You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
'use strict'; const errorEx = require('error-ex'); const fallback = require('json-parse-even-better-errors'); const {default: LinesAndColumns} = require('lines-and-columns'); const {codeFrameColumns} = require('@babel/code-frame');
const JSONError = errorEx('JSONError', { fileName: errorEx.append('in %s'), codeFrame: errorEx.append('\n\n%s\n') });
const parseJson = (string, reviver, filename) => { if (typeof reviver === 'string') { filename = reviver; reviver = null; }
try { try { return JSON.parse(string, reviver); } catch (error) { fallback(string, reviver); throw error; } } catch (error) { error.message = error.message.replace(/\n/g, ''); const indexMatch = error.message.match(/in JSON at position (\d+) while parsing/);
const jsonError = new JSONError(error); if (filename) { jsonError.fileName = filename; }
if (indexMatch && indexMatch.length > 0) { const lines = new LinesAndColumns(string); const index = Number(indexMatch[1]); const location = lines.locationForIndex(index);
const codeFrame = codeFrameColumns( string, {start: {line: location.line + 1, column: location.column + 1}}, {highlightCode: true} );
jsonError.codeFrame = codeFrame; }
throw jsonError; } };
parseJson.JSONError = JSONError;
module.exports = parseJson;
|