@jmespath-community/jmespath 1.1.4 → 1.1.5
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.
- package/dist/jmespath.esm.js +35 -17
- package/dist/jmespath.esm.min.js +1 -1
- package/dist/jmespath.esm.min.js.map +1 -1
- package/dist/jmespath.umd.js +35 -17
- package/dist/jmespath.umd.min.js +1 -1
- package/dist/jmespath.umd.min.js.map +1 -1
- package/dist/lib/Lexer.js +5 -1
- package/dist/lib/Lexer.js.map +1 -1
- package/dist/lib/Parser.js +19 -5
- package/dist/lib/Parser.js.map +1 -1
- package/dist/lib/Runtime.js.map +1 -1
- package/dist/lib/Scope.js +5 -5
- package/dist/lib/Scope.js.map +1 -1
- package/dist/lib/TreeInterpreter.js +6 -6
- package/dist/lib/TreeInterpreter.js.map +1 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/types/Scope.d.ts +1 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jmespath.umd.min.js","sources":["../src/utils/index.ts","../src/utils/strings.ts","../src/Lexer.type.ts","../src/Lexer.ts","../src/Parser.ts","../src/utils/text.ts","../src/Runtime.ts","../src/Scope.ts","../src/TreeInterpreter.ts","../src/index.ts"],"sourcesContent":["import { JSONValue } from '../JSON.type';\n\nexport const isObject = (obj: unknown): obj is Record<string, unknown> => {\n return obj !== null && Object.prototype.toString.call(obj) === '[object Object]';\n};\n\nexport const strictDeepEqual = (first: unknown, second: unknown): boolean => {\n if (first === second) {\n return true;\n }\n if (typeof first !== typeof second) {\n return false;\n }\n if (Array.isArray(first) && Array.isArray(second)) {\n if (first.length !== second.length) {\n return false;\n }\n for (let i = 0; i < first.length; i += 1) {\n if (!strictDeepEqual(first[i], second[i])) {\n return false;\n }\n }\n return true;\n }\n if (isObject(first) && isObject(second)) {\n const firstEntries = Object.entries(first);\n const secondKeys = new Set(Object.keys(second));\n if (firstEntries.length !== secondKeys.size) {\n return false;\n }\n for (const [key, value] of firstEntries) {\n if (!strictDeepEqual(value, second[key])) {\n return false;\n }\n secondKeys.delete(key);\n }\n return secondKeys.size === 0;\n }\n return false;\n};\n\nexport const isFalse = (obj: unknown): boolean => {\n if (typeof obj === 'object') {\n if (obj === null) {\n return true;\n }\n if (Array.isArray(obj)) {\n return obj.length === 0;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n for (const _key in obj) {\n return false;\n }\n return true;\n }\n return !(typeof obj === 'number' || obj);\n};\n\nexport const isAlpha = (ch: string): boolean => {\n // tslint:disable-next-line: strict-comparisons\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_';\n};\n\nexport const isNum = (ch: string): boolean => {\n // tslint:disable-next-line: strict-comparisons\n return (ch >= '0' && ch <= '9') || ch === '-';\n};\nexport const isAlphaNum = (ch: string): boolean => {\n // tslint:disable-next-line: strict-comparisons\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch === '_';\n};\n\nexport const ensureInteger = (value: unknown): number => {\n if (!(typeof value === 'number') || Math.floor(value) !== value) {\n throw new Error('invalid-value: expecting an integer.');\n }\n return <number>value;\n};\nexport const ensurePositiveInteger = (value: unknown): number => {\n if (!(typeof value === 'number') || <number>value < 0 || Math.floor(value) !== value) {\n throw new Error('invalid-value: expecting a non-negative integer.');\n }\n return <number>value;\n};\n\nexport const ensureNumbers = (...operands: (JSONValue | undefined)[]): void => {\n for (let i = 0; i < operands.length; i++) {\n if (operands[i] === null || operands[i] === undefined) {\n throw new Error('not-a-number: undefined');\n }\n if (typeof operands[i] !== 'number') {\n throw new Error('not-a-number');\n }\n }\n};\n\nconst notZero = (n: number): number => {\n n = +n; // coerce to number\n if (!n) {\n // matches -0, +0, NaN\n throw new Error('not-a-number: divide by zero');\n }\n return n;\n};\n\nexport const add = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = (left as number) + (right as number);\n return result;\n};\nexport const sub = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = (left as number) - (right as number);\n return result;\n};\nexport const mul = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = (left as number) * (right as number);\n return result;\n};\nexport const divide = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = (left as number) / notZero(right as number);\n return result;\n};\nexport const div = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = Math.floor((left as number) / notZero(right as number));\n return result;\n};\nexport const mod = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = (left as number) % (right as number);\n return result;\n};\n","import { ensureInteger, ensurePositiveInteger } from '.';\n\nexport const findFirst = (subject: string, sub: string, start?: number, end?: number): number | null => {\n if (!subject || !sub) {\n return null;\n }\n start = Math.max(ensureInteger((start = start || 0)), 0);\n end = Math.min(ensureInteger((end = end || subject.length)), subject.length);\n const offset = subject.slice(start, end).indexOf(sub);\n return offset === -1 ? null : offset + start;\n};\nexport const findLast = (subject: string, sub: string, start?: number, end?: number): number | null => {\n if (!subject || !sub) {\n return null;\n }\n start = Math.max(ensureInteger((start = start || 0)), 0);\n end = Math.min(ensureInteger((end = end || subject.length)), subject.length);\n const offset = subject.slice(start, end).lastIndexOf(sub);\n const result = offset === -1 ? null : offset + start;\n return result;\n};\nexport const lower = (subject: string): string => subject.toLowerCase();\nconst ensurePadFuncParams = (name: string, width: number, padding?: string): string => {\n padding = padding || ' ';\n if (padding.length > 1) {\n throw new Error(`invalid value, ${name} expects its 'pad' parameter to be a valid string with a single codepoint`);\n }\n ensurePositiveInteger(width);\n return padding;\n};\nexport const padLeft = (subject: string, width: number, padding?: string): string => {\n padding = ensurePadFuncParams('pad_left', width, padding);\n return (subject && subject.padStart(width, padding)) || '';\n};\nexport const padRight = (subject: string, width: number, padding?: string): string => {\n padding = ensurePadFuncParams('pad_right', width, padding);\n return (subject && subject.padEnd(width, padding)) || '';\n};\nexport const replace = (subject: string, string: string, by: string, count?: number): string => {\n if (count === 0) {\n return subject;\n }\n if (!count) {\n // emulating es2021: String.prototype.replaceAll()\n return subject.split(string).join(by);\n }\n ensurePositiveInteger(count);\n [...Array(count).keys()].map(() => (subject = subject.replace(string, by)));\n return subject;\n};\nexport const split = (subject: string, search: string, count?: number): string[] => {\n if (subject.length == 0 && search.length === 0) {\n return [];\n }\n if (count === null || count === undefined) {\n return subject.split(search);\n }\n ensurePositiveInteger(count);\n if (count === 0) {\n return [subject];\n }\n const split = subject.split(search);\n return [...split.slice(0, count), split.slice(count).join(search)];\n};\nexport const trim = (subject: string, chars?: string): string => {\n return trimLeft(trimRight(subject, chars), chars);\n};\nexport const trimLeft = (subject: string, chars?: string): string => {\n return trimImpl(subject, list => new RegExp(`^[${list}]*(.*?)`), chars);\n};\nexport const trimRight = (subject: string, chars?: string): string => {\n return trimImpl(subject, list => new RegExp(`(.*?)[${list}]*\\$`), chars);\n};\nconst trimImpl = (subject: string, regExper: (arg: string) => RegExp, chars?: string): string => {\n const pattern = chars ? chars.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') : '\\\\s\\u0085';\n return subject.replace(regExper(pattern), '$1');\n};\n\nexport const upper = (subject: string): string => subject.toUpperCase();\n","import { JSONValue } from './JSON.type';\n\nexport enum Token {\n TOK_EOF = 'EOF',\n TOK_VARIABLE = 'Variable',\n TOK_ASSIGN = 'Assign',\n TOK_UNQUOTEDIDENTIFIER = 'UnquotedIdentifier',\n TOK_QUOTEDIDENTIFIER = 'QuotedIdentifier',\n TOK_RBRACKET = 'Rbracket',\n TOK_RPAREN = 'Rparen',\n TOK_COMMA = 'Comma',\n TOK_COLON = 'Colon',\n TOK_RBRACE = 'Rbrace',\n TOK_NUMBER = 'Number',\n TOK_CURRENT = 'Current',\n TOK_ROOT = 'Root',\n TOK_EXPREF = 'Expref',\n TOK_PIPE = 'Pipe',\n TOK_OR = 'Or',\n TOK_AND = 'And',\n TOK_EQ = 'EQ',\n TOK_GT = 'GT',\n TOK_LT = 'LT',\n TOK_GTE = 'GTE',\n TOK_LTE = 'LTE',\n TOK_NE = 'NE',\n TOK_PLUS = 'Plus',\n TOK_MINUS = 'Minus',\n TOK_MULTIPLY = 'Multiply',\n TOK_DIVIDE = 'Divide',\n TOK_MODULO = 'Modulo',\n TOK_DIV = 'Div',\n TOK_FLATTEN = 'Flatten',\n TOK_STAR = 'Star',\n TOK_FILTER = 'Filter',\n TOK_DOT = 'Dot',\n TOK_NOT = 'Not',\n TOK_LBRACE = 'Lbrace',\n TOK_LBRACKET = 'Lbracket',\n TOK_LPAREN = 'Lparen',\n TOK_LITERAL = 'Literal',\n}\n\nexport type LexerTokenValue = JSONValue;\n\nexport interface LexerToken {\n type: Token;\n value: LexerTokenValue;\n start: number;\n}\n\nexport interface LexerOptions {\n // The flag to enable pre-JEP-12 literal compatibility.\n // JEP-12 deprecates `foo` -> \"foo\" syntax.\n // Valid expressions MUST use: `\"foo\"` -> \"foo\"\n //\n // Setting this flag to `true` enables support for legacy syntax.\n //\n enable_legacy_literals?: boolean;\n}\n","import { JSONValue } from './JSON.type';\nimport { replace } from './utils/strings';\nimport { LexerOptions, LexerToken, Token } from './Lexer.type';\nimport { isAlpha, isNum, isAlphaNum } from './utils/index';\n\nexport const basicTokens: Record<string, Token> = {\n '(': Token.TOK_LPAREN,\n ')': Token.TOK_RPAREN,\n '*': Token.TOK_STAR,\n ',': Token.TOK_COMMA,\n '.': Token.TOK_DOT,\n ':': Token.TOK_COLON,\n '@': Token.TOK_CURRENT,\n ']': Token.TOK_RBRACKET,\n '{': Token.TOK_LBRACE,\n '}': Token.TOK_RBRACE,\n '+': Token.TOK_PLUS,\n '%': Token.TOK_MODULO,\n '\\u2212': Token.TOK_MINUS,\n '\\u00d7': Token.TOK_MULTIPLY,\n '\\u00f7': Token.TOK_DIVIDE,\n};\n\nconst operatorStartToken: Record<string, boolean> = {\n '!': true,\n '<': true,\n '=': true,\n '>': true,\n '&': true,\n '|': true,\n '/': true,\n};\n\nconst skipChars: Record<string, boolean> = {\n '\\t': true,\n '\\n': true,\n '\\r': true,\n ' ': true,\n};\n\nclass StreamLexer {\n private _current = 0;\n private _enable_legacy_literals = false;\n\n tokenize(stream: string, options?: LexerOptions): LexerToken[] {\n const tokens: LexerToken[] = [];\n this._current = 0;\n this._enable_legacy_literals = options?.enable_legacy_literals || false;\n\n let start;\n let identifier;\n let token;\n while (this._current < stream.length) {\n if (isAlpha(stream[this._current])) {\n start = this._current;\n identifier = this.consumeUnquotedIdentifier(stream);\n tokens.push({\n start,\n type: Token.TOK_UNQUOTEDIDENTIFIER,\n value: identifier,\n });\n } else if (basicTokens[stream[this._current]] !== undefined) {\n tokens.push({\n start: this._current,\n type: basicTokens[stream[this._current]],\n value: stream[this._current],\n });\n this._current += 1;\n } else if (stream[this._current] === '$') {\n start = this._current;\n if (this._current + 1 < stream.length && isAlpha(stream[this._current + 1])) {\n this._current += 1;\n identifier = this.consumeUnquotedIdentifier(stream);\n tokens.push({\n start,\n type: Token.TOK_VARIABLE,\n value: identifier,\n });\n } else {\n tokens.push({\n start: start,\n type: Token.TOK_ROOT,\n value: stream[this._current],\n });\n this._current += 1;\n }\n } else if (stream[this._current] === '-') {\n if (this._current + 1 < stream.length && isNum(stream[this._current + 1])) {\n const token = this.consumeNumber(stream);\n token && tokens.push(token);\n } else {\n const token = {\n start: this._current,\n type: Token.TOK_MINUS,\n value: '-',\n };\n tokens.push(token);\n this._current += 1;\n }\n } else if (isNum(stream[this._current])) {\n token = this.consumeNumber(stream);\n tokens.push(token);\n } else if (stream[this._current] === '[') {\n token = this.consumeLBracket(stream);\n tokens.push(token);\n } else if (stream[this._current] === '\"') {\n start = this._current;\n identifier = this.consumeQuotedIdentifier(stream);\n tokens.push({\n start,\n type: Token.TOK_QUOTEDIDENTIFIER,\n value: identifier,\n });\n } else if (stream[this._current] === `'`) {\n start = this._current;\n identifier = this.consumeRawStringLiteral(stream);\n tokens.push({\n start,\n type: Token.TOK_LITERAL,\n value: identifier,\n });\n } else if (stream[this._current] === '`') {\n start = this._current;\n const literal = this.consumeLiteral(stream);\n tokens.push({\n start,\n type: Token.TOK_LITERAL,\n value: literal,\n });\n } else if (operatorStartToken[stream[this._current]] !== undefined) {\n token = this.consumeOperator(stream);\n token && tokens.push(token);\n } else if (skipChars[stream[this._current]] !== undefined) {\n this._current += 1;\n } else {\n const error = new Error(`Syntax error: unknown character: ${stream[this._current]}`);\n error.name = 'LexerError';\n throw error;\n }\n }\n return tokens;\n }\n\n private consumeUnquotedIdentifier(stream: string): string {\n const start = this._current;\n this._current += 1;\n while (this._current < stream.length && isAlphaNum(stream[this._current])) {\n this._current += 1;\n }\n return stream.slice(start, this._current);\n }\n\n private consumeQuotedIdentifier(stream: string): string {\n const start = this._current;\n this._current += 1;\n const maxLength = stream.length;\n while (stream[this._current] !== '\"' && this._current < maxLength) {\n let current = this._current;\n if (stream[current] === '\\\\' && (stream[current + 1] === '\\\\' || stream[current + 1] === '\"')) {\n current += 2;\n } else {\n current += 1;\n }\n this._current = current;\n }\n this._current += 1;\n const [value, ok] = this.parseJSON(stream.slice(start, this._current));\n if (!ok) {\n const error = new Error(`syntax: unexpected end of JSON input`);\n error.name = 'LexerError';\n throw error;\n }\n return <string>value;\n }\n\n private consumeRawStringLiteral(stream: string): string {\n const start = this._current;\n this._current += 1;\n const maxLength = stream.length;\n while (stream[this._current] !== `'` && this._current < maxLength) {\n let current = this._current;\n if (stream[current] === '\\\\' && (stream[current + 1] === '\\\\' || stream[current + 1] === `'`)) {\n current += 2;\n } else {\n current += 1;\n }\n this._current = current;\n }\n this._current += 1;\n const literal = stream.slice(start + 1, this._current - 1);\n return replace(replace(literal, `\\\\\\\\`, `\\\\`), `\\\\'`, `'`);\n }\n\n private consumeNumber(stream: string): LexerToken {\n const start = this._current;\n this._current += 1;\n const maxLength = stream.length;\n while (isNum(stream[this._current]) && this._current < maxLength) {\n this._current += 1;\n }\n const value = parseInt(stream.slice(start, this._current), 10);\n return { start, value, type: Token.TOK_NUMBER };\n }\n\n private consumeLBracket(stream: string): LexerToken {\n const start = this._current;\n this._current += 1;\n if (stream[this._current] === '?') {\n this._current += 1;\n return { start, type: Token.TOK_FILTER, value: '[?' };\n }\n if (stream[this._current] === ']') {\n this._current += 1;\n return { start, type: Token.TOK_FLATTEN, value: '[]' };\n }\n return { start, type: Token.TOK_LBRACKET, value: '[' };\n }\n\n private consumeOrElse(stream: string, peek: string, token: Token, orElse: Token): LexerToken {\n const start = this._current;\n this._current += 1;\n if (this._current < stream.length && stream[this._current] === peek) {\n this._current += 1;\n return { start: start, type: orElse, value: stream.slice(start, this._current) };\n }\n return { start: start, type: token, value: stream[start] };\n }\n\n private consumeOperator(stream: string): LexerToken | void {\n const start = this._current;\n const startingChar = stream[start];\n switch (startingChar) {\n case '!':\n return this.consumeOrElse(stream, '=', Token.TOK_NOT, Token.TOK_NE);\n case '<':\n return this.consumeOrElse(stream, '=', Token.TOK_LT, Token.TOK_LTE);\n case '>':\n return this.consumeOrElse(stream, '=', Token.TOK_GT, Token.TOK_GTE);\n case '=':\n return this.consumeOrElse(stream, '=', Token.TOK_ASSIGN, Token.TOK_EQ);\n case '&':\n return this.consumeOrElse(stream, '&', Token.TOK_EXPREF, Token.TOK_AND);\n case '|':\n return this.consumeOrElse(stream, '|', Token.TOK_PIPE, Token.TOK_OR);\n case '/':\n return this.consumeOrElse(stream, '/', Token.TOK_DIVIDE, Token.TOK_DIV);\n }\n }\n\n private consumeLiteral(stream: string): JSONValue {\n this._current += 1;\n const start = this._current;\n const maxLength = stream.length;\n\n while (stream[this._current] !== '`' && this._current < maxLength) {\n let current = this._current;\n if (stream[current] === '\\\\' && (stream[current + 1] === '\\\\' || stream[current + 1] === '`')) {\n current += 2;\n } else {\n current += 1;\n }\n this._current = current;\n }\n let literalString = stream.slice(start, this._current).trimStart();\n literalString = literalString.replace('\\\\`', '`');\n\n let literal: JSONValue = null;\n let ok = false;\n\n // attempts to detect and parse valid JSON\n\n if (this.looksLikeJSON(literalString)) {\n [literal, ok] = this.parseJSON(literalString);\n }\n\n // invalid JSON values should be converted to quoted\n // JSON strings during the JEP-12 deprecation period.\n\n if (!ok && this._enable_legacy_literals) {\n [literal, ok] = this.parseJSON(`\"${literalString}\"`);\n }\n\n if (!ok) {\n const error = new Error(\n `Syntax error: unexpected end of JSON input or invalid format for a JSON literal: ${stream[this._current]}`,\n );\n error.name = 'LexerError';\n throw error;\n }\n\n this._current += 1;\n return literal;\n }\n\n private looksLikeJSON(literalString: string): boolean {\n const startingChars = '[{\"';\n const jsonLiterals = ['true', 'false', 'null'];\n const numberLooking = '-0123456789';\n\n if (literalString === '') {\n return false;\n }\n if (startingChars.includes(literalString[0])) {\n return true;\n }\n if (jsonLiterals.includes(literalString)) {\n return true;\n }\n if (numberLooking.includes(literalString[0])) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const [_, ok] = this.parseJSON(literalString);\n return ok;\n }\n return false;\n }\n\n private parseJSON(text: string): [JSONValue, boolean] {\n try {\n const json = JSON.parse(text);\n return [json, true];\n } catch {\n return [null, false];\n }\n }\n}\n\nexport const Lexer = new StreamLexer();\nexport default Lexer;\n","import type {\n BinaryArithmeticNode,\n UnaryArithmeticNode,\n BinaryExpressionNode,\n ComparatorNode,\n ComparatorType,\n ExpressionNode,\n FunctionNode,\n IndexNode,\n KeyValuePairNode,\n BinaryOperatorType,\n SliceNode,\n UnaryExpressionNode,\n LetExpressionNode,\n BindingNode,\n VariableNode,\n} from './AST.type';\nimport Lexer from './Lexer';\nimport { LexerToken, Token } from './Lexer.type';\nimport { Options } from './Parser.type';\n\nconst bindingPower: Record<string, number> = {\n [Token.TOK_EOF]: 0,\n [Token.TOK_VARIABLE]: 0,\n [Token.TOK_UNQUOTEDIDENTIFIER]: 0,\n [Token.TOK_QUOTEDIDENTIFIER]: 0,\n [Token.TOK_RBRACKET]: 0,\n [Token.TOK_RPAREN]: 0,\n [Token.TOK_COMMA]: 0,\n [Token.TOK_RBRACE]: 0,\n [Token.TOK_NUMBER]: 0,\n [Token.TOK_CURRENT]: 0,\n [Token.TOK_EXPREF]: 0,\n [Token.TOK_ROOT]: 0,\n [Token.TOK_ASSIGN]: 1,\n [Token.TOK_PIPE]: 1,\n [Token.TOK_OR]: 2,\n [Token.TOK_AND]: 3,\n [Token.TOK_EQ]: 5,\n [Token.TOK_GT]: 5,\n [Token.TOK_LT]: 5,\n [Token.TOK_GTE]: 5,\n [Token.TOK_LTE]: 5,\n [Token.TOK_NE]: 5,\n [Token.TOK_MINUS]: 6,\n [Token.TOK_PLUS]: 6,\n [Token.TOK_DIV]: 7,\n [Token.TOK_DIVIDE]: 7,\n [Token.TOK_MODULO]: 7,\n [Token.TOK_MULTIPLY]: 7,\n [Token.TOK_FLATTEN]: 9,\n [Token.TOK_STAR]: 20,\n [Token.TOK_FILTER]: 21,\n [Token.TOK_DOT]: 40,\n [Token.TOK_NOT]: 45,\n [Token.TOK_LBRACE]: 50,\n [Token.TOK_LBRACKET]: 55,\n [Token.TOK_LPAREN]: 60,\n};\n\nclass TokenParser {\n index = 0;\n tokens: LexerToken[] = [];\n\n parse(expression: string, options?: Options): ExpressionNode {\n this.loadTokens(expression, options || { enable_legacy_literals: false });\n this.index = 0;\n\n const ast = this.expression(0);\n if (this.lookahead(0) !== Token.TOK_EOF) {\n const token = this.lookaheadToken(0);\n this.errorToken(token, `Syntax error: unexpected token type: ${token.type}, value: ${token.value}`);\n }\n return ast;\n }\n\n private loadTokens(expression: string, options: Options): void {\n this.tokens = [\n ...Lexer.tokenize(expression, options),\n { type: Token.TOK_EOF, value: '', start: expression.length },\n ];\n }\n\n expression(rbp: number): ExpressionNode {\n const leftToken = this.lookaheadToken(0);\n this.advance();\n let left = this.nud(leftToken);\n let currentTokenType = this.lookahead(0);\n while (rbp < bindingPower[currentTokenType]) {\n this.advance();\n left = this.led(currentTokenType, left);\n currentTokenType = this.lookahead(0);\n }\n return left;\n }\n\n private lookahead(offset: number): Token {\n return this.tokens[this.index + offset].type;\n }\n\n private lookaheadToken(offset: number): LexerToken {\n return this.tokens[this.index + offset];\n }\n\n private advance(): void {\n this.index += 1;\n }\n\n nud(token: LexerToken): ExpressionNode {\n switch (token.type) {\n case Token.TOK_VARIABLE:\n return { type: 'Variable', name: token.value as string };\n case Token.TOK_LITERAL:\n return { type: 'Literal', value: token.value };\n case Token.TOK_UNQUOTEDIDENTIFIER: {\n if (TokenParser.isKeyword(token, 'let') && this.lookahead(0) === Token.TOK_VARIABLE) {\n return this.parseLetExpression();\n } else {\n return { type: 'Field', name: token.value as string };\n }\n }\n case Token.TOK_QUOTEDIDENTIFIER:\n if (this.lookahead(0) === Token.TOK_LPAREN) {\n throw new Error('Syntax error: quoted identifier not allowed for function names.');\n } else {\n return { type: 'Field', name: token.value as string };\n }\n case Token.TOK_NOT: {\n const child = this.expression(bindingPower.Not);\n return { type: 'NotExpression', child };\n }\n case Token.TOK_MINUS: {\n const child = this.expression(bindingPower.Minus);\n return { type: 'Unary', operator: token.type, operand: child } as UnaryArithmeticNode;\n }\n case Token.TOK_PLUS: {\n const child = this.expression(bindingPower.Plus);\n return { type: 'Unary', operator: token.type, operand: child } as UnaryArithmeticNode;\n }\n case Token.TOK_STAR: {\n const left: ExpressionNode = { type: 'Identity' };\n const right: ExpressionNode =\n this.lookahead(0) === Token.TOK_RBRACKET ? left : this.parseProjectionRHS(bindingPower.Star);\n return { type: 'ValueProjection', left, right };\n }\n case Token.TOK_FILTER:\n return this.led(token.type, { type: 'Identity' });\n case Token.TOK_LBRACE:\n return this.parseMultiselectHash();\n case Token.TOK_FLATTEN: {\n const left: ExpressionNode = { type: 'Flatten', child: { type: 'Identity' } };\n const right: ExpressionNode = this.parseProjectionRHS(bindingPower.Flatten);\n return { type: 'Projection', left, right };\n }\n case Token.TOK_LBRACKET: {\n if (this.lookahead(0) === Token.TOK_NUMBER || this.lookahead(0) === Token.TOK_COLON) {\n const right = this.parseIndexExpression();\n return this.projectIfSlice({ type: 'Identity' }, right);\n }\n if (this.lookahead(0) === Token.TOK_STAR && this.lookahead(1) === Token.TOK_RBRACKET) {\n this.advance();\n this.advance();\n const right = this.parseProjectionRHS(bindingPower.Star);\n return {\n left: { type: 'Identity' },\n right,\n type: 'Projection',\n };\n }\n return this.parseMultiselectList();\n }\n case Token.TOK_CURRENT:\n return { type: Token.TOK_CURRENT };\n case Token.TOK_ROOT:\n return { type: Token.TOK_ROOT };\n case Token.TOK_EXPREF: {\n const child = this.expression(bindingPower.Expref);\n return { type: 'ExpressionReference', child };\n }\n case Token.TOK_LPAREN: {\n console.log('nud::TOK_LPAREN');\n const args: ExpressionNode[] = [];\n let expression = this.expression(0);\n args.push(expression);\n this.match(Token.TOK_RPAREN);\n return args[0];\n }\n default:\n this.errorToken(token);\n }\n }\n\n led(tokenName: string, left: ExpressionNode): ExpressionNode {\n switch (tokenName) {\n case Token.TOK_DOT: {\n const rbp = bindingPower.Dot;\n if (this.lookahead(0) !== Token.TOK_STAR) {\n const right = this.parseDotRHS(rbp);\n return { type: 'Subexpression', left, right };\n }\n this.advance();\n const right = this.parseProjectionRHS(rbp);\n return { type: 'ValueProjection', left, right };\n }\n case Token.TOK_PIPE: {\n const right = this.expression(bindingPower.Pipe);\n return { type: 'Pipe', left, right };\n }\n case Token.TOK_OR: {\n const right = this.expression(bindingPower.Or);\n return { type: 'OrExpression', left, right };\n }\n case Token.TOK_AND: {\n const right = this.expression(bindingPower.And);\n return { type: 'AndExpression', left, right };\n }\n case Token.TOK_LPAREN: {\n if (left.type !== 'Field') {\n throw new Error('Syntax error: expected a Field node');\n }\n const name = left.name;\n const args = this.parseCommaSeparatedExpressionsUntilToken(Token.TOK_RPAREN);\n const node: FunctionNode = { name, type: 'Function', children: args };\n return node;\n }\n case Token.TOK_FILTER: {\n const condition = this.expression(0);\n this.match(Token.TOK_RBRACKET);\n const right: ExpressionNode =\n this.lookahead(0) === Token.TOK_FLATTEN ? { type: 'Identity' } : this.parseProjectionRHS(bindingPower.Filter);\n return { type: 'FilterProjection', left, right, condition };\n }\n case Token.TOK_FLATTEN: {\n const leftNode: UnaryExpressionNode = { type: 'Flatten', child: left };\n const right = this.parseProjectionRHS(bindingPower.Flatten);\n return { type: 'Projection', left: leftNode, right };\n }\n case Token.TOK_ASSIGN: {\n const leftNode = left as VariableNode;\n const right = this.expression(0);\n return {\n type: 'Binding',\n variable: leftNode.name,\n reference: right,\n };\n }\n case Token.TOK_EQ:\n case Token.TOK_NE:\n case Token.TOK_GT:\n case Token.TOK_GTE:\n case Token.TOK_LT:\n case Token.TOK_LTE:\n return this.parseComparator(left, tokenName);\n case Token.TOK_PLUS:\n case Token.TOK_MINUS:\n case Token.TOK_MULTIPLY:\n case Token.TOK_STAR:\n case Token.TOK_DIVIDE:\n case Token.TOK_MODULO:\n case Token.TOK_DIV:\n return this.parseArithmetic(left, tokenName);\n case Token.TOK_LBRACKET: {\n const token = this.lookaheadToken(0);\n if (token.type === Token.TOK_NUMBER || token.type === Token.TOK_COLON) {\n const right = this.parseIndexExpression();\n return this.projectIfSlice(left, right);\n }\n this.match(Token.TOK_STAR);\n this.match(Token.TOK_RBRACKET);\n const right = this.parseProjectionRHS(bindingPower.Star);\n return { type: 'Projection', left, right };\n }\n\n default:\n return this.errorToken(this.lookaheadToken(0));\n }\n }\n\n private static isKeyword(token: LexerToken, keyword: string): boolean {\n return token.type === Token.TOK_UNQUOTEDIDENTIFIER && token.value === keyword;\n }\n\n private match(tokenType: Token | LexerToken): void {\n if (this.lookahead(0) === tokenType) {\n this.advance();\n return;\n } else {\n const token = this.lookaheadToken(0);\n this.errorToken(token, `Syntax error: expected ${tokenType}, got: ${token.type}`);\n }\n }\n\n private errorToken(token: LexerToken, message = ''): never {\n const error = new Error(message || `Syntax error: invalid token (${token.type}): \"${token.value}\"`);\n error.name = 'ParserError';\n throw error;\n }\n\n private parseIndexExpression(): SliceNode | IndexNode {\n if (this.lookahead(0) === Token.TOK_COLON || this.lookahead(1) === Token.TOK_COLON) {\n return this.parseSliceExpression();\n }\n const value = Number(this.lookaheadToken(0).value);\n this.advance();\n this.match(Token.TOK_RBRACKET);\n return { type: 'Index', value };\n }\n\n private projectIfSlice(\n left: ExpressionNode,\n right: ExpressionNode,\n ): BinaryExpressionNode<'Projection' | 'IndexExpression'> {\n const indexExpr: BinaryExpressionNode<'IndexExpression'> = { type: 'IndexExpression', left, right };\n if (right.type === 'Slice') {\n return {\n left: indexExpr,\n right: this.parseProjectionRHS(bindingPower.Star),\n type: 'Projection',\n };\n }\n return indexExpr;\n }\n\n private parseSliceExpression(): SliceNode {\n const parts: (number | null)[] = [null, null, null];\n\n let index = 0;\n let current = this.lookaheadToken(0);\n\n while (current.type != Token.TOK_RBRACKET && index < 3) {\n if (current.type === Token.TOK_COLON) {\n index++;\n if (index === 3) {\n this.errorToken(this.lookaheadToken(0), 'Syntax error, too many colons in slice expression');\n }\n this.advance();\n } else if (current.type === Token.TOK_NUMBER) {\n const part = this.lookaheadToken(0).value as number;\n parts[index] = part;\n this.advance();\n } else {\n const next = this.lookaheadToken(0);\n this.errorToken(next, `Syntax error, unexpected token: ${next.value}(${next.type})`);\n }\n\n current = this.lookaheadToken(0);\n }\n\n this.match(Token.TOK_RBRACKET);\n\n const [start, stop, step] = parts;\n return { type: 'Slice', start, stop, step };\n }\n\n private parseLetExpression(): LetExpressionNode {\n const separated = this.parseCommaSeparatedExpressionsUntilKeyword('in');\n const expression = this.expression(0);\n const bindings = separated.map(binding => binding as BindingNode);\n return {\n type: 'LetExpression',\n bindings: bindings,\n expression: expression,\n };\n }\n\n private parseCommaSeparatedExpressionsUntilKeyword(keyword: string): ExpressionNode[] {\n return this.parseCommaSeparatedExpressionsUntil(\n () => {\n return TokenParser.isKeyword(this.lookaheadToken(0), keyword);\n },\n () => {\n this.advance();\n },\n );\n }\n\n private parseCommaSeparatedExpressionsUntilToken(token: Token): ExpressionNode[] {\n return this.parseCommaSeparatedExpressionsUntil(\n () => {\n return this.lookahead(0) === token;\n },\n () => {\n return this.match(token);\n },\n );\n }\n\n private parseCommaSeparatedExpressionsUntil(isEndToken: () => boolean, matchEndToken: () => void): ExpressionNode[] {\n const args: ExpressionNode[] = [];\n let expression: ExpressionNode;\n while (!isEndToken()) {\n expression = this.expression(0);\n if (this.lookahead(0) === Token.TOK_COMMA) {\n this.match(Token.TOK_COMMA);\n }\n args.push(expression);\n }\n matchEndToken();\n return args;\n }\n\n private parseComparator(left: ExpressionNode, comparator: ComparatorType): ComparatorNode {\n const right = this.expression(bindingPower[comparator]);\n return { type: 'Comparator', name: comparator, left, right };\n }\n\n private parseArithmetic(left: ExpressionNode, operator: BinaryOperatorType): BinaryArithmeticNode {\n const right = this.expression(bindingPower[operator]);\n return { type: 'Arithmetic', operator: operator, left, right };\n }\n\n private parseDotRHS(rbp: number): ExpressionNode {\n const lookahead = this.lookahead(0);\n const exprTokens = [Token.TOK_UNQUOTEDIDENTIFIER, Token.TOK_QUOTEDIDENTIFIER, Token.TOK_STAR];\n if (exprTokens.includes(lookahead)) {\n return this.expression(rbp);\n }\n if (lookahead === Token.TOK_LBRACKET) {\n this.match(Token.TOK_LBRACKET);\n return this.parseMultiselectList();\n }\n if (lookahead === Token.TOK_LBRACE) {\n this.match(Token.TOK_LBRACE);\n return this.parseMultiselectHash();\n }\n const token = this.lookaheadToken(0);\n this.errorToken(token, `Syntax error, unexpected token: ${token.value}(${token.type})`);\n }\n\n private parseProjectionRHS(rbp: number): ExpressionNode {\n if (bindingPower[this.lookahead(0)] < 10) {\n return { type: 'Identity' };\n }\n if (this.lookahead(0) === Token.TOK_LBRACKET) {\n return this.expression(rbp);\n }\n if (this.lookahead(0) === Token.TOK_FILTER) {\n return this.expression(rbp);\n }\n if (this.lookahead(0) === Token.TOK_DOT) {\n this.match(Token.TOK_DOT);\n return this.parseDotRHS(rbp);\n }\n const token = this.lookaheadToken(0);\n this.errorToken(token, `Syntax error, unexpected token: ${token.value}(${token.type})`);\n }\n\n private parseMultiselectList(): ExpressionNode {\n const expressions: ExpressionNode[] = [];\n while (this.lookahead(0) !== Token.TOK_RBRACKET) {\n const expression = this.expression(0);\n expressions.push(expression);\n if (this.lookahead(0) === Token.TOK_COMMA) {\n this.match(Token.TOK_COMMA);\n if (this.lookahead(0) === Token.TOK_RBRACKET) {\n throw new Error('Syntax error: unexpected token Rbracket');\n }\n }\n }\n this.match(Token.TOK_RBRACKET);\n return { type: 'MultiSelectList', children: expressions };\n }\n\n private parseMultiselectHash(): ExpressionNode {\n const pairs: KeyValuePairNode[] = [];\n const identifierTypes = [Token.TOK_UNQUOTEDIDENTIFIER, Token.TOK_QUOTEDIDENTIFIER];\n let keyToken;\n let keyName: string;\n let value: ExpressionNode;\n // tslint:disable-next-line: prettier\n for (;;) {\n keyToken = this.lookaheadToken(0);\n if (!identifierTypes.includes(keyToken.type)) {\n throw new Error(`Syntax error: expecting an identifier token, got: ${keyToken.type}`);\n }\n keyName = keyToken.value as string;\n this.advance();\n this.match(Token.TOK_COLON);\n value = this.expression(0);\n pairs.push({ value, type: 'KeyValuePair', name: keyName });\n if (this.lookahead(0) === Token.TOK_COMMA) {\n this.match(Token.TOK_COMMA);\n } else if (this.lookahead(0) === Token.TOK_RBRACE) {\n this.match(Token.TOK_RBRACE);\n break;\n }\n }\n return { type: 'MultiSelectHash', children: pairs };\n }\n}\n\nexport const Parser = new TokenParser();\nexport default Parser;\n","export class Text {\n private _text: string;\n constructor(text: string) {\n this._text = text;\n }\n\n public get string(): string {\n return this._text;\n }\n\n public get length(): number {\n return this.codePoints.length;\n }\n\n public compareTo(other: string): number {\n return Text.compare(this, new Text(other));\n }\n\n public static get comparer(): (lhs: string, rhs: string) => number {\n const stringComparer = (left: string, right: string): number => {\n return new Text(left).compareTo(right);\n };\n return stringComparer;\n }\n\n public static compare(left: Text, right: Text): number {\n const leftCp = left.codePoints;\n const rightCp = right.codePoints;\n for (let index = 0; index < Math.min(leftCp.length, rightCp.length); index++) {\n if (leftCp[index] === rightCp[index]) {\n continue;\n }\n return leftCp[index] - rightCp[index] > 0 ? 1 : -1;\n }\n return leftCp.length - rightCp.length > 0 ? 1 : -1;\n }\n\n public reverse(): string {\n return String.fromCodePoint(...this.codePoints.reverse());\n }\n\n private get codePoints(): number[] {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const array = [...this._text].map(s => s.codePointAt(0)!);\n return array;\n }\n}\n","import { Text } from './utils/text';\nimport {\n findFirst,\n findLast,\n lower,\n padLeft,\n padRight,\n replace,\n split,\n trim,\n trimLeft,\n trimRight,\n upper,\n} from './utils/strings';\n\nimport type { ExpressionNode } from './AST.type';\nimport type {\n JSONArray,\n JSONArrayArray,\n JSONArrayKeyValuePairs,\n JSONArrayObject,\n JSONObject,\n JSONValue,\n ObjectDict,\n} from './JSON.type';\nimport type { TreeInterpreter } from './TreeInterpreter';\n\nexport enum InputArgument {\n TYPE_NUMBER = 0,\n TYPE_ANY = 1,\n TYPE_STRING = 2,\n TYPE_ARRAY = 3,\n TYPE_OBJECT = 4,\n TYPE_BOOLEAN = 5,\n TYPE_EXPREF = 6,\n TYPE_NULL = 7,\n TYPE_ARRAY_NUMBER = 8,\n TYPE_ARRAY_STRING = 9,\n TYPE_ARRAY_OBJECT = 10,\n TYPE_ARRAY_ARRAY = 11,\n}\n\nexport interface InputSignature {\n types: InputArgument[];\n variadic?: boolean;\n optional?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type RuntimeFunction<T extends any[], U> = (resolvedArgs: T) => U;\n\nexport interface FunctionSignature {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _func: RuntimeFunction<any, JSONValue>;\n _signature: InputSignature[];\n}\n\nexport interface FunctionTable {\n [functionName: string]: FunctionSignature;\n}\n\nexport class Runtime {\n _interpreter: TreeInterpreter;\n _functionTable: FunctionTable;\n TYPE_NAME_TABLE: { [InputArgument: number]: string } = {\n [InputArgument.TYPE_NUMBER]: 'number',\n [InputArgument.TYPE_ANY]: 'any',\n [InputArgument.TYPE_STRING]: 'string',\n [InputArgument.TYPE_ARRAY]: 'array',\n [InputArgument.TYPE_OBJECT]: 'object',\n [InputArgument.TYPE_BOOLEAN]: 'boolean',\n [InputArgument.TYPE_EXPREF]: 'expression',\n [InputArgument.TYPE_NULL]: 'null',\n [InputArgument.TYPE_ARRAY_NUMBER]: 'Array<number>',\n [InputArgument.TYPE_ARRAY_OBJECT]: 'Array<object>',\n [InputArgument.TYPE_ARRAY_STRING]: 'Array<string>',\n [InputArgument.TYPE_ARRAY_ARRAY]: 'Array<Array<any>>',\n };\n\n constructor(interpreter: TreeInterpreter) {\n this._interpreter = interpreter;\n this._functionTable = this.functionTable\n }\n\n registerFunction(\n name: string,\n customFunction: RuntimeFunction<(JSONValue | ExpressionNode)[], JSONValue>,\n signature: InputSignature[],\n ): void {\n if (name in this._functionTable) {\n throw new Error(`Function already defined: ${name}()`);\n }\n this._functionTable[name] = {\n _func: customFunction.bind(this),\n _signature: signature,\n };\n }\n\n callFunction(name: string, resolvedArgs: (JSONValue | ExpressionNode)[]): JSONValue {\n const functionEntry = this._functionTable[name];\n if (functionEntry === undefined) {\n throw new Error(`Unknown function: ${name}()`);\n }\n this.validateArgs(name, resolvedArgs, functionEntry._signature);\n return functionEntry._func.call(this, resolvedArgs);\n }\n\n private validateInputSignatures(name: string, signature: InputSignature[]): void {\n for (let i = 0; i < signature.length; i += 1) {\n if ('variadic' in signature[i] && i !== signature.length - 1) {\n throw new Error(`Invalid arity: ${name}() 'variadic' argument ${i + 1} must occur last`);\n }\n }\n }\n\n private validateArgs(name: string, args: (JSONValue | ExpressionNode)[], signature: InputSignature[]): void {\n let pluralized: boolean;\n this.validateInputSignatures(name, signature);\n const numberOfRequiredArgs = signature.filter(argSignature => !(argSignature.optional ?? false)).length;\n const lastArgIsVariadic = signature[signature.length - 1]?.variadic ?? false;\n const tooFewArgs = args.length < numberOfRequiredArgs;\n const tooManyArgs = args.length > signature.length;\n const tooFewModifier =\n tooFewArgs && ((!lastArgIsVariadic && numberOfRequiredArgs > 1) || lastArgIsVariadic) ? 'at least ' : '';\n\n if ((lastArgIsVariadic && tooFewArgs) || (!lastArgIsVariadic && (tooFewArgs || tooManyArgs))) {\n pluralized = signature.length > 1;\n throw new Error(\n `Invalid arity: ${name}() takes ${tooFewModifier}${numberOfRequiredArgs} argument${\n (pluralized && 's') || ''\n } but received ${args.length}`,\n );\n }\n\n let currentSpec: InputArgument[];\n let actualType: InputArgument;\n let typeMatched: boolean;\n for (let i = 0; i < signature.length; i += 1) {\n typeMatched = false;\n currentSpec = signature[i].types;\n actualType = this.getTypeName(args[i]) as InputArgument;\n let j: number;\n for (j = 0; j < currentSpec.length; j += 1) {\n if (actualType !== undefined && this.typeMatches(actualType, currentSpec[j], args[i])) {\n typeMatched = true;\n break;\n }\n }\n if (!typeMatched && actualType !== undefined) {\n const expected = currentSpec\n .map((typeIdentifier): string => {\n return this.TYPE_NAME_TABLE[typeIdentifier];\n })\n .join(' | ');\n\n throw new Error(\n `Invalid type: ${name}() expected argument ${i + 1} to be type (${expected}) but received type ${\n this.TYPE_NAME_TABLE[actualType]\n } instead.`,\n );\n }\n }\n }\n\n private typeMatches(actual: InputArgument, expected: InputArgument, argValue: unknown): boolean {\n if (expected === InputArgument.TYPE_ANY) {\n return true;\n }\n if (\n expected === InputArgument.TYPE_ARRAY_STRING ||\n expected === InputArgument.TYPE_ARRAY_NUMBER ||\n expected === InputArgument.TYPE_ARRAY_OBJECT ||\n expected === InputArgument.TYPE_ARRAY_ARRAY ||\n expected === InputArgument.TYPE_ARRAY\n ) {\n if (expected === InputArgument.TYPE_ARRAY) {\n return actual === InputArgument.TYPE_ARRAY;\n }\n if (actual === InputArgument.TYPE_ARRAY) {\n let subtype;\n if (expected === InputArgument.TYPE_ARRAY_NUMBER) {\n subtype = InputArgument.TYPE_NUMBER;\n } else if (expected === InputArgument.TYPE_ARRAY_OBJECT) {\n subtype = InputArgument.TYPE_OBJECT;\n } else if (expected === InputArgument.TYPE_ARRAY_STRING) {\n subtype = InputArgument.TYPE_STRING;\n } else if (expected === InputArgument.TYPE_ARRAY_ARRAY) {\n subtype = InputArgument.TYPE_ARRAY;\n }\n const array = <JSONValue[]>argValue;\n for (let i = 0; i < array.length; i += 1) {\n const typeName = this.getTypeName(array[i]);\n if (typeName !== undefined && subtype !== undefined && !this.typeMatches(typeName, subtype, array[i])) {\n return false;\n }\n }\n return true;\n }\n } else {\n return actual === expected;\n }\n return false;\n }\n private getTypeName(obj: JSONValue | ExpressionNode): InputArgument | undefined {\n switch (Object.prototype.toString.call(obj)) {\n case '[object String]':\n return InputArgument.TYPE_STRING;\n case '[object Number]':\n return InputArgument.TYPE_NUMBER;\n case '[object Array]':\n return InputArgument.TYPE_ARRAY;\n case '[object Boolean]':\n return InputArgument.TYPE_BOOLEAN;\n case '[object Null]':\n return InputArgument.TYPE_NULL;\n case '[object Object]':\n if ((obj as ObjectDict).expref) {\n return InputArgument.TYPE_EXPREF;\n }\n return InputArgument.TYPE_OBJECT;\n\n default:\n return;\n }\n }\n\n createKeyFunction(exprefNode: ExpressionNode, allowedTypes: InputArgument[]): (x: JSONValue) => JSONValue {\n const interpreter = this._interpreter;\n const keyFunc = (x: JSONValue): JSONValue => {\n const current = interpreter.visit(exprefNode, x) as JSONValue;\n if (!allowedTypes.includes(this.getTypeName(current) as InputArgument)) {\n const msg = `Invalid type: expected one of (${allowedTypes\n .map(t => this.TYPE_NAME_TABLE[t])\n .join(' | ')}), received ${this.TYPE_NAME_TABLE[this.getTypeName(current) as InputArgument]}`;\n throw new Error(msg);\n }\n return current;\n };\n return keyFunc;\n }\n\n private functionAbs: RuntimeFunction<number[], number> = ([inputValue]) => {\n return Math.abs(inputValue);\n };\n\n private functionAvg: RuntimeFunction<[number[]], number | null> = ([inputArray]) => {\n if (!inputArray || inputArray.length == 0) {\n return null;\n }\n\n let sum = 0;\n for (let i = 0; i < inputArray.length; i += 1) {\n sum += inputArray[i];\n }\n return sum / inputArray.length;\n };\n\n private functionCeil: RuntimeFunction<[number], number> = ([inputValue]) => {\n return Math.ceil(inputValue);\n };\n\n private functionContains: RuntimeFunction<[string[] | JSONArray, JSONValue], JSONValue> = ([\n searchable,\n searchValue,\n ]) => {\n if (Array.isArray(searchable)) {\n const array = <JSONArray>searchable;\n return array.includes(searchValue);\n }\n\n if (typeof searchable === 'string') {\n const text = <string>searchable;\n if (typeof searchValue === 'string') {\n return text.includes(searchValue);\n }\n }\n\n return null;\n };\n\n private functionEndsWith: RuntimeFunction<[string, string], boolean> = resolvedArgs => {\n const [searchStr, suffix] = resolvedArgs;\n return searchStr.includes(suffix, searchStr.length - suffix.length);\n };\n\n private functionFindFirst: RuntimeFunction<JSONValue[], number | null> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const search = <string>resolvedArgs[1];\n const start = (resolvedArgs.length > 2 && <number>resolvedArgs[2]) || undefined;\n const end = (resolvedArgs.length > 3 && <number>resolvedArgs[3]) || undefined;\n return findFirst(subject, search, start, end);\n };\n\n private functionFindLast: RuntimeFunction<JSONValue[], number | null> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const search = <string>resolvedArgs[1];\n const start = (resolvedArgs.length > 2 && <number>resolvedArgs[2]) || undefined;\n const end = (resolvedArgs.length > 3 && <number>resolvedArgs[3]) || undefined;\n return findLast(subject, search, start, end);\n };\n\n private functionFloor: RuntimeFunction<[number], number> = ([inputValue]) => {\n return Math.floor(inputValue);\n };\n\n private functionFromItems: RuntimeFunction<[JSONArrayKeyValuePairs], JSONObject> = ([array]) => {\n array.map((pair: [string, JSONValue]) => {\n if (pair.length != 2 || typeof pair[0] !== 'string') {\n throw new Error('invalid value, each array must contain two elements, a pair of string and value');\n }\n });\n return Object.fromEntries(array);\n };\n\n private functionGroupBy: RuntimeFunction<[JSONArrayObject, ExpressionNode], JSONValue> = ([array, exprefNode]) => {\n const keyFunction = this.createKeyFunction(exprefNode, [InputArgument.TYPE_STRING]);\n return array.reduce((acc, cur) => {\n const k = keyFunction(cur ?? {});\n const target = <JSONArray>(acc[<string>k] = acc[<string>k] || []);\n target.push(cur);\n return acc;\n }, {});\n };\n\n private functionItems: RuntimeFunction<[JSONObject], JSONArray> = ([inputValue]) => {\n return Object.entries(inputValue);\n };\n\n private functionJoin: RuntimeFunction<[string, string[]], string> = resolvedArgs => {\n const [joinChar, listJoin] = resolvedArgs;\n return listJoin.join(joinChar);\n };\n\n private functionKeys: RuntimeFunction<[JSONObject], string[]> = ([inputObject]) => {\n return Object.keys(inputObject);\n };\n\n private functionLength: RuntimeFunction<[string | JSONArray | JSONObject], number> = ([inputValue]) => {\n if (typeof inputValue === 'string') {\n return new Text(inputValue).length;\n }\n if (Array.isArray(inputValue)) {\n return inputValue.length;\n }\n return Object.keys(inputValue).length;\n };\n\n private functionLower: RuntimeFunction<[string], string> = ([subject]) => {\n return lower(subject);\n };\n\n private functionMap: RuntimeFunction<[ExpressionNode, JSONArray], JSONArray> = ([exprefNode, elements]) => {\n if (!this._interpreter) {\n return [];\n }\n const mapped = [];\n const interpreter = this._interpreter;\n for (let i = 0; i < elements.length; i += 1) {\n mapped.push(<JSONValue>interpreter.visit(exprefNode, elements[i]));\n }\n return mapped;\n };\n\n private functionMax: RuntimeFunction<[(string | number)[]], string | number | null> = ([inputValue]) => {\n if (!inputValue.length) {\n return null;\n }\n\n const typeName = this.getTypeName(inputValue[0]);\n if (typeName === InputArgument.TYPE_NUMBER) {\n return Math.max(...(inputValue as number[]));\n }\n\n const elements = inputValue as string[];\n let maxElement = elements[0];\n for (let i = 1; i < elements.length; i += 1) {\n if (maxElement.localeCompare(elements[i]) < 0) {\n maxElement = elements[i];\n }\n }\n return maxElement;\n };\n\n private functionMaxBy: RuntimeFunction<[number[] | string[], ExpressionNode], JSONValue> = resolvedArgs => {\n const exprefNode = resolvedArgs[1];\n const resolvedArray = resolvedArgs[0];\n const keyFunction = this.createKeyFunction(exprefNode, [InputArgument.TYPE_NUMBER, InputArgument.TYPE_STRING]);\n let maxNumber = -Infinity;\n let maxRecord!: JSONValue;\n let current: number | undefined;\n for (let i = 0; i < resolvedArray.length; i += 1) {\n current = keyFunction && (keyFunction(resolvedArray[i]) as number);\n if (current !== undefined && current > maxNumber) {\n maxNumber = current;\n maxRecord = resolvedArray[i];\n }\n }\n return maxRecord || null;\n };\n\n private functionMerge: RuntimeFunction<JSONObject[], JSONObject> = resolvedArgs => {\n let merged = {};\n for (let i = 0; i < resolvedArgs.length; i += 1) {\n const current = resolvedArgs[i];\n merged = Object.assign(merged, current);\n }\n return merged;\n };\n\n private functionMin: RuntimeFunction<[(string | number)[]], string | number | null> = ([inputValue]) => {\n if (!inputValue.length) {\n return null;\n }\n\n const typeName = this.getTypeName(inputValue[0]);\n if (typeName === InputArgument.TYPE_NUMBER) {\n return Math.min(...(inputValue as number[]));\n }\n\n const elements = inputValue as string[];\n let minElement = elements[0];\n for (let i = 1; i < elements.length; i += 1) {\n if (elements[i].localeCompare(minElement) < 0) {\n minElement = elements[i];\n }\n }\n return minElement;\n };\n\n private functionMinBy: RuntimeFunction<[number[] | string[], ExpressionNode], JSONValue> = resolvedArgs => {\n const exprefNode = resolvedArgs[1];\n const resolvedArray = resolvedArgs[0];\n const keyFunction = this.createKeyFunction(exprefNode, [InputArgument.TYPE_NUMBER, InputArgument.TYPE_STRING]);\n let minNumber = Infinity;\n let minRecord!: JSONValue;\n let current: number | undefined;\n for (let i = 0; i < resolvedArray.length; i += 1) {\n current = keyFunction && (keyFunction(resolvedArray[i]) as number);\n if (current !== undefined && current < minNumber) {\n minNumber = current;\n minRecord = resolvedArray[i];\n }\n }\n return minRecord || null;\n };\n\n private functionNotNull: RuntimeFunction<JSONArray, JSONValue> = resolvedArgs => {\n for (let i = 0; i < resolvedArgs.length; i += 1) {\n if (this.getTypeName(resolvedArgs[i]) !== InputArgument.TYPE_NULL) {\n return resolvedArgs[i];\n }\n }\n return null;\n };\n\n private functionPadLeft: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const width = <number>resolvedArgs[1];\n const padding = (resolvedArgs.length > 2 && <string>resolvedArgs[2]) || undefined;\n return padLeft(subject, width, padding);\n };\n\n private functionPadRight: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const width = <number>resolvedArgs[1];\n const padding = (resolvedArgs.length > 2 && <string>resolvedArgs[2]) || undefined;\n return padRight(subject, width, padding);\n };\n\n private functionReplace: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const string = <string>resolvedArgs[1];\n const by = <string>resolvedArgs[2];\n return replace(subject, string, by, resolvedArgs.length > 3 ? <number>resolvedArgs[3] : undefined);\n };\n\n private functionSplit: RuntimeFunction<JSONValue[], string[]> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const search = <string>resolvedArgs[1];\n return split(subject, search, resolvedArgs.length > 2 ? <number>resolvedArgs[2] : undefined);\n };\n\n private functionReverse: RuntimeFunction<[string | JSONArray], string | JSONArray> = ([inputValue]) => {\n const typeName = this.getTypeName(inputValue);\n if (typeName === InputArgument.TYPE_STRING) {\n return new Text(inputValue as string).reverse();\n }\n const reversedArray = (inputValue as JSONArray).slice(0);\n reversedArray.reverse();\n return reversedArray;\n };\n\n private functionSort: RuntimeFunction<[(string | number)[]], (string | number)[]> = ([inputValue]) => {\n if (inputValue.length == 0) {\n return inputValue;\n }\n if (typeof inputValue[0] === 'string') {\n return (<string[]>[...inputValue]).sort(Text.comparer);\n }\n return [...inputValue].sort();\n };\n\n private functionSortBy: RuntimeFunction<[number[] | string[], ExpressionNode], JSONValue> = resolvedArgs => {\n const sortedArray = resolvedArgs[0].slice(0);\n if (sortedArray.length === 0) {\n return sortedArray;\n }\n const interpreter = this._interpreter;\n const exprefNode = resolvedArgs[1];\n const requiredType = this.getTypeName(interpreter.visit(exprefNode, sortedArray[0]) as JSONValue);\n if (requiredType !== undefined && ![InputArgument.TYPE_NUMBER, InputArgument.TYPE_STRING].includes(requiredType)) {\n throw new Error(`Invalid type: unexpected type (${this.TYPE_NAME_TABLE[requiredType]})`);\n }\n function throwInvalidTypeError(rt: Runtime, item: string | number): never {\n throw new Error(\n `Invalid type: expected (${rt.TYPE_NAME_TABLE[requiredType as InputArgument]}), received ${\n rt.TYPE_NAME_TABLE[rt.getTypeName(item) as InputArgument]\n }`,\n );\n }\n\n return sortedArray.sort((a, b) => {\n const exprA = interpreter.visit(exprefNode, a) as number | string;\n const exprB = interpreter.visit(exprefNode, b) as number | string;\n if (this.getTypeName(exprA) !== requiredType) {\n throwInvalidTypeError(this, exprA);\n } else if (this.getTypeName(exprB) !== requiredType) {\n throwInvalidTypeError(this, exprB);\n }\n if (requiredType === InputArgument.TYPE_STRING) {\n return Text.comparer(<string>exprA, <string>exprB);\n }\n return <number>exprA - <number>exprB;\n });\n };\n\n private functionStartsWith: RuntimeFunction<[string, string], boolean> = ([searchable, searchStr]) => {\n return searchable.startsWith(searchStr);\n };\n\n private functionSum: RuntimeFunction<[number[]], number> = ([inputValue]) => {\n return inputValue.reduce((x, y) => x + y, 0);\n };\n\n private functionToArray: RuntimeFunction<[JSONValue], JSONArray> = ([inputValue]) => {\n if (this.getTypeName(inputValue) === InputArgument.TYPE_ARRAY) {\n return inputValue as JSONArray;\n }\n return [inputValue];\n };\n\n private functionToNumber: RuntimeFunction<[JSONValue], number | null> = ([inputValue]) => {\n const typeName = this.getTypeName(inputValue);\n let convertedValue: number;\n if (typeName === InputArgument.TYPE_NUMBER) {\n return inputValue as number;\n }\n if (typeName === InputArgument.TYPE_STRING) {\n convertedValue = +(inputValue as string);\n if (!isNaN(convertedValue)) {\n return convertedValue;\n }\n }\n return null;\n };\n\n private functionToString: RuntimeFunction<[JSONValue], string> = ([inputValue]) => {\n if (this.getTypeName(inputValue) === InputArgument.TYPE_STRING) {\n return inputValue as string;\n }\n return JSON.stringify(inputValue);\n };\n\n private functionTrim: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n return trim(subject, resolvedArgs.length > 1 ? <string>resolvedArgs[1] : undefined);\n };\n private functionTrimLeft: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n return trimLeft(subject, resolvedArgs.length > 1 ? <string>resolvedArgs[1] : undefined);\n };\n private functionTrimRight: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n return trimRight(subject, resolvedArgs.length > 1 ? <string>resolvedArgs[1] : undefined);\n };\n\n private functionType: RuntimeFunction<[JSONValue], string> = ([inputValue]) => {\n switch (this.getTypeName(inputValue)) {\n case InputArgument.TYPE_NUMBER:\n return 'number';\n case InputArgument.TYPE_STRING:\n return 'string';\n case InputArgument.TYPE_ARRAY:\n return 'array';\n case InputArgument.TYPE_OBJECT:\n return 'object';\n case InputArgument.TYPE_BOOLEAN:\n return 'boolean';\n case InputArgument.TYPE_NULL:\n return 'null';\n default:\n throw new Error('invalid-type');\n }\n };\n\n private functionUpper: RuntimeFunction<[string], string> = ([subject]) => {\n return upper(subject);\n };\n\n private functionValues: RuntimeFunction<[JSONObject], JSONValue[]> = ([inputObject]) => {\n return Object.values(inputObject);\n };\n\n private functionZip: RuntimeFunction<JSONArrayArray, JSONArray> = array => {\n const length = Math.min(...array.map(arr => arr.length));\n const result = Array(length)\n .fill(null)\n .map((_, index) => array.map(arr => arr[index]));\n return result;\n };\n\n private functionTable: FunctionTable = {\n abs: {\n _func: this.functionAbs,\n _signature: [\n {\n types: [InputArgument.TYPE_NUMBER],\n },\n ],\n },\n avg: {\n _func: this.functionAvg,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_NUMBER],\n },\n ],\n },\n ceil: {\n _func: this.functionCeil,\n _signature: [\n {\n types: [InputArgument.TYPE_NUMBER],\n },\n ],\n },\n contains: {\n _func: this.functionContains,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING, InputArgument.TYPE_ARRAY],\n },\n {\n types: [InputArgument.TYPE_ANY],\n },\n ],\n },\n ends_with: {\n _func: this.functionEndsWith,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n ],\n },\n find_first: {\n _func: this.functionFindFirst,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n ],\n },\n find_last: {\n _func: this.functionFindLast,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n ],\n },\n floor: {\n _func: this.functionFloor,\n _signature: [\n {\n types: [InputArgument.TYPE_NUMBER],\n },\n ],\n },\n from_items: {\n _func: this.functionFromItems,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_ARRAY],\n },\n ],\n },\n group_by: {\n _func: this.functionGroupBy,\n _signature: [{ types: [InputArgument.TYPE_ARRAY] }, { types: [InputArgument.TYPE_EXPREF] }],\n },\n items: {\n _func: this.functionItems,\n _signature: [\n {\n types: [InputArgument.TYPE_OBJECT],\n },\n ],\n },\n join: {\n _func: this.functionJoin,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_ARRAY_STRING],\n },\n ],\n },\n keys: {\n _func: this.functionKeys,\n _signature: [\n {\n types: [InputArgument.TYPE_OBJECT],\n },\n ],\n },\n length: {\n _func: this.functionLength,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING, InputArgument.TYPE_ARRAY, InputArgument.TYPE_OBJECT],\n },\n ],\n },\n lower: {\n _func: this.functionLower,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n ],\n },\n map: {\n _func: this.functionMap,\n _signature: [\n {\n types: [InputArgument.TYPE_EXPREF],\n },\n {\n types: [InputArgument.TYPE_ARRAY],\n },\n ],\n },\n max: {\n _func: this.functionMax,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_NUMBER, InputArgument.TYPE_ARRAY_STRING],\n },\n ],\n },\n max_by: {\n _func: this.functionMaxBy,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY],\n },\n {\n types: [InputArgument.TYPE_EXPREF],\n },\n ],\n },\n merge: {\n _func: this.functionMerge,\n _signature: [\n {\n types: [InputArgument.TYPE_OBJECT],\n variadic: true,\n },\n ],\n },\n min: {\n _func: this.functionMin,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_NUMBER, InputArgument.TYPE_ARRAY_STRING],\n },\n ],\n },\n min_by: {\n _func: this.functionMinBy,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY],\n },\n {\n types: [InputArgument.TYPE_EXPREF],\n },\n ],\n },\n not_null: {\n _func: this.functionNotNull,\n _signature: [\n {\n types: [InputArgument.TYPE_ANY],\n variadic: true,\n },\n ],\n },\n pad_left: {\n _func: this.functionPadLeft,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n },\n {\n types: [InputArgument.TYPE_STRING],\n optional: true,\n },\n ],\n },\n pad_right: {\n _func: this.functionPadRight,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n },\n {\n types: [InputArgument.TYPE_STRING],\n optional: true,\n },\n ],\n },\n replace: {\n _func: this.functionReplace,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n ],\n },\n split: {\n _func: this.functionSplit,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n ],\n },\n reverse: {\n _func: this.functionReverse,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING, InputArgument.TYPE_ARRAY],\n },\n ],\n },\n sort: {\n _func: this.functionSort,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_STRING, InputArgument.TYPE_ARRAY_NUMBER],\n },\n ],\n },\n sort_by: {\n _func: this.functionSortBy,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY],\n },\n {\n types: [InputArgument.TYPE_EXPREF],\n },\n ],\n },\n starts_with: {\n _func: this.functionStartsWith,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n ],\n },\n sum: {\n _func: this.functionSum,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_NUMBER],\n },\n ],\n },\n to_array: {\n _func: this.functionToArray,\n _signature: [\n {\n types: [InputArgument.TYPE_ANY],\n },\n ],\n },\n to_number: {\n _func: this.functionToNumber,\n _signature: [\n {\n types: [InputArgument.TYPE_ANY],\n },\n ],\n },\n to_string: {\n _func: this.functionToString,\n _signature: [\n {\n types: [InputArgument.TYPE_ANY],\n },\n ],\n },\n trim: {\n _func: this.functionTrim,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n optional: true,\n },\n ],\n },\n trim_left: {\n _func: this.functionTrimLeft,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n optional: true,\n },\n ],\n },\n trim_right: {\n _func: this.functionTrimRight,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n optional: true,\n },\n ],\n },\n type: {\n _func: this.functionType,\n _signature: [\n {\n types: [InputArgument.TYPE_ANY],\n },\n ],\n },\n upper: {\n _func: this.functionUpper,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n ],\n },\n values: {\n _func: this.functionValues,\n _signature: [\n {\n types: [InputArgument.TYPE_OBJECT],\n },\n ],\n },\n zip: {\n _func: this.functionZip,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY],\n variadic: true,\n },\n ],\n },\n };\n}\n","import { JSONObject, JSONValue } from './JSON.type';\n\nexport class ScopeChain {\n private inner?: ScopeChain = undefined;\n private data: JSONObject = {};\n\n public withScope(data: JSONObject): ScopeChain {\n const outer: ScopeChain = new ScopeChain();\n outer.inner = this;\n outer.data = data;\n return outer;\n }\n\n public getValue(identifier: string): JSONValue {\n if (identifier in this.data) {\n const result = this.data[identifier];\n if (result !== null && result !== undefined) {\n return result;\n }\n }\n if (this.inner) {\n return this.inner.getValue(identifier);\n }\n return null;\n }\n}\n","import { Token } from './Lexer.type';\nimport { Runtime } from './Runtime';\nimport { ScopeChain } from './Scope';\nimport { add, div, divide, ensureNumbers, isFalse, mod, mul, strictDeepEqual, sub } from './utils';\n\nimport type { ExpressionNode, ExpressionReference, SliceNode } from './AST.type';\nimport type { JSONArray, JSONObject, JSONValue } from './JSON.type';\nimport { ScopeEntry } from './Parser.type';\n\nexport class TreeInterpreter {\n runtime: Runtime;\n private _rootValue: JSONValue | null = null;\n private _scope: ScopeChain;\n\n constructor() {\n this.runtime = new Runtime(this);\n this._scope = new ScopeChain();\n }\n\n withScope(scope: ScopeEntry): TreeInterpreter {\n const interpreter = new TreeInterpreter();\n interpreter.runtime._functionTable = this.runtime._functionTable;\n interpreter._rootValue = this._rootValue;\n interpreter._scope = this._scope.withScope(scope);\n return interpreter;\n }\n\n search(node: ExpressionNode, value: JSONValue): JSONValue {\n this._rootValue = value;\n this._scope = new ScopeChain();\n return this.visit(node, value) as JSONValue;\n }\n\n visit(node: ExpressionNode, value: JSONValue | ExpressionNode): JSONValue | ExpressionNode | ExpressionReference {\n switch (node.type) {\n case 'Field':\n const identifier = node.name;\n let result: JSONValue = null;\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n result = (value as JSONObject)[identifier] ?? null;\n }\n return result;\n case 'LetExpression': {\n const { bindings, expression } = node;\n let scope = {};\n bindings.forEach(binding => {\n const reference = this.visit(binding, value) as JSONObject;\n scope = {\n ...scope,\n ...reference,\n };\n });\n return this.withScope(scope).visit(expression, value);\n }\n case 'Binding': {\n const { variable, reference } = node;\n const result = this.visit(reference, value);\n return { [variable]: result } as JSONObject;\n }\n case 'Variable': {\n const variable = node.name;\n const result = this._scope.getValue(variable) ?? null;\n if (result === null || result === undefined) {\n throw new Error(`Error referencing undefined variable ${variable}`);\n }\n return result;\n }\n case 'IndexExpression':\n return this.visit(node.right, this.visit(node.left, value));\n case 'Subexpression': {\n const result = this.visit(node.left, value);\n return result != null ? this.visit(node.right, result) ?? null : null;\n }\n case 'Index': {\n if (!Array.isArray(value)) {\n return null;\n }\n const index = node.value < 0 ? value.length + node.value : node.value;\n return value[index] ?? null;\n }\n case 'Slice': {\n if (!Array.isArray(value) && typeof value !== 'string') {\n return null;\n }\n const { start, stop, step } = this.computeSliceParams(value.length, node);\n if (typeof value === 'string') {\n // string slices is implemented by slicing\n // the corresponding array of codepoints and\n // converting the result back to a string\n const chars = [...value];\n const sliced = this.slice(chars, start, stop, step);\n return sliced.join('');\n } else {\n return this.slice(value, start, stop, step);\n }\n }\n case 'Projection': {\n const { left, right } = node;\n\n // projections typically operate on arrays\n // string slicing produces a 'Projection' whose\n // first child is an 'IndexExpression' whose\n // second child is an 'Slice'\n\n // we allow execution of the left index-expression\n // to return a string only if the AST has this\n // specific shape\n\n let allowString = false;\n if (left.type === 'IndexExpression' && left.right.type === 'Slice') {\n allowString = true;\n }\n\n const base = this.visit(left, value);\n if (allowString && typeof base === 'string') {\n // a projection is really a sub-expression in disguise\n // we must evaluate the right hand expression\n return this.visit(right, base) as JSONValue;\n }\n\n if (!Array.isArray(base)) {\n return null;\n }\n const collected: JSONArray = [];\n for (const elem of base) {\n const current = this.visit(right, elem) as JSONValue;\n if (current !== null) {\n collected.push(current);\n }\n }\n return collected as JSONValue;\n }\n case 'ValueProjection': {\n const { left, right } = node;\n\n const base = this.visit(left, value);\n if (base === null || typeof base !== 'object' || Array.isArray(base)) {\n return null;\n }\n const collected: JSONArray = [];\n const values = Object.values(base);\n for (const elem of values) {\n const current = this.visit(right, elem) as JSONValue;\n if (current !== null) {\n collected.push(current);\n }\n }\n return collected;\n }\n case 'FilterProjection': {\n const { left, right, condition } = node;\n\n const base = this.visit(left, value);\n if (!Array.isArray(base)) {\n return null;\n }\n\n const results: JSONArray = [];\n for (const elem of base) {\n const matched = this.visit(condition, elem);\n if (isFalse(matched)) {\n continue;\n }\n const result = this.visit(right, elem) as JSONValue;\n if (result !== null) {\n results.push(result);\n }\n }\n return results;\n }\n case 'Arithmetic': {\n const first = this.visit(node.left, value) as JSONValue;\n const second = this.visit(node.right, value) as JSONValue;\n switch (node.operator) {\n case Token.TOK_PLUS:\n return add(first, second);\n\n case Token.TOK_MINUS:\n return sub(first, second);\n\n case Token.TOK_MULTIPLY:\n case Token.TOK_STAR:\n return mul(first, second);\n\n case Token.TOK_DIVIDE:\n return divide(first, second);\n\n case Token.TOK_MODULO:\n return mod(first, second);\n\n case Token.TOK_DIV:\n return div(first, second);\n\n default:\n throw new Error(`Syntax error: unknown arithmetic operator: ${node.operator}`);\n }\n }\n case 'Unary': {\n const operand = this.visit(node.operand, value) as JSONValue;\n switch (node.operator) {\n case Token.TOK_PLUS:\n ensureNumbers(operand);\n return operand as number;\n\n case Token.TOK_MINUS:\n ensureNumbers(operand);\n return -(operand as number);\n\n default:\n throw new Error(`Syntax error: unknown arithmetic operator: ${node.operator}`);\n }\n }\n case 'Comparator': {\n const first = this.visit(node.left, value);\n const second = this.visit(node.right, value);\n\n // equality is an exact match\n\n switch (node.name) {\n case 'EQ':\n return strictDeepEqual(first, second);\n case 'NE':\n return !strictDeepEqual(first, second);\n }\n\n // ordering operators are only valid for numbers\n\n if (typeof first !== 'number' || typeof second !== 'number') {\n return null;\n }\n\n switch (node.name) {\n case 'GT':\n return (first as number) > (second as number);\n case 'GTE':\n return (first as number) >= (second as number);\n case 'LT':\n return (first as number) < (second as number);\n case 'LTE':\n return (first as number) <= (second as number);\n }\n }\n case 'Flatten': {\n const original = this.visit(node.child, value);\n return Array.isArray(original) ? original.flat() : null;\n }\n case 'Root':\n return this._rootValue;\n case 'MultiSelectList': {\n const collected: JSONArray = [];\n for (const child of node.children) {\n collected.push(this.visit(child, value) as JSONValue);\n }\n return collected;\n }\n case 'MultiSelectHash': {\n const collected: JSONObject = {};\n for (const child of node.children) {\n collected[child.name] = this.visit(child.value, value) as JSONValue;\n }\n return collected;\n }\n case 'OrExpression': {\n const result = this.visit(node.left, value);\n if (isFalse(result)) {\n return this.visit(node.right, value);\n }\n return result;\n }\n case 'AndExpression': {\n const result = this.visit(node.left, value);\n if (isFalse(result)) {\n return result;\n }\n return this.visit(node.right, value);\n }\n case 'NotExpression':\n return isFalse(this.visit(node.child, value));\n case 'Literal':\n return node.value;\n case 'Pipe':\n return this.visit(node.right, this.visit(node.left, value));\n case 'Function': {\n const args: JSONArray = [];\n for (const child of node.children) {\n args.push(this.visit(child, value) as JSONValue);\n }\n return this.runtime.callFunction(node.name, args);\n }\n case 'ExpressionReference':\n return {\n expref: true,\n ...node.child,\n };\n case 'Current':\n case 'Identity':\n return value;\n }\n }\n\n computeSliceParams(arrayLength: number, sliceNode: SliceNode): { start: number; stop: number; step: number } {\n let { start, stop, step } = sliceNode;\n\n if (step === null) {\n step = 1;\n } else if (step === 0) {\n const error = new Error('Invalid value: slice step cannot be 0');\n error.name = 'RuntimeError';\n throw error;\n }\n\n start = start === null ? (step < 0 ? arrayLength - 1 : 0) : this.capSliceRange(arrayLength, start, step);\n stop = stop === null ? (step < 0 ? -1 : arrayLength) : this.capSliceRange(arrayLength, stop, step);\n\n return { start, stop, step };\n }\n\n capSliceRange(arrayLength: number, actualValue: number, step: number): number {\n let nextActualValue = actualValue;\n if (nextActualValue < 0) {\n nextActualValue += arrayLength;\n if (nextActualValue < 0) {\n nextActualValue = step < 0 ? -1 : 0;\n }\n } else if (nextActualValue >= arrayLength) {\n nextActualValue = step < 0 ? arrayLength - 1 : arrayLength;\n }\n return nextActualValue;\n }\n\n slice(collection: JSONArray, start: number, end: number, step: number): JSONArray {\n const result = [];\n if (step > 0) {\n for (let i = start; i < end; i += step) {\n result.push(collection[i]);\n }\n } else {\n for (let i = start; i > end; i += step) {\n result.push(collection[i]);\n }\n }\n return result;\n }\n}\n\nexport const TreeInterpreterInstance = new TreeInterpreter();\nexport default TreeInterpreterInstance;\n","import Parser from './Parser';\nimport Lexer from './Lexer';\nimport TreeInterpreterInst from './TreeInterpreter';\n\nimport { ExpressionNode } from './AST.type';\nimport { JSONValue } from './JSON.type';\nimport { LexerOptions, LexerToken } from './Lexer.type';\nimport { Options } from './Parser.type';\nimport { InputArgument, RuntimeFunction, InputSignature } from './Runtime';\nimport { ScopeChain } from './Scope';\n\nexport type { Options } from './Parser.type';\nexport type { FunctionSignature, RuntimeFunction, InputSignature } from './Runtime';\n\nexport const TYPE_ANY = InputArgument.TYPE_ANY;\nexport const TYPE_ARRAY = InputArgument.TYPE_ARRAY;\nexport const TYPE_ARRAY_ARRAY = InputArgument.TYPE_ARRAY_ARRAY;\nexport const TYPE_ARRAY_NUMBER = InputArgument.TYPE_ARRAY_NUMBER;\nexport const TYPE_ARRAY_OBJECT = InputArgument.TYPE_ARRAY_OBJECT;\nexport const TYPE_ARRAY_STRING = InputArgument.TYPE_ARRAY_STRING;\nexport const TYPE_BOOLEAN = InputArgument.TYPE_BOOLEAN;\nexport const TYPE_EXPREF = InputArgument.TYPE_EXPREF;\nexport const TYPE_NULL = InputArgument.TYPE_NULL;\nexport const TYPE_NUMBER = InputArgument.TYPE_NUMBER;\nexport const TYPE_OBJECT = InputArgument.TYPE_OBJECT;\nexport const TYPE_STRING = InputArgument.TYPE_STRING;\n\nexport function compile(expression: string, options?: Options): ExpressionNode {\n const nodeTree = Parser.parse(expression, options);\n return nodeTree;\n}\n\nexport function tokenize(expression: string, options?: LexerOptions): LexerToken[] {\n return Lexer.tokenize(expression, options);\n}\n\nexport const registerFunction = (\n functionName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n customFunction: RuntimeFunction<any[], JSONValue>,\n signature: InputSignature[],\n): void => {\n TreeInterpreterInst.runtime.registerFunction(functionName, customFunction, signature);\n};\n\nexport function search(data: JSONValue, expression: string, options?: Options): JSONValue {\n const nodeTree = Parser.parse(expression, options);\n return TreeInterpreterInst.search(nodeTree, data);\n}\n\nexport function Scope(): ScopeChain {\n return new ScopeChain();\n}\n\nexport const TreeInterpreter = TreeInterpreterInst;\n\nexport const jmespath = {\n compile,\n registerFunction,\n search,\n tokenize,\n TreeInterpreter,\n TYPE_ANY,\n TYPE_ARRAY_NUMBER,\n TYPE_ARRAY_STRING,\n TYPE_ARRAY,\n TYPE_BOOLEAN,\n TYPE_EXPREF,\n TYPE_NULL,\n TYPE_NUMBER,\n TYPE_OBJECT,\n TYPE_STRING,\n};\n\nexport default jmespath;\n"],"names":["isObject","obj","Object","prototype","toString","call","strictDeepEqual","first","second","Array","isArray","length","i","firstEntries","entries","secondKeys","Set","keys","size","key","value","delete","isFalse","_key","isAlpha","ch","isNum","ensureInteger","Math","floor","Error","ensurePositiveInteger","ensureNumbers","operands","undefined","notZero","n","ensurePadFuncParams","name","width","padding","replace","subject","string","by","count","map","split","join","trimLeft","chars","trimImpl","list","RegExp","trimRight","regExper","pattern","Token","basicTokens","TOK_LPAREN","TOK_RPAREN","TOK_STAR","TOK_COMMA","TOK_DOT","TOK_COLON","TOK_CURRENT","TOK_RBRACKET","TOK_LBRACE","TOK_RBRACE","TOK_PLUS","TOK_MODULO","TOK_MINUS","TOK_MULTIPLY","TOK_DIVIDE","operatorStartToken","skipChars","Lexer","constructor","this","_current","_enable_legacy_literals","tokenize","stream","options","tokens","start","identifier","token","enable_legacy_literals","consumeUnquotedIdentifier","push","type","TOK_UNQUOTEDIDENTIFIER","TOK_VARIABLE","TOK_ROOT","consumeNumber","consumeLBracket","consumeQuotedIdentifier","TOK_QUOTEDIDENTIFIER","consumeRawStringLiteral","TOK_LITERAL","literal","consumeLiteral","consumeOperator","error","slice","maxLength","current","ok","parseJSON","parseInt","TOK_NUMBER","TOK_FILTER","TOK_FLATTEN","TOK_LBRACKET","consumeOrElse","peek","orElse","TOK_NOT","TOK_NE","TOK_LT","TOK_LTE","TOK_GT","TOK_GTE","TOK_ASSIGN","TOK_EQ","TOK_EXPREF","TOK_AND","TOK_PIPE","TOK_OR","TOK_DIV","literalString","trimStart","looksLikeJSON","includes","_","text","JSON","parse","_a","bindingPower","TOK_EOF","TokenParser","index","expression","loadTokens","ast","lookahead","lookaheadToken","errorToken","rbp","leftToken","advance","left","nud","currentTokenType","led","offset","isKeyword","parseLetExpression","child","Not","Minus","operator","operand","Plus","right","parseProjectionRHS","Star","parseMultiselectHash","Flatten","parseIndexExpression","projectIfSlice","parseMultiselectList","Expref","console","log","args","match","tokenName","Dot","parseDotRHS","Pipe","Or","And","children","parseCommaSeparatedExpressionsUntilToken","condition","Filter","leftNode","variable","reference","parseComparator","parseArithmetic","static","keyword","tokenType","message","parseSliceExpression","Number","indexExpr","parts","part","next","stop","step","separated","parseCommaSeparatedExpressionsUntilKeyword","bindings","binding","parseCommaSeparatedExpressionsUntil","isEndToken","matchEndToken","comparator","expressions","pairs","identifierTypes","keyToken","keyName","Parser","Text","_text","codePoints","compareTo","other","compare","comparer","leftCp","rightCp","min","reverse","String","fromCodePoint","s","codePointAt","InputArgument","Runtime","interpreter","TYPE_NAME_TABLE","TYPE_NUMBER","TYPE_ANY","TYPE_STRING","TYPE_ARRAY","TYPE_OBJECT","TYPE_BOOLEAN","TYPE_EXPREF","TYPE_NULL","TYPE_ARRAY_NUMBER","TYPE_ARRAY_OBJECT","TYPE_ARRAY_STRING","TYPE_ARRAY_ARRAY","functionAbs","inputValue","abs","functionAvg","inputArray","sum","functionCeil","ceil","functionContains","searchable","searchValue","functionEndsWith","resolvedArgs","searchStr","suffix","functionFindFirst","sub","end","max","indexOf","findFirst","functionFindLast","lastIndexOf","findLast","functionFloor","functionFromItems","array","pair","fromEntries","functionGroupBy","exprefNode","keyFunction","createKeyFunction","reduce","acc","cur","k","functionItems","functionJoin","joinChar","listJoin","functionKeys","inputObject","functionLength","functionLower","toLowerCase","lower","functionMap","elements","_interpreter","mapped","visit","functionMax","getTypeName","maxElement","localeCompare","functionMaxBy","resolvedArray","maxRecord","maxNumber","Infinity","functionMerge","merged","assign","functionMin","minElement","functionMinBy","minRecord","minNumber","functionNotNull","functionPadLeft","padStart","padLeft","functionPadRight","padEnd","padRight","functionReplace","functionSplit","search","functionReverse","reversedArray","functionSort","sort","functionSortBy","sortedArray","requiredType","throwInvalidTypeError","rt","item","a","b","exprA","exprB","functionStartsWith","startsWith","functionSum","x","y","functionToArray","functionToNumber","typeName","convertedValue","isNaN","functionToString","stringify","functionTrim","trim","functionTrimLeft","functionTrimRight","functionType","functionUpper","toUpperCase","upper","functionValues","values","functionZip","arr","fill","functionTable","_func","_signature","types","avg","contains","ends_with","find_first","optional","find_last","from_items","group_by","items","max_by","merge","variadic","min_by","not_null","pad_left","pad_right","sort_by","starts_with","to_array","to_number","to_string","trim_left","trim_right","zip","_functionTable","registerFunction","customFunction","signature","bind","callFunction","functionEntry","validateArgs","validateInputSignatures","pluralized","numberOfRequiredArgs","filter","argSignature","lastArgIsVariadic","_b","tooFewArgs","tooManyArgs","tooFewModifier","currentSpec","actualType","typeMatched","j","typeMatches","expected","typeIdentifier","actual","argValue","subtype","expref","allowedTypes","msg","t","ScopeChain","inner","data","withScope","outer","getValue","result","TreeInterpreter","_rootValue","runtime","_scope","scope","node","forEach","_c","_d","computeSliceParams","allowString","base","collected","elem","results","matched","mul","divide","mod","div","original","flat","arrayLength","sliceNode","capSliceRange","actualValue","nextActualValue","collection","TreeInterpreterInstance","compile","functionName","TreeInterpreterInst","nodeTree","jmespath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jmespath.umd.min.js","sources":["../src/utils/index.ts","../src/utils/strings.ts","../src/Lexer.type.ts","../src/Lexer.ts","../src/Parser.ts","../src/utils/text.ts","../src/Runtime.ts","../src/Scope.ts","../src/TreeInterpreter.ts","../src/index.ts"],"sourcesContent":["import { JSONValue } from '../JSON.type';\n\nexport const isObject = (obj: unknown): obj is Record<string, unknown> => {\n return obj !== null && Object.prototype.toString.call(obj) === '[object Object]';\n};\n\nexport const strictDeepEqual = (first: unknown, second: unknown): boolean => {\n if (first === second) {\n return true;\n }\n if (typeof first !== typeof second) {\n return false;\n }\n if (Array.isArray(first) && Array.isArray(second)) {\n if (first.length !== second.length) {\n return false;\n }\n for (let i = 0; i < first.length; i += 1) {\n if (!strictDeepEqual(first[i], second[i])) {\n return false;\n }\n }\n return true;\n }\n if (isObject(first) && isObject(second)) {\n const firstEntries = Object.entries(first);\n const secondKeys = new Set(Object.keys(second));\n if (firstEntries.length !== secondKeys.size) {\n return false;\n }\n for (const [key, value] of firstEntries) {\n if (!strictDeepEqual(value, second[key])) {\n return false;\n }\n secondKeys.delete(key);\n }\n return secondKeys.size === 0;\n }\n return false;\n};\n\nexport const isFalse = (obj: unknown): boolean => {\n if (typeof obj === 'object') {\n if (obj === null) {\n return true;\n }\n if (Array.isArray(obj)) {\n return obj.length === 0;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n for (const _key in obj) {\n return false;\n }\n return true;\n }\n return !(typeof obj === 'number' || obj);\n};\n\nexport const isAlpha = (ch: string): boolean => {\n // tslint:disable-next-line: strict-comparisons\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_';\n};\n\nexport const isNum = (ch: string): boolean => {\n // tslint:disable-next-line: strict-comparisons\n return (ch >= '0' && ch <= '9') || ch === '-';\n};\nexport const isAlphaNum = (ch: string): boolean => {\n // tslint:disable-next-line: strict-comparisons\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch === '_';\n};\n\nexport const ensureInteger = (value: unknown): number => {\n if (!(typeof value === 'number') || Math.floor(value) !== value) {\n throw new Error('invalid-value: expecting an integer.');\n }\n return <number>value;\n};\nexport const ensurePositiveInteger = (value: unknown): number => {\n if (!(typeof value === 'number') || <number>value < 0 || Math.floor(value) !== value) {\n throw new Error('invalid-value: expecting a non-negative integer.');\n }\n return <number>value;\n};\n\nexport const ensureNumbers = (...operands: (JSONValue | undefined)[]): void => {\n for (let i = 0; i < operands.length; i++) {\n if (operands[i] === null || operands[i] === undefined) {\n throw new Error('not-a-number: undefined');\n }\n if (typeof operands[i] !== 'number') {\n throw new Error('not-a-number');\n }\n }\n};\n\nconst notZero = (n: number): number => {\n n = +n; // coerce to number\n if (!n) {\n // matches -0, +0, NaN\n throw new Error('not-a-number: divide by zero');\n }\n return n;\n};\n\nexport const add = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = (left as number) + (right as number);\n return result;\n};\nexport const sub = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = (left as number) - (right as number);\n return result;\n};\nexport const mul = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = (left as number) * (right as number);\n return result;\n};\nexport const divide = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = (left as number) / notZero(right as number);\n return result;\n};\nexport const div = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = Math.floor((left as number) / notZero(right as number));\n return result;\n};\nexport const mod = (left?: JSONValue, right?: JSONValue): number => {\n ensureNumbers(left, right);\n const result = (left as number) % (right as number);\n return result;\n};\n","import { ensureInteger, ensurePositiveInteger } from '.';\n\nexport const findFirst = (subject: string, sub: string, start?: number, end?: number): number | null => {\n if (!subject || !sub) {\n return null;\n }\n start = Math.max(ensureInteger((start = start || 0)), 0);\n end = Math.min(ensureInteger((end = end || subject.length)), subject.length);\n const offset = subject.slice(start, end).indexOf(sub);\n return offset === -1 ? null : offset + start;\n};\nexport const findLast = (subject: string, sub: string, start?: number, end?: number): number | null => {\n if (!subject || !sub) {\n return null;\n }\n start = Math.max(ensureInteger((start = start || 0)), 0);\n end = Math.min(ensureInteger((end = end || subject.length)), subject.length);\n const offset = subject.slice(start, end).lastIndexOf(sub);\n const result = offset === -1 ? null : offset + start;\n return result;\n};\nexport const lower = (subject: string): string => subject.toLowerCase();\nconst ensurePadFuncParams = (name: string, width: number, padding?: string): string => {\n padding = padding || ' ';\n if (padding.length > 1) {\n throw new Error(`invalid value, ${name} expects its 'pad' parameter to be a valid string with a single codepoint`);\n }\n ensurePositiveInteger(width);\n return padding;\n};\nexport const padLeft = (subject: string, width: number, padding?: string): string => {\n padding = ensurePadFuncParams('pad_left', width, padding);\n return (subject && subject.padStart(width, padding)) || '';\n};\nexport const padRight = (subject: string, width: number, padding?: string): string => {\n padding = ensurePadFuncParams('pad_right', width, padding);\n return (subject && subject.padEnd(width, padding)) || '';\n};\nexport const replace = (subject: string, string: string, by: string, count?: number): string => {\n if (count === 0) {\n return subject;\n }\n if (!count) {\n // emulating es2021: String.prototype.replaceAll()\n return subject.split(string).join(by);\n }\n ensurePositiveInteger(count);\n [...Array(count).keys()].map(() => (subject = subject.replace(string, by)));\n return subject;\n};\nexport const split = (subject: string, search: string, count?: number): string[] => {\n if (subject.length == 0 && search.length === 0) {\n return [];\n }\n if (count === null || count === undefined) {\n return subject.split(search);\n }\n ensurePositiveInteger(count);\n if (count === 0) {\n return [subject];\n }\n const split = subject.split(search);\n return [...split.slice(0, count), split.slice(count).join(search)];\n};\nexport const trim = (subject: string, chars?: string): string => {\n return trimLeft(trimRight(subject, chars), chars);\n};\nexport const trimLeft = (subject: string, chars?: string): string => {\n return trimImpl(subject, list => new RegExp(`^[${list}]*(.*?)`), chars);\n};\nexport const trimRight = (subject: string, chars?: string): string => {\n return trimImpl(subject, list => new RegExp(`(.*?)[${list}]*\\$`), chars);\n};\nconst trimImpl = (subject: string, regExper: (arg: string) => RegExp, chars?: string): string => {\n const pattern = chars ? chars.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') : '\\\\s\\u0085';\n return subject.replace(regExper(pattern), '$1');\n};\n\nexport const upper = (subject: string): string => subject.toUpperCase();\n","import { JSONValue } from './JSON.type';\n\nexport enum Token {\n TOK_EOF = 'EOF',\n TOK_VARIABLE = 'Variable',\n TOK_ASSIGN = 'Assign',\n TOK_UNQUOTEDIDENTIFIER = 'UnquotedIdentifier',\n TOK_QUOTEDIDENTIFIER = 'QuotedIdentifier',\n TOK_RBRACKET = 'Rbracket',\n TOK_RPAREN = 'Rparen',\n TOK_COMMA = 'Comma',\n TOK_COLON = 'Colon',\n TOK_RBRACE = 'Rbrace',\n TOK_NUMBER = 'Number',\n TOK_CURRENT = 'Current',\n TOK_ROOT = 'Root',\n TOK_EXPREF = 'Expref',\n TOK_PIPE = 'Pipe',\n TOK_OR = 'Or',\n TOK_AND = 'And',\n TOK_EQ = 'EQ',\n TOK_GT = 'GT',\n TOK_LT = 'LT',\n TOK_GTE = 'GTE',\n TOK_LTE = 'LTE',\n TOK_NE = 'NE',\n TOK_PLUS = 'Plus',\n TOK_MINUS = 'Minus',\n TOK_MULTIPLY = 'Multiply',\n TOK_DIVIDE = 'Divide',\n TOK_MODULO = 'Modulo',\n TOK_DIV = 'Div',\n TOK_FLATTEN = 'Flatten',\n TOK_STAR = 'Star',\n TOK_FILTER = 'Filter',\n TOK_DOT = 'Dot',\n TOK_NOT = 'Not',\n TOK_LBRACE = 'Lbrace',\n TOK_LBRACKET = 'Lbracket',\n TOK_LPAREN = 'Lparen',\n TOK_LITERAL = 'Literal',\n}\n\nexport type LexerTokenValue = JSONValue;\n\nexport interface LexerToken {\n type: Token;\n value: LexerTokenValue;\n start: number;\n}\n\nexport interface LexerOptions {\n // The flag to enable pre-JEP-12 literal compatibility.\n // JEP-12 deprecates `foo` -> \"foo\" syntax.\n // Valid expressions MUST use: `\"foo\"` -> \"foo\"\n //\n // Setting this flag to `true` enables support for legacy syntax.\n //\n enable_legacy_literals?: boolean;\n}\n","import { JSONValue } from './JSON.type';\nimport { replace } from './utils/strings';\nimport { LexerOptions, LexerToken, Token } from './Lexer.type';\nimport { isAlpha, isNum, isAlphaNum } from './utils/index';\n\nexport const basicTokens: Record<string, Token> = {\n '(': Token.TOK_LPAREN,\n ')': Token.TOK_RPAREN,\n '*': Token.TOK_STAR,\n ',': Token.TOK_COMMA,\n '.': Token.TOK_DOT,\n ':': Token.TOK_COLON,\n '@': Token.TOK_CURRENT,\n ']': Token.TOK_RBRACKET,\n '{': Token.TOK_LBRACE,\n '}': Token.TOK_RBRACE,\n '+': Token.TOK_PLUS,\n '%': Token.TOK_MODULO,\n '\\u2212': Token.TOK_MINUS,\n '\\u00d7': Token.TOK_MULTIPLY,\n '\\u00f7': Token.TOK_DIVIDE,\n};\n\nconst operatorStartToken: Record<string, boolean> = {\n '!': true,\n '<': true,\n '=': true,\n '>': true,\n '&': true,\n '|': true,\n '/': true,\n};\n\nconst skipChars: Record<string, boolean> = {\n '\\t': true,\n '\\n': true,\n '\\r': true,\n ' ': true,\n};\n\nclass StreamLexer {\n private _current = 0;\n private _enable_legacy_literals = false;\n\n tokenize(stream: string, options?: LexerOptions): LexerToken[] {\n const tokens: LexerToken[] = [];\n this._current = 0;\n this._enable_legacy_literals = options?.enable_legacy_literals || false;\n\n let start;\n let identifier;\n let token;\n while (this._current < stream.length) {\n if (isAlpha(stream[this._current])) {\n start = this._current;\n identifier = this.consumeUnquotedIdentifier(stream);\n tokens.push({\n start,\n type: Token.TOK_UNQUOTEDIDENTIFIER,\n value: identifier,\n });\n } else if (basicTokens[stream[this._current]] !== undefined) {\n tokens.push({\n start: this._current,\n type: basicTokens[stream[this._current]],\n value: stream[this._current],\n });\n this._current += 1;\n } else if (stream[this._current] === '$') {\n start = this._current;\n if (this._current + 1 < stream.length && isAlpha(stream[this._current + 1])) {\n this._current += 1;\n identifier = this.consumeUnquotedIdentifier(stream);\n tokens.push({\n start,\n type: Token.TOK_VARIABLE,\n value: identifier,\n });\n } else {\n tokens.push({\n start: start,\n type: Token.TOK_ROOT,\n value: stream[this._current],\n });\n this._current += 1;\n }\n } else if (stream[this._current] === '-') {\n if (this._current + 1 < stream.length && isNum(stream[this._current + 1])) {\n const token = this.consumeNumber(stream);\n token && tokens.push(token);\n } else {\n const token = {\n start: this._current,\n type: Token.TOK_MINUS,\n value: '-',\n };\n tokens.push(token);\n this._current += 1;\n }\n } else if (isNum(stream[this._current])) {\n token = this.consumeNumber(stream);\n tokens.push(token);\n } else if (stream[this._current] === '[') {\n token = this.consumeLBracket(stream);\n tokens.push(token);\n } else if (stream[this._current] === '\"') {\n start = this._current;\n identifier = this.consumeQuotedIdentifier(stream);\n tokens.push({\n start,\n type: Token.TOK_QUOTEDIDENTIFIER,\n value: identifier,\n });\n } else if (stream[this._current] === `'`) {\n start = this._current;\n identifier = this.consumeRawStringLiteral(stream);\n tokens.push({\n start,\n type: Token.TOK_LITERAL,\n value: identifier,\n });\n } else if (stream[this._current] === '`') {\n start = this._current;\n const literal = this.consumeLiteral(stream);\n tokens.push({\n start,\n type: Token.TOK_LITERAL,\n value: literal,\n });\n } else if (operatorStartToken[stream[this._current]] !== undefined) {\n token = this.consumeOperator(stream);\n token && tokens.push(token);\n } else if (skipChars[stream[this._current]] !== undefined) {\n this._current += 1;\n } else {\n const error = new Error(`Syntax error: unknown character: ${stream[this._current]}`);\n error.name = 'LexerError';\n throw error;\n }\n }\n return tokens;\n }\n\n private consumeUnquotedIdentifier(stream: string): string {\n const start = this._current;\n this._current += 1;\n while (this._current < stream.length && isAlphaNum(stream[this._current])) {\n this._current += 1;\n }\n return stream.slice(start, this._current);\n }\n\n private consumeQuotedIdentifier(stream: string): string {\n const start = this._current;\n this._current += 1;\n const maxLength = stream.length;\n while (stream[this._current] !== '\"' && this._current < maxLength) {\n let current = this._current;\n if (stream[current] === '\\\\' && (stream[current + 1] === '\\\\' || stream[current + 1] === '\"')) {\n current += 2;\n } else {\n current += 1;\n }\n this._current = current;\n }\n this._current += 1;\n const [value, ok] = this.parseJSON(stream.slice(start, this._current));\n if (!ok) {\n const error = new Error(`syntax: unexpected end of JSON input`);\n error.name = 'LexerError';\n throw error;\n }\n return <string>value;\n }\n\n private consumeRawStringLiteral(stream: string): string {\n const start = this._current;\n this._current += 1;\n const maxLength = stream.length;\n while (stream[this._current] !== `'` && this._current < maxLength) {\n let current = this._current;\n if (stream[current] === '\\\\' && (stream[current + 1] === '\\\\' || stream[current + 1] === `'`)) {\n current += 2;\n } else {\n current += 1;\n }\n this._current = current;\n }\n this._current += 1;\n const literal = stream.slice(start + 1, this._current - 1);\n return replace(replace(literal, `\\\\\\\\`, `\\\\`), `\\\\'`, `'`);\n }\n\n private consumeNumber(stream: string): LexerToken {\n const start = this._current;\n this._current += 1;\n const maxLength = stream.length;\n while (isNum(stream[this._current]) && this._current < maxLength) {\n this._current += 1;\n }\n const value = parseInt(stream.slice(start, this._current), 10);\n return { start, value, type: Token.TOK_NUMBER };\n }\n\n private consumeLBracket(stream: string): LexerToken {\n const start = this._current;\n this._current += 1;\n if (stream[this._current] === '?') {\n this._current += 1;\n return { start, type: Token.TOK_FILTER, value: '[?' };\n }\n if (stream[this._current] === ']') {\n this._current += 1;\n return { start, type: Token.TOK_FLATTEN, value: '[]' };\n }\n return { start, type: Token.TOK_LBRACKET, value: '[' };\n }\n\n private consumeOrElse(stream: string, peek: string, token: Token, orElse: Token): LexerToken {\n const start = this._current;\n this._current += 1;\n if (this._current < stream.length && stream[this._current] === peek) {\n this._current += 1;\n return {\n start: start,\n type: orElse,\n value: stream.slice(start, this._current),\n };\n }\n return { start: start, type: token, value: stream[start] };\n }\n\n private consumeOperator(stream: string): LexerToken | void {\n const start = this._current;\n const startingChar = stream[start];\n switch (startingChar) {\n case '!':\n return this.consumeOrElse(stream, '=', Token.TOK_NOT, Token.TOK_NE);\n case '<':\n return this.consumeOrElse(stream, '=', Token.TOK_LT, Token.TOK_LTE);\n case '>':\n return this.consumeOrElse(stream, '=', Token.TOK_GT, Token.TOK_GTE);\n case '=':\n return this.consumeOrElse(stream, '=', Token.TOK_ASSIGN, Token.TOK_EQ);\n case '&':\n return this.consumeOrElse(stream, '&', Token.TOK_EXPREF, Token.TOK_AND);\n case '|':\n return this.consumeOrElse(stream, '|', Token.TOK_PIPE, Token.TOK_OR);\n case '/':\n return this.consumeOrElse(stream, '/', Token.TOK_DIVIDE, Token.TOK_DIV);\n }\n }\n\n private consumeLiteral(stream: string): JSONValue {\n this._current += 1;\n const start = this._current;\n const maxLength = stream.length;\n\n while (stream[this._current] !== '`' && this._current < maxLength) {\n let current = this._current;\n if (stream[current] === '\\\\' && (stream[current + 1] === '\\\\' || stream[current + 1] === '`')) {\n current += 2;\n } else {\n current += 1;\n }\n this._current = current;\n }\n let literalString = stream.slice(start, this._current).trimStart();\n literalString = literalString.replace('\\\\`', '`');\n\n let literal: JSONValue = null;\n let ok = false;\n\n // attempts to detect and parse valid JSON\n\n if (this.looksLikeJSON(literalString)) {\n [literal, ok] = this.parseJSON(literalString);\n }\n\n // invalid JSON values should be converted to quoted\n // JSON strings during the JEP-12 deprecation period.\n\n if (!ok && this._enable_legacy_literals) {\n [literal, ok] = this.parseJSON(`\"${literalString}\"`);\n }\n\n if (!ok) {\n const error = new Error(\n `Syntax error: unexpected end of JSON input or invalid format for a JSON literal: ${stream[this._current]}`,\n );\n error.name = 'LexerError';\n throw error;\n }\n\n this._current += 1;\n return literal;\n }\n\n private looksLikeJSON(literalString: string): boolean {\n const startingChars = '[{\"';\n const jsonLiterals = ['true', 'false', 'null'];\n const numberLooking = '-0123456789';\n\n if (literalString === '') {\n return false;\n }\n if (startingChars.includes(literalString[0])) {\n return true;\n }\n if (jsonLiterals.includes(literalString)) {\n return true;\n }\n if (numberLooking.includes(literalString[0])) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const [_, ok] = this.parseJSON(literalString);\n return ok;\n }\n return false;\n }\n\n private parseJSON(text: string): [JSONValue, boolean] {\n try {\n const json = JSON.parse(text);\n return [json, true];\n } catch {\n return [null, false];\n }\n }\n}\n\nexport const Lexer = new StreamLexer();\nexport default Lexer;\n","import type {\n BinaryArithmeticNode,\n UnaryArithmeticNode,\n BinaryExpressionNode,\n ComparatorNode,\n ComparatorType,\n ExpressionNode,\n FunctionNode,\n IndexNode,\n KeyValuePairNode,\n BinaryOperatorType,\n SliceNode,\n UnaryExpressionNode,\n LetExpressionNode,\n BindingNode,\n VariableNode,\n} from './AST.type';\nimport Lexer from './Lexer';\nimport { LexerToken, Token } from './Lexer.type';\nimport { Options } from './Parser.type';\n\nconst bindingPower: Record<string, number> = {\n [Token.TOK_EOF]: 0,\n [Token.TOK_VARIABLE]: 0,\n [Token.TOK_UNQUOTEDIDENTIFIER]: 0,\n [Token.TOK_QUOTEDIDENTIFIER]: 0,\n [Token.TOK_RBRACKET]: 0,\n [Token.TOK_RPAREN]: 0,\n [Token.TOK_COMMA]: 0,\n [Token.TOK_RBRACE]: 0,\n [Token.TOK_NUMBER]: 0,\n [Token.TOK_CURRENT]: 0,\n [Token.TOK_EXPREF]: 0,\n [Token.TOK_ROOT]: 0,\n [Token.TOK_ASSIGN]: 1,\n [Token.TOK_PIPE]: 1,\n [Token.TOK_OR]: 2,\n [Token.TOK_AND]: 3,\n [Token.TOK_EQ]: 5,\n [Token.TOK_GT]: 5,\n [Token.TOK_LT]: 5,\n [Token.TOK_GTE]: 5,\n [Token.TOK_LTE]: 5,\n [Token.TOK_NE]: 5,\n [Token.TOK_MINUS]: 6,\n [Token.TOK_PLUS]: 6,\n [Token.TOK_DIV]: 7,\n [Token.TOK_DIVIDE]: 7,\n [Token.TOK_MODULO]: 7,\n [Token.TOK_MULTIPLY]: 7,\n [Token.TOK_FLATTEN]: 9,\n [Token.TOK_STAR]: 20,\n [Token.TOK_FILTER]: 21,\n [Token.TOK_DOT]: 40,\n [Token.TOK_NOT]: 45,\n [Token.TOK_LBRACE]: 50,\n [Token.TOK_LBRACKET]: 55,\n [Token.TOK_LPAREN]: 60,\n};\n\nclass TokenParser {\n index = 0;\n tokens: LexerToken[] = [];\n\n parse(expression: string, options?: Options): ExpressionNode {\n this.loadTokens(expression, options || { enable_legacy_literals: false });\n this.index = 0;\n\n const ast = this.expression(0);\n if (this.lookahead(0) !== Token.TOK_EOF) {\n const token = this.lookaheadToken(0);\n this.errorToken(token, `Syntax error: unexpected token type: ${token.type}, value: ${token.value}`);\n }\n return ast;\n }\n\n private loadTokens(expression: string, options: Options): void {\n this.tokens = [\n ...Lexer.tokenize(expression, options),\n { type: Token.TOK_EOF, value: '', start: expression.length },\n ];\n }\n\n expression(rbp: number): ExpressionNode {\n const leftToken = this.lookaheadToken(0);\n this.advance();\n let left = this.nud(leftToken);\n let currentTokenType = this.lookahead(0);\n while (rbp < bindingPower[currentTokenType]) {\n this.advance();\n left = this.led(currentTokenType, left);\n currentTokenType = this.lookahead(0);\n }\n return left;\n }\n\n private lookahead(offset: number): Token {\n return this.tokens[this.index + offset].type;\n }\n\n private lookaheadToken(offset: number): LexerToken {\n return this.tokens[this.index + offset];\n }\n\n private advance(): void {\n this.index += 1;\n }\n\n nud(token: LexerToken): ExpressionNode {\n switch (token.type) {\n case Token.TOK_VARIABLE:\n return { type: 'Variable', name: token.value as string };\n case Token.TOK_LITERAL:\n return { type: 'Literal', value: token.value };\n case Token.TOK_UNQUOTEDIDENTIFIER: {\n if (TokenParser.isKeyword(token, 'let') && this.lookahead(0) === Token.TOK_VARIABLE) {\n return this.parseLetExpression();\n } else {\n return { type: 'Field', name: token.value as string };\n }\n }\n case Token.TOK_QUOTEDIDENTIFIER:\n if (this.lookahead(0) === Token.TOK_LPAREN) {\n throw new Error('Syntax error: quoted identifier not allowed for function names.');\n } else {\n return { type: 'Field', name: token.value as string };\n }\n case Token.TOK_NOT: {\n const child = this.expression(bindingPower.Not);\n return { type: 'NotExpression', child };\n }\n case Token.TOK_MINUS: {\n const child = this.expression(bindingPower.Minus);\n return {\n type: 'Unary',\n operator: token.type,\n operand: child,\n } as UnaryArithmeticNode;\n }\n case Token.TOK_PLUS: {\n const child = this.expression(bindingPower.Plus);\n return {\n type: 'Unary',\n operator: token.type,\n operand: child,\n } as UnaryArithmeticNode;\n }\n case Token.TOK_STAR: {\n const left: ExpressionNode = { type: 'Identity' };\n const right: ExpressionNode =\n this.lookahead(0) === Token.TOK_RBRACKET ? left : this.parseProjectionRHS(bindingPower.Star);\n return { type: 'ValueProjection', left, right };\n }\n case Token.TOK_FILTER:\n return this.led(token.type, { type: 'Identity' });\n case Token.TOK_LBRACE:\n return this.parseMultiselectHash();\n case Token.TOK_FLATTEN: {\n const left: ExpressionNode = {\n type: 'Flatten',\n child: { type: 'Identity' },\n };\n const right: ExpressionNode = this.parseProjectionRHS(bindingPower.Flatten);\n return { type: 'Projection', left, right };\n }\n case Token.TOK_LBRACKET: {\n if (this.lookahead(0) === Token.TOK_NUMBER || this.lookahead(0) === Token.TOK_COLON) {\n const right = this.parseIndexExpression();\n return this.projectIfSlice({ type: 'Identity' }, right);\n }\n if (this.lookahead(0) === Token.TOK_STAR && this.lookahead(1) === Token.TOK_RBRACKET) {\n this.advance();\n this.advance();\n const right = this.parseProjectionRHS(bindingPower.Star);\n return {\n left: { type: 'Identity' },\n right,\n type: 'Projection',\n };\n }\n return this.parseMultiselectList();\n }\n case Token.TOK_CURRENT:\n return { type: Token.TOK_CURRENT };\n case Token.TOK_ROOT:\n return { type: Token.TOK_ROOT };\n case Token.TOK_EXPREF: {\n const child = this.expression(bindingPower.Expref);\n return { type: 'ExpressionReference', child };\n }\n case Token.TOK_LPAREN: {\n const args: ExpressionNode[] = [];\n let expression = this.expression(0);\n args.push(expression);\n this.match(Token.TOK_RPAREN);\n return args[0];\n }\n default:\n this.errorToken(token);\n }\n }\n\n led(tokenName: string, left: ExpressionNode): ExpressionNode {\n switch (tokenName) {\n case Token.TOK_DOT: {\n const rbp = bindingPower.Dot;\n if (this.lookahead(0) !== Token.TOK_STAR) {\n const right = this.parseDotRHS(rbp);\n return { type: 'Subexpression', left, right };\n }\n this.advance();\n const right = this.parseProjectionRHS(rbp);\n return { type: 'ValueProjection', left, right };\n }\n case Token.TOK_PIPE: {\n const right = this.expression(bindingPower.Pipe);\n return { type: 'Pipe', left, right };\n }\n case Token.TOK_OR: {\n const right = this.expression(bindingPower.Or);\n return { type: 'OrExpression', left, right };\n }\n case Token.TOK_AND: {\n const right = this.expression(bindingPower.And);\n return { type: 'AndExpression', left, right };\n }\n case Token.TOK_LPAREN: {\n if (left.type !== 'Field') {\n throw new Error('Syntax error: expected a Field node');\n }\n const name = left.name;\n const args = this.parseCommaSeparatedExpressionsUntilToken(Token.TOK_RPAREN);\n const node: FunctionNode = { name, type: 'Function', children: args };\n return node;\n }\n case Token.TOK_FILTER: {\n const condition = this.expression(0);\n this.match(Token.TOK_RBRACKET);\n const right: ExpressionNode =\n this.lookahead(0) === Token.TOK_FLATTEN ? { type: 'Identity' } : this.parseProjectionRHS(bindingPower.Filter);\n return { type: 'FilterProjection', left, right, condition };\n }\n case Token.TOK_FLATTEN: {\n const leftNode: UnaryExpressionNode = { type: 'Flatten', child: left };\n const right = this.parseProjectionRHS(bindingPower.Flatten);\n return { type: 'Projection', left: leftNode, right };\n }\n case Token.TOK_ASSIGN: {\n const leftNode = left as VariableNode;\n const right = this.expression(0);\n return {\n type: 'Binding',\n variable: leftNode.name,\n reference: right,\n };\n }\n case Token.TOK_EQ:\n case Token.TOK_NE:\n case Token.TOK_GT:\n case Token.TOK_GTE:\n case Token.TOK_LT:\n case Token.TOK_LTE:\n return this.parseComparator(left, tokenName);\n case Token.TOK_PLUS:\n case Token.TOK_MINUS:\n case Token.TOK_MULTIPLY:\n case Token.TOK_STAR:\n case Token.TOK_DIVIDE:\n case Token.TOK_MODULO:\n case Token.TOK_DIV:\n return this.parseArithmetic(left, tokenName);\n case Token.TOK_LBRACKET: {\n const token = this.lookaheadToken(0);\n if (token.type === Token.TOK_NUMBER || token.type === Token.TOK_COLON) {\n const right = this.parseIndexExpression();\n return this.projectIfSlice(left, right);\n }\n this.match(Token.TOK_STAR);\n this.match(Token.TOK_RBRACKET);\n const right = this.parseProjectionRHS(bindingPower.Star);\n return { type: 'Projection', left, right };\n }\n\n default:\n return this.errorToken(this.lookaheadToken(0));\n }\n }\n\n private static isKeyword(token: LexerToken, keyword: string): boolean {\n return token.type === Token.TOK_UNQUOTEDIDENTIFIER && token.value === keyword;\n }\n\n private match(tokenType: Token | LexerToken): void {\n if (this.lookahead(0) === tokenType) {\n this.advance();\n return;\n } else {\n const token = this.lookaheadToken(0);\n this.errorToken(token, `Syntax error: expected ${tokenType}, got: ${token.type}`);\n }\n }\n\n private errorToken(token: LexerToken, message = ''): never {\n const error = new Error(message || `Syntax error: invalid token (${token.type}): \"${token.value}\"`);\n error.name = 'ParserError';\n throw error;\n }\n\n private parseIndexExpression(): SliceNode | IndexNode {\n if (this.lookahead(0) === Token.TOK_COLON || this.lookahead(1) === Token.TOK_COLON) {\n return this.parseSliceExpression();\n }\n const value = Number(this.lookaheadToken(0).value);\n this.advance();\n this.match(Token.TOK_RBRACKET);\n return { type: 'Index', value };\n }\n\n private projectIfSlice(\n left: ExpressionNode,\n right: ExpressionNode,\n ): BinaryExpressionNode<'Projection' | 'IndexExpression'> {\n const indexExpr: BinaryExpressionNode<'IndexExpression'> = {\n type: 'IndexExpression',\n left,\n right,\n };\n if (right.type === 'Slice') {\n return {\n left: indexExpr,\n right: this.parseProjectionRHS(bindingPower.Star),\n type: 'Projection',\n };\n }\n return indexExpr;\n }\n\n private parseSliceExpression(): SliceNode {\n const parts: (number | null)[] = [null, null, null];\n\n let index = 0;\n let current = this.lookaheadToken(0);\n\n while (current.type != Token.TOK_RBRACKET && index < 3) {\n if (current.type === Token.TOK_COLON) {\n index++;\n if (index === 3) {\n this.errorToken(this.lookaheadToken(0), 'Syntax error, too many colons in slice expression');\n }\n this.advance();\n } else if (current.type === Token.TOK_NUMBER) {\n const part = this.lookaheadToken(0).value as number;\n parts[index] = part;\n this.advance();\n } else {\n const next = this.lookaheadToken(0);\n this.errorToken(next, `Syntax error, unexpected token: ${next.value}(${next.type})`);\n }\n\n current = this.lookaheadToken(0);\n }\n\n this.match(Token.TOK_RBRACKET);\n\n const [start, stop, step] = parts;\n return { type: 'Slice', start, stop, step };\n }\n\n private parseLetExpression(): LetExpressionNode {\n const separated = this.parseCommaSeparatedExpressionsUntilKeyword('in');\n const expression = this.expression(0);\n const bindings = separated.map(binding => binding as BindingNode);\n return {\n type: 'LetExpression',\n bindings: bindings,\n expression: expression,\n };\n }\n\n private parseCommaSeparatedExpressionsUntilKeyword(keyword: string): ExpressionNode[] {\n return this.parseCommaSeparatedExpressionsUntil(\n () => {\n return TokenParser.isKeyword(this.lookaheadToken(0), keyword);\n },\n () => {\n this.advance();\n },\n );\n }\n\n private parseCommaSeparatedExpressionsUntilToken(token: Token): ExpressionNode[] {\n return this.parseCommaSeparatedExpressionsUntil(\n () => {\n return this.lookahead(0) === token;\n },\n () => {\n return this.match(token);\n },\n );\n }\n\n private parseCommaSeparatedExpressionsUntil(isEndToken: () => boolean, matchEndToken: () => void): ExpressionNode[] {\n const args: ExpressionNode[] = [];\n let expression: ExpressionNode;\n while (!isEndToken()) {\n expression = this.expression(0);\n if (this.lookahead(0) === Token.TOK_COMMA) {\n this.match(Token.TOK_COMMA);\n }\n args.push(expression);\n }\n matchEndToken();\n return args;\n }\n\n private parseComparator(left: ExpressionNode, comparator: ComparatorType): ComparatorNode {\n const right = this.expression(bindingPower[comparator]);\n return { type: 'Comparator', name: comparator, left, right };\n }\n\n private parseArithmetic(left: ExpressionNode, operator: BinaryOperatorType): BinaryArithmeticNode {\n const right = this.expression(bindingPower[operator]);\n return { type: 'Arithmetic', operator: operator, left, right };\n }\n\n private parseDotRHS(rbp: number): ExpressionNode {\n const lookahead = this.lookahead(0);\n const exprTokens = [Token.TOK_UNQUOTEDIDENTIFIER, Token.TOK_QUOTEDIDENTIFIER, Token.TOK_STAR];\n if (exprTokens.includes(lookahead)) {\n return this.expression(rbp);\n }\n if (lookahead === Token.TOK_LBRACKET) {\n this.match(Token.TOK_LBRACKET);\n return this.parseMultiselectList();\n }\n if (lookahead === Token.TOK_LBRACE) {\n this.match(Token.TOK_LBRACE);\n return this.parseMultiselectHash();\n }\n const token = this.lookaheadToken(0);\n this.errorToken(token, `Syntax error, unexpected token: ${token.value}(${token.type})`);\n }\n\n private parseProjectionRHS(rbp: number): ExpressionNode {\n if (bindingPower[this.lookahead(0)] < 10) {\n return { type: 'Identity' };\n }\n if (this.lookahead(0) === Token.TOK_LBRACKET) {\n return this.expression(rbp);\n }\n if (this.lookahead(0) === Token.TOK_FILTER) {\n return this.expression(rbp);\n }\n if (this.lookahead(0) === Token.TOK_DOT) {\n this.match(Token.TOK_DOT);\n return this.parseDotRHS(rbp);\n }\n const token = this.lookaheadToken(0);\n this.errorToken(token, `Syntax error, unexpected token: ${token.value}(${token.type})`);\n }\n\n private parseMultiselectList(): ExpressionNode {\n const expressions: ExpressionNode[] = [];\n while (this.lookahead(0) !== Token.TOK_RBRACKET) {\n const expression = this.expression(0);\n expressions.push(expression);\n if (this.lookahead(0) === Token.TOK_COMMA) {\n this.match(Token.TOK_COMMA);\n if (this.lookahead(0) === Token.TOK_RBRACKET) {\n throw new Error('Syntax error: unexpected token Rbracket');\n }\n }\n }\n this.match(Token.TOK_RBRACKET);\n return { type: 'MultiSelectList', children: expressions };\n }\n\n private parseMultiselectHash(): ExpressionNode {\n const pairs: KeyValuePairNode[] = [];\n const identifierTypes = [Token.TOK_UNQUOTEDIDENTIFIER, Token.TOK_QUOTEDIDENTIFIER];\n let keyToken;\n let keyName: string;\n let value: ExpressionNode;\n // tslint:disable-next-line: prettier\n for (;;) {\n keyToken = this.lookaheadToken(0);\n if (!identifierTypes.includes(keyToken.type)) {\n throw new Error(`Syntax error: expecting an identifier token, got: ${keyToken.type}`);\n }\n keyName = keyToken.value as string;\n this.advance();\n this.match(Token.TOK_COLON);\n value = this.expression(0);\n pairs.push({ value, type: 'KeyValuePair', name: keyName });\n if (this.lookahead(0) === Token.TOK_COMMA) {\n this.match(Token.TOK_COMMA);\n } else if (this.lookahead(0) === Token.TOK_RBRACE) {\n this.match(Token.TOK_RBRACE);\n break;\n }\n }\n return { type: 'MultiSelectHash', children: pairs };\n }\n}\n\nexport const Parser = new TokenParser();\nexport default Parser;\n","export class Text {\n private _text: string;\n constructor(text: string) {\n this._text = text;\n }\n\n public get string(): string {\n return this._text;\n }\n\n public get length(): number {\n return this.codePoints.length;\n }\n\n public compareTo(other: string): number {\n return Text.compare(this, new Text(other));\n }\n\n public static get comparer(): (lhs: string, rhs: string) => number {\n const stringComparer = (left: string, right: string): number => {\n return new Text(left).compareTo(right);\n };\n return stringComparer;\n }\n\n public static compare(left: Text, right: Text): number {\n const leftCp = left.codePoints;\n const rightCp = right.codePoints;\n for (let index = 0; index < Math.min(leftCp.length, rightCp.length); index++) {\n if (leftCp[index] === rightCp[index]) {\n continue;\n }\n return leftCp[index] - rightCp[index] > 0 ? 1 : -1;\n }\n return leftCp.length - rightCp.length > 0 ? 1 : -1;\n }\n\n public reverse(): string {\n return String.fromCodePoint(...this.codePoints.reverse());\n }\n\n private get codePoints(): number[] {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const array = [...this._text].map(s => s.codePointAt(0)!);\n return array;\n }\n}\n","import { Text } from './utils/text';\nimport {\n findFirst,\n findLast,\n lower,\n padLeft,\n padRight,\n replace,\n split,\n trim,\n trimLeft,\n trimRight,\n upper,\n} from './utils/strings';\n\nimport type { ExpressionNode } from './AST.type';\nimport type {\n JSONArray,\n JSONArrayArray,\n JSONArrayKeyValuePairs,\n JSONArrayObject,\n JSONObject,\n JSONValue,\n ObjectDict,\n} from './JSON.type';\nimport type { TreeInterpreter } from './TreeInterpreter';\n\nexport enum InputArgument {\n TYPE_NUMBER = 0,\n TYPE_ANY = 1,\n TYPE_STRING = 2,\n TYPE_ARRAY = 3,\n TYPE_OBJECT = 4,\n TYPE_BOOLEAN = 5,\n TYPE_EXPREF = 6,\n TYPE_NULL = 7,\n TYPE_ARRAY_NUMBER = 8,\n TYPE_ARRAY_STRING = 9,\n TYPE_ARRAY_OBJECT = 10,\n TYPE_ARRAY_ARRAY = 11,\n}\n\nexport interface InputSignature {\n types: InputArgument[];\n variadic?: boolean;\n optional?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type RuntimeFunction<T extends any[], U> = (resolvedArgs: T) => U;\n\nexport interface FunctionSignature {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _func: RuntimeFunction<any, JSONValue>;\n _signature: InputSignature[];\n}\n\nexport interface FunctionTable {\n [functionName: string]: FunctionSignature;\n}\n\nexport class Runtime {\n _interpreter: TreeInterpreter;\n _functionTable: FunctionTable;\n TYPE_NAME_TABLE: { [InputArgument: number]: string } = {\n [InputArgument.TYPE_NUMBER]: 'number',\n [InputArgument.TYPE_ANY]: 'any',\n [InputArgument.TYPE_STRING]: 'string',\n [InputArgument.TYPE_ARRAY]: 'array',\n [InputArgument.TYPE_OBJECT]: 'object',\n [InputArgument.TYPE_BOOLEAN]: 'boolean',\n [InputArgument.TYPE_EXPREF]: 'expression',\n [InputArgument.TYPE_NULL]: 'null',\n [InputArgument.TYPE_ARRAY_NUMBER]: 'Array<number>',\n [InputArgument.TYPE_ARRAY_OBJECT]: 'Array<object>',\n [InputArgument.TYPE_ARRAY_STRING]: 'Array<string>',\n [InputArgument.TYPE_ARRAY_ARRAY]: 'Array<Array<any>>',\n };\n\n constructor(interpreter: TreeInterpreter) {\n this._interpreter = interpreter;\n this._functionTable = this.functionTable;\n }\n\n registerFunction(\n name: string,\n customFunction: RuntimeFunction<(JSONValue | ExpressionNode)[], JSONValue>,\n signature: InputSignature[],\n ): void {\n if (name in this._functionTable) {\n throw new Error(`Function already defined: ${name}()`);\n }\n this._functionTable[name] = {\n _func: customFunction.bind(this),\n _signature: signature,\n };\n }\n\n callFunction(name: string, resolvedArgs: (JSONValue | ExpressionNode)[]): JSONValue {\n const functionEntry = this._functionTable[name];\n if (functionEntry === undefined) {\n throw new Error(`Unknown function: ${name}()`);\n }\n this.validateArgs(name, resolvedArgs, functionEntry._signature);\n return functionEntry._func.call(this, resolvedArgs);\n }\n\n private validateInputSignatures(name: string, signature: InputSignature[]): void {\n for (let i = 0; i < signature.length; i += 1) {\n if ('variadic' in signature[i] && i !== signature.length - 1) {\n throw new Error(`Invalid arity: ${name}() 'variadic' argument ${i + 1} must occur last`);\n }\n }\n }\n\n private validateArgs(name: string, args: (JSONValue | ExpressionNode)[], signature: InputSignature[]): void {\n let pluralized: boolean;\n this.validateInputSignatures(name, signature);\n const numberOfRequiredArgs = signature.filter(argSignature => !(argSignature.optional ?? false)).length;\n const lastArgIsVariadic = signature[signature.length - 1]?.variadic ?? false;\n const tooFewArgs = args.length < numberOfRequiredArgs;\n const tooManyArgs = args.length > signature.length;\n const tooFewModifier =\n tooFewArgs && ((!lastArgIsVariadic && numberOfRequiredArgs > 1) || lastArgIsVariadic) ? 'at least ' : '';\n\n if ((lastArgIsVariadic && tooFewArgs) || (!lastArgIsVariadic && (tooFewArgs || tooManyArgs))) {\n pluralized = signature.length > 1;\n throw new Error(\n `Invalid arity: ${name}() takes ${tooFewModifier}${numberOfRequiredArgs} argument${\n (pluralized && 's') || ''\n } but received ${args.length}`,\n );\n }\n\n let currentSpec: InputArgument[];\n let actualType: InputArgument;\n let typeMatched: boolean;\n for (let i = 0; i < signature.length; i += 1) {\n typeMatched = false;\n currentSpec = signature[i].types;\n actualType = this.getTypeName(args[i]) as InputArgument;\n let j: number;\n for (j = 0; j < currentSpec.length; j += 1) {\n if (actualType !== undefined && this.typeMatches(actualType, currentSpec[j], args[i])) {\n typeMatched = true;\n break;\n }\n }\n if (!typeMatched && actualType !== undefined) {\n const expected = currentSpec\n .map((typeIdentifier): string => {\n return this.TYPE_NAME_TABLE[typeIdentifier];\n })\n .join(' | ');\n\n throw new Error(\n `Invalid type: ${name}() expected argument ${i + 1} to be type (${expected}) but received type ${\n this.TYPE_NAME_TABLE[actualType]\n } instead.`,\n );\n }\n }\n }\n\n private typeMatches(actual: InputArgument, expected: InputArgument, argValue: unknown): boolean {\n if (expected === InputArgument.TYPE_ANY) {\n return true;\n }\n if (\n expected === InputArgument.TYPE_ARRAY_STRING ||\n expected === InputArgument.TYPE_ARRAY_NUMBER ||\n expected === InputArgument.TYPE_ARRAY_OBJECT ||\n expected === InputArgument.TYPE_ARRAY_ARRAY ||\n expected === InputArgument.TYPE_ARRAY\n ) {\n if (expected === InputArgument.TYPE_ARRAY) {\n return actual === InputArgument.TYPE_ARRAY;\n }\n if (actual === InputArgument.TYPE_ARRAY) {\n let subtype;\n if (expected === InputArgument.TYPE_ARRAY_NUMBER) {\n subtype = InputArgument.TYPE_NUMBER;\n } else if (expected === InputArgument.TYPE_ARRAY_OBJECT) {\n subtype = InputArgument.TYPE_OBJECT;\n } else if (expected === InputArgument.TYPE_ARRAY_STRING) {\n subtype = InputArgument.TYPE_STRING;\n } else if (expected === InputArgument.TYPE_ARRAY_ARRAY) {\n subtype = InputArgument.TYPE_ARRAY;\n }\n const array = <JSONValue[]>argValue;\n for (let i = 0; i < array.length; i += 1) {\n const typeName = this.getTypeName(array[i]);\n if (typeName !== undefined && subtype !== undefined && !this.typeMatches(typeName, subtype, array[i])) {\n return false;\n }\n }\n return true;\n }\n } else {\n return actual === expected;\n }\n return false;\n }\n private getTypeName(obj: JSONValue | ExpressionNode): InputArgument | undefined {\n switch (Object.prototype.toString.call(obj)) {\n case '[object String]':\n return InputArgument.TYPE_STRING;\n case '[object Number]':\n return InputArgument.TYPE_NUMBER;\n case '[object Array]':\n return InputArgument.TYPE_ARRAY;\n case '[object Boolean]':\n return InputArgument.TYPE_BOOLEAN;\n case '[object Null]':\n return InputArgument.TYPE_NULL;\n case '[object Object]':\n if ((obj as ObjectDict).expref) {\n return InputArgument.TYPE_EXPREF;\n }\n return InputArgument.TYPE_OBJECT;\n\n default:\n return;\n }\n }\n\n createKeyFunction(exprefNode: ExpressionNode, allowedTypes: InputArgument[]): (x: JSONValue) => JSONValue {\n const interpreter = this._interpreter;\n const keyFunc = (x: JSONValue): JSONValue => {\n const current = interpreter.visit(exprefNode, x) as JSONValue;\n if (!allowedTypes.includes(this.getTypeName(current) as InputArgument)) {\n const msg = `Invalid type: expected one of (${allowedTypes\n .map(t => this.TYPE_NAME_TABLE[t])\n .join(' | ')}), received ${this.TYPE_NAME_TABLE[this.getTypeName(current) as InputArgument]}`;\n throw new Error(msg);\n }\n return current;\n };\n return keyFunc;\n }\n\n private functionAbs: RuntimeFunction<number[], number> = ([inputValue]) => {\n return Math.abs(inputValue);\n };\n\n private functionAvg: RuntimeFunction<[number[]], number | null> = ([inputArray]) => {\n if (!inputArray || inputArray.length == 0) {\n return null;\n }\n\n let sum = 0;\n for (let i = 0; i < inputArray.length; i += 1) {\n sum += inputArray[i];\n }\n return sum / inputArray.length;\n };\n\n private functionCeil: RuntimeFunction<[number], number> = ([inputValue]) => {\n return Math.ceil(inputValue);\n };\n\n private functionContains: RuntimeFunction<[string[] | JSONArray, JSONValue], JSONValue> = ([\n searchable,\n searchValue,\n ]) => {\n if (Array.isArray(searchable)) {\n const array = <JSONArray>searchable;\n return array.includes(searchValue);\n }\n\n if (typeof searchable === 'string') {\n const text = <string>searchable;\n if (typeof searchValue === 'string') {\n return text.includes(searchValue);\n }\n }\n\n return null;\n };\n\n private functionEndsWith: RuntimeFunction<[string, string], boolean> = resolvedArgs => {\n const [searchStr, suffix] = resolvedArgs;\n return searchStr.includes(suffix, searchStr.length - suffix.length);\n };\n\n private functionFindFirst: RuntimeFunction<JSONValue[], number | null> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const search = <string>resolvedArgs[1];\n const start = (resolvedArgs.length > 2 && <number>resolvedArgs[2]) || undefined;\n const end = (resolvedArgs.length > 3 && <number>resolvedArgs[3]) || undefined;\n return findFirst(subject, search, start, end);\n };\n\n private functionFindLast: RuntimeFunction<JSONValue[], number | null> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const search = <string>resolvedArgs[1];\n const start = (resolvedArgs.length > 2 && <number>resolvedArgs[2]) || undefined;\n const end = (resolvedArgs.length > 3 && <number>resolvedArgs[3]) || undefined;\n return findLast(subject, search, start, end);\n };\n\n private functionFloor: RuntimeFunction<[number], number> = ([inputValue]) => {\n return Math.floor(inputValue);\n };\n\n private functionFromItems: RuntimeFunction<[JSONArrayKeyValuePairs], JSONObject> = ([array]) => {\n array.map((pair: [string, JSONValue]) => {\n if (pair.length != 2 || typeof pair[0] !== 'string') {\n throw new Error('invalid value, each array must contain two elements, a pair of string and value');\n }\n });\n return Object.fromEntries(array);\n };\n\n private functionGroupBy: RuntimeFunction<[JSONArrayObject, ExpressionNode], JSONValue> = ([array, exprefNode]) => {\n const keyFunction = this.createKeyFunction(exprefNode, [InputArgument.TYPE_STRING]);\n return array.reduce((acc, cur) => {\n const k = keyFunction(cur ?? {});\n const target = <JSONArray>(acc[<string>k] = acc[<string>k] || []);\n target.push(cur);\n return acc;\n }, {});\n };\n\n private functionItems: RuntimeFunction<[JSONObject], JSONArray> = ([inputValue]) => {\n return Object.entries(inputValue);\n };\n\n private functionJoin: RuntimeFunction<[string, string[]], string> = resolvedArgs => {\n const [joinChar, listJoin] = resolvedArgs;\n return listJoin.join(joinChar);\n };\n\n private functionKeys: RuntimeFunction<[JSONObject], string[]> = ([inputObject]) => {\n return Object.keys(inputObject);\n };\n\n private functionLength: RuntimeFunction<[string | JSONArray | JSONObject], number> = ([inputValue]) => {\n if (typeof inputValue === 'string') {\n return new Text(inputValue).length;\n }\n if (Array.isArray(inputValue)) {\n return inputValue.length;\n }\n return Object.keys(inputValue).length;\n };\n\n private functionLower: RuntimeFunction<[string], string> = ([subject]) => {\n return lower(subject);\n };\n\n private functionMap: RuntimeFunction<[ExpressionNode, JSONArray], JSONArray> = ([exprefNode, elements]) => {\n if (!this._interpreter) {\n return [];\n }\n const mapped = [];\n const interpreter = this._interpreter;\n for (let i = 0; i < elements.length; i += 1) {\n mapped.push(<JSONValue>interpreter.visit(exprefNode, elements[i]));\n }\n return mapped;\n };\n\n private functionMax: RuntimeFunction<[(string | number)[]], string | number | null> = ([inputValue]) => {\n if (!inputValue.length) {\n return null;\n }\n\n const typeName = this.getTypeName(inputValue[0]);\n if (typeName === InputArgument.TYPE_NUMBER) {\n return Math.max(...(inputValue as number[]));\n }\n\n const elements = inputValue as string[];\n let maxElement = elements[0];\n for (let i = 1; i < elements.length; i += 1) {\n if (maxElement.localeCompare(elements[i]) < 0) {\n maxElement = elements[i];\n }\n }\n return maxElement;\n };\n\n private functionMaxBy: RuntimeFunction<[number[] | string[], ExpressionNode], JSONValue> = resolvedArgs => {\n const exprefNode = resolvedArgs[1];\n const resolvedArray = resolvedArgs[0];\n const keyFunction = this.createKeyFunction(exprefNode, [InputArgument.TYPE_NUMBER, InputArgument.TYPE_STRING]);\n let maxNumber = -Infinity;\n let maxRecord!: JSONValue;\n let current: number | undefined;\n for (let i = 0; i < resolvedArray.length; i += 1) {\n current = keyFunction && (keyFunction(resolvedArray[i]) as number);\n if (current !== undefined && current > maxNumber) {\n maxNumber = current;\n maxRecord = resolvedArray[i];\n }\n }\n return maxRecord || null;\n };\n\n private functionMerge: RuntimeFunction<JSONObject[], JSONObject> = resolvedArgs => {\n let merged = {};\n for (let i = 0; i < resolvedArgs.length; i += 1) {\n const current = resolvedArgs[i];\n merged = Object.assign(merged, current);\n }\n return merged;\n };\n\n private functionMin: RuntimeFunction<[(string | number)[]], string | number | null> = ([inputValue]) => {\n if (!inputValue.length) {\n return null;\n }\n\n const typeName = this.getTypeName(inputValue[0]);\n if (typeName === InputArgument.TYPE_NUMBER) {\n return Math.min(...(inputValue as number[]));\n }\n\n const elements = inputValue as string[];\n let minElement = elements[0];\n for (let i = 1; i < elements.length; i += 1) {\n if (elements[i].localeCompare(minElement) < 0) {\n minElement = elements[i];\n }\n }\n return minElement;\n };\n\n private functionMinBy: RuntimeFunction<[number[] | string[], ExpressionNode], JSONValue> = resolvedArgs => {\n const exprefNode = resolvedArgs[1];\n const resolvedArray = resolvedArgs[0];\n const keyFunction = this.createKeyFunction(exprefNode, [InputArgument.TYPE_NUMBER, InputArgument.TYPE_STRING]);\n let minNumber = Infinity;\n let minRecord!: JSONValue;\n let current: number | undefined;\n for (let i = 0; i < resolvedArray.length; i += 1) {\n current = keyFunction && (keyFunction(resolvedArray[i]) as number);\n if (current !== undefined && current < minNumber) {\n minNumber = current;\n minRecord = resolvedArray[i];\n }\n }\n return minRecord || null;\n };\n\n private functionNotNull: RuntimeFunction<JSONArray, JSONValue> = resolvedArgs => {\n for (let i = 0; i < resolvedArgs.length; i += 1) {\n if (this.getTypeName(resolvedArgs[i]) !== InputArgument.TYPE_NULL) {\n return resolvedArgs[i];\n }\n }\n return null;\n };\n\n private functionPadLeft: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const width = <number>resolvedArgs[1];\n const padding = (resolvedArgs.length > 2 && <string>resolvedArgs[2]) || undefined;\n return padLeft(subject, width, padding);\n };\n\n private functionPadRight: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const width = <number>resolvedArgs[1];\n const padding = (resolvedArgs.length > 2 && <string>resolvedArgs[2]) || undefined;\n return padRight(subject, width, padding);\n };\n\n private functionReplace: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const string = <string>resolvedArgs[1];\n const by = <string>resolvedArgs[2];\n return replace(subject, string, by, resolvedArgs.length > 3 ? <number>resolvedArgs[3] : undefined);\n };\n\n private functionSplit: RuntimeFunction<JSONValue[], string[]> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n const search = <string>resolvedArgs[1];\n return split(subject, search, resolvedArgs.length > 2 ? <number>resolvedArgs[2] : undefined);\n };\n\n private functionReverse: RuntimeFunction<[string | JSONArray], string | JSONArray> = ([inputValue]) => {\n const typeName = this.getTypeName(inputValue);\n if (typeName === InputArgument.TYPE_STRING) {\n return new Text(inputValue as string).reverse();\n }\n const reversedArray = (inputValue as JSONArray).slice(0);\n reversedArray.reverse();\n return reversedArray;\n };\n\n private functionSort: RuntimeFunction<[(string | number)[]], (string | number)[]> = ([inputValue]) => {\n if (inputValue.length == 0) {\n return inputValue;\n }\n if (typeof inputValue[0] === 'string') {\n return (<string[]>[...inputValue]).sort(Text.comparer);\n }\n return [...inputValue].sort();\n };\n\n private functionSortBy: RuntimeFunction<[number[] | string[], ExpressionNode], JSONValue> = resolvedArgs => {\n const sortedArray = resolvedArgs[0].slice(0);\n if (sortedArray.length === 0) {\n return sortedArray;\n }\n const interpreter = this._interpreter;\n const exprefNode = resolvedArgs[1];\n const requiredType = this.getTypeName(interpreter.visit(exprefNode, sortedArray[0]) as JSONValue);\n if (requiredType !== undefined && ![InputArgument.TYPE_NUMBER, InputArgument.TYPE_STRING].includes(requiredType)) {\n throw new Error(`Invalid type: unexpected type (${this.TYPE_NAME_TABLE[requiredType]})`);\n }\n function throwInvalidTypeError(rt: Runtime, item: string | number): never {\n throw new Error(\n `Invalid type: expected (${rt.TYPE_NAME_TABLE[requiredType as InputArgument]}), received ${\n rt.TYPE_NAME_TABLE[rt.getTypeName(item) as InputArgument]\n }`,\n );\n }\n\n return sortedArray.sort((a, b) => {\n const exprA = interpreter.visit(exprefNode, a) as number | string;\n const exprB = interpreter.visit(exprefNode, b) as number | string;\n if (this.getTypeName(exprA) !== requiredType) {\n throwInvalidTypeError(this, exprA);\n } else if (this.getTypeName(exprB) !== requiredType) {\n throwInvalidTypeError(this, exprB);\n }\n if (requiredType === InputArgument.TYPE_STRING) {\n return Text.comparer(<string>exprA, <string>exprB);\n }\n return <number>exprA - <number>exprB;\n });\n };\n\n private functionStartsWith: RuntimeFunction<[string, string], boolean> = ([searchable, searchStr]) => {\n return searchable.startsWith(searchStr);\n };\n\n private functionSum: RuntimeFunction<[number[]], number> = ([inputValue]) => {\n return inputValue.reduce((x, y) => x + y, 0);\n };\n\n private functionToArray: RuntimeFunction<[JSONValue], JSONArray> = ([inputValue]) => {\n if (this.getTypeName(inputValue) === InputArgument.TYPE_ARRAY) {\n return inputValue as JSONArray;\n }\n return [inputValue];\n };\n\n private functionToNumber: RuntimeFunction<[JSONValue], number | null> = ([inputValue]) => {\n const typeName = this.getTypeName(inputValue);\n let convertedValue: number;\n if (typeName === InputArgument.TYPE_NUMBER) {\n return inputValue as number;\n }\n if (typeName === InputArgument.TYPE_STRING) {\n convertedValue = +(inputValue as string);\n if (!isNaN(convertedValue)) {\n return convertedValue;\n }\n }\n return null;\n };\n\n private functionToString: RuntimeFunction<[JSONValue], string> = ([inputValue]) => {\n if (this.getTypeName(inputValue) === InputArgument.TYPE_STRING) {\n return inputValue as string;\n }\n return JSON.stringify(inputValue);\n };\n\n private functionTrim: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n return trim(subject, resolvedArgs.length > 1 ? <string>resolvedArgs[1] : undefined);\n };\n private functionTrimLeft: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n return trimLeft(subject, resolvedArgs.length > 1 ? <string>resolvedArgs[1] : undefined);\n };\n private functionTrimRight: RuntimeFunction<JSONValue[], string> = resolvedArgs => {\n const subject = <string>resolvedArgs[0];\n return trimRight(subject, resolvedArgs.length > 1 ? <string>resolvedArgs[1] : undefined);\n };\n\n private functionType: RuntimeFunction<[JSONValue], string> = ([inputValue]) => {\n switch (this.getTypeName(inputValue)) {\n case InputArgument.TYPE_NUMBER:\n return 'number';\n case InputArgument.TYPE_STRING:\n return 'string';\n case InputArgument.TYPE_ARRAY:\n return 'array';\n case InputArgument.TYPE_OBJECT:\n return 'object';\n case InputArgument.TYPE_BOOLEAN:\n return 'boolean';\n case InputArgument.TYPE_NULL:\n return 'null';\n default:\n throw new Error('invalid-type');\n }\n };\n\n private functionUpper: RuntimeFunction<[string], string> = ([subject]) => {\n return upper(subject);\n };\n\n private functionValues: RuntimeFunction<[JSONObject], JSONValue[]> = ([inputObject]) => {\n return Object.values(inputObject);\n };\n\n private functionZip: RuntimeFunction<JSONArrayArray, JSONArray> = array => {\n const length = Math.min(...array.map(arr => arr.length));\n const result = Array(length)\n .fill(null)\n .map((_, index) => array.map(arr => arr[index]));\n return result;\n };\n\n private functionTable: FunctionTable = {\n abs: {\n _func: this.functionAbs,\n _signature: [\n {\n types: [InputArgument.TYPE_NUMBER],\n },\n ],\n },\n avg: {\n _func: this.functionAvg,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_NUMBER],\n },\n ],\n },\n ceil: {\n _func: this.functionCeil,\n _signature: [\n {\n types: [InputArgument.TYPE_NUMBER],\n },\n ],\n },\n contains: {\n _func: this.functionContains,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING, InputArgument.TYPE_ARRAY],\n },\n {\n types: [InputArgument.TYPE_ANY],\n },\n ],\n },\n ends_with: {\n _func: this.functionEndsWith,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n ],\n },\n find_first: {\n _func: this.functionFindFirst,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n ],\n },\n find_last: {\n _func: this.functionFindLast,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n ],\n },\n floor: {\n _func: this.functionFloor,\n _signature: [\n {\n types: [InputArgument.TYPE_NUMBER],\n },\n ],\n },\n from_items: {\n _func: this.functionFromItems,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_ARRAY],\n },\n ],\n },\n group_by: {\n _func: this.functionGroupBy,\n _signature: [{ types: [InputArgument.TYPE_ARRAY] }, { types: [InputArgument.TYPE_EXPREF] }],\n },\n items: {\n _func: this.functionItems,\n _signature: [\n {\n types: [InputArgument.TYPE_OBJECT],\n },\n ],\n },\n join: {\n _func: this.functionJoin,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_ARRAY_STRING],\n },\n ],\n },\n keys: {\n _func: this.functionKeys,\n _signature: [\n {\n types: [InputArgument.TYPE_OBJECT],\n },\n ],\n },\n length: {\n _func: this.functionLength,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING, InputArgument.TYPE_ARRAY, InputArgument.TYPE_OBJECT],\n },\n ],\n },\n lower: {\n _func: this.functionLower,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n ],\n },\n map: {\n _func: this.functionMap,\n _signature: [\n {\n types: [InputArgument.TYPE_EXPREF],\n },\n {\n types: [InputArgument.TYPE_ARRAY],\n },\n ],\n },\n max: {\n _func: this.functionMax,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_NUMBER, InputArgument.TYPE_ARRAY_STRING],\n },\n ],\n },\n max_by: {\n _func: this.functionMaxBy,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY],\n },\n {\n types: [InputArgument.TYPE_EXPREF],\n },\n ],\n },\n merge: {\n _func: this.functionMerge,\n _signature: [\n {\n types: [InputArgument.TYPE_OBJECT],\n variadic: true,\n },\n ],\n },\n min: {\n _func: this.functionMin,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_NUMBER, InputArgument.TYPE_ARRAY_STRING],\n },\n ],\n },\n min_by: {\n _func: this.functionMinBy,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY],\n },\n {\n types: [InputArgument.TYPE_EXPREF],\n },\n ],\n },\n not_null: {\n _func: this.functionNotNull,\n _signature: [\n {\n types: [InputArgument.TYPE_ANY],\n variadic: true,\n },\n ],\n },\n pad_left: {\n _func: this.functionPadLeft,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n },\n {\n types: [InputArgument.TYPE_STRING],\n optional: true,\n },\n ],\n },\n pad_right: {\n _func: this.functionPadRight,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n },\n {\n types: [InputArgument.TYPE_STRING],\n optional: true,\n },\n ],\n },\n replace: {\n _func: this.functionReplace,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n ],\n },\n split: {\n _func: this.functionSplit,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_NUMBER],\n optional: true,\n },\n ],\n },\n reverse: {\n _func: this.functionReverse,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING, InputArgument.TYPE_ARRAY],\n },\n ],\n },\n sort: {\n _func: this.functionSort,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_STRING, InputArgument.TYPE_ARRAY_NUMBER],\n },\n ],\n },\n sort_by: {\n _func: this.functionSortBy,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY],\n },\n {\n types: [InputArgument.TYPE_EXPREF],\n },\n ],\n },\n starts_with: {\n _func: this.functionStartsWith,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n },\n ],\n },\n sum: {\n _func: this.functionSum,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY_NUMBER],\n },\n ],\n },\n to_array: {\n _func: this.functionToArray,\n _signature: [\n {\n types: [InputArgument.TYPE_ANY],\n },\n ],\n },\n to_number: {\n _func: this.functionToNumber,\n _signature: [\n {\n types: [InputArgument.TYPE_ANY],\n },\n ],\n },\n to_string: {\n _func: this.functionToString,\n _signature: [\n {\n types: [InputArgument.TYPE_ANY],\n },\n ],\n },\n trim: {\n _func: this.functionTrim,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n optional: true,\n },\n ],\n },\n trim_left: {\n _func: this.functionTrimLeft,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n optional: true,\n },\n ],\n },\n trim_right: {\n _func: this.functionTrimRight,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n {\n types: [InputArgument.TYPE_STRING],\n optional: true,\n },\n ],\n },\n type: {\n _func: this.functionType,\n _signature: [\n {\n types: [InputArgument.TYPE_ANY],\n },\n ],\n },\n upper: {\n _func: this.functionUpper,\n _signature: [\n {\n types: [InputArgument.TYPE_STRING],\n },\n ],\n },\n values: {\n _func: this.functionValues,\n _signature: [\n {\n types: [InputArgument.TYPE_OBJECT],\n },\n ],\n },\n zip: {\n _func: this.functionZip,\n _signature: [\n {\n types: [InputArgument.TYPE_ARRAY],\n variadic: true,\n },\n ],\n },\n };\n}\n","import { JSONObject, JSONValue } from './JSON.type';\n\nexport class ScopeChain {\n private inner?: ScopeChain = undefined;\n private data: JSONObject = {};\n\n get currentScopeData(): JSONObject {\n return this.data;\n }\n\n public withScope(data: JSONObject): ScopeChain {\n const outer: ScopeChain = new ScopeChain();\n outer.inner = this;\n outer.data = data;\n return outer;\n }\n\n public getValue(identifier: string): JSONValue {\n if (Object.prototype.hasOwnProperty.call(this.data, identifier)) {\n return this.data[identifier];\n }\n\n if (this.inner) {\n return this.inner.getValue(identifier);\n }\n\n return null;\n }\n}\n","import { Token } from './Lexer.type';\nimport { Runtime } from './Runtime';\nimport { ScopeChain } from './Scope';\nimport { add, div, divide, ensureNumbers, isFalse, mod, mul, strictDeepEqual, sub } from './utils';\n\nimport type { ExpressionNode, ExpressionReference, SliceNode } from './AST.type';\nimport type { JSONArray, JSONObject, JSONValue } from './JSON.type';\nimport { ScopeEntry } from './Parser.type';\n\nexport class TreeInterpreter {\n runtime: Runtime;\n private _rootValue: JSONValue | null = null;\n private _scope: ScopeChain;\n\n constructor() {\n this.runtime = new Runtime(this);\n this._scope = new ScopeChain();\n }\n\n withScope(scope: ScopeEntry): TreeInterpreter {\n const interpreter = new TreeInterpreter();\n interpreter.runtime._functionTable = this.runtime._functionTable;\n interpreter._rootValue = this._rootValue;\n interpreter._scope = this._scope.withScope(scope);\n return interpreter;\n }\n\n search(node: ExpressionNode, value: JSONValue): JSONValue {\n this._rootValue = value;\n this._scope = new ScopeChain();\n return this.visit(node, value) as JSONValue;\n }\n\n visit(node: ExpressionNode, value: JSONValue | ExpressionNode): JSONValue | ExpressionNode | ExpressionReference {\n switch (node.type) {\n case 'Field':\n const identifier = node.name;\n let result: JSONValue = null;\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n result = (value as JSONObject)[identifier] ?? null;\n }\n return result;\n case 'LetExpression': {\n const { bindings, expression } = node;\n let scope = {};\n bindings.forEach(binding => {\n const reference = this.visit(binding, value) as JSONObject;\n scope = {\n ...scope,\n ...reference,\n };\n });\n return this.withScope(scope).visit(expression, value);\n }\n case 'Binding': {\n const { variable, reference } = node;\n const result = this.visit(reference, value);\n return { [variable]: result } as JSONObject;\n }\n case 'Variable': {\n const variable = node.name;\n if (\n !this._scope.getValue(variable) &&\n !Object.prototype.hasOwnProperty.call(this._scope.currentScopeData, variable)\n ) {\n throw new Error(`Error referencing undefined variable ${variable}`);\n }\n return this._scope.getValue(variable);\n }\n case 'IndexExpression':\n return this.visit(node.right, this.visit(node.left, value));\n case 'Subexpression': {\n const result = this.visit(node.left, value);\n return result != null ? this.visit(node.right, result) ?? null : null;\n }\n case 'Index': {\n if (!Array.isArray(value)) {\n return null;\n }\n const index = node.value < 0 ? value.length + node.value : node.value;\n return value[index] ?? null;\n }\n case 'Slice': {\n if (!Array.isArray(value) && typeof value !== 'string') {\n return null;\n }\n const { start, stop, step } = this.computeSliceParams(value.length, node);\n if (typeof value === 'string') {\n // string slices is implemented by slicing\n // the corresponding array of codepoints and\n // converting the result back to a string\n const chars = [...value];\n const sliced = this.slice(chars, start, stop, step);\n return sliced.join('');\n } else {\n return this.slice(value, start, stop, step);\n }\n }\n case 'Projection': {\n const { left, right } = node;\n\n // projections typically operate on arrays\n // string slicing produces a 'Projection' whose\n // first child is an 'IndexExpression' whose\n // second child is an 'Slice'\n\n // we allow execution of the left index-expression\n // to return a string only if the AST has this\n // specific shape\n\n let allowString = false;\n if (left.type === 'IndexExpression' && left.right.type === 'Slice') {\n allowString = true;\n }\n\n const base = this.visit(left, value);\n if (allowString && typeof base === 'string') {\n // a projection is really a sub-expression in disguise\n // we must evaluate the right hand expression\n return this.visit(right, base) as JSONValue;\n }\n\n if (!Array.isArray(base)) {\n return null;\n }\n const collected: JSONArray = [];\n for (const elem of base) {\n const current = this.visit(right, elem) as JSONValue;\n if (current !== null) {\n collected.push(current);\n }\n }\n return collected as JSONValue;\n }\n case 'ValueProjection': {\n const { left, right } = node;\n\n const base = this.visit(left, value);\n if (base === null || typeof base !== 'object' || Array.isArray(base)) {\n return null;\n }\n const collected: JSONArray = [];\n const values = Object.values(base);\n for (const elem of values) {\n const current = this.visit(right, elem) as JSONValue;\n if (current !== null) {\n collected.push(current);\n }\n }\n return collected;\n }\n case 'FilterProjection': {\n const { left, right, condition } = node;\n\n const base = this.visit(left, value);\n if (!Array.isArray(base)) {\n return null;\n }\n\n const results: JSONArray = [];\n for (const elem of base) {\n const matched = this.visit(condition, elem);\n if (isFalse(matched)) {\n continue;\n }\n const result = this.visit(right, elem) as JSONValue;\n if (result !== null) {\n results.push(result);\n }\n }\n return results;\n }\n case 'Arithmetic': {\n const first = this.visit(node.left, value) as JSONValue;\n const second = this.visit(node.right, value) as JSONValue;\n switch (node.operator) {\n case Token.TOK_PLUS:\n return add(first, second);\n\n case Token.TOK_MINUS:\n return sub(first, second);\n\n case Token.TOK_MULTIPLY:\n case Token.TOK_STAR:\n return mul(first, second);\n\n case Token.TOK_DIVIDE:\n return divide(first, second);\n\n case Token.TOK_MODULO:\n return mod(first, second);\n\n case Token.TOK_DIV:\n return div(first, second);\n\n default:\n throw new Error(`Syntax error: unknown arithmetic operator: ${node.operator}`);\n }\n }\n case 'Unary': {\n const operand = this.visit(node.operand, value) as JSONValue;\n switch (node.operator) {\n case Token.TOK_PLUS:\n ensureNumbers(operand);\n return operand as number;\n\n case Token.TOK_MINUS:\n ensureNumbers(operand);\n return -(operand as number);\n\n default:\n throw new Error(`Syntax error: unknown arithmetic operator: ${node.operator}`);\n }\n }\n case 'Comparator': {\n const first = this.visit(node.left, value);\n const second = this.visit(node.right, value);\n\n // equality is an exact match\n\n switch (node.name) {\n case 'EQ':\n return strictDeepEqual(first, second);\n case 'NE':\n return !strictDeepEqual(first, second);\n }\n\n // ordering operators are only valid for numbers\n\n if (typeof first !== 'number' || typeof second !== 'number') {\n return null;\n }\n\n switch (node.name) {\n case 'GT':\n return (first as number) > (second as number);\n case 'GTE':\n return (first as number) >= (second as number);\n case 'LT':\n return (first as number) < (second as number);\n case 'LTE':\n return (first as number) <= (second as number);\n }\n }\n case 'Flatten': {\n const original = this.visit(node.child, value);\n return Array.isArray(original) ? original.flat() : null;\n }\n case 'Root':\n return this._rootValue;\n case 'MultiSelectList': {\n const collected: JSONArray = [];\n for (const child of node.children) {\n collected.push(this.visit(child, value) as JSONValue);\n }\n return collected;\n }\n case 'MultiSelectHash': {\n const collected: JSONObject = {};\n for (const child of node.children) {\n collected[child.name] = this.visit(child.value, value) as JSONValue;\n }\n return collected;\n }\n case 'OrExpression': {\n const result = this.visit(node.left, value);\n if (isFalse(result)) {\n return this.visit(node.right, value);\n }\n return result;\n }\n case 'AndExpression': {\n const result = this.visit(node.left, value);\n if (isFalse(result)) {\n return result;\n }\n return this.visit(node.right, value);\n }\n case 'NotExpression':\n return isFalse(this.visit(node.child, value));\n case 'Literal':\n return node.value;\n case 'Pipe':\n return this.visit(node.right, this.visit(node.left, value));\n case 'Function': {\n const args: JSONArray = [];\n for (const child of node.children) {\n args.push(this.visit(child, value) as JSONValue);\n }\n return this.runtime.callFunction(node.name, args);\n }\n case 'ExpressionReference':\n return {\n expref: true,\n ...node.child,\n };\n case 'Current':\n case 'Identity':\n return value;\n }\n }\n\n computeSliceParams(arrayLength: number, sliceNode: SliceNode): { start: number; stop: number; step: number } {\n let { start, stop, step } = sliceNode;\n\n if (step === null) {\n step = 1;\n } else if (step === 0) {\n const error = new Error('Invalid value: slice step cannot be 0');\n error.name = 'RuntimeError';\n throw error;\n }\n\n start = start === null ? (step < 0 ? arrayLength - 1 : 0) : this.capSliceRange(arrayLength, start, step);\n stop = stop === null ? (step < 0 ? -1 : arrayLength) : this.capSliceRange(arrayLength, stop, step);\n\n return { start, stop, step };\n }\n\n capSliceRange(arrayLength: number, actualValue: number, step: number): number {\n let nextActualValue = actualValue;\n if (nextActualValue < 0) {\n nextActualValue += arrayLength;\n if (nextActualValue < 0) {\n nextActualValue = step < 0 ? -1 : 0;\n }\n } else if (nextActualValue >= arrayLength) {\n nextActualValue = step < 0 ? arrayLength - 1 : arrayLength;\n }\n return nextActualValue;\n }\n\n slice(collection: JSONArray, start: number, end: number, step: number): JSONArray {\n const result = [];\n if (step > 0) {\n for (let i = start; i < end; i += step) {\n result.push(collection[i]);\n }\n } else {\n for (let i = start; i > end; i += step) {\n result.push(collection[i]);\n }\n }\n return result;\n }\n}\n\nexport const TreeInterpreterInstance = new TreeInterpreter();\nexport default TreeInterpreterInstance;\n","import Parser from './Parser';\nimport Lexer from './Lexer';\nimport TreeInterpreterInst from './TreeInterpreter';\n\nimport { ExpressionNode } from './AST.type';\nimport { JSONValue } from './JSON.type';\nimport { LexerOptions, LexerToken } from './Lexer.type';\nimport { Options } from './Parser.type';\nimport { InputArgument, RuntimeFunction, InputSignature } from './Runtime';\nimport { ScopeChain } from './Scope';\n\nexport type { Options } from './Parser.type';\nexport type { FunctionSignature, RuntimeFunction, InputSignature } from './Runtime';\n\nexport type { JSONValue, JSONPrimitive, JSONArray, JSONObject } from './JSON.type';\n\nexport const TYPE_ANY = InputArgument.TYPE_ANY;\nexport const TYPE_ARRAY = InputArgument.TYPE_ARRAY;\nexport const TYPE_ARRAY_ARRAY = InputArgument.TYPE_ARRAY_ARRAY;\nexport const TYPE_ARRAY_NUMBER = InputArgument.TYPE_ARRAY_NUMBER;\nexport const TYPE_ARRAY_OBJECT = InputArgument.TYPE_ARRAY_OBJECT;\nexport const TYPE_ARRAY_STRING = InputArgument.TYPE_ARRAY_STRING;\nexport const TYPE_BOOLEAN = InputArgument.TYPE_BOOLEAN;\nexport const TYPE_EXPREF = InputArgument.TYPE_EXPREF;\nexport const TYPE_NULL = InputArgument.TYPE_NULL;\nexport const TYPE_NUMBER = InputArgument.TYPE_NUMBER;\nexport const TYPE_OBJECT = InputArgument.TYPE_OBJECT;\nexport const TYPE_STRING = InputArgument.TYPE_STRING;\n\nexport function compile(expression: string, options?: Options): ExpressionNode {\n const nodeTree = Parser.parse(expression, options);\n return nodeTree;\n}\n\nexport function tokenize(expression: string, options?: LexerOptions): LexerToken[] {\n return Lexer.tokenize(expression, options);\n}\n\nexport const registerFunction = (\n functionName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n customFunction: RuntimeFunction<any[], JSONValue>,\n signature: InputSignature[],\n): void => {\n TreeInterpreterInst.runtime.registerFunction(functionName, customFunction, signature);\n};\n\nexport function search(data: JSONValue, expression: string, options?: Options): JSONValue {\n const nodeTree = Parser.parse(expression, options);\n return TreeInterpreterInst.search(nodeTree, data);\n}\n\nexport function Scope(): ScopeChain {\n return new ScopeChain();\n}\n\nexport const TreeInterpreter = TreeInterpreterInst;\n\nexport const jmespath = {\n compile,\n registerFunction,\n search,\n tokenize,\n TreeInterpreter,\n TYPE_ANY,\n TYPE_ARRAY_NUMBER,\n TYPE_ARRAY_STRING,\n TYPE_ARRAY,\n TYPE_BOOLEAN,\n TYPE_EXPREF,\n TYPE_NULL,\n TYPE_NUMBER,\n TYPE_OBJECT,\n TYPE_STRING,\n};\n\nexport default jmespath;\n"],"names":["isObject","obj","Object","prototype","toString","call","strictDeepEqual","first","second","Array","isArray","length","i","firstEntries","entries","secondKeys","Set","keys","size","key","value","delete","isFalse","_key","isAlpha","ch","isNum","ensureInteger","Math","floor","Error","ensurePositiveInteger","ensureNumbers","operands","undefined","notZero","n","ensurePadFuncParams","name","width","padding","replace","subject","string","by","count","map","split","join","trimLeft","chars","trimImpl","list","RegExp","trimRight","regExper","pattern","Token","basicTokens","TOK_LPAREN","TOK_RPAREN","TOK_STAR","TOK_COMMA","TOK_DOT","TOK_COLON","TOK_CURRENT","TOK_RBRACKET","TOK_LBRACE","TOK_RBRACE","TOK_PLUS","TOK_MODULO","TOK_MINUS","TOK_MULTIPLY","TOK_DIVIDE","operatorStartToken","skipChars","Lexer","constructor","this","_current","_enable_legacy_literals","tokenize","stream","options","tokens","start","identifier","token","enable_legacy_literals","consumeUnquotedIdentifier","push","type","TOK_UNQUOTEDIDENTIFIER","TOK_VARIABLE","TOK_ROOT","consumeNumber","consumeLBracket","consumeQuotedIdentifier","TOK_QUOTEDIDENTIFIER","consumeRawStringLiteral","TOK_LITERAL","literal","consumeLiteral","consumeOperator","error","slice","maxLength","current","ok","parseJSON","parseInt","TOK_NUMBER","TOK_FILTER","TOK_FLATTEN","TOK_LBRACKET","consumeOrElse","peek","orElse","TOK_NOT","TOK_NE","TOK_LT","TOK_LTE","TOK_GT","TOK_GTE","TOK_ASSIGN","TOK_EQ","TOK_EXPREF","TOK_AND","TOK_PIPE","TOK_OR","TOK_DIV","literalString","trimStart","looksLikeJSON","includes","_","text","JSON","parse","_a","bindingPower","TOK_EOF","TokenParser","index","expression","loadTokens","ast","lookahead","lookaheadToken","errorToken","rbp","leftToken","advance","left","nud","currentTokenType","led","offset","isKeyword","parseLetExpression","child","Not","Minus","operator","operand","Plus","right","parseProjectionRHS","Star","parseMultiselectHash","Flatten","parseIndexExpression","projectIfSlice","parseMultiselectList","Expref","args","match","tokenName","Dot","parseDotRHS","Pipe","Or","And","children","parseCommaSeparatedExpressionsUntilToken","condition","Filter","leftNode","variable","reference","parseComparator","parseArithmetic","static","keyword","tokenType","message","parseSliceExpression","Number","indexExpr","parts","part","next","stop","step","separated","parseCommaSeparatedExpressionsUntilKeyword","bindings","binding","parseCommaSeparatedExpressionsUntil","isEndToken","matchEndToken","comparator","expressions","pairs","identifierTypes","keyToken","keyName","Parser","Text","_text","codePoints","compareTo","other","compare","comparer","leftCp","rightCp","min","reverse","String","fromCodePoint","s","codePointAt","InputArgument","Runtime","interpreter","TYPE_NAME_TABLE","TYPE_NUMBER","TYPE_ANY","TYPE_STRING","TYPE_ARRAY","TYPE_OBJECT","TYPE_BOOLEAN","TYPE_EXPREF","TYPE_NULL","TYPE_ARRAY_NUMBER","TYPE_ARRAY_OBJECT","TYPE_ARRAY_STRING","TYPE_ARRAY_ARRAY","functionAbs","inputValue","abs","functionAvg","inputArray","sum","functionCeil","ceil","functionContains","searchable","searchValue","functionEndsWith","resolvedArgs","searchStr","suffix","functionFindFirst","sub","end","max","indexOf","findFirst","functionFindLast","lastIndexOf","findLast","functionFloor","functionFromItems","array","pair","fromEntries","functionGroupBy","exprefNode","keyFunction","createKeyFunction","reduce","acc","cur","k","functionItems","functionJoin","joinChar","listJoin","functionKeys","inputObject","functionLength","functionLower","toLowerCase","lower","functionMap","elements","_interpreter","mapped","visit","functionMax","getTypeName","maxElement","localeCompare","functionMaxBy","resolvedArray","maxRecord","maxNumber","Infinity","functionMerge","merged","assign","functionMin","minElement","functionMinBy","minRecord","minNumber","functionNotNull","functionPadLeft","padStart","padLeft","functionPadRight","padEnd","padRight","functionReplace","functionSplit","search","functionReverse","reversedArray","functionSort","sort","functionSortBy","sortedArray","requiredType","throwInvalidTypeError","rt","item","a","b","exprA","exprB","functionStartsWith","startsWith","functionSum","x","y","functionToArray","functionToNumber","typeName","convertedValue","isNaN","functionToString","stringify","functionTrim","trim","functionTrimLeft","functionTrimRight","functionType","functionUpper","toUpperCase","upper","functionValues","values","functionZip","arr","fill","functionTable","_func","_signature","types","avg","contains","ends_with","find_first","optional","find_last","from_items","group_by","items","max_by","merge","variadic","min_by","not_null","pad_left","pad_right","sort_by","starts_with","to_array","to_number","to_string","trim_left","trim_right","zip","_functionTable","registerFunction","customFunction","signature","bind","callFunction","functionEntry","validateArgs","validateInputSignatures","pluralized","numberOfRequiredArgs","filter","argSignature","lastArgIsVariadic","_b","tooFewArgs","tooManyArgs","tooFewModifier","currentSpec","actualType","typeMatched","j","typeMatches","expected","typeIdentifier","actual","argValue","subtype","expref","allowedTypes","msg","t","ScopeChain","inner","data","currentScopeData","withScope","outer","getValue","hasOwnProperty","TreeInterpreter","_rootValue","runtime","_scope","scope","node","result","forEach","_c","computeSliceParams","allowString","base","collected","elem","results","matched","mul","divide","mod","div","original","flat","arrayLength","sliceNode","capSliceRange","actualValue","nextActualValue","collection","TreeInterpreterInstance","compile","functionName","TreeInterpreterInst","nodeTree","jmespath"],"mappings":"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"}
|