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.
		
		
		
		
		
			
		
			
				
					
					
						
							54 lines
						
					
					
						
							1.3 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							54 lines
						
					
					
						
							1.3 KiB
						
					
					
				| '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;
 | |
| 
 |