diff options
author | Marcin Puc <5671049+tranzystorek-io@users.noreply.github.com> | 2020-07-26 21:51:33 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-26 15:51:33 -0400 |
commit | 7326e1ab490aab2220b139460165be0bfbf04f36 (patch) | |
tree | 1aff54e9bb747e46fa62c834d3bc85f965f868cb /std | |
parent | 3b7fdd6734c4f1dbc34b0971296464395dc173bf (diff) |
fix(std/json): Add newline at the end of json files (#6885)
Diffstat (limited to 'std')
-rw-r--r-- | std/fs/README.md | 8 | ||||
-rw-r--r-- | std/fs/write_json.ts | 51 | ||||
-rw-r--r-- | std/fs/write_json_test.ts | 24 |
3 files changed, 46 insertions, 37 deletions
diff --git a/std/fs/README.md b/std/fs/README.md index aad81acee..0b71b2b9d 100644 --- a/std/fs/README.md +++ b/std/fs/README.md @@ -133,18 +133,24 @@ const foo = readJsonSync("./foo.json"); Writes an object to a JSON file. -**WriteJsonOptions** +#### WriteJsonOptions - replacer : An array of strings and numbers that acts as a approved list for selecting the object properties that will be stringified. - space : Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. +You can also specify options from `Deno.WriteFileOptions` to configure how the +file is written. + ```ts import { writeJson, writeJsonSync } from "https://deno.land/std/fs/mod.ts"; writeJson("./target.dat", { foo: "bar" }, { spaces: 2 }); // returns a promise writeJsonSync("./target.dat", { foo: "bar" }, { replacer: ["foo"] }); // void + +// appends to the file instead of rewriting +writeJsonSync("./target.dat", { foo: "bar" }, { append: true }); ``` ### walk diff --git a/std/fs/write_json.ts b/std/fs/write_json.ts index 015957bba..46c33572a 100644 --- a/std/fs/write_json.ts +++ b/std/fs/write_json.ts @@ -2,32 +2,43 @@ // eslint-disable-next-line @typescript-eslint/no-explicit-any type Replacer = (key: string, value: any) => any; -export interface WriteJsonOptions { - spaces?: number | string; +export interface WriteJsonOptions extends Deno.WriteFileOptions { replacer?: Array<number | string> | Replacer; + spaces?: number | string; } -/* Writes an object to a JSON file. */ -export async function writeJson( +function serialize( filePath: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any object: any, - options: WriteJsonOptions = {}, -): Promise<void> { - let contentRaw = ""; - + options: WriteJsonOptions, +): string { try { - contentRaw = JSON.stringify( + const jsonString = JSON.stringify( object, options.replacer as string[], options.spaces, ); + return `${jsonString}\n`; } catch (err) { err.message = `${filePath}: ${err.message}`; throw err; } +} - await Deno.writeFile(filePath, new TextEncoder().encode(contentRaw)); +/* Writes an object to a JSON file. */ +export async function writeJson( + filePath: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + object: any, + options: WriteJsonOptions = {}, +): Promise<void> { + const jsonString = serialize(filePath, object, options); + await Deno.writeTextFile(filePath, jsonString, { + append: options.append, + create: options.create, + mode: options.mode, + }); } /* Writes an object to a JSON file. */ @@ -37,18 +48,10 @@ export function writeJsonSync( object: any, options: WriteJsonOptions = {}, ): void { - let contentRaw = ""; - - try { - contentRaw = JSON.stringify( - object, - options.replacer as string[], - options.spaces, - ); - } catch (err) { - err.message = `${filePath}: ${err.message}`; - throw err; - } - - Deno.writeFileSync(filePath, new TextEncoder().encode(contentRaw)); + const jsonString = serialize(filePath, object, options); + Deno.writeTextFileSync(filePath, jsonString, { + append: options.append, + create: options.create, + mode: options.mode, + }); } diff --git a/std/fs/write_json_test.ts b/std/fs/write_json_test.ts index c22bd7bf1..3fb32ca16 100644 --- a/std/fs/write_json_test.ts +++ b/std/fs/write_json_test.ts @@ -25,7 +25,7 @@ Deno.test("writeJsonIfNotExists", async function (): Promise<void> { await Deno.remove(notExistsJsonFile); - assertEquals(new TextDecoder().decode(content), `{"a":"1"}`); + assertEquals(new TextDecoder().decode(content), `{"a":"1"}\n`); }); Deno.test("writeJsonIfExists", async function (): Promise<void> { @@ -46,7 +46,7 @@ Deno.test("writeJsonIfExists", async function (): Promise<void> { await Deno.remove(existsJsonFile); - assertEquals(new TextDecoder().decode(content), `{"a":"1"}`); + assertEquals(new TextDecoder().decode(content), `{"a":"1"}\n`); }); Deno.test("writeJsonIfExistsAnInvalidJson", async function (): Promise<void> { @@ -71,7 +71,7 @@ Deno.test("writeJsonIfExistsAnInvalidJson", async function (): Promise<void> { await Deno.remove(existsInvalidJsonFile); - assertEquals(new TextDecoder().decode(content), `{"a":"1"}`); + assertEquals(new TextDecoder().decode(content), `{"a":"1"}\n`); }); Deno.test("writeJsonWithSpaces", async function (): Promise<void> { @@ -93,7 +93,7 @@ Deno.test("writeJsonWithSpaces", async function (): Promise<void> { await Deno.remove(existsJsonFile); - assertEquals(new TextDecoder().decode(content), `{\n "a": "1"\n}`); + assertEquals(new TextDecoder().decode(content), `{\n "a": "1"\n}\n`); }); Deno.test("writeJsonWithReplacer", async function (): Promise<void> { @@ -121,7 +121,7 @@ Deno.test("writeJsonWithReplacer", async function (): Promise<void> { await Deno.remove(existsJsonFile); - assertEquals(new TextDecoder().decode(content), `{"a":"1"}`); + assertEquals(new TextDecoder().decode(content), `{"a":"1"}\n`); }); Deno.test("writeJsonSyncIfNotExists", function (): void { @@ -140,7 +140,7 @@ Deno.test("writeJsonSyncIfNotExists", function (): void { Deno.removeSync(notExistsJsonFile); - assertEquals(new TextDecoder().decode(content), `{"a":"1"}`); + assertEquals(new TextDecoder().decode(content), `{"a":"1"}\n`); }); Deno.test("writeJsonSyncIfExists", function (): void { @@ -161,7 +161,7 @@ Deno.test("writeJsonSyncIfExists", function (): void { Deno.removeSync(existsJsonFile); - assertEquals(new TextDecoder().decode(content), `{"a":"1"}`); + assertEquals(new TextDecoder().decode(content), `{"a":"1"}\n`); }); Deno.test("writeJsonSyncIfExistsAnInvalidJson", function (): void { @@ -186,10 +186,10 @@ Deno.test("writeJsonSyncIfExistsAnInvalidJson", function (): void { Deno.removeSync(existsInvalidJsonFile); - assertEquals(new TextDecoder().decode(content), `{"a":"1"}`); + assertEquals(new TextDecoder().decode(content), `{"a":"1"}\n`); }); -Deno.test("writeJsonWithSpaces", function (): void { +Deno.test("writeJsonSyncWithSpaces", function (): void { const existsJsonFile = path.join(testdataDir, "file_write_spaces_sync.json"); const invalidJsonContent = new TextEncoder().encode(); @@ -208,10 +208,10 @@ Deno.test("writeJsonWithSpaces", function (): void { Deno.removeSync(existsJsonFile); - assertEquals(new TextDecoder().decode(content), `{\n "a": "1"\n}`); + assertEquals(new TextDecoder().decode(content), `{\n "a": "1"\n}\n`); }); -Deno.test("writeJsonWithReplacer", function (): void { +Deno.test("writeJsonSyncWithReplacer", function (): void { const existsJsonFile = path.join( testdataDir, "file_write_replacer_sync.json", @@ -239,5 +239,5 @@ Deno.test("writeJsonWithReplacer", function (): void { Deno.removeSync(existsJsonFile); - assertEquals(new TextDecoder().decode(content), `{"a":"1"}`); + assertEquals(new TextDecoder().decode(content), `{"a":"1"}\n`); }); |