Skip to content

Commit d74bc4c

Browse files
shubhekshakumar303
authored andcommitted
fix: Format JSON parse errors so that they provide file context (#594)
1 parent 101500c commit d74bc4c

File tree

5 files changed

+24
-8
lines changed

5 files changed

+24
-8
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"mz": "2.6.0",
5959
"node-firefox-connect": "1.2.0",
6060
"regenerator-runtime": "0.10.0",
61+
"parse-json": "2.2.0",
6162
"sign-addon": "0.2.0",
6263
"source-map-support": "0.4.6",
6364
"stream-to-promise": "2.2.0",

src/cmd/build.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import minimatch from 'minimatch';
44
import {createWriteStream} from 'fs';
55
import streamToPromise from 'stream-to-promise';
66
import {fs} from 'mz';
7+
import parseJSON from 'parse-json';
78

89
import defaultSourceWatcher from '../watcher';
910
import {zipDir} from '../util/zip-dir';
@@ -59,14 +60,23 @@ export async function getDefaultLocalizedName(
5960
): Promise<string> {
6061

6162
let messageData: LocalizedMessageData;
63+
let messageContents: string | Buffer;
6264
let extensionName: string = manifestData.name;
6365

6466
try {
65-
messageData = JSON.parse(await fs.readFile(messageFile));
67+
messageContents = await fs.readFile(messageFile);
6668
} catch (error) {
6769
throw new UsageError(
68-
`Error reading or parsing file ${messageFile}: ${error}`);
70+
`Error reading messages.json file at ${messageFile}: ${error}`);
6971
}
72+
73+
try {
74+
messageData = parseJSON(messageContents, messageFile);
75+
} catch (error) {
76+
throw new UsageError(
77+
`Error parsing messages.json ${error}`);
78+
}
79+
7080
extensionName = manifestData.name.replace(/__MSG_([A-Za-z0-9@_]+?)__/g,
7181
(match, messageName) => {
7282
if (!(messageData[messageName]

src/util/manifest.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import path from 'path';
44
import {fs} from 'mz';
55
import {InvalidManifest} from '../errors';
66
import {createLogger} from './logger';
7+
import parseJSON from 'parse-json';
78

89

910
const log = createLogger(__filename);
@@ -45,7 +46,7 @@ export default async function getValidatedManifest(
4546
let manifestData;
4647

4748
try {
48-
manifestData = JSON.parse(manifestContents);
49+
manifestData = parseJSON(manifestContents, manifestFile);
4950
} catch (error) {
5051
throw new InvalidManifest(
5152
`Error parsing manifest.json at ${manifestFile}: ${error}`);

tests/unit/test-cmd/test.build.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ describe('build', () => {
102102
.then(makeSureItFails())
103103
.catch((error) => {
104104
assert.instanceOf(error, UsageError);
105-
assert.match(
106-
error.message,
107-
/Error .* file .*messages\.json: SyntaxError: Unexpected string/);
105+
assert.match(error.message, /Unexpected token '"' at 1:15/);
106+
assert.match(error.message, /^Error parsing messages.json/);
107+
assert.include(error.message, messageFileName);
108108
});
109109
}
110110
);
@@ -150,7 +150,10 @@ describe('build', () => {
150150
assert.instanceOf(error, UsageError);
151151
assert.match(
152152
error.message,
153-
/Error .* file .*messages\.json: .*: no such file or directory/);
153+
/Error: ENOENT: no such file or directory, open .*messages.json/);
154+
assert.match(error.message, /^Error reading messages.json/);
155+
assert.include(error.message,
156+
'/path/to/non-existent-dir/messages.json');
154157
});
155158
});
156159

tests/unit/test-util/test.manifest.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ describe('util/manifest', () => {
7070
.then(() => getValidatedManifest(tmpDir.path()))
7171
.then(makeSureItFails())
7272
.catch(onlyInstancesOf(InvalidManifest, (error) => {
73-
assert.match(error.message, /Error parsing manifest\.json/);
73+
assert.match(error.message, /Error parsing manifest\.json at /);
74+
assert.include(error.message, 'Unexpected token \' \' at 2:49');
7475
assert.include(error.message, manifestFile);
7576
}));
7677
}

0 commit comments

Comments
 (0)