Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add readJson/readJsonSync for fs modules #269

Merged
merged 2 commits into from Mar 13, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
42 changes: 42 additions & 0 deletions fs/read_json.ts
@@ -0,0 +1,42 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import * as path from "./path/mod.ts";

/**
* Reads a JSON file and then parses it into an object
* @export
* @param {string} filePath
* @returns {Promise<any>}
*/
export async function readJson(filePath: string): Promise<any> {
filePath = path.resolve(filePath);
const decoder = new TextDecoder("utf-8");

const content = decoder.decode(await Deno.readFile(filePath));

try {
return JSON.parse(content);
} catch (err) {
err.message = `${filePath}: ${err.message}`;
throw err;
}
}

/**
* Reads a JSON file and then parses it into an object
* @export
* @param {string} filePath
* @returns {void}
*/
export function readJsonSync(filePath: string): any {
filePath = path.resolve(filePath);
const decoder = new TextDecoder("utf-8");

const content = decoder.decode(Deno.readFileSync(filePath));

try {
return JSON.parse(content);
} catch (err) {
err.message = `${filePath}: ${err.message}`;
throw err;
}
}
91 changes: 91 additions & 0 deletions fs/read_json_test.ts
@@ -0,0 +1,91 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import { test } from "../testing/mod.ts";
import {
assertEquals,
assertThrowsAsync,
assertThrows
} from "../testing/asserts.ts";
import { readJson, readJsonSync } from "./read_json.ts";
import * as path from "./path/mod.ts";

const testdataDir = path.resolve("fs", "testdata");

test(async function readJsonFileNotExists() {
const emptyJsonFile = path.join(testdataDir, "json_not_exists.json");

await assertThrowsAsync(async () => {
await readJson(emptyJsonFile);
});
});

test(async function readEmptyJsonFile() {
const emptyJsonFile = path.join(testdataDir, "json_empty.json");

await assertThrowsAsync(async () => {
await readJson(emptyJsonFile);
});
});

test(async function readInvalidJsonFile() {
const invalidJsonFile = path.join(testdataDir, "json_invalid.json");

await assertThrowsAsync(async () => {
await readJson(invalidJsonFile);
});
});

test(async function readValidJsonFile() {
const invalidJsonFile = path.join(testdataDir, "json_valid_array.json");

const json = await readJson(invalidJsonFile);

assertEquals(json, ["1", "2", "3"]);
});

test(async function readValidJsonFile() {
const invalidJsonFile = path.join(testdataDir, "json_valid_obj.json");

const json = await readJson(invalidJsonFile);

assertEquals(json, { key1: "value1", key2: "value2" });
});

test(function readJsonFileNotExistsSync() {
const emptyJsonFile = path.join(testdataDir, "json_not_exists.json");

assertThrows(() => {
readJsonSync(emptyJsonFile);
});
});

test(function readEmptyJsonFileSync() {
const emptyJsonFile = path.join(testdataDir, "json_empty.json");

assertThrows(() => {
readJsonSync(emptyJsonFile);
});
});

test(function readInvalidJsonFile() {
const invalidJsonFile = path.join(testdataDir, "json_invalid.json");

assertThrows(() => {
readJsonSync(invalidJsonFile);
});
});

test(function readValidJsonFile() {
const invalidJsonFile = path.join(testdataDir, "json_valid_array.json");

const json = readJsonSync(invalidJsonFile);

assertEquals(json, ["1", "2", "3"]);
});

test(function readValidJsonFile() {
const invalidJsonFile = path.join(testdataDir, "json_valid_obj.json");

const json = readJsonSync(invalidJsonFile);

assertEquals(json, { key1: "value1", key2: "value2" });
});
Empty file added fs/testdata/json_empty.json
Empty file.
5 changes: 5 additions & 0 deletions fs/testdata/json_invalid.json
@@ -0,0 +1,5 @@
{
[
"here is a invalid json file"
]
}
5 changes: 5 additions & 0 deletions fs/testdata/json_valid_array.json
@@ -0,0 +1,5 @@
[
"1",
"2",
"3"
]
4 changes: 4 additions & 0 deletions fs/testdata/json_valid_obj.json
@@ -0,0 +1,4 @@
{
"key1": "value1",
"key2": "value2"
}
1 change: 1 addition & 0 deletions test.ts
Expand Up @@ -18,6 +18,7 @@ import "./fs/empty_dir_test.ts";
import "./fs/ensure_dir_test.ts";
import "./fs/ensure_file_test.ts";
import "./fs/move_test.ts";
import "./fs/read_json_test.ts";
import "./io/test.ts";
import "./http/server_test.ts";
import "./http/file_server_test.ts";
Expand Down