@cbortech/cbor 0.25.5 → 0.25.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/ast/CborAppSeqResult.d.ts +4 -2
  2. package/dist/ast/CborArray.d.ts +1 -1
  3. package/dist/ast/CborByteString.d.ts +1 -1
  4. package/dist/ast/CborEmbeddedCBOR.d.ts +5 -2
  5. package/dist/ast/CborFloat.d.ts +1 -1
  6. package/dist/ast/CborIndefiniteTextString.d.ts +1 -1
  7. package/dist/ast/CborMap.d.ts +1 -1
  8. package/dist/ast/CborNint.d.ts +1 -1
  9. package/dist/ast/CborTag.d.ts +1 -1
  10. package/dist/ast/CborTextString.d.ts +1 -1
  11. package/dist/ast/CborUint.d.ts +1 -1
  12. package/dist/ast/index.cjs +1 -1
  13. package/dist/ast/index.js +1 -1
  14. package/dist/cdn/index.cjs +1 -1
  15. package/dist/cdn/index.js +1 -1
  16. package/dist/cdn/serialize-utils.d.ts +14 -2
  17. package/dist/extensions/dt.d.ts +2 -2
  18. package/dist/extensions/types.d.ts +4 -1
  19. package/dist/index.cjs +3 -3
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.js +133 -62
  22. package/dist/index.js.map +1 -1
  23. package/dist/mapEntries-C5S6uTIO.cjs +12 -0
  24. package/dist/mapEntries-C5S6uTIO.cjs.map +1 -0
  25. package/dist/{mapEntries-D6BfG4-1.js → mapEntries-bvRWFfqX.js} +755 -614
  26. package/dist/mapEntries-bvRWFfqX.js.map +1 -0
  27. package/dist/{tokenizer-C597LW89.js → tokenizer-BuRSmdyM.js} +3 -3
  28. package/dist/{tokenizer-C597LW89.js.map → tokenizer-BuRSmdyM.js.map} +1 -1
  29. package/dist/{tokenizer-C8NLHT2B.cjs → tokenizer-M2pf9ud0.cjs} +2 -2
  30. package/dist/{tokenizer-C8NLHT2B.cjs.map → tokenizer-M2pf9ud0.cjs.map} +1 -1
  31. package/dist/types.d.ts +49 -7
  32. package/package.json +7 -7
  33. package/dist/mapEntries-Chd4Qmgv.cjs +0 -12
  34. package/dist/mapEntries-Chd4Qmgv.cjs.map +0 -1
  35. package/dist/mapEntries-D6BfG4-1.js.map +0 -1
@@ -640,7 +640,7 @@ var i = new TextEncoder(), a = class {
640
640
  };
