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.
		
		
		
		
			
				
					55 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					55 lines
				
				1.3 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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;
							 |