in packages/angular_devkit/core/src/json/parser.ts [322:400]
function _readString(context: JsonParserContext, comments = _readBlanks(context)): JsonAstString {
const start = context.position;
// Consume the first string delimiter.
const delim = _token(context);
if ((context.mode & JsonParseMode.SingleQuotesAllowed) == 0) {
if (delim == "'") {
throw new InvalidJsonCharacterException(context);
}
}
let str = '';
while (true) {
let char = _token(context);
if (char == delim) {
return {
kind: 'string',
start,
end: context.position,
text: context.original.substring(start.offset, context.position.offset),
value: str,
comments: comments,
};
} else if (char == '\\') {
char = _token(context);
switch (char) {
case '\\':
case '/':
case '"':
case delim:
str += char;
break;
case 'b':
str += '\b';
break;
case 'f':
str += '\f';
break;
case 'n':
str += '\n';
break;
case 'r':
str += '\r';
break;
case 't':
str += '\t';
break;
case 'u':
const [c0] = _token(context, '0123456789abcdefABCDEF');
const [c1] = _token(context, '0123456789abcdefABCDEF');
const [c2] = _token(context, '0123456789abcdefABCDEF');
const [c3] = _token(context, '0123456789abcdefABCDEF');
str += String.fromCharCode(parseInt(c0 + c1 + c2 + c3, 16));
break;
case undefined:
throw new UnexpectedEndOfInputException(context);
case '\n':
// Only valid when multiline strings are allowed.
if ((context.mode & JsonParseMode.MultiLineStringAllowed) == 0) {
throw new InvalidJsonCharacterException(context);
}
str += char;
break;
default:
throw new InvalidJsonCharacterException(context);
}
} else if (char === undefined) {
throw new UnexpectedEndOfInputException(context);
} else if (char == '\b' || char == '\f' || char == '\n' || char == '\r' || char == '\t') {
throw new InvalidJsonCharacterException(context);
} else {
str += char;
}
}
}