feat: add readJson/readJsonSync for fs modules (denoland/deno_std#269)

Original: e4485d722a
This commit is contained in:
Axetroy 2019-03-14 00:06:40 +08:00 committed by Ryan Dahl
parent 511dbdde73
commit a391660d2d
7 changed files with 148 additions and 0 deletions

42
fs/read_json.ts Normal file
View file

@ -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
fs/read_json_test.ts Normal file
View file

@ -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" });
});

0
fs/testdata/json_empty.json vendored Normal file
View file

5
fs/testdata/json_invalid.json vendored Normal file
View file

@ -0,0 +1,5 @@
{
[
"here is a invalid json file"
]
}

5
fs/testdata/json_valid_array.json vendored Normal file
View file

@ -0,0 +1,5 @@
[
"1",
"2",
"3"
]

4
fs/testdata/json_valid_obj.json vendored Normal file
View file

@ -0,0 +1,4 @@
{
"key1": "value1",
"key2": "value2"
}

View file

@ -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";