| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.readCodePoint = readCodePoint; |
| exports.readInt = readInt; |
| exports.readStringContents = readStringContents; |
| var _isDigit = function isDigit(code) { |
| return code >= 48 && code <= 57; |
| }; |
| const forbiddenNumericSeparatorSiblings = { |
| decBinOct: new Set([46, 66, 69, 79, 95, 98, 101, 111]), |
| hex: new Set([46, 88, 95, 120]) |
| }; |
| const isAllowedNumericSeparatorSibling = { |
| bin: ch => ch === 48 || ch === 49, |
| oct: ch => ch >= 48 && ch <= 55, |
| dec: ch => ch >= 48 && ch <= 57, |
| hex: ch => ch >= 48 && ch <= 57 || ch >= 65 && ch <= 70 || ch >= 97 && ch <= 102 |
| }; |
| function readStringContents(type, input, pos, lineStart, curLine, errors) { |
| const initialPos = pos; |
| const initialLineStart = lineStart; |
| const initialCurLine = curLine; |
| let out = ""; |
| let firstInvalidLoc = null; |
| let chunkStart = pos; |
| const { |
| length |
| } = input; |
| for (;;) { |
| if (pos >= length) { |
| errors.unterminated(initialPos, initialLineStart, initialCurLine); |
| out += input.slice(chunkStart, pos); |
| break; |
| } |
| const ch = input.charCodeAt(pos); |
| if (isStringEnd(type, ch, input, pos)) { |
| out += input.slice(chunkStart, pos); |
| break; |
| } |
| if (ch === 92) { |
| out += input.slice(chunkStart, pos); |
| const res = readEscapedChar(input, pos, lineStart, curLine, type === "template", errors); |
| if (res.ch === null && !firstInvalidLoc) { |
| firstInvalidLoc = { |
| pos, |
| lineStart, |
| curLine |
| }; |
| } else { |
| out += res.ch; |
| } |
| ({ |
| pos, |
| lineStart, |
| curLine |
| } = res); |
| chunkStart = pos; |
| } else if (ch === 8232 || ch === 8233) { |
| ++pos; |
| ++curLine; |
| lineStart = pos; |
| } else if (ch === 10 || ch === 13) { |
| if (type === "template") { |
| out += input.slice(chunkStart, pos) + "\n"; |
| ++pos; |
| if (ch === 13 && input.charCodeAt(pos) === 10) { |
| ++pos; |
| } |
| ++curLine; |
| chunkStart = lineStart = pos; |
| } else { |
| errors.unterminated(initialPos, initialLineStart, initialCurLine); |
| } |
| } else { |
| ++pos; |
| } |
| } |
| return { |
| pos, |
| str: out, |
| firstInvalidLoc, |
| lineStart, |
| curLine, |
| containsInvalid: !!firstInvalidLoc |
| }; |
| } |
| function isStringEnd(type, ch, input, pos) { |
| if (type === "template") { |
| return ch === 96 || ch === 36 && input.charCodeAt(pos + 1) === 123; |
| } |
| return ch === (type === "double" ? 34 : 39); |
| } |
| function readEscapedChar(input, pos, lineStart, curLine, inTemplate, errors) { |
| const throwOnInvalid = !inTemplate; |
| pos++; |
| const res = ch => ({ |
| pos, |
| ch, |
| lineStart, |
| curLine |
| }); |
| const ch = input.charCodeAt(pos++); |
| switch (ch) { |
| case 110: |
| return res("\n"); |
| case 114: |
| return res("\r"); |
| case 120: |
| { |
| let code; |
| ({ |
| code, |
| pos |
| } = readHexChar(input, pos, lineStart, curLine, 2, false, throwOnInvalid, errors)); |
| return res(code === null ? null : String.fromCharCode(code)); |
| } |
| case 117: |
| { |
| let code; |
| ({ |
| code, |
| pos |
| } = readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors)); |
| return res(code === null ? null : String.fromCodePoint(code)); |
| } |
| case 116: |
| return res("\t"); |
| case 98: |
| return res("\b"); |
| case 118: |
| return res("\u000b"); |
| case 102: |
| return res("\f"); |
| case 13: |
| if (input.charCodeAt(pos) === 10) { |
| ++pos; |
| } |
| case 10: |
| lineStart = pos; |
| ++curLine; |
| case 8232: |
| case 8233: |
| return res(""); |
| case 56: |
| case 57: |
| if (inTemplate) { |
| return res(null); |
| } else { |
| errors.strictNumericEscape(pos - 1, lineStart, curLine); |
| } |
| default: |
| if (ch >= 48 && ch <= 55) { |
| const startPos = pos - 1; |
| const match = /^[0-7]+/.exec(input.slice(startPos, pos + 2)); |
| let octalStr = match[0]; |
| let octal = parseInt(octalStr, 8); |
| if (octal > 255) { |
| octalStr = octalStr.slice(0, -1); |
| octal = parseInt(octalStr, 8); |
| } |
| pos += octalStr.length - 1; |
| const next = input.charCodeAt(pos); |
| if (octalStr !== "0" || next === 56 || next === 57) { |
| if (inTemplate) { |
| return res(null); |
| } else { |
| errors.strictNumericEscape(startPos, lineStart, curLine); |
| } |
| } |
| return res(String.fromCharCode(octal)); |
| } |
| return res(String.fromCharCode(ch)); |
| } |
| } |
| function readHexChar(input, pos, lineStart, curLine, len, forceLen, throwOnInvalid, errors) { |
| const initialPos = pos; |
| let n; |
| ({ |
| n, |
| pos |
| } = readInt(input, pos, lineStart, curLine, 16, len, forceLen, false, errors, !throwOnInvalid)); |
| if (n === null) { |
| if (throwOnInvalid) { |
| errors.invalidEscapeSequence(initialPos, lineStart, curLine); |
| } else { |
| pos = initialPos - 1; |
| } |
| } |
| return { |
| code: n, |
| pos |
| }; |
| } |
| function readInt(input, pos, lineStart, curLine, radix, len, forceLen, allowNumSeparator, errors, bailOnError) { |
| const start = pos; |
| const forbiddenSiblings = radix === 16 ? forbiddenNumericSeparatorSiblings.hex : forbiddenNumericSeparatorSiblings.decBinOct; |
| const isAllowedSibling = radix === 16 ? isAllowedNumericSeparatorSibling.hex : radix === 10 ? isAllowedNumericSeparatorSibling.dec : radix === 8 ? isAllowedNumericSeparatorSibling.oct : isAllowedNumericSeparatorSibling.bin; |
| let invalid = false; |
| let total = 0; |
| for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) { |
| const code = input.charCodeAt(pos); |
| let val; |
| if (code === 95 && allowNumSeparator !== "bail") { |
| const prev = input.charCodeAt(pos - 1); |
| const next = input.charCodeAt(pos + 1); |
| if (!allowNumSeparator) { |
| if (bailOnError) return { |
| n: null, |
| pos |
| }; |
| errors.numericSeparatorInEscapeSequence(pos, lineStart, curLine); |
| } else if (Number.isNaN(next) || !isAllowedSibling(next) || forbiddenSiblings.has(prev) || forbiddenSiblings.has(next)) { |
| if (bailOnError) return { |
| n: null, |
| pos |
| }; |
| errors.unexpectedNumericSeparator(pos, lineStart, curLine); |
| } |
| ++pos; |
| continue; |
| } |
| if (code >= 97) { |
| val = code - 97 + 10; |
| } else if (code >= 65) { |
| val = code - 65 + 10; |
| } else if (_isDigit(code)) { |
| val = code - 48; |
| } else { |
| val = Infinity; |
| } |
| if (val >= radix) { |
| if (val <= 9 && bailOnError) { |
| return { |
| n: null, |
| pos |
| }; |
| } else if (val <= 9 && errors.invalidDigit(pos, lineStart, curLine, radix)) { |
| val = 0; |
| } else if (forceLen) { |
| val = 0; |
| invalid = true; |
| } else { |
| break; |
| } |
| } |
| ++pos; |
| total = total * radix + val; |
| } |
| if (pos === start || len != null && pos - start !== len || invalid) { |
| return { |
| n: null, |
| pos |
| }; |
| } |
| return { |
| n: total, |
| pos |
| }; |
| } |
| function readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors) { |
| const ch = input.charCodeAt(pos); |
| let code; |
| if (ch === 123) { |
| ++pos; |
| ({ |
| code, |
| pos |
| } = readHexChar(input, pos, lineStart, curLine, input.indexOf("}", pos) - pos, true, throwOnInvalid, errors)); |
| ++pos; |
| if (code !== null && code > 0x10ffff) { |
| if (throwOnInvalid) { |
| errors.invalidCodePoint(pos, lineStart, curLine); |
| } else { |
| return { |
| code: null, |
| pos |
| }; |
| } |
| } |
| } else { |
| ({ |
| code, |
| pos |
| } = readHexChar(input, pos, lineStart, curLine, 4, false, throwOnInvalid, errors)); |
| } |
| return { |
| code, |
| pos |
| }; |
| } |
| |
| //# sourceMappingURL=index.js.map |