'use strict' module.exports = parseJson function parseJson (txt, reviver, context) { context = context || 20 try { return JSON.parse(txt, reviver) } catch (e) { if (typeof txt !== 'string') { const isEmptyArray = Array.isArray(txt) && txt.length === 0 const errorMessage = 'Cannot parse ' + (isEmptyArray ? 'an empty array' : String(txt)) throw new TypeError(errorMessage) } const syntaxErr = e.message.match(/^Unexpected token.*position\s+(\d+)/i) const errIdx = syntaxErr ? +syntaxErr[1] : e.message.match(/^Unexpected end of JSON.*/i) ? txt.length - 1 : null if (errIdx != null) { const start = errIdx <= context ? 0 : errIdx - context const end = errIdx + context >= txt.length ? txt.length : errIdx + context e.message += ` while parsing near '${ start === 0 ? '' : '...' }${txt.slice(start, end)}${ end === txt.length ? '' : '...' }'` } else { e.message += ` while parsing '${txt.slice(0, context * 2)}'` } throw e } }