{"version":3,"sources":["../../../src/parser/tokenizer/is.ts"],"sourcesContent":["import Symbols from \"./symbols\";\r\nimport TokenType from \"./token-types\";\r\n\r\n// Character code constants for ultra-fast character checking\r\n// Exported for use in the tokenizer's hot path\r\nexport const CHAR_CODES = {\r\n  SPACE: 32,        // ' '\r\n  TAB: 9,           // '\\t'\r\n  NEWLINE: 10,      // '\\n'\r\n  CARRIAGE_RETURN: 13, // '\\r'\r\n  DOUBLE_QUOTE: 34, // '\"'\r\n  SINGLE_QUOTE: 39, // \"'\"\r\n  HASH: 35,         // '#'\r\n  PLUS: 43,         // '+'\r\n  MINUS: 45,        // '-'\r\n  DOT: 46,          // '.'\r\n  ZERO: 48,         // '0'\r\n  NINE: 57,         // '9'\r\n  COLON: 58,        // ':'\r\n  COMMA: 44,        // ','\r\n  CURLY_OPEN: 123,  // '{'\r\n  CURLY_CLOSE: 125, // '}'\r\n  BRACKET_OPEN: 91, // '['\r\n  BRACKET_CLOSE: 93, // ']'\r\n  BACKSLASH: 92,    // '\\'\r\n  TILDE: 126,       // '~'\r\n  A_UPPER: 65,      // 'A'\r\n  F_UPPER: 70,      // 'F'\r\n  A_LOWER: 97,      // 'a'\r\n  F_LOWER: 102,     // 'f'\r\n  X_UPPER: 88,      // 'X'\r\n  X_LOWER: 120,     // 'x'\r\n  O_UPPER: 79,      // 'O'\r\n  O_LOWER: 111,     // 'o'\r\n  B_UPPER: 66,      // 'B'\r\n  B_LOWER: 98       // 'b'\r\n} as const;\r\n\r\n// Pre-computed lookup for specific Unicode whitespace characters\r\n// Exported for use in the tokenizer's fast whitespace checking\r\nexport const WHITESPACE_LOOKUP = new Set([\r\n  0x1680, // Ogham space mark\r\n  0x2028, // Line separator\r\n  0x2029, // Paragraph separator\r\n  0x202F, // Narrow no-break space\r\n  0x205F, // Medium mathematical space\r\n  0x3000, // Ideographic space\r\n  0xFEFF  // BOM/Zero width no-break space\r\n]);\r\n\r\n/**\r\n * Fast digit checking using character codes.\r\n * @param charCode - Character code to check.\r\n * @returns True if the character code represents a digit (0-9).\r\n */\r\nexport const isDigitCode = (charCode: number): boolean =>\r\n  charCode >= CHAR_CODES.ZERO && charCode <= CHAR_CODES.NINE;\r\n\r\n/**\r\n * Fast whitespace checking using character codes.\r\n * This is the canonical implementation used by both is.ts and the tokenizer.\r\n * @param charCode - Character code to check.\r\n * @returns True if the character code represents whitespace.\r\n */\r\nexport const isWhitespaceCode = (charCode: number): boolean => {\r\n  // Fast path: ASCII whitespace and control characters (U+0000 to U+0020)\r\n  if (charCode <= 0x20) {\r\n    return true;\r\n  }\r\n\r\n  // Fast path: Extended ASCII range (U+0021 to U+00FF) - only U+00A0 is whitespace\r\n  if (charCode <= 0xFF) {\r\n    return charCode === 0x00A0;\r\n  }\r\n\r\n  // Fast path: Anything above U+FEFF is never whitespace\r\n  if (charCode > 0xFEFF) {\r\n    return false;\r\n  }\r\n\r\n  // Fast path: Unicode range U+2000-U+200A (various em/en spaces)\r\n  if (charCode >= 0x2000 && charCode <= 0x200A) {\r\n    return true;\r\n  }\r\n\r\n  // Lookup table for remaining Unicode whitespace characters\r\n  return WHITESPACE_LOOKUP.has(charCode);\r\n};\r\n\r\n/**\r\n  * Check if the given character is a special symbol.\r\n  * @param {string} char - Character to check.\r\n  * @returns {boolean} True if the character is a special symbol, else false.\r\n  */\r\nexport const isSpecialSymbol = (char: string): boolean => {\r\n  // const symbols = ['{', '}', '[', ']', ':', ',', '~'];\r\n  const symbols = [\r\n    Symbols.CURLY_OPEN,\r\n    Symbols.CURLY_CLOSE,\r\n    Symbols.BRACKET_OPEN,\r\n    Symbols.BRACKET_CLOSE,\r\n    Symbols.COLON,\r\n    Symbols.COMMA,\r\n    Symbols.TILDE,\r\n\r\n    // TODO: Ensure that the following symbols are good to be included here.\r\n    Symbols.DOUBLE_QUOTE,\r\n    Symbols.SINGLE_QUOTE,\r\n  ]\r\n\r\n  return symbols.includes(char as Symbols);\r\n}\r\n\r\n/**\r\n  * Check if the given character is a digit.\r\n  * @param char The character to check.\r\n  * @returns {boolean} True if the character is a digit, else false.\r\n  */\r\nexport const isDigit = (char: string): boolean => {\r\n  return /[0-9]/.test(char);\r\n}\r\n\r\n/**\r\n  * Check if the given character represents a whitespace.\r\n  * @param {string} char - Character to check.\r\n  * @param {boolean} hspacesOnly - If true, only check for horizontal spaces (space and tab).\r\n  * @returns {boolean} True if the character is a whitespace, else false.\r\n  */\r\nexport const isWhitespace = (char: string, hspacesOnly: boolean = false): boolean => {\r\n  if (hspacesOnly) {\r\n    return char === ' ' || char === '\\t';\r\n  }\r\n\r\n  // Use codePointAt for proper Unicode handling, then delegate to the fast code-based check\r\n  const code = char.codePointAt(0) || 0;\r\n  return isWhitespaceCode(code);\r\n}\r\n\r\n/**\r\n * Check if the given character is valid newline character. It is valid if it\r\n * is either a carriage return or a line feed.\r\n */\r\nexport const isValidNewline = (char: string): boolean => {\r\n  return char === '\\r' || char === '\\n';\r\n}\r\n\r\n/**\r\n* Check if the given character is an alphabetic character.\r\n*/\r\nexport const isValidOpenStringChar = (char: string): boolean => {\r\n  // Define terminators based on IO's spec.\r\n  // const terminators = [\"{\", \"}\", \"[\", \"]\", \":\", \",\", \"\\\"\", \"'\", \"@\", undefined];\r\n\r\n  const terminators = [\r\n    Symbols.CURLY_OPEN,\r\n    Symbols.CURLY_CLOSE,\r\n    Symbols.BRACKET_OPEN,\r\n    Symbols.BRACKET_CLOSE,\r\n    Symbols.COLON,\r\n    Symbols.COMMA,\r\n    Symbols.HASH,\r\n    Symbols.DOUBLE_QUOTE,\r\n    Symbols.SINGLE_QUOTE,\r\n    Symbols.TILDE,\r\n  ];\r\n\r\n  return !terminators.includes(char as Symbols);\r\n}\r\n\r\n/**\r\n  * Determine the token type for a special symbol.\r\n  * @param {string} char - Special symbol character.\r\n  * @returns {string} Token type.\r\n  */\r\nexport const getSymbolTokenType = (char: string): string => {\r\n  switch (char) {\r\n      case '{': return TokenType.CURLY_OPEN;\r\n      case '}': return TokenType.CURLY_CLOSE;\r\n      case '[': return TokenType.BRACKET_OPEN;\r\n      case ']': return TokenType.BRACKET_CLOSE;\r\n      case ':': return TokenType.COLON;\r\n      case ',': return TokenType.COMMA;\r\n      case '~': return TokenType.COLLECTION_START;\r\n      default: return TokenType.UNKNOWN;\r\n  }\r\n}\r\n\r\n/**\r\n * Check if the given character is a terminator at the character level.\r\n * Used during tokenization to identify structural boundaries.\r\n * @param {string} char - The character to check.\r\n * @returns {boolean} True if the character is a terminator.\r\n */\r\nexport const isCharTerminator = (char: string): boolean => {\r\n  return char === Symbols.CURLY_OPEN ||\r\n         char === Symbols.CURLY_CLOSE ||\r\n         char === Symbols.BRACKET_OPEN ||\r\n         char === Symbols.BRACKET_CLOSE ||\r\n         char === Symbols.COLON ||\r\n         char === Symbols.COMMA ||\r\n         char === Symbols.TILDE ||\r\n         char === Symbols.DOUBLE_QUOTE ||\r\n         char === Symbols.SINGLE_QUOTE ||\r\n         char === Symbols.HASH;  // # starts a comment\r\n}\r\n\r\n/**\r\n * Check if the given token type is a terminator (structural boundary character).\r\n * Terminators are used for error recovery, parsing boundaries, and token validation.\r\n * Note: String quotes (\", ') are terminators at the character level (see isCharTerminator)\r\n * but not at the token level since they're consumed into STRING tokens.\r\n * @param {string} tokenType - The token type to check.\r\n * @returns {boolean} True if the token type is a terminator.\r\n */\r\nexport const isTerminator = (tokenType: string): boolean => {\r\n  return tokenType === TokenType.COLLECTION_START ||  // ~ - collection item boundary\r\n         tokenType === TokenType.SECTION_SEP ||        // --- - section boundary\r\n         tokenType === TokenType.COMMA ||              // , - element delimiter\r\n         tokenType === TokenType.COLON ||              // : - key-value separator\r\n         tokenType === TokenType.BRACKET_OPEN ||       // [ - array start\r\n         tokenType === TokenType.BRACKET_CLOSE ||      // ] - array end\r\n         tokenType === TokenType.CURLY_OPEN ||         // { - object start\r\n         tokenType === TokenType.CURLY_CLOSE;          // } - object end\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,yBAAsB;AAIf,MAAM,aAAa;AAAA,EACxB,OAAO;AAAA;AAAA,EACP,KAAK;AAAA;AAAA,EACL,SAAS;AAAA;AAAA,EACT,iBAAiB;AAAA;AAAA,EACjB,cAAc;AAAA;AAAA,EACd,cAAc;AAAA;AAAA,EACd,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,OAAO;AAAA;AAAA,EACP,KAAK;AAAA;AAAA,EACL,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,OAAO;AAAA;AAAA,EACP,OAAO;AAAA;AAAA,EACP,YAAY;AAAA;AAAA,EACZ,aAAa;AAAA;AAAA,EACb,cAAc;AAAA;AAAA,EACd,eAAe;AAAA;AAAA,EACf,WAAW;AAAA;AAAA,EACX,OAAO;AAAA;AAAA,EACP,SAAS;AAAA;AAAA,EACT,SAAS;AAAA;AAAA,EACT,SAAS;AAAA;AAAA,EACT,SAAS;AAAA;AAAA,EACT,SAAS;AAAA;AAAA,EACT,SAAS;AAAA;AAAA,EACT,SAAS;AAAA;AAAA,EACT,SAAS;AAAA;AAAA,EACT,SAAS;AAAA;AAAA,EACT,SAAS;AAAA;AACX;AAIO,MAAM,oBAAoB,oBAAI,IAAI;AAAA,EACvC;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF,CAAC;AAOM,MAAM,cAAc,CAAC,aAC1B,YAAY,WAAW,QAAQ,YAAY,WAAW;AAQjD,MAAM,mBAAmB,CAAC,aAA8B;AAE7D,MAAI,YAAY,IAAM;AACpB,WAAO;AAAA,EACT;AAGA,MAAI,YAAY,KAAM;AACpB,WAAO,aAAa;AAAA,EACtB;AAGA,MAAI,WAAW,OAAQ;AACrB,WAAO;AAAA,EACT;AAGA,MAAI,YAAY,QAAU,YAAY,MAAQ;AAC5C,WAAO;AAAA,EACT;AAGA,SAAO,kBAAkB,IAAI,QAAQ;AACvC;AAOO,MAAM,kBAAkB,CAAC,SAA0B;AAExD,QAAM,UAAU;AAAA,IACd,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA;AAAA,IAGR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,EACV;AAEA,SAAO,QAAQ,SAAS,IAAe;AACzC;AAOO,MAAM,UAAU,CAAC,SAA0B;AAChD,SAAO,QAAQ,KAAK,IAAI;AAC1B;AAQO,MAAM,eAAe,CAAC,MAAc,cAAuB,UAAmB;AACnF,MAAI,aAAa;AACf,WAAO,SAAS,OAAO,SAAS;AAAA,EAClC;AAGA,QAAM,OAAO,KAAK,YAAY,CAAC,KAAK;AACpC,SAAO,iBAAiB,IAAI;AAC9B;AAMO,MAAM,iBAAiB,CAAC,SAA0B;AACvD,SAAO,SAAS,QAAQ,SAAS;AACnC;AAKO,MAAM,wBAAwB,CAAC,SAA0B;AAI9D,QAAM,cAAc;AAAA,IAClB,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,IACR,eAAAA,QAAQ;AAAA,EACV;AAEA,SAAO,CAAC,YAAY,SAAS,IAAe;AAC9C;AAOO,MAAM,qBAAqB,CAAC,SAAyB;AAC1D,UAAQ,MAAM;AAAA,IACV,KAAK;AAAK,aAAO,mBAAAC,QAAU;AAAA,IAC3B,KAAK;AAAK,aAAO,mBAAAA,QAAU;AAAA,IAC3B,KAAK;AAAK,aAAO,mBAAAA,QAAU;AAAA,IAC3B,KAAK;AAAK,aAAO,mBAAAA,QAAU;AAAA,IAC3B,KAAK;AAAK,aAAO,mBAAAA,QAAU;AAAA,IAC3B,KAAK;AAAK,aAAO,mBAAAA,QAAU;AAAA,IAC3B,KAAK;AAAK,aAAO,mBAAAA,QAAU;AAAA,IAC3B;AAAS,aAAO,mBAAAA,QAAU;AAAA,EAC9B;AACF;AAQO,MAAM,mBAAmB,CAAC,SAA0B;AACzD,SAAO,SAAS,eAAAD,QAAQ,cACjB,SAAS,eAAAA,QAAQ,eACjB,SAAS,eAAAA,QAAQ,gBACjB,SAAS,eAAAA,QAAQ,iBACjB,SAAS,eAAAA,QAAQ,SACjB,SAAS,eAAAA,QAAQ,SACjB,SAAS,eAAAA,QAAQ,SACjB,SAAS,eAAAA,QAAQ,gBACjB,SAAS,eAAAA,QAAQ,gBACjB,SAAS,eAAAA,QAAQ;AAC1B;AAUO,MAAM,eAAe,CAAC,cAA+B;AAC1D,SAAO,cAAc,mBAAAC,QAAU;AAAA,EACxB,cAAc,mBAAAA,QAAU;AAAA,EACxB,cAAc,mBAAAA,QAAU;AAAA,EACxB,cAAc,mBAAAA,QAAU;AAAA,EACxB,cAAc,mBAAAA,QAAU;AAAA,EACxB,cAAc,mBAAAA,QAAU;AAAA,EACxB,cAAc,mBAAAA,QAAU;AAAA,EACxB,cAAc,mBAAAA,QAAU;AACjC;","names":["Symbols","TokenType"]}