641
641
  case "\"": {
642
642
  let n = this._readStringContent("\"");
643
- return n === "" && this._ch() === "_" ? (this._advance(), {
643
+ return n === "" && this._ch() === "_" && !/[0-7i]/.test(this.input[this.pos + 1] ?? "") ? (this._advance(), {
644
644
  type: "EMPTY_INDEF_TEXT",
645
645
  value: "",
646
646
  line: e,
@@ -653,7 +653,7 @@ var i = new TextEncoder(), a = class {
653
653
  };
654
654
  }
655
655
  case "'": {
656
- if ((this.input[this.pos + 1] ?? "") === "'" && (this.input[this.pos + 2] ?? "") === "_") return this._advance(), this._advance(), this._advance(), {
656
+ if ((this.input[this.pos + 1] ?? "") === "'" && (this.input[this.pos + 2] ?? "") === "_" && !/[0-7i]/.test(this.input[this.pos + 3] ?? "")) return this._advance(), this._advance(), this._advance(), {
657
657
  type: "EMPTY_INDEF_BYTES",
658
658
  value: "",
659
659
  line: e,
@@ -992,4 +992,4 @@ var i = new TextEncoder(), a = class {
992
992
  //#endregion
993
993
  export { e as n, a as t };
994
994
 
995
- //# sourceMappingURL=tokenizer-C597LW89.js.map
995
+ //# sourceMappingURL=tokenizer-BuRSmdyM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenizer-C597LW89.js","names":[],"sources":["../src/cdn/errors.ts","../src/cdn/tokenizer.ts"],"sourcesContent":["/**\n * Structured syntax error thrown by the CDN tokenizer and parser.\n *\n * Carries the source position of the failure so tooling (editors, linters,\n * playgrounds) can point at the offending range without parsing the message.\n * Position fields are present whenever the failure site knows them.\n */\nexport class CdnSyntaxError extends SyntaxError {\n /** Character offset of the start of the offending range in the source input. */\n readonly offset?: number;\n /** 1-based line number of the offending range. */\n readonly line?: number;\n /** 1-based column number of the offending range. */\n readonly column?: number;\n /** Character offset just past the end of the offending range. */\n readonly endOffset?: number;\n\n constructor(\n message: string,\n position?: {\n offset?: number;\n line?: number;\n column?: number;\n endOffset?: number;\n }\n ) {\n const loc =\n position?.line !== undefined\n ? ` at line ${position.line}, column ${position.column}`\n : '';\n super(`EDN parse error${loc}: ${message}`);\n this.name = 'CdnSyntaxError';\n this.offset = position?.offset;\n this.line = position?.line;\n this.column = position?.column;\n this.endOffset = position?.endOffset;\n }\n}\n","/**\n * CDN lexer (internal).\n *\n * Used by parser.ts for parsing and by CborTextString serialization to collect\n * source offsets after parseCDN() has already validated embedded CDN.\n */\n\nimport { CdnSyntaxError } from './errors';\n\nexport type TokenType =\n | 'INTEGER'\n | 'FLOAT'\n | 'TSTR'\n | 'SQSTR'\n | 'RAWSTRING'\n | 'BYTES_HEX'\n | 'BYTES_HEX_ELIDED'\n | 'BYTES_B64'\n | 'APP_STRING'\n | 'APP_SEQUENCE'\n | 'EMPTY_INDEF_BYTES'\n | 'EMPTY_INDEF_TEXT'\n | 'TRUE'\n | 'FALSE'\n | 'NULL'\n | 'UNDEFINED'\n | 'SIMPLE'\n | 'LBRACKET'\n | 'RBRACKET'\n | 'LBRACE'\n | 'RBRACE'\n | 'LPAREN'\n | 'RPAREN'\n | 'COLON'\n | 'COMMA'\n | 'PLUS'\n | 'UNDERSCORE'\n | 'ENCODING_INDICATOR'\n | 'LT_LT'\n | 'GT_GT'\n | 'ELLIPSIS'\n | 'EOF'\n /** Synthetic token emitted by tokenizeLenient() for the unscannable tail. */\n | 'ERROR';\n\nexport interface Token {\n type: TokenType;\n /** Processed value: decoded string content, raw number text, raw byte content, etc. */\n value: string;\n /** Original source text for this token. */\n raw: string;\n line: number;\n col: number;\n /** Character offset of the first character of this token in the source input. */\n offset: number;\n /** Character offset just past the last character of this token in the source input. */\n endOffset: number;\n /** Only set when type === 'APP_STRING': the extension prefix (e.g. 'dt', 'DT'). */\n appPrefix?: string;\n}\n\nexport interface TokenizerOptions {\n /** Character offset at which tokenization starts. */\n offset?: number;\n}\n\nexport interface EdnComment {\n kind: 'line' | 'block';\n marker: '#' | '//' | '/*' | '/';\n text: string;\n start: number;\n end: number;\n line: number;\n col: number;\n}\n\n/** Inverse of positionAt; only used on the cold error path. */\nfunction offsetAt(input: string, line: number, col: number): number {\n let l = 1;\n let c = 1;\n for (let i = 0; i < input.length; i++) {\n if (l === line && c === col) return i;\n if (input[i] === '\\n') {\n l++;\n c = 1;\n } else {\n c++;\n }\n }\n return input.length;\n}\n\nfunction positionAt(\n input: string,\n offset: number\n): { line: number; col: number } {\n let line = 1;\n let col = 1;\n for (let i = 0; i < offset; i++) {\n if (input[i] === '\\n') {\n line++;\n col = 1;\n } else {\n col++;\n }\n }\n return { line, col };\n}\n\n// ─── Scanning helpers (hot path) ─────────────────────────────────────────────\n//\n// Token content is consumed in bulk runs: a charCodeAt loop locates the next\n// character that needs individual handling, and everything before it is\n// appended with a single slice instead of per-character concatenation.\n\nfunction isHexDigitCode(c: number): boolean {\n return (\n (c >= 0x30 && c <= 0x39) || // 0-9\n (c >= 0x61 && c <= 0x66) || // a-f\n (c >= 0x41 && c <= 0x46) // A-F\n );\n}\n\n/** Shared encoder — constructing TextEncoder per token is needlessly slow. */\nconst textEncoder = new TextEncoder();\n\nexport class Tokenizer {\n private pos: number;\n private line: number;\n private col: number;\n private _peeked: Token | null = null;\n private _lastConsumedEndOffset: number;\n /** Comments encountered while scanning, appended in source order. */\n readonly comments: EdnComment[] = [];\n /**\n * When set, non-standard-but-JS-valid escape sequences are accepted instead\n * of throwing. The callback receives a message and the position of the `\\`\n * (offset, line, column) so the parser can forward it as a ParseWarning.\n */\n onEscapeWarning?: (\n msg: string,\n offset: number,\n line: number,\n col: number\n ) => void;\n constructor(\n private readonly input: string,\n options?: TokenizerOptions\n ) {\n const offset = options?.offset ?? 0;\n if (!Number.isInteger(offset) || offset < 0 || offset > input.length)\n throw new RangeError(\n `EDN parse offset must be an integer between 0 and ${input.length}`\n );\n const position = positionAt(input, offset);\n this.pos = offset;\n this.line = position.line;\n this.col = position.col;\n this._lastConsumedEndOffset = offset;\n }\n\n peek(): Token {\n if (this._peeked === null) this._peeked = this._readNext();\n return this._peeked;\n }\n\n consume(): Token {\n const tok = this._peeked !== null ? this._peeked : this._readNext();\n this._peeked = null;\n this._lastConsumedEndOffset = tok.endOffset;\n return tok;\n }\n\n /** Character offset just past the last character of the most recently consumed token. */\n get lastEndOffset(): number {\n return this._lastConsumedEndOffset;\n }\n\n /** The full source text supplied to this tokenizer. */\n get source(): string {\n return this.input;\n }\n\n // ── Internal helpers ─────────────────────────────────────────────────────\n\n private _ch(): string {\n return this.input[this.pos] ?? '';\n }\n private _eof(): boolean {\n return this.pos >= this.input.length;\n }\n\n private _advance(): string {\n const c = this.input[this.pos++] ?? '';\n if (c === '\\n') {\n this.line++;\n this.col = 1;\n } else {\n this.col++;\n }\n return c;\n }\n\n private _fail(msg: string, line = this.line, col = this.col): never {\n const offset =\n line === this.line && col === this.col\n ? this.pos\n : offsetAt(this.input, line, col);\n throw new CdnSyntaxError(msg, { offset, line, column: col });\n }\n\n private _skipWS(): void {\n for (;;) {\n // Skip whitespace characters. Common ASCII whitespace is matched with\n // direct comparisons; printable ASCII can never match /\\s/, so the\n // regex only runs for the rare remaining characters (e.g. \\f, NBSP).\n for (;;) {\n const ws = this.input[this.pos];\n if (ws === undefined) return;\n if (ws === ' ' || ws === '\\n' || ws === '\\t' || ws === '\\r') {\n this._advance();\n continue;\n }\n if (ws > ' ' && ws <= '~') break; // printable ASCII — not whitespace\n if (/\\s/.test(ws)) {\n this._advance();\n continue;\n }\n break;\n }\n\n const c = this._ch();\n\n // CDN line comment: # to end of line\n if (c === '#') {\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n while (!this._eof() && this._ch() !== '\\n') this._advance();\n this.comments.push({\n kind: 'line',\n marker: '#',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n\n // Comments starting with /\n if (c === '/') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === '/') {\n // EDN end-of-line comment: // to end of line (§2.2)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() !== '\\n') this._advance();\n this.comments.push({\n kind: 'line',\n marker: '//',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n if (next === '*') {\n // EDN block comment: /* ... */ (§2.2)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance();\n this._advance();\n this._skipBlockCommentStar();\n this.comments.push({\n kind: 'block',\n marker: '/*',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n // EDN slash-delimited comment: / ... / (§2.2, first char must not be * or /)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance(); // consume opening /\n this._skipBlockCommentSlash();\n this.comments.push({\n kind: 'block',\n marker: '/',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n\n return;\n }\n }\n\n /**\n * Skip a comment in a quoted byte string literal (h'', b64'').\n * Returns true if a comment was consumed, false if the current char is not a\n * comment start. `quote` is the closing delimiter character.\n *\n * Supports / ... /, /* *\\/, //, and # comment forms (§2.2).\n */\n private _skipByteStringComment(quote: string): boolean {\n const ch = this._ch();\n if (ch === '/') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === '/') {\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof() && this._ch() !== '\\n') this._advance();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n return true;\n }\n if (next === '*') {\n this._advance();\n this._advance();\n this._skipBlockCommentStar();\n return true;\n }\n this._advance();\n this._skipBlockCommentSlash();\n return true;\n }\n if (ch === '#') {\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance(); // consume '\\'\n if (this._eof() || this._ch() === '\\n') continue;\n const escaped = this._advance();\n if (escaped === 'u') this._validateHexCommentUnicodeEscape();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n return true;\n }\n return false;\n }\n\n /**\n * Validate a `\\uXXXX` or `\\u{N}` escape inside a hex-string comment.\n *\n * Called immediately after the `u` character has been consumed. Rejects\n * lone surrogates and invalid surrogate pairs; tolerates truncated/\n * non-hex sequences (comments are informational, but surrogates are\n * always illegal).\n */\n private _validateHexCommentUnicodeEscape(): void {\n const line = this.line,\n col = this.col;\n\n // Extended form \\u{XXXXXX}\n if (!this._eof() && this._ch() === '{') {\n this._advance(); // {\n let hex = '';\n while (!this._eof() && this._ch() !== '}' && this._ch() !== '\\n')\n hex += this._advance();\n if (!this._eof() && this._ch() === '}') this._advance(); // }\n const cp = parseInt(hex || '0', 16);\n if (cp >= 0xd800 && cp <= 0xdfff)\n this._fail(\n `\\\\u{${hex}} is a surrogate code point, not allowed in hex string comments`,\n line,\n col\n );\n return;\n }\n\n // Standard \\uXXXX — read up to 4 hex digits\n let hex = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof() || this._ch() === '\\n') break;\n if (!/[0-9a-fA-F]/.test(this._ch())) break;\n hex += this._advance();\n }\n if (hex.length < 4) return; // truncated / non-hex — not our problem\n\n const cp = parseInt(hex, 16);\n\n // High surrogate: must be followed immediately by a low-surrogate escape\n if (cp >= 0xd800 && cp <= 0xdbff) {\n if (this._ch() !== '\\\\' || (this.input[this.pos + 1] ?? '') !== 'u')\n this._fail(\n `lone high surrogate \\\\u${hex} in hex string comment`,\n line,\n col\n );\n this._advance(); // \\\n this._advance(); // u\n let hex2 = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof() || this._ch() === '\\n') break;\n if (!/[0-9a-fA-F]/.test(this._ch())) break;\n hex2 += this._advance();\n }\n const cp2 = parseInt(hex2 || '0', 16);\n if (cp2 < 0xdc00 || cp2 > 0xdfff)\n this._fail(\n `\\\\u${hex} (high surrogate) not followed by valid low surrogate in hex string comment`,\n line,\n col\n );\n return;\n }\n\n if (cp >= 0xdc00 && cp <= 0xdfff)\n this._fail(\n `lone low surrogate \\\\u${hex} in hex string comment`,\n line,\n col\n );\n }\n\n /**\n * Skip a comment in a raw byte string (h``, b64``).\n * Called with `i` pointing at the comment-start character.\n * Returns the index after the comment, or -1 if no comment was found.\n *\n * Supports / ... /, /* *\\/, //, and # comment forms (§2.2).\n * `context` is used in unterminated-comment error messages.\n */\n private _skipRawComment(\n raw: string,\n i: number,\n context: string,\n tokenLine: number,\n tokenCol: number\n ): number {\n const ch = raw[i];\n if (ch === '/') {\n i++;\n if (raw[i] === '/') {\n i++;\n while (i < raw.length && raw[i] !== '\\n') i++;\n return i;\n }\n if (raw[i] === '*') {\n i++;\n while (i < raw.length) {\n if (raw[i] === '*' && raw[i + 1] === '/') return i + 2;\n i++;\n }\n return i; // EOF inside comment — fall through; caller will report\n }\n // / … / comment\n while (i < raw.length && raw[i] !== '/') i++;\n if (i >= raw.length)\n this._fail(\n `unterminated block comment in ${context}`,\n tokenLine,\n tokenCol\n );\n return i + 1; // consume closing /\n }\n if (ch === '#') {\n while (i < raw.length && raw[i] !== '\\n') i++;\n return i;\n }\n return -1; // not a comment\n }\n\n /** Skip content until a closing `/` (CDN block comment). */\n private _skipBlockCommentSlash(): void {\n const line = this.line,\n col = this.col;\n while (!this._eof()) {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof()) this._advance();\n continue;\n }\n if (this._ch() === '/') break;\n this._advance();\n }\n if (this._eof()) this._fail('unterminated block comment', line, col);\n this._advance(); // consume closing /\n }\n\n /** Skip content until a closing `*\\/` (JSONC block comment). */\n private _skipBlockCommentStar(): void {\n const line = this.line,\n col = this.col;\n while (!this._eof()) {\n if (this._ch() === '*' && (this.input[this.pos + 1] ?? '') === '/') {\n this._advance();\n this._advance();\n return;\n }\n this._advance();\n }\n this._fail('unterminated block comment', line, col);\n }\n\n /**\n * Read content between `quote` delimiters, processing escape sequences.\n *\n * Strict spec compliance:\n * - Literal LF (U+000A) is allowed; all other C0 controls and U+007F are rejected.\n * - Literal CR (U+000D) is silently stripped (source-level CRLF normalisation).\n * - Only spec-defined escape sequences are accepted; `\\q` etc. throw SyntaxError.\n * - `\\/` is valid only in double-quoted strings (not in escapable-s, §5.1).\n * - `\\\\` (backslash) is valid in both single- and double-quoted strings.\n * - `\\uXXXX` for a high surrogate must be immediately followed by `\\uXXXX` for\n * the corresponding low surrogate; lone surrogates are rejected.\n * - `\\u{N}` … `\\u{10FFFF}` extended syntax is supported; surrogates are rejected.\n * - In single-quoted strings, `\\u` escapes to printable ASCII (U+0020–U+007E)\n * are forbidden (hexchar-s restriction, draft-25 §5.1).\n */\n private _readStringContent(quote: string): string {\n this._advance(); // opening quote\n const quoteCode = quote.charCodeAt(0);\n const inputLen = this.input.length;\n let out = '';\n while (!this._eof() && this._ch() !== quote) {\n // Fast path: bulk-consume a run of ordinary characters up to the next\n // delimiter, backslash, CR, or control character. LF is ordinary\n // content; it is counted here so line/col stay correct.\n let p = this.pos;\n let newlines = 0;\n let lastNewline = -1;\n while (p < inputLen) {\n const cc = this.input.charCodeAt(p);\n if (cc === quoteCode || cc === 0x5c /* \\ */ || cc === 0x7f /* DEL */)\n break;\n if (cc < 0x20) {\n if (cc !== 0x0a) break; // CR / other C0 controls → slow path\n newlines++;\n lastNewline = p;\n }\n p++;\n }\n if (p > this.pos) {\n out += this.input.slice(this.pos, p);\n if (newlines > 0) {\n this.line += newlines;\n this.col = p - lastNewline;\n } else {\n this.col += p - this.pos;\n }\n this.pos = p;\n continue;\n }\n\n const ch = this._ch();\n\n // Strip literal CR (cross-platform source normalisation — spec §2.5.1)\n if (ch === '\\r') {\n this._advance();\n continue;\n }\n\n // Reject unescaped C0 control characters (except LF) and DEL — spec §5.1 unescaped\n const cp = ch.codePointAt(0)!;\n if ((cp < 0x20 && cp !== 0x0a) || cp === 0x7f)\n this._fail(\n `unescaped control character U+${cp.toString(16).padStart(4, '0')} is not allowed in string literals`\n );\n\n if (ch === '\\\\') {\n // Capture position of the backslash itself before consuming it.\n const eOffset = this.pos,\n eLine = this.line,\n eCol = this.col;\n this._advance();\n const e = this._advance();\n switch (e) {\n case 'n':\n out += '\\n';\n break;\n case 'r':\n out += '\\r';\n break;\n case 't':\n out += '\\t';\n break;\n case 'b':\n out += '\\b';\n break;\n case 'f':\n out += '\\f';\n break;\n case '\\\\':\n out += '\\\\';\n break;\n case 'u':\n out += this._readUnicodeEscape(quote, eOffset, eLine, eCol);\n break;\n default:\n // Escaped delimiter char (e.g. \\' inside '...' or \\\" inside \"...\")\n if (e === quote) {\n out += e;\n break;\n }\n if (e === '/') {\n if (quote === \"'\")\n this._fail(\n `\\\\/ is not a valid escape in single-quoted byte strings (§5.1)`,\n eLine,\n eCol\n );\n out += '/';\n break;\n }\n // Non-standard JS escape sequences — accepted when onEscapeWarning is set.\n if (this.onEscapeWarning) {\n if (e === '0') {\n this.onEscapeWarning(\n '\\\\0 is a non-standard escape sequence; use \\\\u0000 instead',\n eOffset,\n eLine,\n eCol\n );\n out += '\\0';\n break;\n }\n if (e === 'v') {\n this.onEscapeWarning(\n '\\\\v is a non-standard escape sequence; use \\\\u000b instead',\n eOffset,\n eLine,\n eCol\n );\n out += '\\v';\n break;\n }\n if (e === 'x') {\n // \\xHH — two hex digits\n const h1 = this._ch();\n const h2 = this.input[this.pos + 1] ?? '';\n if (!/[0-9a-fA-F]/.test(h1) || !/[0-9a-fA-F]/.test(h2)) {\n this._fail(\n '\\\\x escape requires exactly two hex digits',\n eLine,\n eCol\n );\n }\n this._advance();\n this._advance();\n const codePoint = parseInt(h1 + h2, 16);\n this.onEscapeWarning(\n `\\\\x${h1}${h2} is a non-standard escape sequence; use \\\\u00${h1}${h2} instead`,\n eOffset,\n eLine,\n eCol\n );\n out += String.fromCharCode(codePoint);\n break;\n }\n // Cross-quote delimiter (e.g. \\\" inside '...' or \\' inside \"...\")\n if (e === '\"' || e === \"'\") {\n this.onEscapeWarning(\n `\\\\${e} inside ${quote === '\"' ? 'double' : 'single'}-quoted string is non-standard`,\n eOffset,\n eLine,\n eCol\n );\n out += e;\n break;\n }\n // JS line continuation: \\ + LF / CR / CRLF → nothing added\n if (e === '\\n' || e === '\\r') {\n if (e === '\\r' && this._ch() === '\\n') this._advance(); // consume CRLF\n this.onEscapeWarning(\n 'line continuation (\\\\<newline>) is non-standard; the newline is ignored',\n eOffset,\n eLine,\n eCol\n );\n break;\n }\n // Identity escape: \\X → X (JS accepts any \\X as just X)\n this.onEscapeWarning(\n `\\\\${e} is an unknown escape sequence; interpreted as '${e}'`,\n eOffset,\n eLine,\n eCol\n );\n out += e;\n break;\n }\n this._fail(\n `invalid escape sequence \\\\${e} in ${quote === '\"' ? 'double' : 'single'}-quoted string`,\n eLine,\n eCol\n );\n }\n } else {\n out += this._advance();\n }\n }\n if (this._eof()) this._fail('unterminated string literal');\n this._advance(); // closing quote\n return out;\n }\n\n /**\n * Parse a Unicode escape immediately after `\\u` has been consumed.\n *\n * @param quote - The enclosing string delimiter (`\"` or `'`).\n *\n * Handles two forms:\n * - `\\u{N}` … `\\u{10FFFF}`: direct Unicode scalar value (surrogates rejected)\n * - `\\uXXXX`: exactly four hex digits; a high surrogate must be followed by\n * `\\uXXXX` for the matching low surrogate to form a valid surrogate pair,\n * which is then decoded into the corresponding non-BMP code point.\n *\n * In single-quoted strings (`quote === \"'\"`), `\\u` escapes that resolve to\n * printable ASCII (U+0020–U+007E) are rejected per draft-25 §5.1 hexchar-s.\n * Use `\\\\` for backslash (U+005C) and `\\'` for the single-quote delimiter.\n */\n private _readUnicodeEscape(\n quote: string,\n bsOffset?: number,\n bsLine?: number,\n bsCol?: number\n ): string {\n const line = this.line,\n col = this.col;\n\n /** Warn or throw when this is a single-quoted string and the code point is printable ASCII. */\n const checkSingleQuotedPrintable = (cp: number): void => {\n // Per draft-25 §5.1 hexchar-s, \\u escapes for printable ASCII (U+0020–U+007E)\n // are not valid in single-quoted strings. Use \\\\ for backslash and \\' for\n // the single-quote delimiter. In lenient mode (onEscapeWarning set) we emit\n // a warning and accept the value rather than hard-failing.\n if (quote === \"'\" && cp >= 0x20 && cp <= 0x7e) {\n const msg = `\\\\u escape for printable ASCII U+${cp.toString(16).padStart(4, '0').toUpperCase()} is not allowed in single-quoted strings (§5.1 hexchar-s)`;\n if (this.onEscapeWarning) {\n this.onEscapeWarning(\n msg,\n bsOffset ?? this.pos,\n bsLine ?? line,\n bsCol ?? col\n );\n return;\n }\n this._fail(msg, line, col);\n }\n };\n\n // Extended form \\u{NNN}\n if (!this._eof() && this._ch() === '{') {\n this._advance(); // {\n let hex = '';\n while (!this._eof() && this._ch() !== '}') {\n const c = this._ch();\n if (!/[0-9a-fA-F]/.test(c))\n this._fail(\n `invalid character in \\\\u{} escape: ${JSON.stringify(c)}`,\n line,\n col\n );\n hex += this._advance();\n }\n if (this._eof()) this._fail('unterminated \\\\u{} escape', line, col);\n this._advance(); // }\n if (hex.length === 0) this._fail('empty \\\\u{} escape', line, col);\n const cp = parseInt(hex, 16);\n if (cp > 0x10_ffff)\n this._fail(\n `\\\\u{${hex}} exceeds maximum Unicode code point U+10FFFF`,\n line,\n col\n );\n if (cp >= 0xd800 && cp <= 0xdfff)\n this._fail(\n `\\\\u{${hex}} is a surrogate code point, which is not a valid Unicode scalar value`,\n line,\n col\n );\n checkSingleQuotedPrintable(cp);\n return String.fromCodePoint(cp);\n }\n\n // Standard form \\uXXXX\n let hex = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof()) this._fail('truncated \\\\uXXXX escape', line, col);\n const c = this._ch();\n if (!/[0-9a-fA-F]/.test(c))\n this._fail(\n `invalid hex digit in \\\\uXXXX escape: ${JSON.stringify(c)}`,\n line,\n col\n );\n hex += this._advance();\n }\n const cp = parseInt(hex, 16);\n\n // High surrogate: must be immediately followed by a low-surrogate escape\n if (cp >= 0xd800 && cp <= 0xdbff) {\n if (this._ch() !== '\\\\' || (this.input[this.pos + 1] ?? '') !== 'u')\n this._fail(\n `lone high surrogate \\\\u${hex} must be followed by \\\\uDC00–\\\\uDFFF`,\n line,\n col\n );\n this._advance(); // \\\n this._advance(); // u\n const line2 = this.line,\n col2 = this.col;\n let hex2 = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof())\n this._fail('truncated low-surrogate escape', line2, col2);\n hex2 += this._advance();\n }\n const cp2 = parseInt(hex2, 16);\n if (cp2 < 0xdc00 || cp2 > 0xdfff)\n this._fail(\n `\\\\u${hex} (high surrogate) not followed by a valid low surrogate (got \\\\u${hex2})`,\n line,\n col\n );\n // Surrogate pairs always resolve to non-BMP (> U+FFFF), never printable ASCII\n return String.fromCodePoint(\n 0x10000 + (cp - 0xd800) * 0x400 + (cp2 - 0xdc00)\n );\n }\n\n // Low surrogate without a preceding high surrogate is invalid\n if (cp >= 0xdc00 && cp <= 0xdfff)\n this._fail(`lone low surrogate \\\\u${hex} is not valid`, line, col);\n\n checkSingleQuotedPrintable(cp);\n return String.fromCharCode(cp);\n }\n\n /**\n * Read raw text-string content between N-backtick delimiters (§2.5.3).\n *\n * - The opening delimiter is the maximal run of consecutive backticks (N ≥ 1).\n * - A single leading newline (LF or CRLF) immediately after the opening is stripped.\n * - No escape sequences are processed — content is taken verbatim.\n * - Literal CR is stripped for source-level CRLF normalisation.\n * - The closing delimiter is the first run of M ≥ N backticks; any excess\n * M-N backticks are appended to the content before closing.\n */\n private _readRawStringContent(): string {\n const openLine = this.line,\n openCol = this.col;\n\n // Count opening backticks (greedy)\n let n = 0;\n while (!this._eof() && this._ch() === '`') {\n this._advance();\n n++;\n }\n\n // Strip a single leading CRLF or LF (§2.5.3)\n if (!this._eof() && this._ch() === '\\r') this._advance(); // CR\n if (!this._eof() && this._ch() === '\\n') this._advance(); // LF\n\n const inputLen = this.input.length;\n let out = '';\n while (!this._eof()) {\n // Fast path: bulk-consume a run of ordinary characters up to the next\n // backtick, CR, or control character. LF is ordinary content; it is\n // counted here so line/col stay correct.\n let p = this.pos;\n let newlines = 0;\n let lastNewline = -1;\n while (p < inputLen) {\n const cc = this.input.charCodeAt(p);\n if (cc === 0x60 /* ` */ || cc === 0x7f /* DEL */) break;\n if (cc < 0x20) {\n if (cc !== 0x0a) break; // CR / other C0 controls → slow path\n newlines++;\n lastNewline = p;\n }\n p++;\n }\n if (p > this.pos) {\n out += this.input.slice(this.pos, p);\n if (newlines > 0) {\n this.line += newlines;\n this.col = p - lastNewline;\n } else {\n this.col += p - this.pos;\n }\n this.pos = p;\n continue;\n }\n\n const ch = this._ch();\n\n // Source-level CRLF normalisation: strip bare CR\n if (ch === '\\r') {\n this._advance();\n continue;\n }\n\n if (ch === '`') {\n // Count this backtick run\n let m = 0;\n while (!this._eof() && this._ch() === '`') {\n this._advance();\n m++;\n }\n if (m >= n) {\n // Closing delimiter found; excess backticks become content\n out += '`'.repeat(m - n);\n if (out === '')\n this._fail(\n 'raw string must not be empty (§2.5.3)',\n openLine,\n openCol\n );\n return out;\n }\n // Not enough backticks — all become content\n out += '`'.repeat(m);\n } else {\n const cp = ch.codePointAt(0)!;\n // rawchars = 1*(%x0a/%x0d / %x20-5f / %x61-7e / NONASCII) — HT and other C0 controls forbidden\n if (cp < 0x20 && cp !== 0x0a && cp !== 0x0d) {\n this._fail(\n `raw string content must not contain control character U+${cp.toString(16).toUpperCase().padStart(4, '0')} (§2.5.3)`,\n this.line,\n this.col\n );\n }\n if (cp === 0x7f) {\n this._fail(\n 'raw string content must not contain DEL (U+007F) (§2.5.3)',\n this.line,\n this.col\n );\n }\n out += this._advance();\n }\n }\n\n this._fail('unterminated raw string literal', openLine, openCol);\n }\n\n /**\n * Post-process raw hex content from a `h``…``\\` raw string (§5.3.3).\n *\n * Skips:\n * - lblank whitespace (LF, SP; also CR for source-level normalisation)\n * - `/ … /` block comments\n * - `# …` line comments (up to but not including LF)\n * Detects `...` ellipsis sequences.\n *\n * A trailing `# comment` immediately before the closing delimiter is allowed\n * per §5.3.3 `r-app-string-h`.\n *\n * Returns { value: hex-string-with-ellipsis-markers, elided: boolean }\n */\n private _processRawHexContent(\n raw: string,\n tokenLine: number,\n tokenCol: number\n ): { value: string; elided: boolean } {\n let hex = '';\n let elided = false;\n let i = 0;\n while (i < raw.length) {\n const ch = raw[i];\n // lblank / CR — skip\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n i++;\n continue;\n }\n // HT is still forbidden (rawchars excludes %x09)\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside h`` raw byte string literals (§5.3.3)',\n tokenLine,\n tokenCol\n );\n }\n // Comments (§2.2)\n const afterComment = this._skipRawComment(\n raw,\n i,\n 'h`` raw byte string',\n tokenLine,\n tokenCol\n );\n if (afterComment !== -1) {\n i = afterComment;\n continue;\n }\n // Ellipsis: ... (three or more dots)\n if (ch === '.' && raw[i + 1] === '.' && raw[i + 2] === '.') {\n i += 3;\n while (i < raw.length && raw[i] === '.') i++;\n hex += '...';\n elided = true;\n continue;\n }\n // Hex digits — consume the whole run at once\n if (isHexDigitCode(raw.charCodeAt(i))) {\n const runStart = i;\n while (i < raw.length && isHexDigitCode(raw.charCodeAt(i))) i++;\n hex += raw.slice(runStart, i);\n continue;\n }\n this._fail(\n `unexpected character ${JSON.stringify(ch)} in h\\`\\` raw byte string`,\n tokenLine,\n tokenCol\n );\n }\n return { value: hex, elided };\n }\n\n /**\n * Post-process raw base64 content from a `b64``…``\\` raw string (§5.3.4).\n *\n * Skips:\n * - lblank whitespace (LF, SP; also CR for source-level normalisation)\n * - `# …` line comments (up to but not including LF)\n *\n * Returns the stripped base64 string.\n */\n private _processRawB64Content(\n raw: string,\n tokenLine: number,\n tokenCol: number\n ): string {\n let out = '';\n let i = 0;\n while (i < raw.length) {\n const ch = raw[i];\n // lblank / CR — skip\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n i++;\n continue;\n }\n // HT forbidden\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside b64`` raw byte string literals (§5.3.4)',\n tokenLine,\n tokenCol\n );\n }\n // Line comment: # … (to end of line)\n // Note: // is NOT treated as a comment because / is a valid B64DIGIT\n // (e.g. 0xFF 0xFF encodes to //8= in standard base64).\n if (ch === '#') {\n while (i < raw.length && raw[i] !== '\\n') i++;\n continue;\n }\n // Run of data characters — consume in bulk up to the next terminator\n const runStart = i;\n while (i < raw.length) {\n const d = raw[i];\n if (d === '\\n' || d === ' ' || d === '\\r' || d === '\\t' || d === '#')\n break;\n i++;\n }\n out += raw.slice(runStart, i);\n }\n return out;\n }\n\n /**\n * Read raw byte-string content between `quote` chars (b64 / b64url).\n *\n * Strips whitespace and skips `# ...` line comments per §2.5.5.\n * `/` is NOT treated as a comment delimiter because it is a valid base64 character.\n */\n private _readByteContent(quote: string): string {\n this._advance(); // opening quote\n let raw = '';\n while (!this._eof() && this._ch() !== quote) {\n const ch = this._ch();\n // lblank = %x0A / %x20 — only LF and SP are whitespace (§5.2.2 Fig 4); HT is forbidden\n if (ch === '\\n' || ch === ' ') {\n this._advance();\n continue;\n }\n if (ch === '\\r') {\n // CR is not lblank; skip silently as source-level normalization only\n this._advance();\n continue;\n }\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside byte string literals (§5.2.2)',\n this.line,\n this.col\n );\n }\n // # line comment — stop at newline or the closing quote (whichever comes first)\n // Note: // is NOT treated as a comment here because / is a valid B64DIGIT;\n // treating // as a comment would corrupt base64 data that naturally contains\n // consecutive slashes (e.g. 0xFF 0xFF encodes to //8= in standard base64).\n if (ch === '#') {\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof() && this._ch() !== '\\n') this._advance();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n continue;\n }\n // Run of data characters — consume in bulk up to the next terminator.\n // Newlines terminate the run, so a plain column update is safe.\n const runStart = this.pos;\n let p = this.pos;\n const n = this.input.length;\n while (p < n) {\n const d = this.input[p];\n if (\n d === quote ||\n d === '\\n' ||\n d === ' ' ||\n d === '\\r' ||\n d === '\\t' ||\n d === '#'\n )\n break;\n p++;\n }\n this.col += p - runStart;\n this.pos = p;\n raw += this.input.slice(runStart, p);\n }\n if (this._eof()) this._fail('unterminated byte string literal');\n this._advance(); // closing quote\n return raw;\n }\n\n /**\n * Read hex byte-string content, recognising `...` ellipsis sequences (§4.2).\n *\n * Returns the raw hex string (with `...` markers embedded) and a flag\n * indicating whether any ellipsis was found.\n */\n private _readHexByteContentElisionAware(quote: string): {\n value: string;\n elided: boolean;\n } {\n this._advance(); // opening quote\n let hex = '';\n let elided = false;\n while (!this._eof() && this._ch() !== quote) {\n const ch = this._ch();\n // lblank = %x0A / %x20 only; HT is forbidden per §5.2 Figure 3\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n this._advance();\n continue;\n }\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside hex byte string literals (§5.2.1)',\n this.line,\n this.col\n );\n }\n if (this._skipByteStringComment(quote)) continue;\n // Detect '...' ellipsis inside hex literal\n if (\n ch === '.' &&\n (this.input[this.pos + 1] ?? '') === '.' &&\n (this.input[this.pos + 2] ?? '') === '.'\n ) {\n this._advance();\n this._advance();\n this._advance();\n // consume any additional dots (spec says \"three or more\")\n while (!this._eof() && this._ch() === '.') this._advance();\n // adjacent ... separated only by whitespace collapse into a single ellipsis\n if (!hex.endsWith('...')) hex += '...';\n elided = true;\n continue;\n }\n if (isHexDigitCode(ch.charCodeAt(0))) {\n // Run of hex digits — consume in bulk (digits contain no newlines)\n const runStart = this.pos;\n let p = this.pos;\n const n = this.input.length;\n while (p < n && isHexDigitCode(this.input.charCodeAt(p))) p++;\n this.col += p - runStart;\n this.pos = p;\n hex += this.input.slice(runStart, p);\n continue;\n }\n this._fail(\n `unexpected character ${JSON.stringify(ch)} in hex byte string`\n );\n }\n if (this._eof()) this._fail('unterminated hex byte string literal');\n this._advance(); // closing quote\n return { value: hex, elided };\n }\n\n // ── Token reader ─────────────────────────────────────────────────────────\n\n private _readNext(): Token {\n this._skipWS();\n const offset = this.pos;\n const tok = this._readNextCore();\n return {\n ...tok,\n raw: this.input.slice(offset, this.pos),\n offset,\n endOffset: this.pos,\n };\n }\n\n private _readNextCore(): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n const line = this.line,\n col = this.col;\n if (this._eof()) return { type: 'EOF', value: '', line, col };\n\n const c = this._ch();\n\n switch (c) {\n case '[':\n this._advance();\n return { type: 'LBRACKET', value: '[', line, col };\n case ']':\n this._advance();\n return { type: 'RBRACKET', value: ']', line, col };\n case '{':\n this._advance();\n return { type: 'LBRACE', value: '{', line, col };\n case '}':\n this._advance();\n return { type: 'RBRACE', value: '}', line, col };\n case '(':\n this._advance();\n return { type: 'LPAREN', value: '(', line, col };\n case ')':\n this._advance();\n return { type: 'RPAREN', value: ')', line, col };\n case ':':\n this._advance();\n return { type: 'COLON', value: ':', line, col };\n case ',':\n this._advance();\n return { type: 'COMMA', value: ',', line, col };\n case '<':\n if ((this.input[this.pos + 1] ?? '') === '<') {\n this._advance();\n this._advance();\n return { type: 'LT_LT', value: '<<', line, col };\n }\n this._fail(`unexpected character '<'`, line, col);\n case '>':\n if ((this.input[this.pos + 1] ?? '') === '>') {\n this._advance();\n this._advance();\n return { type: 'GT_GT', value: '>>', line, col };\n }\n this._fail(`unexpected character '>'`, line, col);\n case '+': {\n // +Infinity[_N]\n const posInf = this._readSignedInfinity('+', line, col);\n if (posInf !== null) return posInf;\n // Numeric literal with explicit positive sign\n const afterPlus = this.input[this.pos + 1] ?? '';\n if ((afterPlus >= '0' && afterPlus <= '9') || afterPlus === '.') {\n this._advance(); // consume '+'\n return this._readNumber(line, col);\n }\n // String concatenation operator\n this._advance();\n return { type: 'PLUS', value: '+', line, col };\n }\n case '`':\n return {\n type: 'RAWSTRING',\n value: this._readRawStringContent(),\n line,\n col,\n };\n case '\"': {\n const strVal = this._readStringContent('\"');\n if (strVal === '' && this._ch() === '_') {\n this._advance(); // _\n return { type: 'EMPTY_INDEF_TEXT', value: '', line, col };\n }\n return { type: 'TSTR', value: strVal, line, col };\n }\n case \"'\": {\n // ''_ → empty indefinite byte string\n if (\n (this.input[this.pos + 1] ?? '') === \"'\" &&\n (this.input[this.pos + 2] ?? '') === '_'\n ) {\n this._advance(); // first '\n this._advance(); // second '\n this._advance(); // _\n return { type: 'EMPTY_INDEF_BYTES', value: '', line, col };\n }\n // 'text' → UTF-8 encoded byte string (major type 2)\n const strVal = this._readStringContent(\"'\");\n const utf8 = textEncoder.encode(strVal);\n const hex = Array.from(utf8, (b) =>\n b.toString(16).padStart(2, '0')\n ).join('');\n return { type: 'SQSTR', value: hex, line, col };\n }\n }\n\n // -Infinity (check before generic '-' handling)\n if (c === '-') {\n const negInf = this._readSignedInfinity('-', line, col);\n if (negInf !== null) return negInf;\n return this._readNumber(line, col);\n }\n\n if (c >= '0' && c <= '9') return this._readNumber(line, col);\n // Leading-dot float: .5, .1e2, etc. (same as +.5 / -.5)\n if (c === '.' && /[0-9]/.test(this.input[this.pos + 1] ?? ''))\n return this._readNumber(line, col);\n if (/[a-zA-Z_]/.test(c)) return this._readIdent(line, col);\n\n // Three or more dots → ellipsis notation (§4.2)\n if (c === '.') {\n if (\n (this.input[this.pos + 1] ?? '') === '.' &&\n (this.input[this.pos + 2] ?? '') === '.'\n ) {\n this._advance();\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() === '.') this._advance();\n return { type: 'ELLIPSIS', value: '...', line, col };\n }\n this._fail(`unexpected character '.'`, line, col);\n }\n\n this._fail(`unexpected character ${JSON.stringify(c)}`, line, col);\n }\n\n /**\n * Try to read `Infinity[_N]` immediately after a `+`/`-` sign at this.pos.\n *\n * Returns null when the input is not an Infinity literal (e.g. an identifier\n * like `Infinityx` that merely starts with \"Infinity\"); the caller then\n * falls back to its sign handling.\n *\n * All encoding-indicator suffixes _0–_7/_i are tokenized here; the parser\n * validates them and rejects/warns on the invalid ones (_0, _4–_7, _i).\n *\n * Uses startsWith with a position argument instead of slicing the remainder\n * of the input, which would allocate a substring for every sign token.\n */\n private _readSignedInfinity(\n sign: '+' | '-',\n line: number,\n col: number\n ): Omit<Token, 'raw' | 'offset' | 'endOffset'> | null {\n if (!this.input.startsWith('Infinity', this.pos + 1)) return null;\n const after = this.input[this.pos + 9] ?? '';\n const hasSuffix =\n after === '_' &&\n /[0-7i]/.test(this.input[this.pos + 10] ?? '') &&\n !/[a-zA-Z0-9_]/.test(this.input[this.pos + 11] ?? '');\n if (/[a-zA-Z0-9_]/.test(after) && !hasSuffix) return null;\n this._advance(); // sign\n for (let i = 0; i < 8; i++) this._advance(); // Infinity\n let value = sign === '-' ? '-Infinity' : 'Infinity';\n if (hasSuffix) value += this._advance() + this._advance(); // _N\n return { type: 'FLOAT', value, line, col };\n }\n\n /** Advance past a run of hex digits. Digits contain no newlines, so a\n * plain column update is safe. */\n private _skipHexDigits(): void {\n let p = this.pos;\n const n = this.input.length;\n while (p < n && isHexDigitCode(this.input.charCodeAt(p))) p++;\n this.col += p - this.pos;\n this.pos = p;\n }\n\n /** Advance past a run of decimal digits (same newline-free guarantee). */\n private _skipDecimalDigits(): void {\n let p = this.pos;\n const n = this.input.length;\n while (p < n) {\n const c = this.input.charCodeAt(p);\n if (c < 0x30 || c > 0x39) break;\n p++;\n }\n this.col += p - this.pos;\n this.pos = p;\n }\n\n /**\n * Consume a trailing _0–_7/_i encoding-indicator suffix when present and\n * not followed by another identifier character.\n */\n private _tryConsumeEncodingSuffix(): void {\n if (this._ch() !== '_') return;\n const d = this.input[this.pos + 1] ?? '';\n const after = this.input[this.pos + 2] ?? '';\n if (((d >= '0' && d <= '7') || d === 'i') && !/[0-9a-zA-Z_]/.test(after)) {\n this._advance();\n this._advance();\n }\n }\n\n private _readNumber(\n line: number,\n col: number\n ): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n // The token value is the raw consumed text; it is collected with a single\n // slice at the end instead of per-character string concatenation.\n const start = this.pos;\n const consumed = () => this.input.slice(start, this.pos);\n if (this._ch() === '-') this._advance();\n\n // Alternative bases: 0x 0o 0b\n if (this._ch() === '0') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === 'x' || next === 'X') {\n this._advance();\n this._advance(); // '0x'\n const intStart = this.pos;\n this._skipHexDigits();\n const hasIntDigits = this.pos > intStart;\n // Hex float: optional '.[hex]' fractional part followed by 'p'/'P' exponent\n let isHexFloat = false;\n let hasFracDigits = false;\n if (!this._eof() && this._ch() === '.') {\n isHexFloat = true;\n this._advance();\n const fracStart = this.pos;\n this._skipHexDigits();\n hasFracDigits = this.pos > fracStart;\n }\n if (!this._eof() && (this._ch() === 'p' || this._ch() === 'P')) {\n isHexFloat = true;\n // Validate mantissa: need at least one hex digit before or after dot\n if (!hasIntDigits && !hasFracDigits)\n this._fail(\n `hex float has no mantissa digits: ${consumed()}`,\n line,\n col\n );\n this._advance();\n if (!this._eof() && (this._ch() === '+' || this._ch() === '-'))\n this._advance();\n const expStart = this.pos;\n this._skipDecimalDigits();\n // Validate exponent: at least one decimal digit required\n if (this.pos === expStart)\n this._fail(\n `hex float missing exponent digits: ${consumed()}`,\n line,\n col\n );\n } else if (isHexFloat) {\n // Had a dot but no 'p' — missing exponent\n this._fail(\n `hex float missing 'p' exponent: ${consumed()}`,\n line,\n col\n );\n }\n if (isHexFloat) {\n // Encoding-indicator suffix _0/_1/_2/_3/_4/_5/_6/_7/_i for hex floats\n this._tryConsumeEncodingSuffix();\n return { type: 'FLOAT', value: consumed(), line, col };\n }\n return { type: 'INTEGER', value: consumed(), line, col };\n }\n if (next === 'o' || next === 'O') {\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '7')\n this._advance();\n return { type: 'INTEGER', value: consumed(), line, col };\n }\n if (next === 'b' || next === 'B') {\n this._advance();\n this._advance();\n while (!this._eof() && (this._ch() === '0' || this._ch() === '1'))\n this._advance();\n return { type: 'INTEGER', value: consumed(), line, col };\n }\n }\n\n // Decimal digits\n this._skipDecimalDigits();\n\n let isFloat = false;\n if (!this._eof() && this._ch() === '.') {\n isFloat = true;\n this._advance();\n this._skipDecimalDigits();\n }\n if (!this._eof() && (this._ch() === 'e' || this._ch() === 'E')) {\n isFloat = true;\n this._advance();\n if (!this._eof() && (this._ch() === '+' || this._ch() === '-'))\n this._advance();\n const expStart = this.pos;\n this._skipDecimalDigits();\n if (this.pos === expStart)\n this._fail(\n `float exponent has no digits: ${JSON.stringify(consumed())}`,\n line,\n col\n );\n }\n\n // Encoding-indicator suffix _0–_7 / _i (no whitespace, not followed by\n // more ident chars). The suffix is included in the token value.\n // isFloat is NOT set here — a float is only a float when it contains\n // '.' or 'e'/'E'. The parser extracts encoding width from the suffix.\n this._tryConsumeEncodingSuffix();\n\n return {\n type: isFloat ? 'FLOAT' : 'INTEGER',\n value: consumed(),\n line,\n col,\n };\n }\n\n private _readIdent(\n line: number,\n col: number\n ): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n // Idents contain no newlines, so a plain column update is safe.\n const identStart = this.pos;\n {\n let p = this.pos;\n const n = this.input.length;\n while (p < n) {\n const cc = this.input.charCodeAt(p);\n const isIdentChar =\n (cc >= 0x61 && cc <= 0x7a) || // a-z\n (cc >= 0x41 && cc <= 0x5a) || // A-Z\n (cc >= 0x30 && cc <= 0x39) || // 0-9\n cc === 0x5f; // _\n if (!isIdentChar) break;\n p++;\n }\n this.col += p - this.pos;\n this.pos = p;\n }\n let ident = this.input.slice(identStart, this.pos);\n\n // Known keywords — checked first so they are never shadowed by app-strings.\n switch (ident) {\n case 'true':\n return { type: 'TRUE', value: ident, line, col };\n case 'false':\n return { type: 'FALSE', value: ident, line, col };\n case 'null':\n return { type: 'NULL', value: ident, line, col };\n case 'undefined':\n return { type: 'UNDEFINED', value: ident, line, col };\n case 'NaN':\n case 'NaN_0':\n case 'NaN_1':\n case 'NaN_2':\n case 'NaN_3':\n case 'NaN_4':\n case 'NaN_5':\n case 'NaN_6':\n case 'NaN_7':\n case 'NaN_i':\n case 'Infinity':\n case 'Infinity_0':\n case 'Infinity_1':\n case 'Infinity_2':\n case 'Infinity_3':\n case 'Infinity_4':\n case 'Infinity_5':\n case 'Infinity_6':\n case 'Infinity_7':\n case 'Infinity_i':\n return { type: 'FLOAT', value: ident, line, col };\n case 'simple':\n return { type: 'SIMPLE', value: ident, line, col };\n case '_':\n return { type: 'UNDERSCORE', value: '_', line, col };\n // Encoding indicators used in array/map/string/bytes contexts\n case '_0':\n return { type: 'ENCODING_INDICATOR', value: '0', line, col };\n case '_1':\n return { type: 'ENCODING_INDICATOR', value: '1', line, col };\n case '_2':\n return { type: 'ENCODING_INDICATOR', value: '2', line, col };\n case '_3':\n return { type: 'ENCODING_INDICATOR', value: '3', line, col };\n case '_4':\n return { type: 'ENCODING_INDICATOR', value: '4', line, col };\n case '_5':\n return { type: 'ENCODING_INDICATOR', value: '5', line, col };\n case '_6':\n return { type: 'ENCODING_INDICATOR', value: '6', line, col };\n case '_7':\n // _7 = AI 31 = indefinite-length; kept as ENCODING_INDICATOR so that\n // bare `_` (UNDERSCORE) and explicit `_7` stay distinguishable.\n return { type: 'ENCODING_INDICATOR', value: '7', line, col };\n case '_i':\n return { type: 'ENCODING_INDICATOR', value: 'i', line, col };\n }\n\n // Byte-string prefixes or app-string extensions.\n // App-prefix grammar (§3 of draft-ietf-cbor-edn-literals-25):\n // app-prefix = lcalpha *lcldh / ucalpha *ucldh\n // lcldh = lcalpha / DIGIT / \"-\"\n // ucldh = ucalpha / DIGIT / \"-\"\n // Mixed-case or underscore-containing idents are not valid app-prefixes.\n const firstChar = ident[0] ?? '';\n const isLower = firstChar >= 'a' && firstChar <= 'z';\n const isUpper = firstChar >= 'A' && firstChar <= 'Z';\n\n if (isLower || isUpper) {\n // Validate chars already consumed by the main loop (no underscore, correct case).\n const restAlreadyRead = ident.slice(1);\n const restValid = isLower\n ? /^[a-z0-9]*$/.test(restAlreadyRead)\n : /^[A-Z0-9]*$/.test(restAlreadyRead);\n\n if (restValid) {\n // Extend the prefix with any remaining lcldh / ucldh chars.\n // The main loop stops at '-', so we need to consume hyphen-segments here.\n const extStart = this.pos;\n while (!this._eof()) {\n const ch = this._ch();\n const validCh = isLower\n ? (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch === '-'\n : (ch >= 'A' && ch <= 'Z') ||\n (ch >= '0' && ch <= '9') ||\n ch === '-';\n if (!validCh) break;\n this.pos++;\n }\n if (this.pos > extStart) {\n this.col += this.pos - extStart;\n ident += this.input.slice(extStart, this.pos);\n }\n\n const q = this._ch();\n // Double quotes are not valid for app-string / byte-string prefixes.\n // app-string = app-prefix sqstr (sqstr uses single quotes only)\n if (q === '\"')\n this._fail(\n `\"${ident}\" prefix requires single quotes or backticks, not double quotes`,\n line,\n col\n );\n if (q === \"'\") {\n switch (ident) {\n case 'h': {\n const { value: hexVal, elided } =\n this._readHexByteContentElisionAware(q);\n return {\n type: elided ? 'BYTES_HEX_ELIDED' : 'BYTES_HEX',\n value: hexVal,\n line,\n col,\n };\n }\n case 'b64':\n return {\n type: 'BYTES_B64',\n value: this._readByteContent(q),\n line,\n col,\n };\n default:\n return {\n type: 'APP_STRING',\n appPrefix: ident,\n value: this._readStringContent(q),\n line,\n col,\n };\n }\n }\n\n // app-rstring: prefix followed by backtick raw string (§2.5.3 / app-rstring)\n if (q === '`') {\n const raw = this._readRawStringContent();\n switch (ident) {\n case 'h': {\n // §5.3.3: lblank + / / block comments + # line comments + ellipsis\n const { value: hexVal, elided } = this._processRawHexContent(\n raw,\n line,\n col\n );\n return {\n type: elided ? 'BYTES_HEX_ELIDED' : 'BYTES_HEX',\n value: hexVal,\n line,\n col,\n };\n }\n case 'b64':\n // §5.3.4: lblank + # line comments\n return {\n type: 'BYTES_B64',\n value: this._processRawB64Content(raw, line, col),\n line,\n col,\n };\n default:\n return {\n type: 'APP_STRING',\n appPrefix: ident,\n value: raw,\n line,\n col,\n };\n }\n }\n\n // App-sequence extension: prefix<<items...>>\n // The tokenizer consumes only prefix + \"<<\"; the parser reads items until \">>\".\n if (q === '<' && (this.input[this.pos + 1] ?? '') === '<') {\n this._advance();\n this._advance(); // <<\n return {\n type: 'APP_SEQUENCE',\n appPrefix: ident,\n value: '',\n line,\n col,\n };\n }\n }\n }\n\n this._fail(`unknown identifier ${JSON.stringify(ident)}`, line, col);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tokenizer-BuRSmdyM.js","names":[],"sources":["../src/cdn/errors.ts","../src/cdn/tokenizer.ts"],"sourcesContent":["/**\n * Structured syntax error thrown by the CDN tokenizer and parser.\n *\n * Carries the source position of the failure so tooling (editors, linters,\n * playgrounds) can point at the offending range without parsing the message.\n * Position fields are present whenever the failure site knows them.\n */\nexport class CdnSyntaxError extends SyntaxError {\n /** Character offset of the start of the offending range in the source input. */\n readonly offset?: number;\n /** 1-based line number of the offending range. */\n readonly line?: number;\n /** 1-based column number of the offending range. */\n readonly column?: number;\n /** Character offset just past the end of the offending range. */\n readonly endOffset?: number;\n\n constructor(\n message: string,\n position?: {\n offset?: number;\n line?: number;\n column?: number;\n endOffset?: number;\n }\n ) {\n const loc =\n position?.line !== undefined\n ? ` at line ${position.line}, column ${position.column}`\n : '';\n super(`EDN parse error${loc}: ${message}`);\n this.name = 'CdnSyntaxError';\n this.offset = position?.offset;\n this.line = position?.line;\n this.column = position?.column;\n this.endOffset = position?.endOffset;\n }\n}\n","/**\n * CDN lexer (internal).\n *\n * Used by parser.ts for parsing and by CborTextString serialization to collect\n * source offsets after parseCDN() has already validated embedded CDN.\n */\n\nimport { CdnSyntaxError } from './errors';\n\nexport type TokenType =\n | 'INTEGER'\n | 'FLOAT'\n | 'TSTR'\n | 'SQSTR'\n | 'RAWSTRING'\n | 'BYTES_HEX'\n | 'BYTES_HEX_ELIDED'\n | 'BYTES_B64'\n | 'APP_STRING'\n | 'APP_SEQUENCE'\n | 'EMPTY_INDEF_BYTES'\n | 'EMPTY_INDEF_TEXT'\n | 'TRUE'\n | 'FALSE'\n | 'NULL'\n | 'UNDEFINED'\n | 'SIMPLE'\n | 'LBRACKET'\n | 'RBRACKET'\n | 'LBRACE'\n | 'RBRACE'\n | 'LPAREN'\n | 'RPAREN'\n | 'COLON'\n | 'COMMA'\n | 'PLUS'\n | 'UNDERSCORE'\n | 'ENCODING_INDICATOR'\n | 'LT_LT'\n | 'GT_GT'\n | 'ELLIPSIS'\n | 'EOF'\n /** Synthetic token emitted by tokenizeLenient() for the unscannable tail. */\n | 'ERROR';\n\nexport interface Token {\n type: TokenType;\n /** Processed value: decoded string content, raw number text, raw byte content, etc. */\n value: string;\n /** Original source text for this token. */\n raw: string;\n line: number;\n col: number;\n /** Character offset of the first character of this token in the source input. */\n offset: number;\n /** Character offset just past the last character of this token in the source input. */\n endOffset: number;\n /** Only set when type === 'APP_STRING': the extension prefix (e.g. 'dt', 'DT'). */\n appPrefix?: string;\n}\n\nexport interface TokenizerOptions {\n /** Character offset at which tokenization starts. */\n offset?: number;\n}\n\nexport interface EdnComment {\n kind: 'line' | 'block';\n marker: '#' | '//' | '/*' | '/';\n text: string;\n start: number;\n end: number;\n line: number;\n col: number;\n}\n\n/** Inverse of positionAt; only used on the cold error path. */\nfunction offsetAt(input: string, line: number, col: number): number {\n let l = 1;\n let c = 1;\n for (let i = 0; i < input.length; i++) {\n if (l === line && c === col) return i;\n if (input[i] === '\\n') {\n l++;\n c = 1;\n } else {\n c++;\n }\n }\n return input.length;\n}\n\nfunction positionAt(\n input: string,\n offset: number\n): { line: number; col: number } {\n let line = 1;\n let col = 1;\n for (let i = 0; i < offset; i++) {\n if (input[i] === '\\n') {\n line++;\n col = 1;\n } else {\n col++;\n }\n }\n return { line, col };\n}\n\n// ─── Scanning helpers (hot path) ─────────────────────────────────────────────\n//\n// Token content is consumed in bulk runs: a charCodeAt loop locates the next\n// character that needs individual handling, and everything before it is\n// appended with a single slice instead of per-character concatenation.\n\nfunction isHexDigitCode(c: number): boolean {\n return (\n (c >= 0x30 && c <= 0x39) || // 0-9\n (c >= 0x61 && c <= 0x66) || // a-f\n (c >= 0x41 && c <= 0x46) // A-F\n );\n}\n\n/** Shared encoder — constructing TextEncoder per token is needlessly slow. */\nconst textEncoder = new TextEncoder();\n\nexport class Tokenizer {\n private pos: number;\n private line: number;\n private col: number;\n private _peeked: Token | null = null;\n private _lastConsumedEndOffset: number;\n /** Comments encountered while scanning, appended in source order. */\n readonly comments: EdnComment[] = [];\n /**\n * When set, non-standard-but-JS-valid escape sequences are accepted instead\n * of throwing. The callback receives a message and the position of the `\\`\n * (offset, line, column) so the parser can forward it as a ParseWarning.\n */\n onEscapeWarning?: (\n msg: string,\n offset: number,\n line: number,\n col: number\n ) => void;\n constructor(\n private readonly input: string,\n options?: TokenizerOptions\n ) {\n const offset = options?.offset ?? 0;\n if (!Number.isInteger(offset) || offset < 0 || offset > input.length)\n throw new RangeError(\n `EDN parse offset must be an integer between 0 and ${input.length}`\n );\n const position = positionAt(input, offset);\n this.pos = offset;\n this.line = position.line;\n this.col = position.col;\n this._lastConsumedEndOffset = offset;\n }\n\n peek(): Token {\n if (this._peeked === null) this._peeked = this._readNext();\n return this._peeked;\n }\n\n consume(): Token {\n const tok = this._peeked !== null ? this._peeked : this._readNext();\n this._peeked = null;\n this._lastConsumedEndOffset = tok.endOffset;\n return tok;\n }\n\n /** Character offset just past the last character of the most recently consumed token. */\n get lastEndOffset(): number {\n return this._lastConsumedEndOffset;\n }\n\n /** The full source text supplied to this tokenizer. */\n get source(): string {\n return this.input;\n }\n\n // ── Internal helpers ─────────────────────────────────────────────────────\n\n private _ch(): string {\n return this.input[this.pos] ?? '';\n }\n private _eof(): boolean {\n return this.pos >= this.input.length;\n }\n\n private _advance(): string {\n const c = this.input[this.pos++] ?? '';\n if (c === '\\n') {\n this.line++;\n this.col = 1;\n } else {\n this.col++;\n }\n return c;\n }\n\n private _fail(msg: string, line = this.line, col = this.col): never {\n const offset =\n line === this.line && col === this.col\n ? this.pos\n : offsetAt(this.input, line, col);\n throw new CdnSyntaxError(msg, { offset, line, column: col });\n }\n\n private _skipWS(): void {\n for (;;) {\n // Skip whitespace characters. Common ASCII whitespace is matched with\n // direct comparisons; printable ASCII can never match /\\s/, so the\n // regex only runs for the rare remaining characters (e.g. \\f, NBSP).\n for (;;) {\n const ws = this.input[this.pos];\n if (ws === undefined) return;\n if (ws === ' ' || ws === '\\n' || ws === '\\t' || ws === '\\r') {\n this._advance();\n continue;\n }\n if (ws > ' ' && ws <= '~') break; // printable ASCII — not whitespace\n if (/\\s/.test(ws)) {\n this._advance();\n continue;\n }\n break;\n }\n\n const c = this._ch();\n\n // CDN line comment: # to end of line\n if (c === '#') {\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n while (!this._eof() && this._ch() !== '\\n') this._advance();\n this.comments.push({\n kind: 'line',\n marker: '#',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n\n // Comments starting with /\n if (c === '/') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === '/') {\n // EDN end-of-line comment: // to end of line (§2.2)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() !== '\\n') this._advance();\n this.comments.push({\n kind: 'line',\n marker: '//',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n if (next === '*') {\n // EDN block comment: /* ... */ (§2.2)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance();\n this._advance();\n this._skipBlockCommentStar();\n this.comments.push({\n kind: 'block',\n marker: '/*',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n // EDN slash-delimited comment: / ... / (§2.2, first char must not be * or /)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance(); // consume opening /\n this._skipBlockCommentSlash();\n this.comments.push({\n kind: 'block',\n marker: '/',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n\n return;\n }\n }\n\n /**\n * Skip a comment in a quoted byte string literal (h'', b64'').\n * Returns true if a comment was consumed, false if the current char is not a\n * comment start. `quote` is the closing delimiter character.\n *\n * Supports / ... /, /* *\\/, //, and # comment forms (§2.2).\n */\n private _skipByteStringComment(quote: string): boolean {\n const ch = this._ch();\n if (ch === '/') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === '/') {\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof() && this._ch() !== '\\n') this._advance();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n return true;\n }\n if (next === '*') {\n this._advance();\n this._advance();\n this._skipBlockCommentStar();\n return true;\n }\n this._advance();\n this._skipBlockCommentSlash();\n return true;\n }\n if (ch === '#') {\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance(); // consume '\\'\n if (this._eof() || this._ch() === '\\n') continue;\n const escaped = this._advance();\n if (escaped === 'u') this._validateHexCommentUnicodeEscape();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n return true;\n }\n return false;\n }\n\n /**\n * Validate a `\\uXXXX` or `\\u{N}` escape inside a hex-string comment.\n *\n * Called immediately after the `u` character has been consumed. Rejects\n * lone surrogates and invalid surrogate pairs; tolerates truncated/\n * non-hex sequences (comments are informational, but surrogates are\n * always illegal).\n */\n private _validateHexCommentUnicodeEscape(): void {\n const line = this.line,\n col = this.col;\n\n // Extended form \\u{XXXXXX}\n if (!this._eof() && this._ch() === '{') {\n this._advance(); // {\n let hex = '';\n while (!this._eof() && this._ch() !== '}' && this._ch() !== '\\n')\n hex += this._advance();\n if (!this._eof() && this._ch() === '}') this._advance(); // }\n const cp = parseInt(hex || '0', 16);\n if (cp >= 0xd800 && cp <= 0xdfff)\n this._fail(\n `\\\\u{${hex}} is a surrogate code point, not allowed in hex string comments`,\n line,\n col\n );\n return;\n }\n\n // Standard \\uXXXX — read up to 4 hex digits\n let hex = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof() || this._ch() === '\\n') break;\n if (!/[0-9a-fA-F]/.test(this._ch())) break;\n hex += this._advance();\n }\n if (hex.length < 4) return; // truncated / non-hex — not our problem\n\n const cp = parseInt(hex, 16);\n\n // High surrogate: must be followed immediately by a low-surrogate escape\n if (cp >= 0xd800 && cp <= 0xdbff) {\n if (this._ch() !== '\\\\' || (this.input[this.pos + 1] ?? '') !== 'u')\n this._fail(\n `lone high surrogate \\\\u${hex} in hex string comment`,\n line,\n col\n );\n this._advance(); // \\\n this._advance(); // u\n let hex2 = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof() || this._ch() === '\\n') break;\n if (!/[0-9a-fA-F]/.test(this._ch())) break;\n hex2 += this._advance();\n }\n const cp2 = parseInt(hex2 || '0', 16);\n if (cp2 < 0xdc00 || cp2 > 0xdfff)\n this._fail(\n `\\\\u${hex} (high surrogate) not followed by valid low surrogate in hex string comment`,\n line,\n col\n );\n return;\n }\n\n if (cp >= 0xdc00 && cp <= 0xdfff)\n this._fail(\n `lone low surrogate \\\\u${hex} in hex string comment`,\n line,\n col\n );\n }\n\n /**\n * Skip a comment in a raw byte string (h``, b64``).\n * Called with `i` pointing at the comment-start character.\n * Returns the index after the comment, or -1 if no comment was found.\n *\n * Supports / ... /, /* *\\/, //, and # comment forms (§2.2).\n * `context` is used in unterminated-comment error messages.\n */\n private _skipRawComment(\n raw: string,\n i: number,\n context: string,\n tokenLine: number,\n tokenCol: number\n ): number {\n const ch = raw[i];\n if (ch === '/') {\n i++;\n if (raw[i] === '/') {\n i++;\n while (i < raw.length && raw[i] !== '\\n') i++;\n return i;\n }\n if (raw[i] === '*') {\n i++;\n while (i < raw.length) {\n if (raw[i] === '*' && raw[i + 1] === '/') return i + 2;\n i++;\n }\n return i; // EOF inside comment — fall through; caller will report\n }\n // / … / comment\n while (i < raw.length && raw[i] !== '/') i++;\n if (i >= raw.length)\n this._fail(\n `unterminated block comment in ${context}`,\n tokenLine,\n tokenCol\n );\n return i + 1; // consume closing /\n }\n if (ch === '#') {\n while (i < raw.length && raw[i] !== '\\n') i++;\n return i;\n }\n return -1; // not a comment\n }\n\n /** Skip content until a closing `/` (CDN block comment). */\n private _skipBlockCommentSlash(): void {\n const line = this.line,\n col = this.col;\n while (!this._eof()) {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof()) this._advance();\n continue;\n }\n if (this._ch() === '/') break;\n this._advance();\n }\n if (this._eof()) this._fail('unterminated block comment', line, col);\n this._advance(); // consume closing /\n }\n\n /** Skip content until a closing `*\\/` (JSONC block comment). */\n private _skipBlockCommentStar(): void {\n const line = this.line,\n col = this.col;\n while (!this._eof()) {\n if (this._ch() === '*' && (this.input[this.pos + 1] ?? '') === '/') {\n this._advance();\n this._advance();\n return;\n }\n this._advance();\n }\n this._fail('unterminated block comment', line, col);\n }\n\n /**\n * Read content between `quote` delimiters, processing escape sequences.\n *\n * Strict spec compliance:\n * - Literal LF (U+000A) is allowed; all other C0 controls and U+007F are rejected.\n * - Literal CR (U+000D) is silently stripped (source-level CRLF normalisation).\n * - Only spec-defined escape sequences are accepted; `\\q` etc. throw SyntaxError.\n * - `\\/` is valid only in double-quoted strings (not in escapable-s, §5.1).\n * - `\\\\` (backslash) is valid in both single- and double-quoted strings.\n * - `\\uXXXX` for a high surrogate must be immediately followed by `\\uXXXX` for\n * the corresponding low surrogate; lone surrogates are rejected.\n * - `\\u{N}` … `\\u{10FFFF}` extended syntax is supported; surrogates are rejected.\n * - In single-quoted strings, `\\u` escapes to printable ASCII (U+0020–U+007E)\n * are forbidden (hexchar-s restriction, draft-25 §5.1).\n */\n private _readStringContent(quote: string): string {\n this._advance(); // opening quote\n const quoteCode = quote.charCodeAt(0);\n const inputLen = this.input.length;\n let out = '';\n while (!this._eof() && this._ch() !== quote) {\n // Fast path: bulk-consume a run of ordinary characters up to the next\n // delimiter, backslash, CR, or control character. LF is ordinary\n // content; it is counted here so line/col stay correct.\n let p = this.pos;\n let newlines = 0;\n let lastNewline = -1;\n while (p < inputLen) {\n const cc = this.input.charCodeAt(p);\n if (cc === quoteCode || cc === 0x5c /* \\ */ || cc === 0x7f /* DEL */)\n break;\n if (cc < 0x20) {\n if (cc !== 0x0a) break; // CR / other C0 controls → slow path\n newlines++;\n lastNewline = p;\n }\n p++;\n }\n if (p > this.pos) {\n out += this.input.slice(this.pos, p);\n if (newlines > 0) {\n this.line += newlines;\n this.col = p - lastNewline;\n } else {\n this.col += p - this.pos;\n }\n this.pos = p;\n continue;\n }\n\n const ch = this._ch();\n\n // Strip literal CR (cross-platform source normalisation — spec §2.5.1)\n if (ch === '\\r') {\n this._advance();\n continue;\n }\n\n // Reject unescaped C0 control characters (except LF) and DEL — spec §5.1 unescaped\n const cp = ch.codePointAt(0)!;\n if ((cp < 0x20 && cp !== 0x0a) || cp === 0x7f)\n this._fail(\n `unescaped control character U+${cp.toString(16).padStart(4, '0')} is not allowed in string literals`\n );\n\n if (ch === '\\\\') {\n // Capture position of the backslash itself before consuming it.\n const eOffset = this.pos,\n eLine = this.line,\n eCol = this.col;\n this._advance();\n const e = this._advance();\n switch (e) {\n case 'n':\n out += '\\n';\n break;\n case 'r':\n out += '\\r';\n break;\n case 't':\n out += '\\t';\n break;\n case 'b':\n out += '\\b';\n break;\n case 'f':\n out += '\\f';\n break;\n case '\\\\':\n out += '\\\\';\n break;\n case 'u':\n out += this._readUnicodeEscape(quote, eOffset, eLine, eCol);\n break;\n default:\n // Escaped delimiter char (e.g. \\' inside '...' or \\\" inside \"...\")\n if (e === quote) {\n out += e;\n break;\n }\n if (e === '/') {\n if (quote === \"'\")\n this._fail(\n `\\\\/ is not a valid escape in single-quoted byte strings (§5.1)`,\n eLine,\n eCol\n );\n out += '/';\n break;\n }\n // Non-standard JS escape sequences — accepted when onEscapeWarning is set.\n if (this.onEscapeWarning) {\n if (e === '0') {\n this.onEscapeWarning(\n '\\\\0 is a non-standard escape sequence; use \\\\u0000 instead',\n eOffset,\n eLine,\n eCol\n );\n out += '\\0';\n break;\n }\n if (e === 'v') {\n this.onEscapeWarning(\n '\\\\v is a non-standard escape sequence; use \\\\u000b instead',\n eOffset,\n eLine,\n eCol\n );\n out += '\\v';\n break;\n }\n if (e === 'x') {\n // \\xHH — two hex digits\n const h1 = this._ch();\n const h2 = this.input[this.pos + 1] ?? '';\n if (!/[0-9a-fA-F]/.test(h1) || !/[0-9a-fA-F]/.test(h2)) {\n this._fail(\n '\\\\x escape requires exactly two hex digits',\n eLine,\n eCol\n );\n }\n this._advance();\n this._advance();\n const codePoint = parseInt(h1 + h2, 16);\n this.onEscapeWarning(\n `\\\\x${h1}${h2} is a non-standard escape sequence; use \\\\u00${h1}${h2} instead`,\n eOffset,\n eLine,\n eCol\n );\n out += String.fromCharCode(codePoint);\n break;\n }\n // Cross-quote delimiter (e.g. \\\" inside '...' or \\' inside \"...\")\n if (e === '\"' || e === \"'\") {\n this.onEscapeWarning(\n `\\\\${e} inside ${quote === '\"' ? 'double' : 'single'}-quoted string is non-standard`,\n eOffset,\n eLine,\n eCol\n );\n out += e;\n break;\n }\n // JS line continuation: \\ + LF / CR / CRLF → nothing added\n if (e === '\\n' || e === '\\r') {\n if (e === '\\r' && this._ch() === '\\n') this._advance(); // consume CRLF\n this.onEscapeWarning(\n 'line continuation (\\\\<newline>) is non-standard; the newline is ignored',\n eOffset,\n eLine,\n eCol\n );\n break;\n }\n // Identity escape: \\X → X (JS accepts any \\X as just X)\n this.onEscapeWarning(\n `\\\\${e} is an unknown escape sequence; interpreted as '${e}'`,\n eOffset,\n eLine,\n eCol\n );\n out += e;\n break;\n }\n this._fail(\n `invalid escape sequence \\\\${e} in ${quote === '\"' ? 'double' : 'single'}-quoted string`,\n eLine,\n eCol\n );\n }\n } else {\n out += this._advance();\n }\n }\n if (this._eof()) this._fail('unterminated string literal');\n this._advance(); // closing quote\n return out;\n }\n\n /**\n * Parse a Unicode escape immediately after `\\u` has been consumed.\n *\n * @param quote - The enclosing string delimiter (`\"` or `'`).\n *\n * Handles two forms:\n * - `\\u{N}` … `\\u{10FFFF}`: direct Unicode scalar value (surrogates rejected)\n * - `\\uXXXX`: exactly four hex digits; a high surrogate must be followed by\n * `\\uXXXX` for the matching low surrogate to form a valid surrogate pair,\n * which is then decoded into the corresponding non-BMP code point.\n *\n * In single-quoted strings (`quote === \"'\"`), `\\u` escapes that resolve to\n * printable ASCII (U+0020–U+007E) are rejected per draft-25 §5.1 hexchar-s.\n * Use `\\\\` for backslash (U+005C) and `\\'` for the single-quote delimiter.\n */\n private _readUnicodeEscape(\n quote: string,\n bsOffset?: number,\n bsLine?: number,\n bsCol?: number\n ): string {\n const line = this.line,\n col = this.col;\n\n /** Warn or throw when this is a single-quoted string and the code point is printable ASCII. */\n const checkSingleQuotedPrintable = (cp: number): void => {\n // Per draft-25 §5.1 hexchar-s, \\u escapes for printable ASCII (U+0020–U+007E)\n // are not valid in single-quoted strings. Use \\\\ for backslash and \\' for\n // the single-quote delimiter. In lenient mode (onEscapeWarning set) we emit\n // a warning and accept the value rather than hard-failing.\n if (quote === \"'\" && cp >= 0x20 && cp <= 0x7e) {\n const msg = `\\\\u escape for printable ASCII U+${cp.toString(16).padStart(4, '0').toUpperCase()} is not allowed in single-quoted strings (§5.1 hexchar-s)`;\n if (this.onEscapeWarning) {\n this.onEscapeWarning(\n msg,\n bsOffset ?? this.pos,\n bsLine ?? line,\n bsCol ?? col\n );\n return;\n }\n this._fail(msg, line, col);\n }\n };\n\n // Extended form \\u{NNN}\n if (!this._eof() && this._ch() === '{') {\n this._advance(); // {\n let hex = '';\n while (!this._eof() && this._ch() !== '}') {\n const c = this._ch();\n if (!/[0-9a-fA-F]/.test(c))\n this._fail(\n `invalid character in \\\\u{} escape: ${JSON.stringify(c)}`,\n line,\n col\n );\n hex += this._advance();\n }\n if (this._eof()) this._fail('unterminated \\\\u{} escape', line, col);\n this._advance(); // }\n if (hex.length === 0) this._fail('empty \\\\u{} escape', line, col);\n const cp = parseInt(hex, 16);\n if (cp > 0x10_ffff)\n this._fail(\n `\\\\u{${hex}} exceeds maximum Unicode code point U+10FFFF`,\n line,\n col\n );\n if (cp >= 0xd800 && cp <= 0xdfff)\n this._fail(\n `\\\\u{${hex}} is a surrogate code point, which is not a valid Unicode scalar value`,\n line,\n col\n );\n checkSingleQuotedPrintable(cp);\n return String.fromCodePoint(cp);\n }\n\n // Standard form \\uXXXX\n let hex = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof()) this._fail('truncated \\\\uXXXX escape', line, col);\n const c = this._ch();\n if (!/[0-9a-fA-F]/.test(c))\n this._fail(\n `invalid hex digit in \\\\uXXXX escape: ${JSON.stringify(c)}`,\n line,\n col\n );\n hex += this._advance();\n }\n const cp = parseInt(hex, 16);\n\n // High surrogate: must be immediately followed by a low-surrogate escape\n if (cp >= 0xd800 && cp <= 0xdbff) {\n if (this._ch() !== '\\\\' || (this.input[this.pos + 1] ?? '') !== 'u')\n this._fail(\n `lone high surrogate \\\\u${hex} must be followed by \\\\uDC00–\\\\uDFFF`,\n line,\n col\n );\n this._advance(); // \\\n this._advance(); // u\n const line2 = this.line,\n col2 = this.col;\n let hex2 = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof())\n this._fail('truncated low-surrogate escape', line2, col2);\n hex2 += this._advance();\n }\n const cp2 = parseInt(hex2, 16);\n if (cp2 < 0xdc00 || cp2 > 0xdfff)\n this._fail(\n `\\\\u${hex} (high surrogate) not followed by a valid low surrogate (got \\\\u${hex2})`,\n line,\n col\n );\n // Surrogate pairs always resolve to non-BMP (> U+FFFF), never printable ASCII\n return String.fromCodePoint(\n 0x10000 + (cp - 0xd800) * 0x400 + (cp2 - 0xdc00)\n );\n }\n\n // Low surrogate without a preceding high surrogate is invalid\n if (cp >= 0xdc00 && cp <= 0xdfff)\n this._fail(`lone low surrogate \\\\u${hex} is not valid`, line, col);\n\n checkSingleQuotedPrintable(cp);\n return String.fromCharCode(cp);\n }\n\n /**\n * Read raw text-string content between N-backtick delimiters (§2.5.3).\n *\n * - The opening delimiter is the maximal run of consecutive backticks (N ≥ 1).\n * - A single leading newline (LF or CRLF) immediately after the opening is stripped.\n * - No escape sequences are processed — content is taken verbatim.\n * - Literal CR is stripped for source-level CRLF normalisation.\n * - The closing delimiter is the first run of M ≥ N backticks; any excess\n * M-N backticks are appended to the content before closing.\n */\n private _readRawStringContent(): string {\n const openLine = this.line,\n openCol = this.col;\n\n // Count opening backticks (greedy)\n let n = 0;\n while (!this._eof() && this._ch() === '`') {\n this._advance();\n n++;\n }\n\n // Strip a single leading CRLF or LF (§2.5.3)\n if (!this._eof() && this._ch() === '\\r') this._advance(); // CR\n if (!this._eof() && this._ch() === '\\n') this._advance(); // LF\n\n const inputLen = this.input.length;\n let out = '';\n while (!this._eof()) {\n // Fast path: bulk-consume a run of ordinary characters up to the next\n // backtick, CR, or control character. LF is ordinary content; it is\n // counted here so line/col stay correct.\n let p = this.pos;\n let newlines = 0;\n let lastNewline = -1;\n while (p < inputLen) {\n const cc = this.input.charCodeAt(p);\n if (cc === 0x60 /* ` */ || cc === 0x7f /* DEL */) break;\n if (cc < 0x20) {\n if (cc !== 0x0a) break; // CR / other C0 controls → slow path\n newlines++;\n lastNewline = p;\n }\n p++;\n }\n if (p > this.pos) {\n out += this.input.slice(this.pos, p);\n if (newlines > 0) {\n this.line += newlines;\n this.col = p - lastNewline;\n } else {\n this.col += p - this.pos;\n }\n this.pos = p;\n continue;\n }\n\n const ch = this._ch();\n\n // Source-level CRLF normalisation: strip bare CR\n if (ch === '\\r') {\n this._advance();\n continue;\n }\n\n if (ch === '`') {\n // Count this backtick run\n let m = 0;\n while (!this._eof() && this._ch() === '`') {\n this._advance();\n m++;\n }\n if (m >= n) {\n // Closing delimiter found; excess backticks become content\n out += '`'.repeat(m - n);\n if (out === '')\n this._fail(\n 'raw string must not be empty (§2.5.3)',\n openLine,\n openCol\n );\n return out;\n }\n // Not enough backticks — all become content\n out += '`'.repeat(m);\n } else {\n const cp = ch.codePointAt(0)!;\n // rawchars = 1*(%x0a/%x0d / %x20-5f / %x61-7e / NONASCII) — HT and other C0 controls forbidden\n if (cp < 0x20 && cp !== 0x0a && cp !== 0x0d) {\n this._fail(\n `raw string content must not contain control character U+${cp.toString(16).toUpperCase().padStart(4, '0')} (§2.5.3)`,\n this.line,\n this.col\n );\n }\n if (cp === 0x7f) {\n this._fail(\n 'raw string content must not contain DEL (U+007F) (§2.5.3)',\n this.line,\n this.col\n );\n }\n out += this._advance();\n }\n }\n\n this._fail('unterminated raw string literal', openLine, openCol);\n }\n\n /**\n * Post-process raw hex content from a `h``…``\\` raw string (§5.3.3).\n *\n * Skips:\n * - lblank whitespace (LF, SP; also CR for source-level normalisation)\n * - `/ … /` block comments\n * - `# …` line comments (up to but not including LF)\n * Detects `...` ellipsis sequences.\n *\n * A trailing `# comment` immediately before the closing delimiter is allowed\n * per §5.3.3 `r-app-string-h`.\n *\n * Returns { value: hex-string-with-ellipsis-markers, elided: boolean }\n */\n private _processRawHexContent(\n raw: string,\n tokenLine: number,\n tokenCol: number\n ): { value: string; elided: boolean } {\n let hex = '';\n let elided = false;\n let i = 0;\n while (i < raw.length) {\n const ch = raw[i];\n // lblank / CR — skip\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n i++;\n continue;\n }\n // HT is still forbidden (rawchars excludes %x09)\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside h`` raw byte string literals (§5.3.3)',\n tokenLine,\n tokenCol\n );\n }\n // Comments (§2.2)\n const afterComment = this._skipRawComment(\n raw,\n i,\n 'h`` raw byte string',\n tokenLine,\n tokenCol\n );\n if (afterComment !== -1) {\n i = afterComment;\n continue;\n }\n // Ellipsis: ... (three or more dots)\n if (ch === '.' && raw[i + 1] === '.' && raw[i + 2] === '.') {\n i += 3;\n while (i < raw.length && raw[i] === '.') i++;\n hex += '...';\n elided = true;\n continue;\n }\n // Hex digits — consume the whole run at once\n if (isHexDigitCode(raw.charCodeAt(i))) {\n const runStart = i;\n while (i < raw.length && isHexDigitCode(raw.charCodeAt(i))) i++;\n hex += raw.slice(runStart, i);\n continue;\n }\n this._fail(\n `unexpected character ${JSON.stringify(ch)} in h\\`\\` raw byte string`,\n tokenLine,\n tokenCol\n );\n }\n return { value: hex, elided };\n }\n\n /**\n * Post-process raw base64 content from a `b64``…``\\` raw string (§5.3.4).\n *\n * Skips:\n * - lblank whitespace (LF, SP; also CR for source-level normalisation)\n * - `# …` line comments (up to but not including LF)\n *\n * Returns the stripped base64 string.\n */\n private _processRawB64Content(\n raw: string,\n tokenLine: number,\n tokenCol: number\n ): string {\n let out = '';\n let i = 0;\n while (i < raw.length) {\n const ch = raw[i];\n // lblank / CR — skip\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n i++;\n continue;\n }\n // HT forbidden\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside b64`` raw byte string literals (§5.3.4)',\n tokenLine,\n tokenCol\n );\n }\n // Line comment: # … (to end of line)\n // Note: // is NOT treated as a comment because / is a valid B64DIGIT\n // (e.g. 0xFF 0xFF encodes to //8= in standard base64).\n if (ch === '#') {\n while (i < raw.length && raw[i] !== '\\n') i++;\n continue;\n }\n // Run of data characters — consume in bulk up to the next terminator\n const runStart = i;\n while (i < raw.length) {\n const d = raw[i];\n if (d === '\\n' || d === ' ' || d === '\\r' || d === '\\t' || d === '#')\n break;\n i++;\n }\n out += raw.slice(runStart, i);\n }\n return out;\n }\n\n /**\n * Read raw byte-string content between `quote` chars (b64 / b64url).\n *\n * Strips whitespace and skips `# ...` line comments per §2.5.5.\n * `/` is NOT treated as a comment delimiter because it is a valid base64 character.\n */\n private _readByteContent(quote: string): string {\n this._advance(); // opening quote\n let raw = '';\n while (!this._eof() && this._ch() !== quote) {\n const ch = this._ch();\n // lblank = %x0A / %x20 — only LF and SP are whitespace (§5.2.2 Fig 4); HT is forbidden\n if (ch === '\\n' || ch === ' ') {\n this._advance();\n continue;\n }\n if (ch === '\\r') {\n // CR is not lblank; skip silently as source-level normalization only\n this._advance();\n continue;\n }\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside byte string literals (§5.2.2)',\n this.line,\n this.col\n );\n }\n // # line comment — stop at newline or the closing quote (whichever comes first)\n // Note: // is NOT treated as a comment here because / is a valid B64DIGIT;\n // treating // as a comment would corrupt base64 data that naturally contains\n // consecutive slashes (e.g. 0xFF 0xFF encodes to //8= in standard base64).\n if (ch === '#') {\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof() && this._ch() !== '\\n') this._advance();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n continue;\n }\n // Run of data characters — consume in bulk up to the next terminator.\n // Newlines terminate the run, so a plain column update is safe.\n const runStart = this.pos;\n let p = this.pos;\n const n = this.input.length;\n while (p < n) {\n const d = this.input[p];\n if (\n d === quote ||\n d === '\\n' ||\n d === ' ' ||\n d === '\\r' ||\n d === '\\t' ||\n d === '#'\n )\n break;\n p++;\n }\n this.col += p - runStart;\n this.pos = p;\n raw += this.input.slice(runStart, p);\n }\n if (this._eof()) this._fail('unterminated byte string literal');\n this._advance(); // closing quote\n return raw;\n }\n\n /**\n * Read hex byte-string content, recognising `...` ellipsis sequences (§4.2).\n *\n * Returns the raw hex string (with `...` markers embedded) and a flag\n * indicating whether any ellipsis was found.\n */\n private _readHexByteContentElisionAware(quote: string): {\n value: string;\n elided: boolean;\n } {\n this._advance(); // opening quote\n let hex = '';\n let elided = false;\n while (!this._eof() && this._ch() !== quote) {\n const ch = this._ch();\n // lblank = %x0A / %x20 only; HT is forbidden per §5.2 Figure 3\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n this._advance();\n continue;\n }\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside hex byte string literals (§5.2.1)',\n this.line,\n this.col\n );\n }\n if (this._skipByteStringComment(quote)) continue;\n // Detect '...' ellipsis inside hex literal\n if (\n ch === '.' &&\n (this.input[this.pos + 1] ?? '') === '.' &&\n (this.input[this.pos + 2] ?? '') === '.'\n ) {\n this._advance();\n this._advance();\n this._advance();\n // consume any additional dots (spec says \"three or more\")\n while (!this._eof() && this._ch() === '.') this._advance();\n // adjacent ... separated only by whitespace collapse into a single ellipsis\n if (!hex.endsWith('...')) hex += '...';\n elided = true;\n continue;\n }\n if (isHexDigitCode(ch.charCodeAt(0))) {\n // Run of hex digits — consume in bulk (digits contain no newlines)\n const runStart = this.pos;\n let p = this.pos;\n const n = this.input.length;\n while (p < n && isHexDigitCode(this.input.charCodeAt(p))) p++;\n this.col += p - runStart;\n this.pos = p;\n hex += this.input.slice(runStart, p);\n continue;\n }\n this._fail(\n `unexpected character ${JSON.stringify(ch)} in hex byte string`\n );\n }\n if (this._eof()) this._fail('unterminated hex byte string literal');\n this._advance(); // closing quote\n return { value: hex, elided };\n }\n\n // ── Token reader ─────────────────────────────────────────────────────────\n\n private _readNext(): Token {\n this._skipWS();\n const offset = this.pos;\n const tok = this._readNextCore();\n return {\n ...tok,\n raw: this.input.slice(offset, this.pos),\n offset,\n endOffset: this.pos,\n };\n }\n\n private _readNextCore(): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n const line = this.line,\n col = this.col;\n if (this._eof()) return { type: 'EOF', value: '', line, col };\n\n const c = this._ch();\n\n switch (c) {\n case '[':\n this._advance();\n return { type: 'LBRACKET', value: '[', line, col };\n case ']':\n this._advance();\n return { type: 'RBRACKET', value: ']', line, col };\n case '{':\n this._advance();\n return { type: 'LBRACE', value: '{', line, col };\n case '}':\n this._advance();\n return { type: 'RBRACE', value: '}', line, col };\n case '(':\n this._advance();\n return { type: 'LPAREN', value: '(', line, col };\n case ')':\n this._advance();\n return { type: 'RPAREN', value: ')', line, col };\n case ':':\n this._advance();\n return { type: 'COLON', value: ':', line, col };\n case ',':\n this._advance();\n return { type: 'COMMA', value: ',', line, col };\n case '<':\n if ((this.input[this.pos + 1] ?? '') === '<') {\n this._advance();\n this._advance();\n return { type: 'LT_LT', value: '<<', line, col };\n }\n this._fail(`unexpected character '<'`, line, col);\n case '>':\n if ((this.input[this.pos + 1] ?? '') === '>') {\n this._advance();\n this._advance();\n return { type: 'GT_GT', value: '>>', line, col };\n }\n this._fail(`unexpected character '>'`, line, col);\n case '+': {\n // +Infinity[_N]\n const posInf = this._readSignedInfinity('+', line, col);\n if (posInf !== null) return posInf;\n // Numeric literal with explicit positive sign\n const afterPlus = this.input[this.pos + 1] ?? '';\n if ((afterPlus >= '0' && afterPlus <= '9') || afterPlus === '.') {\n this._advance(); // consume '+'\n return this._readNumber(line, col);\n }\n // String concatenation operator\n this._advance();\n return { type: 'PLUS', value: '+', line, col };\n }\n case '`':\n return {\n type: 'RAWSTRING',\n value: this._readRawStringContent(),\n line,\n col,\n };\n case '\"': {\n const strVal = this._readStringContent('\"');\n if (\n strVal === '' &&\n this._ch() === '_' &&\n !/[0-7i]/.test(this.input[this.pos + 1] ?? '')\n ) {\n this._advance(); // _\n return { type: 'EMPTY_INDEF_TEXT', value: '', line, col };\n }\n return { type: 'TSTR', value: strVal, line, col };\n }\n case \"'\": {\n // ''_ → empty indefinite byte string (but ''_N is sqstr + encoding indicator)\n if (\n (this.input[this.pos + 1] ?? '') === \"'\" &&\n (this.input[this.pos + 2] ?? '') === '_' &&\n !/[0-7i]/.test(this.input[this.pos + 3] ?? '')\n ) {\n this._advance(); // first '\n this._advance(); // second '\n this._advance(); // _\n return { type: 'EMPTY_INDEF_BYTES', value: '', line, col };\n }\n // 'text' → UTF-8 encoded byte string (major type 2)\n const strVal = this._readStringContent(\"'\");\n const utf8 = textEncoder.encode(strVal);\n const hex = Array.from(utf8, (b) =>\n b.toString(16).padStart(2, '0')\n ).join('');\n return { type: 'SQSTR', value: hex, line, col };\n }\n }\n\n // -Infinity (check before generic '-' handling)\n if (c === '-') {\n const negInf = this._readSignedInfinity('-', line, col);\n if (negInf !== null) return negInf;\n return this._readNumber(line, col);\n }\n\n if (c >= '0' && c <= '9') return this._readNumber(line, col);\n // Leading-dot float: .5, .1e2, etc. (same as +.5 / -.5)\n if (c === '.' && /[0-9]/.test(this.input[this.pos + 1] ?? ''))\n return this._readNumber(line, col);\n if (/[a-zA-Z_]/.test(c)) return this._readIdent(line, col);\n\n // Three or more dots → ellipsis notation (§4.2)\n if (c === '.') {\n if (\n (this.input[this.pos + 1] ?? '') === '.' &&\n (this.input[this.pos + 2] ?? '') === '.'\n ) {\n this._advance();\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() === '.') this._advance();\n return { type: 'ELLIPSIS', value: '...', line, col };\n }\n this._fail(`unexpected character '.'`, line, col);\n }\n\n this._fail(`unexpected character ${JSON.stringify(c)}`, line, col);\n }\n\n /**\n * Try to read `Infinity[_N]` immediately after a `+`/`-` sign at this.pos.\n *\n * Returns null when the input is not an Infinity literal (e.g. an identifier\n * like `Infinityx` that merely starts with \"Infinity\"); the caller then\n * falls back to its sign handling.\n *\n * All encoding-indicator suffixes _0–_7/_i are tokenized here; the parser\n * validates them and rejects/warns on the invalid ones (_0, _4–_7, _i).\n *\n * Uses startsWith with a position argument instead of slicing the remainder\n * of the input, which would allocate a substring for every sign token.\n */\n private _readSignedInfinity(\n sign: '+' | '-',\n line: number,\n col: number\n ): Omit<Token, 'raw' | 'offset' | 'endOffset'> | null {\n if (!this.input.startsWith('Infinity', this.pos + 1)) return null;\n const after = this.input[this.pos + 9] ?? '';\n const hasSuffix =\n after === '_' &&\n /[0-7i]/.test(this.input[this.pos + 10] ?? '') &&\n !/[a-zA-Z0-9_]/.test(this.input[this.pos + 11] ?? '');\n if (/[a-zA-Z0-9_]/.test(after) && !hasSuffix) return null;\n this._advance(); // sign\n for (let i = 0; i < 8; i++) this._advance(); // Infinity\n let value = sign === '-' ? '-Infinity' : 'Infinity';\n if (hasSuffix) value += this._advance() + this._advance(); // _N\n return { type: 'FLOAT', value, line, col };\n }\n\n /** Advance past a run of hex digits. Digits contain no newlines, so a\n * plain column update is safe. */\n private _skipHexDigits(): void {\n let p = this.pos;\n const n = this.input.length;\n while (p < n && isHexDigitCode(this.input.charCodeAt(p))) p++;\n this.col += p - this.pos;\n this.pos = p;\n }\n\n /** Advance past a run of decimal digits (same newline-free guarantee). */\n private _skipDecimalDigits(): void {\n let p = this.pos;\n const n = this.input.length;\n while (p < n) {\n const c = this.input.charCodeAt(p);\n if (c < 0x30 || c > 0x39) break;\n p++;\n }\n this.col += p - this.pos;\n this.pos = p;\n }\n\n /**\n * Consume a trailing _0–_7/_i encoding-indicator suffix when present and\n * not followed by another identifier character.\n */\n private _tryConsumeEncodingSuffix(): void {\n if (this._ch() !== '_') return;\n const d = this.input[this.pos + 1] ?? '';\n const after = this.input[this.pos + 2] ?? '';\n if (((d >= '0' && d <= '7') || d === 'i') && !/[0-9a-zA-Z_]/.test(after)) {\n this._advance();\n this._advance();\n }\n }\n\n private _readNumber(\n line: number,\n col: number\n ): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n // The token value is the raw consumed text; it is collected with a single\n // slice at the end instead of per-character string concatenation.\n const start = this.pos;\n const consumed = () => this.input.slice(start, this.pos);\n if (this._ch() === '-') this._advance();\n\n // Alternative bases: 0x 0o 0b\n if (this._ch() === '0') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === 'x' || next === 'X') {\n this._advance();\n this._advance(); // '0x'\n const intStart = this.pos;\n this._skipHexDigits();\n const hasIntDigits = this.pos > intStart;\n // Hex float: optional '.[hex]' fractional part followed by 'p'/'P' exponent\n let isHexFloat = false;\n let hasFracDigits = false;\n if (!this._eof() && this._ch() === '.') {\n isHexFloat = true;\n this._advance();\n const fracStart = this.pos;\n this._skipHexDigits();\n hasFracDigits = this.pos > fracStart;\n }\n if (!this._eof() && (this._ch() === 'p' || this._ch() === 'P')) {\n isHexFloat = true;\n // Validate mantissa: need at least one hex digit before or after dot\n if (!hasIntDigits && !hasFracDigits)\n this._fail(\n `hex float has no mantissa digits: ${consumed()}`,\n line,\n col\n );\n this._advance();\n if (!this._eof() && (this._ch() === '+' || this._ch() === '-'))\n this._advance();\n const expStart = this.pos;\n this._skipDecimalDigits();\n // Validate exponent: at least one decimal digit required\n if (this.pos === expStart)\n this._fail(\n `hex float missing exponent digits: ${consumed()}`,\n line,\n col\n );\n } else if (isHexFloat) {\n // Had a dot but no 'p' — missing exponent\n this._fail(\n `hex float missing 'p' exponent: ${consumed()}`,\n line,\n col\n );\n }\n if (isHexFloat) {\n // Encoding-indicator suffix _0/_1/_2/_3/_4/_5/_6/_7/_i for hex floats\n this._tryConsumeEncodingSuffix();\n return { type: 'FLOAT', value: consumed(), line, col };\n }\n return { type: 'INTEGER', value: consumed(), line, col };\n }\n if (next === 'o' || next === 'O') {\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '7')\n this._advance();\n return { type: 'INTEGER', value: consumed(), line, col };\n }\n if (next === 'b' || next === 'B') {\n this._advance();\n this._advance();\n while (!this._eof() && (this._ch() === '0' || this._ch() === '1'))\n this._advance();\n return { type: 'INTEGER', value: consumed(), line, col };\n }\n }\n\n // Decimal digits\n this._skipDecimalDigits();\n\n let isFloat = false;\n if (!this._eof() && this._ch() === '.') {\n isFloat = true;\n this._advance();\n this._skipDecimalDigits();\n }\n if (!this._eof() && (this._ch() === 'e' || this._ch() === 'E')) {\n isFloat = true;\n this._advance();\n if (!this._eof() && (this._ch() === '+' || this._ch() === '-'))\n this._advance();\n const expStart = this.pos;\n this._skipDecimalDigits();\n if (this.pos === expStart)\n this._fail(\n `float exponent has no digits: ${JSON.stringify(consumed())}`,\n line,\n col\n );\n }\n\n // Encoding-indicator suffix _0–_7 / _i (no whitespace, not followed by\n // more ident chars). The suffix is included in the token value.\n // isFloat is NOT set here — a float is only a float when it contains\n // '.' or 'e'/'E'. The parser extracts encoding width from the suffix.\n this._tryConsumeEncodingSuffix();\n\n return {\n type: isFloat ? 'FLOAT' : 'INTEGER',\n value: consumed(),\n line,\n col,\n };\n }\n\n private _readIdent(\n line: number,\n col: number\n ): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n // Idents contain no newlines, so a plain column update is safe.\n const identStart = this.pos;\n {\n let p = this.pos;\n const n = this.input.length;\n while (p < n) {\n const cc = this.input.charCodeAt(p);\n const isIdentChar =\n (cc >= 0x61 && cc <= 0x7a) || // a-z\n (cc >= 0x41 && cc <= 0x5a) || // A-Z\n (cc >= 0x30 && cc <= 0x39) || // 0-9\n cc === 0x5f; // _\n if (!isIdentChar) break;\n p++;\n }\n this.col += p - this.pos;\n this.pos = p;\n }\n let ident = this.input.slice(identStart, this.pos);\n\n // Known keywords — checked first so they are never shadowed by app-strings.\n switch (ident) {\n case 'true':\n return { type: 'TRUE', value: ident, line, col };\n case 'false':\n return { type: 'FALSE', value: ident, line, col };\n case 'null':\n return { type: 'NULL', value: ident, line, col };\n case 'undefined':\n return { type: 'UNDEFINED', value: ident, line, col };\n case 'NaN':\n case 'NaN_0':\n case 'NaN_1':\n case 'NaN_2':\n case 'NaN_3':\n case 'NaN_4':\n case 'NaN_5':\n case 'NaN_6':\n case 'NaN_7':\n case 'NaN_i':\n case 'Infinity':\n case 'Infinity_0':\n case 'Infinity_1':\n case 'Infinity_2':\n case 'Infinity_3':\n case 'Infinity_4':\n case 'Infinity_5':\n case 'Infinity_6':\n case 'Infinity_7':\n case 'Infinity_i':\n return { type: 'FLOAT', value: ident, line, col };\n case 'simple':\n return { type: 'SIMPLE', value: ident, line, col };\n case '_':\n return { type: 'UNDERSCORE', value: '_', line, col };\n // Encoding indicators used in array/map/string/bytes contexts\n case '_0':\n return { type: 'ENCODING_INDICATOR', value: '0', line, col };\n case '_1':\n return { type: 'ENCODING_INDICATOR', value: '1', line, col };\n case '_2':\n return { type: 'ENCODING_INDICATOR', value: '2', line, col };\n case '_3':\n return { type: 'ENCODING_INDICATOR', value: '3', line, col };\n case '_4':\n return { type: 'ENCODING_INDICATOR', value: '4', line, col };\n case '_5':\n return { type: 'ENCODING_INDICATOR', value: '5', line, col };\n case '_6':\n return { type: 'ENCODING_INDICATOR', value: '6', line, col };\n case '_7':\n // _7 = AI 31 = indefinite-length; kept as ENCODING_INDICATOR so that\n // bare `_` (UNDERSCORE) and explicit `_7` stay distinguishable.\n return { type: 'ENCODING_INDICATOR', value: '7', line, col };\n case '_i':\n return { type: 'ENCODING_INDICATOR', value: 'i', line, col };\n }\n\n // Byte-string prefixes or app-string extensions.\n // App-prefix grammar (§3 of draft-ietf-cbor-edn-literals-25):\n // app-prefix = lcalpha *lcldh / ucalpha *ucldh\n // lcldh = lcalpha / DIGIT / \"-\"\n // ucldh = ucalpha / DIGIT / \"-\"\n // Mixed-case or underscore-containing idents are not valid app-prefixes.\n const firstChar = ident[0] ?? '';\n const isLower = firstChar >= 'a' && firstChar <= 'z';\n const isUpper = firstChar >= 'A' && firstChar <= 'Z';\n\n if (isLower || isUpper) {\n // Validate chars already consumed by the main loop (no underscore, correct case).\n const restAlreadyRead = ident.slice(1);\n const restValid = isLower\n ? /^[a-z0-9]*$/.test(restAlreadyRead)\n : /^[A-Z0-9]*$/.test(restAlreadyRead);\n\n if (restValid) {\n // Extend the prefix with any remaining lcldh / ucldh chars.\n // The main loop stops at '-', so we need to consume hyphen-segments here.\n const extStart = this.pos;\n while (!this._eof()) {\n const ch = this._ch();\n const validCh = isLower\n ? (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch === '-'\n : (ch >= 'A' && ch <= 'Z') ||\n (ch >= '0' && ch <= '9') ||\n ch === '-';\n if (!validCh) break;\n this.pos++;\n }\n if (this.pos > extStart) {\n this.col += this.pos - extStart;\n ident += this.input.slice(extStart, this.pos);\n }\n\n const q = this._ch();\n // Double quotes are not valid for app-string / byte-string prefixes.\n // app-string = app-prefix sqstr (sqstr uses single quotes only)\n if (q === '\"')\n this._fail(\n `\"${ident}\" prefix requires single quotes or backticks, not double quotes`,\n line,\n col\n );\n if (q === \"'\") {\n switch (ident) {\n case 'h': {\n const { value: hexVal, elided } =\n this._readHexByteContentElisionAware(q);\n return {\n type: elided ? 'BYTES_HEX_ELIDED' : 'BYTES_HEX',\n value: hexVal,\n line,\n col,\n };\n }\n case 'b64':\n return {\n type: 'BYTES_B64',\n value: this._readByteContent(q),\n line,\n col,\n };\n default:\n return {\n type: 'APP_STRING',\n appPrefix: ident,\n value: this._readStringContent(q),\n line,\n col,\n };\n }\n }\n\n // app-rstring: prefix followed by backtick raw string (§2.5.3 / app-rstring)\n if (q === '`') {\n const raw = this._readRawStringContent();\n switch (ident) {\n case 'h': {\n // §5.3.3: lblank + / / block comments + # line comments + ellipsis\n const { value: hexVal, elided } = this._processRawHexContent(\n raw,\n line,\n col\n );\n return {\n type: elided ? 'BYTES_HEX_ELIDED' : 'BYTES_HEX',\n value: hexVal,\n line,\n col,\n };\n }\n case 'b64':\n // §5.3.4: lblank + # line comments\n return {\n type: 'BYTES_B64',\n value: this._processRawB64Content(raw, line, col),\n line,\n col,\n };\n default:\n return {\n type: 'APP_STRING',\n appPrefix: ident,\n value: raw,\n line,\n col,\n };\n }\n }\n\n // App-sequence extension: prefix<<items...>>\n // The tokenizer consumes only prefix + \"<<\"; the parser reads items until \">>\".\n if (q === '<' && (this.input[this.pos + 1] ?? '') === '<') {\n this._advance();\n this._advance(); // <<\n return {\n type: 'APP_SEQUENCE',\n appPrefix: ident,\n value: '',\n line,\n col,\n };\n }\n }\n }\n\n this._fail(`unknown identifier ${JSON.stringify(ident)}`, line, col);\n }\n}\n"],"mappings":"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"}
@@ -26,5 +26,5 @@ var e=class extends SyntaxError{offset;line;column;endOffset;constructor(e,t){le
26
26
  `;){if(this._ch()===`\\`){this._advance(),!this._eof()&&this._ch()!==`
27
27
  `&&this._advance();continue}if(this._ch()===e)break;this._advance()}continue}let r=this.pos,i=this.pos,a=this.input.length;for(;i<a;){let t=this.input[i];if(t===e||t===`
28
28
  `||t===` `||t===`\r`||t===` `||t===`#`)break;i++}this.col+=i-r,this.pos=i,t+=this.input.slice(r,i)}return this._eof()&&this._fail(`unterminated byte string literal`),this._advance(),t}_readHexByteContentElisionAware(e){this._advance();let t=``,n=!1;for(;!this._eof()&&this._ch()!==e;){let i=this._ch();if(i===`
29
- `||i===` `||i===`\r`){this._advance();continue}if(i===` `&&this._fail(`horizontal tab (HT) is not allowed inside hex byte string literals (§5.2.1)`,this.line,this.col),!this._skipByteStringComment(e)){if(i===`.`&&(this.input[this.pos+1]??``)===`.`&&(this.input[this.pos+2]??``)===`.`){for(this._advance(),this._advance(),this._advance();!this._eof()&&this._ch()===`.`;)this._advance();t.endsWith(`...`)||(t+=`...`),n=!0;continue}if(r(i.charCodeAt(0))){let e=this.pos,n=this.pos,i=this.input.length;for(;n<i&&r(this.input.charCodeAt(n));)n++;this.col+=n-e,this.pos=n,t+=this.input.slice(e,n);continue}this._fail(`unexpected character ${JSON.stringify(i)} in hex byte string`)}}return this._eof()&&this._fail(`unterminated hex byte string literal`),this._advance(),{value:t,elided:n}}_readNext(){this._skipWS();let e=this.pos;return{...this._readNextCore(),raw:this.input.slice(e,this.pos),offset:e,endOffset:this.pos}}_readNextCore(){let e=this.line,t=this.col;if(this._eof())return{type:`EOF`,value:``,line:e,col:t};let n=this._ch();switch(n){case`[`:return this._advance(),{type:`LBRACKET`,value:`[`,line:e,col:t};case`]`:return this._advance(),{type:`RBRACKET`,value:`]`,line:e,col:t};case`{`:return this._advance(),{type:`LBRACE`,value:`{`,line:e,col:t};case`}`:return this._advance(),{type:`RBRACE`,value:`}`,line:e,col:t};case`(`:return this._advance(),{type:`LPAREN`,value:`(`,line:e,col:t};case`)`:return this._advance(),{type:`RPAREN`,value:`)`,line:e,col:t};case`:`:return this._advance(),{type:`COLON`,value:`:`,line:e,col:t};case`,`:return this._advance(),{type:`COMMA`,value:`,`,line:e,col:t};case`<`:if((this.input[this.pos+1]??``)===`<`)return this._advance(),this._advance(),{type:`LT_LT`,value:`<<`,line:e,col:t};this._fail(`unexpected character '<'`,e,t);case`>`:if((this.input[this.pos+1]??``)===`>`)return this._advance(),this._advance(),{type:`GT_GT`,value:`>>`,line:e,col:t};this._fail(`unexpected character '>'`,e,t);case`+`:{let n=this._readSignedInfinity(`+`,e,t);if(n!==null)return n;let r=this.input[this.pos+1]??``;return r>=`0`&&r<=`9`||r===`.`?(this._advance(),this._readNumber(e,t)):(this._advance(),{type:`PLUS`,value:`+`,line:e,col:t})}case"`":return{type:`RAWSTRING`,value:this._readRawStringContent(),line:e,col:t};case`"`:{let n=this._readStringContent(`"`);return n===``&&this._ch()===`_`?(this._advance(),{type:`EMPTY_INDEF_TEXT`,value:``,line:e,col:t}):{type:`TSTR`,value:n,line:e,col:t}}case`'`:{if((this.input[this.pos+1]??``)===`'`&&(this.input[this.pos+2]??``)===`_`)return this._advance(),this._advance(),this._advance(),{type:`EMPTY_INDEF_BYTES`,value:``,line:e,col:t};let n=this._readStringContent(`'`),r=i.encode(n);return{type:`SQSTR`,value:Array.from(r,e=>e.toString(16).padStart(2,`0`)).join(``),line:e,col:t}}}if(n===`-`){let n=this._readSignedInfinity(`-`,e,t);return n===null?this._readNumber(e,t):n}if(n>=`0`&&n<=`9`||n===`.`&&/[0-9]/.test(this.input[this.pos+1]??``))return this._readNumber(e,t);if(/[a-zA-Z_]/.test(n))return this._readIdent(e,t);if(n===`.`){if((this.input[this.pos+1]??``)===`.`&&(this.input[this.pos+2]??``)===`.`){for(this._advance(),this._advance(),this._advance();!this._eof()&&this._ch()===`.`;)this._advance();return{type:`ELLIPSIS`,value:`...`,line:e,col:t}}this._fail(`unexpected character '.'`,e,t)}this._fail(`unexpected character ${JSON.stringify(n)}`,e,t)}_readSignedInfinity(e,t,n){if(!this.input.startsWith(`Infinity`,this.pos+1))return null;let r=this.input[this.pos+9]??``,i=r===`_`&&/[0-7i]/.test(this.input[this.pos+10]??``)&&!/[a-zA-Z0-9_]/.test(this.input[this.pos+11]??``);if(/[a-zA-Z0-9_]/.test(r)&&!i)return null;this._advance();for(let e=0;e<8;e++)this._advance();let a=e===`-`?`-Infinity`:`Infinity`;return i&&(a+=this._advance()+this._advance()),{type:`FLOAT`,value:a,line:t,col:n}}_skipHexDigits(){let e=this.pos,t=this.input.length;for(;e<t&&r(this.input.charCodeAt(e));)e++;this.col+=e-this.pos,this.pos=e}_skipDecimalDigits(){let e=this.pos,t=this.input.length;for(;e<t;){let t=this.input.charCodeAt(e);if(t<48||t>57)break;e++}this.col+=e-this.pos,this.pos=e}_tryConsumeEncodingSuffix(){if(this._ch()!==`_`)return;let e=this.input[this.pos+1]??``,t=this.input[this.pos+2]??``;(e>=`0`&&e<=`7`||e===`i`)&&!/[0-9a-zA-Z_]/.test(t)&&(this._advance(),this._advance())}_readNumber(e,t){let n=this.pos,r=()=>this.input.slice(n,this.pos);if(this._ch()===`-`&&this._advance(),this._ch()===`0`){let n=this.input[this.pos+1]??``;if(n===`x`||n===`X`){this._advance(),this._advance();let n=this.pos;this._skipHexDigits();let i=this.pos>n,a=!1,o=!1;if(!this._eof()&&this._ch()===`.`){a=!0,this._advance();let e=this.pos;this._skipHexDigits(),o=this.pos>e}if(!this._eof()&&(this._ch()===`p`||this._ch()===`P`)){a=!0,!i&&!o&&this._fail(`hex float has no mantissa digits: ${r()}`,e,t),this._advance(),!this._eof()&&(this._ch()===`+`||this._ch()===`-`)&&this._advance();let n=this.pos;this._skipDecimalDigits(),this.pos===n&&this._fail(`hex float missing exponent digits: ${r()}`,e,t)}else a&&this._fail(`hex float missing 'p' exponent: ${r()}`,e,t);return a?(this._tryConsumeEncodingSuffix(),{type:`FLOAT`,value:r(),line:e,col:t}):{type:`INTEGER`,value:r(),line:e,col:t}}if(n===`o`||n===`O`){for(this._advance(),this._advance();!this._eof()&&this._ch()>=`0`&&this._ch()<=`7`;)this._advance();return{type:`INTEGER`,value:r(),line:e,col:t}}if(n===`b`||n===`B`){for(this._advance(),this._advance();!this._eof()&&(this._ch()===`0`||this._ch()===`1`);)this._advance();return{type:`INTEGER`,value:r(),line:e,col:t}}}this._skipDecimalDigits();let i=!1;if(!this._eof()&&this._ch()===`.`&&(i=!0,this._advance(),this._skipDecimalDigits()),!this._eof()&&(this._ch()===`e`||this._ch()===`E`)){i=!0,this._advance(),!this._eof()&&(this._ch()===`+`||this._ch()===`-`)&&this._advance();let n=this.pos;this._skipDecimalDigits(),this.pos===n&&this._fail(`float exponent has no digits: ${JSON.stringify(r())}`,e,t)}return this._tryConsumeEncodingSuffix(),{type:i?`FLOAT`:`INTEGER`,value:r(),line:e,col:t}}_readIdent(e,t){let n=this.pos;{let e=this.pos,t=this.input.length;for(;e<t;){let t=this.input.charCodeAt(e);if(!(t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||t===95))break;e++}this.col+=e-this.pos,this.pos=e}let r=this.input.slice(n,this.pos);switch(r){case`true`:return{type:`TRUE`,value:r,line:e,col:t};case`false`:return{type:`FALSE`,value:r,line:e,col:t};case`null`:return{type:`NULL`,value:r,line:e,col:t};case`undefined`:return{type:`UNDEFINED`,value:r,line:e,col:t};case`NaN`:case`NaN_0`:case`NaN_1`:case`NaN_2`:case`NaN_3`:case`NaN_4`:case`NaN_5`:case`NaN_6`:case`NaN_7`:case`NaN_i`:case`Infinity`:case`Infinity_0`:case`Infinity_1`:case`Infinity_2`:case`Infinity_3`:case`Infinity_4`:case`Infinity_5`:case`Infinity_6`:case`Infinity_7`:case`Infinity_i`:return{type:`FLOAT`,value:r,line:e,col:t};case`simple`:return{type:`SIMPLE`,value:r,line:e,col:t};case`_`:return{type:`UNDERSCORE`,value:`_`,line:e,col:t};case`_0`:return{type:`ENCODING_INDICATOR`,value:`0`,line:e,col:t};case`_1`:return{type:`ENCODING_INDICATOR`,value:`1`,line:e,col:t};case`_2`:return{type:`ENCODING_INDICATOR`,value:`2`,line:e,col:t};case`_3`:return{type:`ENCODING_INDICATOR`,value:`3`,line:e,col:t};case`_4`:return{type:`ENCODING_INDICATOR`,value:`4`,line:e,col:t};case`_5`:return{type:`ENCODING_INDICATOR`,value:`5`,line:e,col:t};case`_6`:return{type:`ENCODING_INDICATOR`,value:`6`,line:e,col:t};case`_7`:return{type:`ENCODING_INDICATOR`,value:`7`,line:e,col:t};case`_i`:return{type:`ENCODING_INDICATOR`,value:`i`,line:e,col:t}}let i=r[0]??``,a=i>=`a`&&i<=`z`;if(a||i>=`A`&&i<=`Z`){let n=r.slice(1);if(a?/^[a-z0-9]*$/.test(n):/^[A-Z0-9]*$/.test(n)){let n=this.pos;for(;!this._eof();){let e=this._ch();if(!(a?e>=`a`&&e<=`z`||e>=`0`&&e<=`9`||e===`-`:e>=`A`&&e<=`Z`||e>=`0`&&e<=`9`||e===`-`))break;this.pos++}this.pos>n&&(this.col+=this.pos-n,r+=this.input.slice(n,this.pos));let i=this._ch();if(i===`"`&&this._fail(`"${r}" prefix requires single quotes or backticks, not double quotes`,e,t),i===`'`)switch(r){case`h`:{let{value:n,elided:r}=this._readHexByteContentElisionAware(i);return{type:r?`BYTES_HEX_ELIDED`:`BYTES_HEX`,value:n,line:e,col:t}}case`b64`:return{type:`BYTES_B64`,value:this._readByteContent(i),line:e,col:t};default:return{type:`APP_STRING`,appPrefix:r,value:this._readStringContent(i),line:e,col:t}}if(i==="`"){let n=this._readRawStringContent();switch(r){case`h`:{let{value:r,elided:i}=this._processRawHexContent(n,e,t);return{type:i?`BYTES_HEX_ELIDED`:`BYTES_HEX`,value:r,line:e,col:t}}case`b64`:return{type:`BYTES_B64`,value:this._processRawB64Content(n,e,t),line:e,col:t};default:return{type:`APP_STRING`,appPrefix:r,value:n,line:e,col:t}}}if(i===`<`&&(this.input[this.pos+1]??``)===`<`)return this._advance(),this._advance(),{type:`APP_SEQUENCE`,appPrefix:r,value:``,line:e,col:t}}}this._fail(`unknown identifier ${JSON.stringify(r)}`,e,t)}};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return a}});
30
- //# sourceMappingURL=tokenizer-C8NLHT2B.cjs.map
29
+ `||i===` `||i===`\r`){this._advance();continue}if(i===` `&&this._fail(`horizontal tab (HT) is not allowed inside hex byte string literals (§5.2.1)`,this.line,this.col),!this._skipByteStringComment(e)){if(i===`.`&&(this.input[this.pos+1]??``)===`.`&&(this.input[this.pos+2]??``)===`.`){for(this._advance(),this._advance(),this._advance();!this._eof()&&this._ch()===`.`;)this._advance();t.endsWith(`...`)||(t+=`...`),n=!0;continue}if(r(i.charCodeAt(0))){let e=this.pos,n=this.pos,i=this.input.length;for(;n<i&&r(this.input.charCodeAt(n));)n++;this.col+=n-e,this.pos=n,t+=this.input.slice(e,n);continue}this._fail(`unexpected character ${JSON.stringify(i)} in hex byte string`)}}return this._eof()&&this._fail(`unterminated hex byte string literal`),this._advance(),{value:t,elided:n}}_readNext(){this._skipWS();let e=this.pos;return{...this._readNextCore(),raw:this.input.slice(e,this.pos),offset:e,endOffset:this.pos}}_readNextCore(){let e=this.line,t=this.col;if(this._eof())return{type:`EOF`,value:``,line:e,col:t};let n=this._ch();switch(n){case`[`:return this._advance(),{type:`LBRACKET`,value:`[`,line:e,col:t};case`]`:return this._advance(),{type:`RBRACKET`,value:`]`,line:e,col:t};case`{`:return this._advance(),{type:`LBRACE`,value:`{`,line:e,col:t};case`}`:return this._advance(),{type:`RBRACE`,value:`}`,line:e,col:t};case`(`:return this._advance(),{type:`LPAREN`,value:`(`,line:e,col:t};case`)`:return this._advance(),{type:`RPAREN`,value:`)`,line:e,col:t};case`:`:return this._advance(),{type:`COLON`,value:`:`,line:e,col:t};case`,`:return this._advance(),{type:`COMMA`,value:`,`,line:e,col:t};case`<`:if((this.input[this.pos+1]??``)===`<`)return this._advance(),this._advance(),{type:`LT_LT`,value:`<<`,line:e,col:t};this._fail(`unexpected character '<'`,e,t);case`>`:if((this.input[this.pos+1]??``)===`>`)return this._advance(),this._advance(),{type:`GT_GT`,value:`>>`,line:e,col:t};this._fail(`unexpected character '>'`,e,t);case`+`:{let n=this._readSignedInfinity(`+`,e,t);if(n!==null)return n;let r=this.input[this.pos+1]??``;return r>=`0`&&r<=`9`||r===`.`?(this._advance(),this._readNumber(e,t)):(this._advance(),{type:`PLUS`,value:`+`,line:e,col:t})}case"`":return{type:`RAWSTRING`,value:this._readRawStringContent(),line:e,col:t};case`"`:{let n=this._readStringContent(`"`);return n===``&&this._ch()===`_`&&!/[0-7i]/.test(this.input[this.pos+1]??``)?(this._advance(),{type:`EMPTY_INDEF_TEXT`,value:``,line:e,col:t}):{type:`TSTR`,value:n,line:e,col:t}}case`'`:{if((this.input[this.pos+1]??``)===`'`&&(this.input[this.pos+2]??``)===`_`&&!/[0-7i]/.test(this.input[this.pos+3]??``))return this._advance(),this._advance(),this._advance(),{type:`EMPTY_INDEF_BYTES`,value:``,line:e,col:t};let n=this._readStringContent(`'`),r=i.encode(n);return{type:`SQSTR`,value:Array.from(r,e=>e.toString(16).padStart(2,`0`)).join(``),line:e,col:t}}}if(n===`-`){let n=this._readSignedInfinity(`-`,e,t);return n===null?this._readNumber(e,t):n}if(n>=`0`&&n<=`9`||n===`.`&&/[0-9]/.test(this.input[this.pos+1]??``))return this._readNumber(e,t);if(/[a-zA-Z_]/.test(n))return this._readIdent(e,t);if(n===`.`){if((this.input[this.pos+1]??``)===`.`&&(this.input[this.pos+2]??``)===`.`){for(this._advance(),this._advance(),this._advance();!this._eof()&&this._ch()===`.`;)this._advance();return{type:`ELLIPSIS`,value:`...`,line:e,col:t}}this._fail(`unexpected character '.'`,e,t)}this._fail(`unexpected character ${JSON.stringify(n)}`,e,t)}_readSignedInfinity(e,t,n){if(!this.input.startsWith(`Infinity`,this.pos+1))return null;let r=this.input[this.pos+9]??``,i=r===`_`&&/[0-7i]/.test(this.input[this.pos+10]??``)&&!/[a-zA-Z0-9_]/.test(this.input[this.pos+11]??``);if(/[a-zA-Z0-9_]/.test(r)&&!i)return null;this._advance();for(let e=0;e<8;e++)this._advance();let a=e===`-`?`-Infinity`:`Infinity`;return i&&(a+=this._advance()+this._advance()),{type:`FLOAT`,value:a,line:t,col:n}}_skipHexDigits(){let e=this.pos,t=this.input.length;for(;e<t&&r(this.input.charCodeAt(e));)e++;this.col+=e-this.pos,this.pos=e}_skipDecimalDigits(){let e=this.pos,t=this.input.length;for(;e<t;){let t=this.input.charCodeAt(e);if(t<48||t>57)break;e++}this.col+=e-this.pos,this.pos=e}_tryConsumeEncodingSuffix(){if(this._ch()!==`_`)return;let e=this.input[this.pos+1]??``,t=this.input[this.pos+2]??``;(e>=`0`&&e<=`7`||e===`i`)&&!/[0-9a-zA-Z_]/.test(t)&&(this._advance(),this._advance())}_readNumber(e,t){let n=this.pos,r=()=>this.input.slice(n,this.pos);if(this._ch()===`-`&&this._advance(),this._ch()===`0`){let n=this.input[this.pos+1]??``;if(n===`x`||n===`X`){this._advance(),this._advance();let n=this.pos;this._skipHexDigits();let i=this.pos>n,a=!1,o=!1;if(!this._eof()&&this._ch()===`.`){a=!0,this._advance();let e=this.pos;this._skipHexDigits(),o=this.pos>e}if(!this._eof()&&(this._ch()===`p`||this._ch()===`P`)){a=!0,!i&&!o&&this._fail(`hex float has no mantissa digits: ${r()}`,e,t),this._advance(),!this._eof()&&(this._ch()===`+`||this._ch()===`-`)&&this._advance();let n=this.pos;this._skipDecimalDigits(),this.pos===n&&this._fail(`hex float missing exponent digits: ${r()}`,e,t)}else a&&this._fail(`hex float missing 'p' exponent: ${r()}`,e,t);return a?(this._tryConsumeEncodingSuffix(),{type:`FLOAT`,value:r(),line:e,col:t}):{type:`INTEGER`,value:r(),line:e,col:t}}if(n===`o`||n===`O`){for(this._advance(),this._advance();!this._eof()&&this._ch()>=`0`&&this._ch()<=`7`;)this._advance();return{type:`INTEGER`,value:r(),line:e,col:t}}if(n===`b`||n===`B`){for(this._advance(),this._advance();!this._eof()&&(this._ch()===`0`||this._ch()===`1`);)this._advance();return{type:`INTEGER`,value:r(),line:e,col:t}}}this._skipDecimalDigits();let i=!1;if(!this._eof()&&this._ch()===`.`&&(i=!0,this._advance(),this._skipDecimalDigits()),!this._eof()&&(this._ch()===`e`||this._ch()===`E`)){i=!0,this._advance(),!this._eof()&&(this._ch()===`+`||this._ch()===`-`)&&this._advance();let n=this.pos;this._skipDecimalDigits(),this.pos===n&&this._fail(`float exponent has no digits: ${JSON.stringify(r())}`,e,t)}return this._tryConsumeEncodingSuffix(),{type:i?`FLOAT`:`INTEGER`,value:r(),line:e,col:t}}_readIdent(e,t){let n=this.pos;{let e=this.pos,t=this.input.length;for(;e<t;){let t=this.input.charCodeAt(e);if(!(t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||t===95))break;e++}this.col+=e-this.pos,this.pos=e}let r=this.input.slice(n,this.pos);switch(r){case`true`:return{type:`TRUE`,value:r,line:e,col:t};case`false`:return{type:`FALSE`,value:r,line:e,col:t};case`null`:return{type:`NULL`,value:r,line:e,col:t};case`undefined`:return{type:`UNDEFINED`,value:r,line:e,col:t};case`NaN`:case`NaN_0`:case`NaN_1`:case`NaN_2`:case`NaN_3`:case`NaN_4`:case`NaN_5`:case`NaN_6`:case`NaN_7`:case`NaN_i`:case`Infinity`:case`Infinity_0`:case`Infinity_1`:case`Infinity_2`:case`Infinity_3`:case`Infinity_4`:case`Infinity_5`:case`Infinity_6`:case`Infinity_7`:case`Infinity_i`:return{type:`FLOAT`,value:r,line:e,col:t};case`simple`:return{type:`SIMPLE`,value:r,line:e,col:t};case`_`:return{type:`UNDERSCORE`,value:`_`,line:e,col:t};case`_0`:return{type:`ENCODING_INDICATOR`,value:`0`,line:e,col:t};case`_1`:return{type:`ENCODING_INDICATOR`,value:`1`,line:e,col:t};case`_2`:return{type:`ENCODING_INDICATOR`,value:`2`,line:e,col:t};case`_3`:return{type:`ENCODING_INDICATOR`,value:`3`,line:e,col:t};case`_4`:return{type:`ENCODING_INDICATOR`,value:`4`,line:e,col:t};case`_5`:return{type:`ENCODING_INDICATOR`,value:`5`,line:e,col:t};case`_6`:return{type:`ENCODING_INDICATOR`,value:`6`,line:e,col:t};case`_7`:return{type:`ENCODING_INDICATOR`,value:`7`,line:e,col:t};case`_i`:return{type:`ENCODING_INDICATOR`,value:`i`,line:e,col:t}}let i=r[0]??``,a=i>=`a`&&i<=`z`;if(a||i>=`A`&&i<=`Z`){let n=r.slice(1);if(a?/^[a-z0-9]*$/.test(n):/^[A-Z0-9]*$/.test(n)){let n=this.pos;for(;!this._eof();){let e=this._ch();if(!(a?e>=`a`&&e<=`z`||e>=`0`&&e<=`9`||e===`-`:e>=`A`&&e<=`Z`||e>=`0`&&e<=`9`||e===`-`))break;this.pos++}this.pos>n&&(this.col+=this.pos-n,r+=this.input.slice(n,this.pos));let i=this._ch();if(i===`"`&&this._fail(`"${r}" prefix requires single quotes or backticks, not double quotes`,e,t),i===`'`)switch(r){case`h`:{let{value:n,elided:r}=this._readHexByteContentElisionAware(i);return{type:r?`BYTES_HEX_ELIDED`:`BYTES_HEX`,value:n,line:e,col:t}}case`b64`:return{type:`BYTES_B64`,value:this._readByteContent(i),line:e,col:t};default:return{type:`APP_STRING`,appPrefix:r,value:this._readStringContent(i),line:e,col:t}}if(i==="`"){let n=this._readRawStringContent();switch(r){case`h`:{let{value:r,elided:i}=this._processRawHexContent(n,e,t);return{type:i?`BYTES_HEX_ELIDED`:`BYTES_HEX`,value:r,line:e,col:t}}case`b64`:return{type:`BYTES_B64`,value:this._processRawB64Content(n,e,t),line:e,col:t};default:return{type:`APP_STRING`,appPrefix:r,value:n,line:e,col:t}}}if(i===`<`&&(this.input[this.pos+1]??``)===`<`)return this._advance(),this._advance(),{type:`APP_SEQUENCE`,appPrefix:r,value:``,line:e,col:t}}}this._fail(`unknown identifier ${JSON.stringify(r)}`,e,t)}};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return a}});
30
+ //# sourceMappingURL=tokenizer-M2pf9ud0.cjs.map