| 'use strict'; | |
| const singleComment = Symbol('singleComment'); | |
| const multiComment = Symbol('multiComment'); | |
| const stripWithoutWhitespace = () => ''; | |
| const stripWithWhitespace = (string, start, end) => string.slice(start, end).replace(/\S/g, ' '); | |
| 
 | |
| const isEscaped = (jsonString, quotePosition) => { | |
| 	let index = quotePosition - 1; | |
| 	let backslashCount = 0; | |
| 
 | |
| 	while (jsonString[index] === '\\') { | |
| 		index -= 1; | |
| 		backslashCount += 1; | |
| 	} | |
| 
 | |
| 	return Boolean(backslashCount % 2); | |
| }; | |
| 
 | |
| module.exports = (jsonString, options = {}) => { | |
| 	if (typeof jsonString !== 'string') { | |
| 		throw new TypeError(`Expected argument \`jsonString\` to be a \`string\`, got \`${typeof jsonString}\``); | |
| 	} | |
| 
 | |
| 	const strip = options.whitespace === false ? stripWithoutWhitespace : stripWithWhitespace; | |
| 
 | |
| 	let insideString = false; | |
| 	let insideComment = false; | |
| 	let offset = 0; | |
| 	let result = ''; | |
| 
 | |
| 	for (let i = 0; i < jsonString.length; i++) { | |
| 		const currentCharacter = jsonString[i]; | |
| 		const nextCharacter = jsonString[i + 1]; | |
| 
 | |
| 		if (!insideComment && currentCharacter === '"') { | |
| 			const escaped = isEscaped(jsonString, i); | |
| 			if (!escaped) { | |
| 				insideString = !insideString; | |
| 			} | |
| 		} | |
| 
 | |
| 		if (insideString) { | |
| 			continue; | |
| 		} | |
| 
 | |
| 		if (!insideComment && currentCharacter + nextCharacter === '//') { | |
| 			result += jsonString.slice(offset, i); | |
| 			offset = i; | |
| 			insideComment = singleComment; | |
| 			i++; | |
| 		} else if (insideComment === singleComment && currentCharacter + nextCharacter === '\r\n') { | |
| 			i++; | |
| 			insideComment = false; | |
| 			result += strip(jsonString, offset, i); | |
| 			offset = i; | |
| 			continue; | |
| 		} else if (insideComment === singleComment && currentCharacter === '\n') { | |
| 			insideComment = false; | |
| 			result += strip(jsonString, offset, i); | |
| 			offset = i; | |
| 		} else if (!insideComment && currentCharacter + nextCharacter === '/*') { | |
| 			result += jsonString.slice(offset, i); | |
| 			offset = i; | |
| 			insideComment = multiComment; | |
| 			i++; | |
| 			continue; | |
| 		} else if (insideComment === multiComment && currentCharacter + nextCharacter === '*/') { | |
| 			i++; | |
| 			insideComment = false; | |
| 			result += strip(jsonString, offset, i + 1); | |
| 			offset = i + 1; | |
| 			continue; | |
| 		} | |
| 	} | |
| 
 | |
| 	return result + (insideComment ? strip(jsonString.slice(offset)) : jsonString.slice(offset)); | |
| };
 |