summaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
authorMarcin Puc <5671049+tranzystorek-io@users.noreply.github.com>2020-07-26 21:51:33 +0200
committerGitHub <noreply@github.com>2020-07-26 15:51:33 -0400
commit7326e1ab490aab2220b139460165be0bfbf04f36 (patch)
tree1aff54e9bb747e46fa62c834d3bc85f965f868cb /std
parent3b7fdd6734c4f1dbc34b0971296464395dc173bf (diff)
fix(std/json): Add newline at the end of json files (#6885)
Diffstat (limited to 'std')
-rw-r--r--std/fs/README.md8
-rw-r--r--std/fs/write_json.ts51
-rw-r--r--std/fs/write_json_test.ts24
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`);
});