@libdbm/libcel-ts 1.0.2-rc.1 → 2.0.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/parser/lexer.ts","../src/ast/operators.ts","../src/ast/expression.ts","../src/parser/parser.ts","../src/functions/functions.ts","../src/functions/utilities.ts","../src/functions/standard-functions.ts","../src/interpreter/interpreter.ts","../src/program.ts","../src/cel.ts"],"sourcesContent":["/**\n * ParseError is thrown when the lexer or parser encounters invalid syntax.\n */\nexport class ParseError extends Error {\n constructor(\n message: string,\n public readonly line: number,\n public readonly column: number\n ) {\n super(`${message} at ${line}:${column}`);\n this.name = 'ParseError';\n }\n}\n\n/**\n * Token types for CEL lexical analysis.\n */\nexport enum TokenType {\n // Literals\n NULL = 'NULL',\n TRUE = 'TRUE',\n FALSE = 'FALSE',\n INT = 'INT',\n UINT = 'UINT',\n DOUBLE = 'DOUBLE',\n STRING = 'STRING',\n BYTES = 'BYTES',\n IDENTIFIER = 'IDENTIFIER',\n\n // Operators\n PLUS = 'PLUS',\n MINUS = 'MINUS',\n STAR = 'STAR',\n SLASH = 'SLASH',\n PERCENT = 'PERCENT',\n EQ = 'EQ',\n NE = 'NE',\n LT = 'LT',\n LE = 'LE',\n GT = 'GT',\n GE = 'GE',\n LOGICAL_AND = 'LOGICAL_AND',\n LOGICAL_OR = 'LOGICAL_OR',\n BANG = 'BANG',\n IN = 'IN',\n\n // Delimiters\n LPAREN = 'LPAREN',\n RPAREN = 'RPAREN',\n LBRACKET = 'LBRACKET',\n RBRACKET = 'RBRACKET',\n LBRACE = 'LBRACE',\n RBRACE = 'RBRACE',\n DOT = 'DOT',\n COMMA = 'COMMA',\n COLON = 'COLON',\n QUESTION = 'QUESTION',\n\n // Special\n EOF = 'EOF',\n}\n\n/**\n * Token representation for lexical analysis.\n */\nexport class Token {\n constructor(\n public readonly type: TokenType,\n public readonly value: string,\n public readonly line: number,\n public readonly column: number\n ) {}\n\n toString(): string {\n return `${this.type}(${this.value})`;\n }\n}\n\n/**\n * Lexer for tokenizing CEL expressions.\n * Performs character-by-character scanning to produce tokens.\n */\nexport class Lexer {\n private position = 0;\n private line = 1;\n private column = 1;\n private readonly lookahead: Token[] = [];\n\n constructor(private readonly input: string) {}\n\n /**\n * Get the next token from the input.\n */\n next(): Token {\n if (this.lookahead.length > 0) {\n return this.lookahead.shift()!;\n }\n return this.token();\n }\n\n /**\n * Peek ahead at future tokens without consuming them.\n * @param count Number of tokens to look ahead (1-indexed)\n */\n peek(count: number): Token {\n while (this.lookahead.length < count) {\n this.lookahead.push(this.token());\n }\n return this.lookahead[count - 1]!;\n }\n\n private step(): void {\n if (this.position >= this.input.length) return;\n\n const ch = this.input[this.position]!;\n this.position++;\n\n if (ch === '\\r') {\n // Handle CRLF as a single newline\n if (this.position < this.input.length && this.input[this.position] === '\\n') {\n this.position++;\n }\n this.line++;\n this.column = 1;\n } else if (ch === '\\n') {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n }\n\n private forward(n: number): void {\n for (let i = 0; i < n; i++) {\n this.step();\n }\n }\n\n private token(): Token {\n this.whitespace();\n\n if (this.position >= this.input.length) {\n return new Token(TokenType.EOF, '', this.line, this.column);\n }\n\n const start = this.position;\n const line = this.line;\n const column = this.column;\n const ch = this.input[this.position]!;\n\n // Single character tokens\n switch (ch) {\n case '(':\n this.step();\n return new Token(TokenType.LPAREN, '(', line, column);\n case ')':\n this.step();\n return new Token(TokenType.RPAREN, ')', line, column);\n case '[':\n this.step();\n return new Token(TokenType.LBRACKET, '[', line, column);\n case ']':\n this.step();\n return new Token(TokenType.RBRACKET, ']', line, column);\n case '{':\n this.step();\n return new Token(TokenType.LBRACE, '{', line, column);\n case '}':\n this.step();\n return new Token(TokenType.RBRACE, '}', line, column);\n case ',':\n this.step();\n return new Token(TokenType.COMMA, ',', line, column);\n case '.':\n this.step();\n return new Token(TokenType.DOT, '.', line, column);\n case ':':\n this.step();\n return new Token(TokenType.COLON, ':', line, column);\n case '?':\n this.step();\n return new Token(TokenType.QUESTION, '?', line, column);\n case '+':\n this.step();\n return new Token(TokenType.PLUS, '+', line, column);\n case '*':\n this.step();\n return new Token(TokenType.STAR, '*', line, column);\n case '/':\n this.step();\n return new Token(TokenType.SLASH, '/', line, column);\n case '%':\n this.step();\n return new Token(TokenType.PERCENT, '%', line, column);\n }\n\n // Multi-character operators\n if (ch === '&' && this.peekChar() === '&') {\n this.forward(2);\n return new Token(TokenType.LOGICAL_AND, '&&', line, column);\n }\n if (ch === '|' && this.peekChar() === '|') {\n this.forward(2);\n return new Token(TokenType.LOGICAL_OR, '||', line, column);\n }\n if (ch === '=' && this.peekChar() === '=') {\n this.forward(2);\n return new Token(TokenType.EQ, '==', line, column);\n }\n if (ch === '!' && this.peekChar() === '=') {\n this.forward(2);\n return new Token(TokenType.NE, '!=', line, column);\n }\n if (ch === '<' && this.peekChar() === '=') {\n this.forward(2);\n return new Token(TokenType.LE, '<=', line, column);\n }\n if (ch === '>' && this.peekChar() === '=') {\n this.forward(2);\n return new Token(TokenType.GE, '>=', line, column);\n }\n if (ch === '<') {\n this.step();\n return new Token(TokenType.LT, '<', line, column);\n }\n if (ch === '>') {\n this.step();\n return new Token(TokenType.GT, '>', line, column);\n }\n if (ch === '!') {\n this.step();\n return new Token(TokenType.BANG, '!', line, column);\n }\n if (ch === '-') {\n this.step();\n return new Token(TokenType.MINUS, '-', line, column);\n }\n\n // String literals\n if (ch === '\"' || ch === \"'\") {\n return this.string(line, column, start);\n }\n\n // Raw strings or triple-quoted strings\n if ((ch === 'r' || ch === 'R') && this.position + 1 < this.input.length) {\n const next = this.input[this.position + 1]!;\n if (next === '\"' || next === \"'\") {\n return this.string(line, column, start);\n }\n }\n\n // Bytes literals\n if ((ch === 'b' || ch === 'B') && this.position + 1 < this.input.length) {\n const next = this.input[this.position + 1]!;\n if (next === '\"' || next === \"'\") {\n return this.bytes(line, column, start);\n }\n }\n\n // Numbers\n if (this.isDigit(ch)) {\n return this.number(line, column, start);\n }\n\n // Identifiers and keywords\n if (this.isLetter(ch) || ch === '_') {\n return this.identifier(line, column, start);\n }\n\n throw new ParseError(`Unexpected character: ${ch}`, line, column);\n }\n\n private string(line: number, column: number, offset: number): Token {\n let isRaw = false;\n\n // Check for raw prefix\n if (this.input[this.position] === 'r' || this.input[this.position] === 'R') {\n isRaw = true;\n this.step();\n }\n\n // Check for triple-quoted string\n if (this.position + 2 < this.input.length) {\n const prefix = this.input.substring(this.position, this.position + 3);\n if (prefix === '\"\"\"' || prefix === \"'''\") {\n const quote = this.input[this.position]!;\n this.forward(3);\n\n // Find closing triple quotes\n while (this.position + 2 < this.input.length) {\n if (\n this.input[this.position] === quote &&\n this.input[this.position + 1] === quote &&\n this.input[this.position + 2] === quote\n ) {\n this.forward(3);\n return new Token(TokenType.STRING, this.input.substring(offset, this.position), line, column);\n }\n this.step();\n }\n throw new ParseError('Unterminated triple-quoted string', line, column);\n }\n }\n\n // Regular string\n const quote = this.input[this.position]!;\n this.step(); // consume opening quote\n\n while (this.position < this.input.length) {\n const ch = this.input[this.position]!;\n if (ch === quote) {\n this.step();\n return new Token(TokenType.STRING, this.input.substring(offset, this.position), line, column);\n }\n if (ch === '\\\\' && !isRaw && this.position + 1 < this.input.length) {\n // Skip escape sequence as two chars\n this.forward(2);\n } else {\n this.step();\n }\n }\n\n throw new ParseError('Unterminated string', line, column);\n }\n\n private bytes(line: number, column: number, offset: number): Token {\n this.step(); // Skip 'b' or 'B'\n const quote = this.input[this.position]!;\n this.step();\n\n while (this.position < this.input.length) {\n const ch = this.input[this.position]!;\n if (ch === quote) {\n this.step();\n return new Token(TokenType.BYTES, this.input.substring(offset, this.position), line, column);\n }\n if (ch === '\\\\' && this.position + 1 < this.input.length) {\n this.forward(2); // Skip escape sequence\n } else {\n this.step();\n }\n }\n\n throw new ParseError('Unterminated bytes literal', line, column);\n }\n\n private number(line: number, column: number, offset: number): Token {\n // Check for hexadecimal\n if (this.input[this.position] === '0' && this.position + 1 < this.input.length) {\n const next = this.input[this.position + 1]!;\n if (next === 'x' || next === 'X') {\n this.forward(2);\n while (this.position < this.input.length && this.isHexDigit(this.input[this.position]!)) {\n this.step();\n }\n\n // Check for uint suffix\n if (this.position < this.input.length) {\n const suffix = this.input[this.position]!;\n if (suffix === 'u' || suffix === 'U') {\n this.step();\n return new Token(TokenType.UINT, this.input.substring(offset, this.position), line, column);\n }\n }\n\n return new Token(TokenType.INT, this.input.substring(offset, this.position), line, column);\n }\n }\n\n // Scan digits\n while (this.position < this.input.length && this.isDigit(this.input[this.position]!)) {\n this.step();\n }\n\n // Check for decimal point or exponent\n let isDouble = false;\n if (this.position < this.input.length && this.input[this.position] === '.') {\n isDouble = true;\n this.step();\n while (this.position < this.input.length && this.isDigit(this.input[this.position]!)) {\n this.step();\n }\n }\n\n if (this.position < this.input.length) {\n const c = this.input[this.position]!;\n if (c === 'e' || c === 'E') {\n isDouble = true;\n this.step();\n if (this.position < this.input.length) {\n const sign = this.input[this.position]!;\n if (sign === '+' || sign === '-') {\n this.step();\n }\n }\n while (this.position < this.input.length && this.isDigit(this.input[this.position]!)) {\n this.step();\n }\n }\n }\n\n // Check for uint suffix\n if (!isDouble && this.position < this.input.length) {\n const suffix = this.input[this.position]!;\n if (suffix === 'u' || suffix === 'U') {\n this.step();\n return new Token(TokenType.UINT, this.input.substring(offset, this.position), line, column);\n }\n }\n\n const type = isDouble ? TokenType.DOUBLE : TokenType.INT;\n return new Token(type, this.input.substring(offset, this.position), line, column);\n }\n\n private identifier(line: number, column: number, offset: number): Token {\n while (this.position < this.input.length) {\n const c = this.input[this.position]!;\n if (!this.isLetterOrDigit(c) && c !== '_') {\n break;\n }\n this.step();\n }\n\n const value = this.input.substring(offset, this.position);\n const type = this.typeOf(value);\n\n return new Token(type, value, line, column);\n }\n\n private typeOf(value: string): TokenType {\n switch (value) {\n case 'null':\n return TokenType.NULL;\n case 'true':\n return TokenType.TRUE;\n case 'false':\n return TokenType.FALSE;\n case 'in':\n return TokenType.IN;\n default:\n return TokenType.IDENTIFIER;\n }\n }\n\n private whitespace(): void {\n while (this.position < this.input.length) {\n const c = this.input[this.position]!;\n if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n break;\n }\n this.step();\n }\n }\n\n private peekChar(): string {\n const pos = this.position + 1;\n if (pos >= this.input.length) {\n return '\\0';\n }\n return this.input[pos]!;\n }\n\n private isHexDigit(c: string): boolean {\n return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');\n }\n\n private isDigit(c: string): boolean {\n return c >= '0' && c <= '9';\n }\n\n private isLetter(c: string): boolean {\n return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');\n }\n\n private isLetterOrDigit(c: string): boolean {\n return this.isLetter(c) || this.isDigit(c);\n }\n}\n","/**\n * Binary operators in CEL expressions.\n */\nexport enum BinaryOp {\n /** Addition (+) or string/list concatenation */\n ADD = 'ADD',\n /** Subtraction (-) */\n SUBTRACT = 'SUBTRACT',\n /** Multiplication (*) or string/list repetition */\n MULTIPLY = 'MULTIPLY',\n /** Division (/) */\n DIVIDE = 'DIVIDE',\n /** Modulo (%) */\n MODULO = 'MODULO',\n /** Equality (==) */\n EQUAL = 'EQUAL',\n /** Inequality (!=) */\n NOT_EQUAL = 'NOT_EQUAL',\n /** Less than (<) */\n LESS = 'LESS',\n /** Less than or equal (<=) */\n LESS_EQUAL = 'LESS_EQUAL',\n /** Greater than (>) */\n GREATER = 'GREATER',\n /** Greater than or equal (>=) */\n GREATER_EQUAL = 'GREATER_EQUAL',\n /** Membership test (in) */\n IN = 'IN',\n /** Logical AND (&&) */\n LOGICAL_AND = 'LOGICAL_AND',\n /** Logical OR (||) */\n LOGICAL_OR = 'LOGICAL_OR',\n}\n\n/**\n * Unary operators in CEL expressions.\n */\nexport enum UnaryOp {\n /** Logical NOT (!) */\n NOT = 'NOT',\n /** Numeric negation (-) */\n NEGATE = 'NEGATE',\n}\n\n/**\n * Types of literal values in CEL.\n */\nexport enum LiteralType {\n NULL_VALUE = 'NULL_VALUE',\n BOOL = 'BOOL',\n INT = 'INT',\n UINT = 'UINT',\n DOUBLE = 'DOUBLE',\n STRING = 'STRING',\n BYTES = 'BYTES',\n}\n","import { BinaryOp, UnaryOp, LiteralType } from './operators.js';\n\n/**\n * Visitor interface for traversing and operating on CEL expression nodes.\n * Implements the Visitor pattern for AST traversal.\n *\n * @template T The return type of visit operations\n */\nexport interface Visitor<T> {\n visitLiteral(expr: Literal): T;\n visitIdentifier(expr: Identifier): T;\n visitSelect(expr: Select): T;\n visitIndex(expr: Index): T;\n visitCall(expr: Call): T;\n visitList(expr: ListExpression): T;\n visitMap(expr: MapExpression): T;\n visitStruct(expr: Struct): T;\n visitComprehension(expr: Comprehension): T;\n visitUnary(expr: Unary): T;\n visitBinary(expr: Binary): T;\n visitConditional(expr: Conditional): T;\n}\n\n/**\n * Base interface for all CEL expression nodes in the Abstract Syntax Tree.\n * Uses the Visitor pattern to enable different operations on expressions.\n */\nexport interface Expression {\n /**\n * Accepts a visitor to perform operations on this expression node.\n *\n * @template T The return type of the visitor's visit operations\n * @param visitor The visitor that will operate on this expression node\n * @returns The result of the visitor's visit operation\n */\n accept<T>(visitor: Visitor<T>): T;\n}\n\n/**\n * Literal value expression (null, boolean, number, string, bytes).\n */\nexport class Literal implements Expression {\n constructor(\n public readonly value: any,\n public readonly literalType: LiteralType\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitLiteral(this);\n }\n}\n\n/**\n * Identifier expression (variable reference).\n */\nexport class Identifier implements Expression {\n constructor(public readonly name: string) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitIdentifier(this);\n }\n}\n\n/**\n * Field selection expression (operand.field).\n */\nexport class Select implements Expression {\n constructor(\n public readonly operand: Expression | null,\n public readonly field: string,\n public readonly isTest: boolean = false\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitSelect(this);\n }\n}\n\n/**\n * Index expression for array/map access (operand[index]).\n */\nexport class Index implements Expression {\n constructor(\n public readonly operand: Expression,\n public readonly index: Expression\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitIndex(this);\n }\n}\n\n/**\n * Function or method call expression.\n */\nexport class Call implements Expression {\n constructor(\n public readonly target: Expression | null,\n public readonly functionName: string,\n public readonly args: Expression[],\n public readonly isMacro: boolean = false\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitCall(this);\n }\n}\n\n/**\n * List literal expression ([1, 2, 3]).\n */\nexport class ListExpression implements Expression {\n constructor(public readonly elements: Expression[]) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitList(this);\n }\n}\n\n/**\n * Map entry (key-value pair in a map literal).\n */\nexport class MapEntry {\n constructor(\n public readonly key: Expression,\n public readonly value: Expression\n ) {}\n}\n\n/**\n * Map literal expression ({key: value}).\n */\nexport class MapExpression implements Expression {\n constructor(public readonly entries: MapEntry[]) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitMap(this);\n }\n}\n\n/**\n * Field initializer in a struct literal.\n */\nexport class FieldInitializer {\n constructor(\n public readonly field: string,\n public readonly value: Expression\n ) {}\n}\n\n/**\n * Struct literal expression (Type{field: value}).\n */\nexport class Struct implements Expression {\n constructor(\n public readonly typeName: string | null,\n public readonly fields: FieldInitializer[]\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitStruct(this);\n }\n}\n\n/**\n * Comprehension expression for advanced iteration constructs.\n */\nexport class Comprehension implements Expression {\n constructor(\n public readonly variable: string,\n public readonly range: Expression,\n public readonly accumulator: string,\n public readonly initializer: Expression,\n public readonly condition: Expression,\n public readonly step: Expression,\n public readonly result: Expression\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitComprehension(this);\n }\n}\n\n/**\n * Unary operation expression (!, -).\n */\nexport class Unary implements Expression {\n constructor(\n public readonly op: UnaryOp,\n public readonly operand: Expression\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitUnary(this);\n }\n}\n\n/**\n * Binary operation expression (+, -, *, /, etc.).\n */\nexport class Binary implements Expression {\n constructor(\n public readonly op: BinaryOp,\n public readonly left: Expression,\n public readonly right: Expression\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitBinary(this);\n }\n}\n\n/**\n * Conditional (ternary) expression (condition ? then : otherwise).\n */\nexport class Conditional implements Expression {\n constructor(\n public readonly condition: Expression,\n public readonly thenExpr: Expression,\n public readonly otherwiseExpr: Expression\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitConditional(this);\n }\n}\n","import {\n Expression,\n Literal,\n Identifier,\n Select,\n Index,\n Call,\n ListExpression,\n MapExpression,\n MapEntry,\n Struct,\n FieldInitializer,\n Unary,\n Binary,\n Conditional,\n BinaryOp,\n UnaryOp,\n LiteralType,\n} from '../ast/index.js';\nimport { Lexer, Token, TokenType, ParseError } from './lexer.js';\n\n// Re-export ParseError for convenience\nexport { ParseError } from './lexer.js';\n\n/**\n * Set of macro method names that require special handling.\n */\nconst MACRO_METHODS = new Set(['map', 'filter', 'all', 'exists', 'existsOne']);\n\n/**\n * Recursive descent parser for CEL (Common Expression Language).\n * Parses CEL expressions into an Abstract Syntax Tree (AST).\n */\nexport class Parser {\n private readonly lexer: Lexer;\n private current: Token;\n\n constructor(input: string) {\n this.lexer = new Lexer(input);\n this.current = this.lexer.next();\n }\n\n /**\n * Parse a CEL expression from the input string.\n * @returns The parsed Expression AST node\n * @throws ParseError if the input contains syntax errors\n */\n parse(): Expression {\n const expr = this.parseExpr();\n if (this.current.type !== TokenType.EOF) {\n throw new ParseError(\n `Unexpected token after expression: ${this.current.value}`,\n this.current.line,\n this.current.column\n );\n }\n return expr;\n }\n\n // expr = conditionalOr ( '?' conditionalOr ':' expr )?\n private parseExpr(): Expression {\n const condition = this.parseConditionalOr();\n\n if (this.match(TokenType.QUESTION)) {\n const thenExpr = this.parseConditionalOr();\n this.expect(TokenType.COLON);\n const otherwiseExpr = this.parseExpr();\n return new Conditional(condition, thenExpr, otherwiseExpr);\n }\n\n return condition;\n }\n\n // conditionalOr = conditionalAnd ( '||' conditionalAnd )*\n private parseConditionalOr(): Expression {\n let left = this.parseConditionalAnd();\n\n while (this.match(TokenType.LOGICAL_OR)) {\n const right = this.parseConditionalAnd();\n left = new Binary(BinaryOp.LOGICAL_OR, left, right);\n }\n\n return left;\n }\n\n // conditionalAnd = relation ( '&&' relation )*\n private parseConditionalAnd(): Expression {\n let left = this.parseRelation();\n\n while (this.match(TokenType.LOGICAL_AND)) {\n const right = this.parseRelation();\n left = new Binary(BinaryOp.LOGICAL_AND, left, right);\n }\n\n return left;\n }\n\n // relation = addition ( relop addition )*\n // relop = '<=' | '>=' | '!=' | '==' | '<' | '>' | 'in'\n private parseRelation(): Expression {\n let left = this.parseAddition();\n\n while (this.isRelationalOp(this.current.type)) {\n const op = this.current.type;\n this.advance();\n const right = this.parseAddition();\n left = new Binary(this.toBinaryOp(op), left, right);\n }\n\n return left;\n }\n\n // addition = multiplication ( ('+' | '-') multiplication )*\n private parseAddition(): Expression {\n let left = this.parseMultiplication();\n\n while (this.current.type === TokenType.PLUS || this.current.type === TokenType.MINUS) {\n const op = this.current.type;\n this.advance();\n const right = this.parseMultiplication();\n left = new Binary(op === TokenType.PLUS ? BinaryOp.ADD : BinaryOp.SUBTRACT, left, right);\n }\n\n return left;\n }\n\n // multiplication = unary ( ('*' | '/' | '%') unary )*\n private parseMultiplication(): Expression {\n let left = this.parseUnary();\n\n while (\n this.current.type === TokenType.STAR ||\n this.current.type === TokenType.SLASH ||\n this.current.type === TokenType.PERCENT\n ) {\n const op = this.current.type;\n this.advance();\n const right = this.parseUnary();\n const operator =\n op === TokenType.STAR\n ? BinaryOp.MULTIPLY\n : op === TokenType.SLASH\n ? BinaryOp.DIVIDE\n : BinaryOp.MODULO;\n left = new Binary(operator, left, right);\n }\n\n return left;\n }\n\n // unary = '!'+ member | '-'+ member | member\n private parseUnary(): Expression {\n if (this.current.type === TokenType.BANG) {\n this.advance();\n return new Unary(UnaryOp.NOT, this.parseUnary());\n } else if (this.current.type === TokenType.MINUS) {\n this.advance();\n return new Unary(UnaryOp.NEGATE, this.parseUnary());\n }\n\n return this.parseMember();\n }\n\n // member = primary ( selector | index | fieldCall )*\n private parseMember(): Expression {\n let expr = this.parsePrimary();\n\n while (true) {\n if (this.current.type === TokenType.DOT) {\n this.advance();\n const field = this.expectIdentifier();\n\n // Check if it's a method call or a field selection\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.LPAREN) {\n this.advance();\n const args = this.parseExprList();\n this.expect(TokenType.RPAREN);\n const isMacro = MACRO_METHODS.has(field);\n expr = new Call(expr, field, args, isMacro);\n } else {\n expr = new Select(expr, field);\n }\n } else if (this.current.type === TokenType.LBRACKET) {\n this.advance();\n const index = this.parseExpr();\n this.expect(TokenType.RBRACKET);\n expr = new Index(expr, index);\n } else {\n break;\n }\n }\n\n return expr;\n }\n\n // primary = literal | ident callArgs? | listLiteral | mapLiteral | structLiteral | '(' expr ')' | '.' ident callArgs?\n private parsePrimary(): Expression {\n // Check for literals\n if (this.isLiteralToken(this.current.type)) {\n return this.parseLiteral();\n }\n\n // List literal\n if (this.current.type === TokenType.LBRACKET) {\n return this.parseListLiteral();\n }\n\n // Map or struct literal\n if (this.current.type === TokenType.LBRACE) {\n return this.parseMapOrStructLiteral(null);\n }\n\n // Parenthesized expression\n if (this.current.type === TokenType.LPAREN) {\n this.advance();\n const expr = this.parseExpr();\n this.expect(TokenType.RPAREN);\n return expr;\n }\n\n // Leading dot (e.g., .identifier or .method())\n if (this.current.type === TokenType.DOT) {\n this.advance();\n const field = this.expectIdentifier();\n\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.LPAREN) {\n this.advance();\n const args = this.parseExprList();\n this.expect(TokenType.RPAREN);\n return new Call(null, field, args);\n }\n\n return new Select(null, field);\n }\n\n // Identifier (possibly followed by call args or struct literal)\n if (this.current.type === TokenType.IDENTIFIER) {\n const name = this.current.value;\n this.advance();\n\n // Function call\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.LPAREN) {\n this.advance();\n const args = this.parseExprList();\n this.expect(TokenType.RPAREN);\n return new Call(null, name, args);\n }\n\n // Check for qualified identifier followed by struct literal\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.DOT && this.isQualifiedStructLiteral()) {\n const qualified = this.parseQualifiedIdent(name);\n return this.parseMapOrStructLiteral(qualified);\n }\n\n // Check for struct literal with simple type name\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.LBRACE) {\n return this.parseMapOrStructLiteral(name);\n }\n\n return new Identifier(name);\n }\n\n throw new ParseError(\n `Unexpected token: ${this.current.value}`,\n this.current.line,\n this.current.column\n );\n }\n\n // listLiteral = '[' exprList? ','? ']'\n private parseListLiteral(): Expression {\n this.expect(TokenType.LBRACKET);\n\n const elements: Expression[] = [];\n if (this.current.type !== TokenType.RBRACKET) {\n elements.push(...this.parseExprList());\n // Optional trailing comma\n if (this.current.type === TokenType.COMMA) {\n this.advance();\n }\n }\n\n this.expect(TokenType.RBRACKET);\n return new ListExpression(elements);\n }\n\n // mapLiteral or structLiteral\n private parseMapOrStructLiteral(typeName: string | null): Expression {\n this.expect(TokenType.LBRACE);\n\n if (this.current.type === TokenType.RBRACE) {\n this.advance();\n if (typeName !== null) {\n return new Struct(typeName, []);\n }\n return new MapExpression([]);\n }\n\n // Try to determine if this is a struct (field: expr) or map (expr: expr)\n const isStruct =\n this.current.type === TokenType.IDENTIFIER && this.peekAhead(1).type === TokenType.COLON;\n\n if (isStruct || typeName !== null) {\n const fields = this.parseFieldInits();\n if (this.current.type === TokenType.COMMA) {\n this.advance();\n }\n this.expect(TokenType.RBRACE);\n return new Struct(typeName, fields);\n } else {\n const entries = this.parseMapInits();\n if (this.current.type === TokenType.COMMA) {\n this.advance();\n }\n this.expect(TokenType.RBRACE);\n return new MapExpression(entries);\n }\n }\n\n // exprList = expr ( ',' expr )*\n private parseExprList(): Expression[] {\n const expressions: Expression[] = [];\n\n // Check for empty list - current could be RPAREN or RBRACKET\n const currentType = this.current.type;\n if (currentType === TokenType.RPAREN || currentType === TokenType.RBRACKET) {\n return expressions;\n }\n\n expressions.push(this.parseExpr());\n\n while (this.current.type === TokenType.COMMA) {\n this.advance();\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.RPAREN || this.current.type === TokenType.RBRACKET) {\n break;\n }\n expressions.push(this.parseExpr());\n }\n\n return expressions;\n }\n\n // mapInits = mapInit ( ',' mapInit )*\n private parseMapInits(): MapEntry[] {\n const entries: MapEntry[] = [];\n\n entries.push(this.parseMapInit());\n while (this.current.type === TokenType.COMMA) {\n this.advance();\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.RBRACE) {\n break;\n }\n entries.push(this.parseMapInit());\n }\n\n return entries;\n }\n\n // mapInit = expr ':' expr\n private parseMapInit(): MapEntry {\n const key = this.parseExpr();\n this.expect(TokenType.COLON);\n const value = this.parseExpr();\n return new MapEntry(key, value);\n }\n\n // fieldInits = fieldInit ( ',' fieldInit )*\n private parseFieldInits(): FieldInitializer[] {\n const fields: FieldInitializer[] = [];\n\n fields.push(this.parseFieldInit());\n while (this.current.type === TokenType.COMMA) {\n this.advance();\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.RBRACE) {\n break;\n }\n fields.push(this.parseFieldInit());\n }\n\n return fields;\n }\n\n // fieldInit = ident ':' expr\n private parseFieldInit(): FieldInitializer {\n const field = this.expectIdentifier();\n this.expect(TokenType.COLON);\n const value = this.parseExpr();\n return new FieldInitializer(field, value);\n }\n\n // qualifiedIdent = ident ( '.' ident )*\n private parseQualifiedIdent(first: string): string {\n let qualified = first;\n\n while (this.current.type === TokenType.DOT) {\n this.advance();\n qualified += '.';\n qualified += this.expectIdentifier();\n }\n\n return qualified;\n }\n\n private parseLiteral(): Expression {\n const token = this.current;\n this.advance();\n\n switch (token.type) {\n case TokenType.NULL:\n return new Literal(null, LiteralType.NULL_VALUE);\n case TokenType.TRUE:\n return new Literal(true, LiteralType.BOOL);\n case TokenType.FALSE:\n return new Literal(false, LiteralType.BOOL);\n case TokenType.INT:\n return new Literal(this.parseIntLiteral(token.value), LiteralType.INT);\n case TokenType.UINT:\n return new Literal(this.parseUintLiteral(token.value), LiteralType.UINT);\n case TokenType.DOUBLE:\n return new Literal(parseFloat(token.value), LiteralType.DOUBLE);\n case TokenType.STRING:\n return new Literal(this.parseStringLiteral(token.value), LiteralType.STRING);\n case TokenType.BYTES:\n return new Literal(this.parseBytesLiteral(token.value), LiteralType.BYTES);\n default:\n throw new ParseError(`Not a literal: ${token.value}`, token.line, token.column);\n }\n }\n\n private parseIntLiteral(value: string): number {\n if (value.startsWith('-0x') || value.startsWith('-0X')) {\n return -parseInt(value.substring(3), 16);\n } else if (value.startsWith('0x') || value.startsWith('0X')) {\n return parseInt(value.substring(2), 16);\n } else {\n return parseInt(value, 10);\n }\n }\n\n private parseUintLiteral(value: string): number {\n // Remove 'u' or 'U' suffix\n const number = value.substring(0, value.length - 1);\n if (number.startsWith('0x') || number.startsWith('0X')) {\n return parseInt(number.substring(2), 16);\n } else {\n return parseInt(number, 10);\n }\n }\n\n private parseStringLiteral(value: string): string {\n const isRaw = value.startsWith('r') || value.startsWith('R');\n let content: string;\n\n if (isRaw && (value.substring(1).startsWith('\"\"\"') || value.substring(1).startsWith(\"'''\"))) {\n // Raw triple-quoted string: r\"\"\"...\"\"\" or r'''...'''\n content = value.substring(4, value.length - 3);\n } else if (value.startsWith('\"\"\"') || value.startsWith(\"'''\")) {\n // Triple-quoted string: \"\"\"...\"\"\" or '''...'''\n content = value.substring(3, value.length - 3);\n content = this.unescapeString(content);\n } else if (isRaw) {\n // Raw string: r\"...\" or r'...'\n content = value.substring(2, value.length - 1);\n } else {\n // Regular string: \"...\" or '...'\n content = value.substring(1, value.length - 1);\n content = this.unescapeString(content);\n }\n\n return content;\n }\n\n private parseBytesLiteral(value: string): string {\n // Remove b\"...\" or B'...' wrapper and process escapes\n const content = value.substring(2, value.length - 1);\n return this.unescapeString(content);\n }\n\n private unescapeString(value: string): string {\n let result = '';\n let i = 0;\n\n while (i < value.length) {\n if (value[i] === '\\\\' && i + 1 < value.length) {\n const next = value[i + 1]!;\n switch (next) {\n case '\\\\':\n result += '\\\\';\n i += 2;\n break;\n case '\"':\n result += '\"';\n i += 2;\n break;\n case \"'\":\n result += \"'\";\n i += 2;\n break;\n case '`':\n result += '`';\n i += 2;\n break;\n case '?':\n result += '?';\n i += 2;\n break;\n case 'a':\n result += '\\u0007';\n i += 2;\n break;\n case 'b':\n result += '\\b';\n i += 2;\n break;\n case 'f':\n result += '\\f';\n i += 2;\n break;\n case 'n':\n result += '\\n';\n i += 2;\n break;\n case 'r':\n result += '\\r';\n i += 2;\n break;\n case 't':\n result += '\\t';\n i += 2;\n break;\n case 'v':\n result += '\\u000B';\n i += 2;\n break;\n case 'x':\n // Hexadecimal escape: \\xHH\n if (i + 3 < value.length) {\n const hex = value.substring(i + 2, i + 4);\n result += String.fromCharCode(parseInt(hex, 16));\n i += 4;\n } else {\n result += value[i]!;\n i++;\n }\n break;\n case 'u':\n // Unicode escape: \\uHHHH\n if (i + 5 < value.length) {\n const hex = value.substring(i + 2, i + 6);\n result += String.fromCharCode(parseInt(hex, 16));\n i += 6;\n } else {\n result += value[i]!;\n i++;\n }\n break;\n case 'U':\n // Unicode escape: \\UHHHHHHHH\n if (i + 9 < value.length) {\n const hex = value.substring(i + 2, i + 10);\n const codePoint = parseInt(hex, 16);\n result += String.fromCodePoint(codePoint);\n i += 10;\n } else {\n result += value[i]!;\n i++;\n }\n break;\n default:\n // Check for octal escape: \\[0-3][0-7][0-7]\n if (\n i + 3 < value.length &&\n next >= '0' &&\n next <= '3' &&\n value[i + 2]! >= '0' &&\n value[i + 2]! <= '7' &&\n value[i + 3]! >= '0' &&\n value[i + 3]! <= '7'\n ) {\n const octal = value.substring(i + 1, i + 4);\n result += String.fromCharCode(parseInt(octal, 8));\n i += 4;\n } else {\n result += value[i]!;\n i++;\n }\n }\n } else {\n result += value[i]!;\n i++;\n }\n }\n\n return result;\n }\n\n private isLiteralToken(type: TokenType): boolean {\n return (\n type === TokenType.NULL ||\n type === TokenType.TRUE ||\n type === TokenType.FALSE ||\n type === TokenType.INT ||\n type === TokenType.UINT ||\n type === TokenType.DOUBLE ||\n type === TokenType.STRING ||\n type === TokenType.BYTES\n );\n }\n\n private isRelationalOp(type: TokenType): boolean {\n return (\n type === TokenType.LT ||\n type === TokenType.LE ||\n type === TokenType.GT ||\n type === TokenType.GE ||\n type === TokenType.EQ ||\n type === TokenType.NE ||\n type === TokenType.IN\n );\n }\n\n private toBinaryOp(type: TokenType): BinaryOp {\n switch (type) {\n case TokenType.LT:\n return BinaryOp.LESS;\n case TokenType.LE:\n return BinaryOp.LESS_EQUAL;\n case TokenType.GT:\n return BinaryOp.GREATER;\n case TokenType.GE:\n return BinaryOp.GREATER_EQUAL;\n case TokenType.EQ:\n return BinaryOp.EQUAL;\n case TokenType.NE:\n return BinaryOp.NOT_EQUAL;\n case TokenType.IN:\n return BinaryOp.IN;\n default:\n throw new ParseError(\n `Unknown relational operator: ${type}`,\n this.current.line,\n this.current.column\n );\n }\n }\n\n private match(type: TokenType): boolean {\n if (this.current.type === type) {\n this.advance();\n return true;\n }\n return false;\n }\n\n private expect(type: TokenType): void {\n if (this.current.type !== type) {\n throw new ParseError(\n `Expected ${type} but found ${this.current.type}`,\n this.current.line,\n this.current.column\n );\n }\n this.advance();\n }\n\n private expectIdentifier(): string {\n if (this.current.type !== TokenType.IDENTIFIER) {\n throw new ParseError(\n `Expected identifier but found ${this.current.value}`,\n this.current.line,\n this.current.column\n );\n }\n const name = this.current.value;\n this.advance();\n return name;\n }\n\n private advance(): void {\n this.current = this.lexer.next();\n }\n\n private peekAhead(count: number): Token {\n return this.lexer.peek(count);\n }\n\n // Check if we have a pattern like: . ident ( . ident )* {\n private isQualifiedStructLiteral(): boolean {\n let lookahead = 1;\n let token = this.peekAhead(lookahead);\n\n // Must start with identifier after dot\n if (token.type !== TokenType.IDENTIFIER) {\n return false;\n }\n\n lookahead++;\n token = this.peekAhead(lookahead);\n\n // Skip additional .ident sequences\n while (token.type === TokenType.DOT) {\n lookahead++;\n token = this.peekAhead(lookahead);\n if (token.type !== TokenType.IDENTIFIER) {\n return false;\n }\n lookahead++;\n token = this.peekAhead(lookahead);\n }\n\n // Must end with {\n return token.type === TokenType.LBRACE;\n }\n}\n","/**\n * Exception thrown during CEL expression evaluation.\n */\nexport class EvaluationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'EvaluationError';\n }\n}\n\n/**\n * Interface for providing functions to CEL expressions.\n *\n * Implement this interface to provide custom functions that can be called\n * from CEL expressions. The StandardFunctions class provides all standard\n * CEL functions and can be extended for custom functionality.\n *\n * @example\n * ```typescript\n * class MyFunctions extends StandardFunctions {\n * callFunction(name: string, args: any[]): any {\n * if (name === 'customFunc') {\n * return myCustomImplementation(args);\n * }\n * return super.callFunction(name, args);\n * }\n * }\n * ```\n */\nexport interface Functions {\n /**\n * Calls a global function by name.\n *\n * @param name The name of the function to call\n * @param args The arguments to pass to the function\n * @returns The result of the function call\n * @throws Error if the function is not found or if the arguments are invalid\n */\n callFunction(name: string, args: any[]): any;\n\n /**\n * Calls a method on a target object.\n *\n * @param target The object to call the method on\n * @param method The name of the method to call\n * @param args The arguments to pass to the method\n * @returns The result of the method call\n * @throws Error if the method is not found or if the arguments are invalid\n */\n callMethod(target: any, method: string, args: any[]): any;\n}\n","/**\n * Utility helper methods for libcel.\n * Methods are exported so library users can call them directly.\n */\n\n/**\n * Returns the size/length of the given value.\n *\n * Supported types:\n * - String: number of characters\n * - Array: number of elements\n * - Map/Record: number of entries\n * - null: 0\n *\n * @param value The value whose size should be computed; may be null\n * @returns The size for supported types, or 0 for null\n * @throws Error if the value type is unsupported\n */\nexport function sizeOf(value: any): number {\n if (value === null || value === undefined) {\n return 0;\n }\n if (typeof value === 'string') {\n return value.length;\n }\n if (Array.isArray(value)) {\n return value.length;\n }\n if (typeof value === 'object' && value !== null) {\n return Object.keys(value).length;\n }\n throw new Error(`size() not supported for type: ${typeof value}`);\n}\n\n/**\n * Converts the given value to a signed integer (number).\n *\n * Accepted inputs: number, string (parsed as integer), boolean (true=1, false=0)\n *\n * @param value The value to convert\n * @returns The converted integer value\n * @throws Error if the value cannot be converted\n */\nexport function asInt(value: any): number {\n if (typeof value === 'number') {\n return Math.trunc(value);\n }\n if (typeof value === 'string') {\n const parsed = parseInt(value, 10);\n if (isNaN(parsed)) {\n throw new Error(`Cannot convert to int: ${value}`);\n }\n return parsed;\n }\n if (typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n throw new Error(`Cannot convert to int: ${value}`);\n}\n\n/**\n * Converts the given value to an unsigned integer.\n *\n * Negative inputs are not allowed and will result in an exception.\n *\n * @param value The value to convert\n * @returns The non-negative integer value\n * @throws Error if the value is negative or cannot be converted\n */\nexport function asUInt(value: any): number {\n const result = asInt(value);\n if (result < 0) {\n throw new Error(`Cannot convert negative value to uint: ${value}`);\n }\n return result;\n}\n\n/**\n * Converts the given value to a double (number).\n *\n * Accepted inputs: number, string parsable as number\n *\n * @param value The value to convert\n * @returns The converted number value\n * @throws Error if the value cannot be converted\n */\nexport function asDouble(value: any): number {\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value);\n if (isNaN(parsed)) {\n throw new Error(`Cannot convert to double: ${value}`);\n }\n return parsed;\n }\n throw new Error(`Cannot convert to double: ${value}`);\n}\n\n/**\n * Converts the given value to its string representation.\n *\n * Returns the literal string \"null\" for null/undefined values.\n *\n * @param value The value to stringify\n * @returns The string representation\n */\nexport function asString(value: any): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n return String(value);\n}\n\n/**\n * Converts the given value to a boolean using common truthiness rules.\n *\n * Numbers are true if non-zero. Strings are true if non-empty.\n * Collections/maps are true if non-empty. Null is false.\n *\n * @param value The value to interpret\n * @returns The boolean interpretation\n */\nexport function asBool(value: any): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'number') {\n return value !== 0;\n }\n if (typeof value === 'string') {\n return value.length > 0;\n }\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n if (typeof value === 'object' && value !== null) {\n return Object.keys(value).length > 0;\n }\n return value != null;\n}\n\n/**\n * Returns a simple type name for the given value.\n *\n * Possible results: \"null\", \"bool\", \"int\", \"double\", \"string\", \"list\", \"map\", or \"unknown\"\n *\n * @param value The value whose type is to be described\n * @returns The simple type name\n */\nexport function typeOf(value: any): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n if (typeof value === 'boolean') {\n return 'bool';\n }\n if (typeof value === 'number') {\n return Number.isInteger(value) ? 'int' : 'double';\n }\n if (typeof value === 'string') {\n return 'string';\n }\n if (Array.isArray(value)) {\n return 'list';\n }\n if (typeof value === 'object') {\n return 'map';\n }\n return 'unknown';\n}\n\n/**\n * Checks whether a map contains the given field name.\n *\n * @param target The map-like object to check (must be an object to return true/false)\n * @param field The field/key to look for (must be a string)\n * @returns true if target is a Map/object and contains the given key; false otherwise\n */\nexport function has(target: any, field: any): boolean {\n if (typeof target === 'object' && target !== null && typeof field === 'string') {\n return field in target;\n }\n return false;\n}\n\n/**\n * Tests whether the given regular expression matches any part of the text.\n *\n * Uses RegExp pattern matching with find semantics.\n *\n * @param text The input text\n * @param pattern The regular expression pattern\n * @returns true if the pattern matches anywhere in the text; false otherwise\n * @throws Error if the pattern is invalid\n */\nexport function matches(text: string, pattern: string): boolean {\n try {\n const regex = new RegExp(pattern);\n return regex.test(text);\n } catch {\n throw new Error(`Invalid regex pattern: ${pattern}`);\n }\n}\n\n/**\n * Returns the maximum element from a non-empty array of values.\n *\n * Comparison rules follow compare(). All elements must be mutually comparable.\n *\n * @param values A non-empty array of values\n * @returns The maximum value in the array\n * @throws Error if the array is empty or values are not comparable\n */\nexport function max(values: any[]): any {\n if (values.length === 0) {\n throw new Error('max() requires at least one argument');\n }\n\n let result = values[0];\n for (let i = 1; i < values.length; i++) {\n if (compare(values[i], result) > 0) {\n result = values[i];\n }\n }\n return result;\n}\n\n/**\n * Returns the minimum element from a non-empty array of values.\n *\n * Comparison rules follow compare(). All elements must be mutually comparable.\n *\n * @param values A non-empty array of values\n * @returns The minimum value in the array\n * @throws Error if the array is empty or values are not comparable\n */\nexport function min(values: any[]): any {\n if (values.length === 0) {\n throw new Error('min() requires at least one argument');\n }\n\n let result = values[0];\n for (let i = 1; i < values.length; i++) {\n if (compare(values[i], result) < 0) {\n result = values[i];\n }\n }\n return result;\n}\n\n/**\n * Compares two values using a common set of rules.\n *\n * Supported comparisons: numbers (by numeric value), strings (lexicographically),\n * booleans, arrays (lexicographically).\n *\n * @param a The first value\n * @param b The second value\n * @returns A negative number, zero, or a positive number as a is less than, equal to, or greater than b\n * @throws Error if the values cannot be compared\n */\nexport function compare(a: any, b: any): number {\n if (a === null && b === null) {\n return 0;\n }\n if (a === null) {\n return -1;\n }\n if (b === null) {\n return 1;\n }\n\n // Number comparison\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n // String comparison\n if (typeof a === 'string' && typeof b === 'string') {\n return a.localeCompare(b);\n }\n\n // Boolean comparison\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return a === b ? 0 : a ? 1 : -1;\n }\n\n // Array comparison (lexicographic)\n if (Array.isArray(a) && Array.isArray(b)) {\n const size = Math.min(a.length, b.length);\n for (let i = 0; i < size; i++) {\n const cmp = compare(a[i], b[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n return a.length - b.length;\n }\n\n throw new Error(`Cannot compare types: ${typeof a} and ${typeof b}`);\n}\n\n/**\n * Deep equality check for CEL values.\n *\n * @param left First value\n * @param right Second value\n * @returns true if values are deeply equal\n */\nexport function deepEquals(left: any, right: any): boolean {\n if (left === null || left === undefined || right === null || right === undefined) {\n return left === right;\n }\n\n // Array equality\n if (Array.isArray(left) && Array.isArray(right)) {\n if (left.length !== right.length) {\n return false;\n }\n for (let i = 0; i < left.length; i++) {\n if (!deepEquals(left[i], right[i])) {\n return false;\n }\n }\n return true;\n }\n\n // Object/Map equality\n if (typeof left === 'object' && typeof right === 'object' && !Array.isArray(left) && !Array.isArray(right)) {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n for (const key of leftKeys) {\n if (!(key in right)) {\n return false;\n }\n if (!deepEquals(left[key], right[key])) {\n return false;\n }\n }\n return true;\n }\n\n // Numeric equality with type coercion\n if (typeof left === 'number' && typeof right === 'number') {\n return left === right;\n }\n\n // Standard equality\n return left === right;\n}\n\n/**\n * Helper for array contains with deep equality.\n *\n * @param array The array to search\n * @param value The value to find\n * @returns true if the array contains the value (using deep equality)\n */\nexport function containsInArray(array: any[], value: any): boolean {\n for (const item of array) {\n if (deepEquals(item, value)) {\n return true;\n }\n }\n return false;\n}\n","import { Functions, EvaluationError } from './functions.js';\nimport * as Utilities from './utilities.js';\n\n/**\n * Standard CEL function library implementation.\n *\n * Provides all built-in CEL functions including:\n * - Type conversions: int(), double(), string(), bool()\n * - Type checking: type()\n * - Collection operations: size(), has()\n * - String operations: contains(), startsWith(), endsWith(), matches()\n * - Math operations: max(), min()\n *\n * This class can be extended to add custom functions while retaining\n * all standard CEL functionality.\n */\nexport class StandardFunctions implements Functions {\n callFunction(name: string, args: any[]): any {\n switch (name) {\n case 'size':\n return Utilities.sizeOf(args[0]);\n case 'int':\n return Utilities.asInt(args[0]);\n case 'uint':\n return Utilities.asUInt(args[0]);\n case 'double':\n return Utilities.asDouble(args[0]);\n case 'string':\n return Utilities.asString(args[0]);\n case 'bool':\n return Utilities.asBool(args[0]);\n case 'type':\n return Utilities.typeOf(args[0]);\n case 'has':\n if (args.length !== 2) {\n throw new Error('has() requires 2 arguments');\n }\n return Utilities.has(args[0], args[1]);\n case 'matches':\n if (args.length !== 2) {\n throw new Error('matches() requires 2 arguments');\n }\n return Utilities.matches(args[0] as string, args[1] as string);\n case 'max':\n return Utilities.max(args);\n case 'min':\n return Utilities.min(args);\n default:\n throw new Error(`Unknown function: ${name}`);\n }\n }\n\n callMethod(target: any, method: string, args: any[]): any {\n if (target === null || target === undefined) {\n throw new Error('Cannot call method on null');\n }\n\n switch (method) {\n case 'contains':\n if (typeof target === 'string' && args.length === 1 && typeof args[0] === 'string') {\n return target.includes(args[0]);\n } else if (Array.isArray(target) && args.length === 1) {\n return target.includes(args[0]);\n }\n throw new Error('Invalid arguments for contains()');\n\n case 'startsWith':\n if (typeof target === 'string' && args.length === 1 && typeof args[0] === 'string') {\n return target.startsWith(args[0]);\n }\n throw new Error('startsWith() requires string target and argument');\n\n case 'endsWith':\n if (typeof target === 'string' && args.length === 1 && typeof args[0] === 'string') {\n return target.endsWith(args[0]);\n }\n throw new Error('endsWith() requires string target and argument');\n\n case 'toLowerCase':\n if (typeof target === 'string' && args.length === 0) {\n return target.toLowerCase();\n }\n throw new Error('toLowerCase() requires string target');\n\n case 'toUpperCase':\n if (typeof target === 'string' && args.length === 0) {\n return target.toUpperCase();\n }\n throw new Error('toUpperCase() requires string target');\n\n case 'trim':\n if (typeof target === 'string' && args.length === 0) {\n return target.trim();\n }\n throw new Error('trim() requires string target');\n\n case 'replace':\n if (\n typeof target === 'string' &&\n args.length === 2 &&\n typeof args[0] === 'string' &&\n typeof args[1] === 'string'\n ) {\n // Note: JavaScript replace() only replaces first occurrence by default\n // Use replaceAll() or split/join for all occurrences\n return target.replaceAll(args[0], args[1]);\n }\n throw new Error('replace() requires string target and 2 string arguments');\n\n case 'split':\n if (typeof target === 'string' && args.length === 1 && typeof args[0] === 'string') {\n // CEL split uses literal string matching, not regex\n return target.split(args[0]);\n }\n throw new Error('split() requires string target and separator');\n\n case 'size':\n return Utilities.sizeOf(target);\n\n // Macro functions are handled in the interpreter with special logic\n case 'map':\n case 'filter':\n case 'all':\n case 'exists':\n case 'existsOne':\n throw new EvaluationError(\n `Macro function ${method} was not properly handled by the interpreter`\n );\n\n default:\n // Try to call native JavaScript method\n return this.callNativeMethod(target, method, args);\n }\n }\n\n /**\n * Attempts to call a native JavaScript method on the target object.\n *\n * @param target The object to call the method on\n * @param name The method name\n * @param args The arguments\n * @returns The result of the method call\n * @throws Error if the method doesn't exist or call fails\n */\n private callNativeMethod(target: any, name: string, args: any[]): any {\n if (typeof target[name] === 'function') {\n try {\n return target[name](...args);\n } catch (e) {\n throw new EvaluationError(\n `Invocation of method '${name}' failed: ${e instanceof Error ? e.message : String(e)}`\n );\n }\n }\n throw new Error(\n `No such method '${name}' on type ${typeof target} with ${args.length} argument(s)`\n );\n }\n}\n","import {\n Expression,\n Visitor,\n Literal,\n Identifier,\n Select,\n Index,\n Call,\n ListExpression,\n MapExpression,\n Struct,\n Comprehension,\n Unary,\n Binary,\n Conditional,\n BinaryOp,\n UnaryOp,\n} from '../ast/index.js';\nimport { Functions, EvaluationError } from '../functions/functions.js';\nimport { StandardFunctions } from '../functions/standard-functions.js';\nimport * as Utilities from '../functions/utilities.js';\n\n/**\n * Interpreter for evaluating CEL expressions.\n *\n * Implements the Visitor pattern to traverse and evaluate the AST produced by the parser.\n * Supports all CEL operations including macros, type conversions, and complex expressions.\n */\nexport class Interpreter implements Visitor<any> {\n private readonly variables: Record<string, any>;\n private readonly functions: Functions;\n\n /**\n * Constructs an interpreter with the specified variables and functions.\n *\n * @param variables A map of variable names to their values. If null, an empty object is used.\n * @param functions An instance of Functions to handle function calls. If null, StandardFunctions is used.\n */\n constructor(variables?: Record<string, any> | null, functions?: Functions | null) {\n this.variables = variables ?? {};\n this.functions = functions ?? new StandardFunctions();\n }\n\n /**\n * Evaluates a CEL expression and returns its result.\n *\n * @param expr The expression to evaluate\n * @returns The result of the evaluation\n * @throws EvaluationError if evaluation fails\n */\n evaluate(expr: Expression): any {\n return expr.accept(this);\n }\n\n visitLiteral(expr: Literal): any {\n // In CEL, byte literals are just strings marked as bytes\n return expr.value;\n }\n\n visitIdentifier(expr: Identifier): any {\n if (!(expr.name in this.variables)) {\n throw new EvaluationError(`Undefined variable: ${expr.name}`);\n }\n return this.variables[expr.name];\n }\n\n visitSelect(expr: Select): any {\n const target = expr.operand !== null ? this.evaluate(expr.operand) : this.variables;\n\n if (target === null || target === undefined) {\n if (expr.isTest) {\n return false;\n }\n throw new EvaluationError(`Cannot select field ${expr.field} from null`);\n }\n\n if (typeof target === 'object') {\n if (expr.isTest) {\n return expr.field in target;\n }\n if (!(expr.field in target)) {\n throw new EvaluationError(`Field ${expr.field} not found`);\n }\n return target[expr.field];\n }\n\n throw new EvaluationError('Cannot select field from non-object type');\n }\n\n visitCall(expr: Call): any {\n // For macro calls, we need special handling\n if (expr.isMacro && expr.target !== null) {\n const target = this.evaluate(expr.target);\n\n // For macros, we pass the AST expressions, not evaluated values\n if (expr.args.length === 0) {\n throw new EvaluationError(`Macro ${expr.functionName} requires arguments`);\n }\n\n // Extract variable name from first argument\n const firstArg = expr.args[0]!;\n if (!(firstArg instanceof Identifier)) {\n throw new EvaluationError(\n `First argument to macro ${expr.functionName} must be a variable name`\n );\n }\n const variableName = firstArg.name;\n\n // Second argument is the expression (kept as AST)\n if (expr.args.length < 2) {\n throw new EvaluationError(`Macro ${expr.functionName} requires an expression argument`);\n }\n const macroExpr = expr.args[1]!;\n\n // Handle each macro function\n return this.evaluateMacro(target, expr.functionName, variableName, macroExpr);\n }\n\n // Regular function call - evaluate all arguments\n const args: any[] = [];\n for (const arg of expr.args) {\n args.push(this.evaluate(arg));\n }\n\n if (expr.target !== null) {\n const target = this.evaluate(expr.target);\n return this.functions.callMethod(target, expr.functionName, args);\n } else {\n return this.functions.callFunction(expr.functionName, args);\n }\n }\n\n private evaluateMacro(target: any, functionName: string, variableName: string, expr: Expression): any {\n if (!Array.isArray(target)) {\n throw new EvaluationError(`Macro ${functionName} requires a list target`);\n }\n\n // Save the current value of the variable (if any)\n const saved = this.variables[variableName];\n const had = variableName in this.variables;\n\n try {\n switch (functionName) {\n case 'map': {\n const results: any[] = [];\n for (const item of target) {\n this.variables[variableName] = item;\n results.push(this.evaluate(expr));\n }\n return results;\n }\n\n case 'filter': {\n const results: any[] = [];\n for (const item of target) {\n this.variables[variableName] = item;\n const condition = this.evaluate(expr);\n if (condition === true) {\n results.push(item);\n }\n }\n return results;\n }\n\n case 'all': {\n for (const item of target) {\n this.variables[variableName] = item;\n const condition = this.evaluate(expr);\n if (condition !== true) {\n return false;\n }\n }\n return true;\n }\n\n case 'exists': {\n for (const item of target) {\n this.variables[variableName] = item;\n const condition = this.evaluate(expr);\n if (condition === true) {\n return true;\n }\n }\n return false;\n }\n\n case 'existsOne': {\n let count = 0;\n for (const item of target) {\n this.variables[variableName] = item;\n const condition = this.evaluate(expr);\n if (condition === true) {\n count++;\n if (count > 1) {\n return false;\n }\n }\n }\n return count === 1;\n }\n\n default:\n throw new EvaluationError(`Unknown macro function: ${functionName}`);\n }\n } finally {\n // Restore the original value of the variable\n if (had) {\n this.variables[variableName] = saved;\n } else {\n delete this.variables[variableName];\n }\n }\n }\n\n visitList(expr: ListExpression): any {\n const result: any[] = [];\n for (const element of expr.elements) {\n result.push(this.evaluate(element));\n }\n return result;\n }\n\n visitMap(expr: MapExpression): any {\n const map: Record<string, any> = {};\n for (const entry of expr.entries) {\n const key = this.evaluate(entry.key);\n const value = this.evaluate(entry.value);\n map[key] = value;\n }\n return map;\n }\n\n visitStruct(expr: Struct): any {\n const map: Record<string, any> = {};\n for (const field of expr.fields) {\n map[field.field] = this.evaluate(field.value);\n }\n return map;\n }\n\n visitComprehension(expr: Comprehension): any {\n const range = this.evaluate(expr.range);\n if (!Array.isArray(range)) {\n throw new EvaluationError('Comprehension range must be a list');\n }\n\n const iteratorSaved = this.variables[expr.variable];\n const accumulatorSaved = this.variables[expr.accumulator];\n const hadIterator = expr.variable in this.variables;\n const hadAccumulator = expr.accumulator in this.variables;\n\n try {\n let accumulator = this.evaluate(expr.initializer);\n this.variables[expr.accumulator] = accumulator;\n\n for (const item of range) {\n this.variables[expr.variable] = item;\n\n const condition = this.evaluate(expr.condition);\n if (condition !== true) {\n continue;\n }\n\n accumulator = this.evaluate(expr.step);\n this.variables[expr.accumulator] = accumulator;\n }\n\n return this.evaluate(expr.result);\n } finally {\n // Restore the original values\n if (hadIterator) {\n this.variables[expr.variable] = iteratorSaved;\n } else {\n delete this.variables[expr.variable];\n }\n if (hadAccumulator) {\n this.variables[expr.accumulator] = accumulatorSaved;\n } else {\n delete this.variables[expr.accumulator];\n }\n }\n }\n\n visitUnary(expr: Unary): any {\n const operand = this.evaluate(expr.operand);\n\n switch (expr.op) {\n case UnaryOp.NOT:\n if (typeof operand !== 'boolean') {\n throw new EvaluationError('NOT operator requires boolean operand');\n }\n return !operand;\n\n case UnaryOp.NEGATE:\n if (typeof operand !== 'number') {\n throw new EvaluationError('Negation requires numeric operand');\n }\n return -operand;\n\n default:\n throw new EvaluationError(`Unknown unary operator: ${expr.op}`);\n }\n }\n\n visitBinary(expr: Binary): any {\n // Short-circuit evaluation for logical operators\n if (expr.op === BinaryOp.LOGICAL_AND) {\n const left = this.evaluate(expr.left);\n if (left !== true) {\n return false;\n }\n return this.evaluate(expr.right) === true;\n } else if (expr.op === BinaryOp.LOGICAL_OR) {\n const left = this.evaluate(expr.left);\n if (left === true) {\n return true;\n }\n return this.evaluate(expr.right) === true;\n }\n\n const left = this.evaluate(expr.left);\n const right = this.evaluate(expr.right);\n\n switch (expr.op) {\n case BinaryOp.ADD:\n // String concatenation\n if (typeof left === 'string' || typeof right === 'string') {\n return String(left) + String(right);\n }\n // Array concatenation\n if (Array.isArray(left) && Array.isArray(right)) {\n return [...left, ...right];\n }\n // Numeric addition\n if (typeof left === 'number' && typeof right === 'number') {\n return left + right;\n }\n throw new EvaluationError('Invalid operands for addition');\n\n case BinaryOp.SUBTRACT:\n if (typeof left === 'number' && typeof right === 'number') {\n return left - right;\n }\n throw new EvaluationError('Subtraction requires numeric operands');\n\n case BinaryOp.MULTIPLY:\n if (typeof left === 'number' && typeof right === 'number') {\n return left * right;\n }\n // String repetition\n if (typeof left === 'string' && typeof right === 'number') {\n return left.repeat(right);\n }\n // Array repetition\n if (Array.isArray(left) && typeof right === 'number') {\n const result: any[] = [];\n for (let i = 0; i < right; i++) {\n result.push(...left);\n }\n return result;\n }\n throw new EvaluationError('Invalid operands for multiplication');\n\n case BinaryOp.DIVIDE:\n if (typeof left === 'number' && typeof right === 'number') {\n if (right === 0) {\n throw new EvaluationError('Division by zero');\n }\n // Division always returns double in CEL\n return left / right;\n }\n throw new EvaluationError('Division requires numeric operands');\n\n case BinaryOp.MODULO:\n if (typeof left === 'number' && typeof right === 'number') {\n if (right === 0) {\n throw new EvaluationError('Modulo by zero');\n }\n return left % right;\n }\n throw new EvaluationError('Modulo requires integer operands');\n\n case BinaryOp.EQUAL:\n return Utilities.deepEquals(left, right);\n\n case BinaryOp.NOT_EQUAL:\n return !Utilities.deepEquals(left, right);\n\n case BinaryOp.LESS:\n return Utilities.compare(left, right) < 0;\n\n case BinaryOp.LESS_EQUAL:\n return Utilities.compare(left, right) <= 0;\n\n case BinaryOp.GREATER:\n return Utilities.compare(left, right) > 0;\n\n case BinaryOp.GREATER_EQUAL:\n return Utilities.compare(left, right) >= 0;\n\n case BinaryOp.IN:\n if (Array.isArray(right)) {\n return Utilities.containsInArray(right, left);\n } else if (typeof right === 'object' && right !== null) {\n return left in right;\n } else if (typeof right === 'string' && typeof left === 'string') {\n return right.includes(left);\n }\n throw new EvaluationError('IN operator requires list, map, or string on right side');\n\n default:\n throw new EvaluationError(`Unknown binary operator: ${expr.op}`);\n }\n }\n\n visitConditional(expr: Conditional): any {\n const condition = this.evaluate(expr.condition);\n if (condition === true) {\n return this.evaluate(expr.thenExpr);\n } else {\n return this.evaluate(expr.otherwiseExpr);\n }\n }\n\n visitIndex(expr: Index): any {\n const operand = this.evaluate(expr.operand);\n const index = this.evaluate(expr.index);\n\n if (operand === null || operand === undefined) {\n throw new EvaluationError('Cannot index null value');\n }\n\n if (Array.isArray(operand)) {\n if (typeof index !== 'number') {\n throw new EvaluationError('List index must be an integer');\n }\n const idx = Math.trunc(index);\n if (idx < 0 || idx >= operand.length) {\n throw new EvaluationError(`List index out of bounds: ${idx}`);\n }\n return operand[idx];\n } else if (typeof operand === 'object') {\n if (!(index in operand)) {\n throw new EvaluationError(`Map key not found: ${index}`);\n }\n return operand[index];\n } else if (typeof operand === 'string') {\n if (typeof index !== 'number') {\n throw new EvaluationError('String index must be an integer');\n }\n const idx = Math.trunc(index);\n if (idx < 0 || idx >= operand.length) {\n throw new EvaluationError(`String index out of bounds: ${idx}`);\n }\n return operand[idx];\n }\n\n throw new EvaluationError(`Cannot index type: ${typeof operand}`);\n }\n}\n","import { Expression } from './ast/index.js';\nimport { Functions } from './functions/index.js';\nimport { Interpreter } from './interpreter/index.js';\n\n/**\n * A compiled CEL program that can be evaluated multiple times.\n *\n * A Program represents a parsed CEL expression that can be efficiently evaluated\n * with different sets of variables. This is more efficient than parsing the\n * expression each time it needs to be evaluated.\n *\n * Programs are created using CEL.compile() and should be reused when the same\n * expression needs to be evaluated multiple times.\n *\n * @example\n * ```typescript\n * const program = cel.compile('price * quantity');\n * const result1 = program.evaluate({ price: 10, quantity: 5 });\n * const result2 = program.evaluate({ price: 20, quantity: 3 });\n * ```\n */\nexport class Program {\n /**\n * Creates a new compiled program.\n *\n * This constructor is typically called by CEL.compile() and should not be used directly.\n *\n * @param ast The abstract syntax tree of the compiled expression\n * @param functions The function library to use for evaluation\n */\n constructor(\n private readonly ast: Expression,\n private readonly functions: Functions\n ) {}\n\n /**\n * Evaluates the compiled program with the given variables.\n *\n * @param variables A map of variable names to their values\n * @returns The result of evaluating the expression\n * @throws EvaluationError if an error occurs during evaluation\n *\n * @example\n * ```typescript\n * const result = program.evaluate({\n * x: 10,\n * y: 20,\n * items: [1, 2, 3]\n * });\n * ```\n */\n evaluate(variables: Record<string, any> = {}): any {\n const interpreter = new Interpreter({ ...variables }, this.functions);\n return interpreter.evaluate(this.ast);\n }\n}\n","import { Parser } from './parser/index.js';\nimport { Functions, StandardFunctions } from './functions/index.js';\nimport { Program } from './program.js';\n\n/**\n * The main entry point for evaluating CEL expressions.\n *\n * The CEL class provides methods to compile and evaluate CEL expressions.\n * It supports all standard CEL operators, functions, and macros.\n *\n * @example\n * ```typescript\n * const cel = new CEL();\n * const result = cel.eval('x * 2 + y', { x: 10, y: 5 });\n * console.log(result); // 25\n * ```\n */\nexport class CEL {\n private readonly functions: Functions;\n\n /**\n * Creates a new CEL evaluator with the standard function library.\n */\n constructor();\n\n /**\n * Creates a new CEL evaluator.\n *\n * @param functions Optional custom function library. If not provided, the standard\n * CEL function library will be used.\n */\n constructor(functions?: Functions | null);\n\n constructor(functions?: Functions | null) {\n this.functions = functions ?? new StandardFunctions();\n }\n\n /**\n * Compiles a CEL expression using the provided function library.\n *\n * This static convenience method avoids the need to instantiate CEL when\n * callers just need to compile once.\n *\n * @param expression The CEL expression to compile\n * @param functions The function library to use when compiling the program\n * @returns A compiled Program using the provided functions\n * @throws ParseError if the expression is invalid\n *\n * @example\n * ```typescript\n * const program = CEL.compile('x + y', new StandardFunctions());\n * ```\n */\n static compile(expression: string, functions: Functions): Program {\n const parser = new Parser(expression);\n return new Program(parser.parse(), functions);\n }\n\n /**\n * Evaluates a CEL expression with the given variables using the provided function library.\n *\n * This static convenience method avoids the need to instantiate CEL when callers\n * just need to evaluate an expression once.\n *\n * @param expression The CEL expression to evaluate\n * @param functions The function library to use when evaluating the expression\n * @param variables A map of variable names to their values\n * @returns The result of evaluating the expression\n * @throws ParseError if the expression is invalid\n * @throws EvaluationError if an error occurs during evaluation\n *\n * @example\n * ```typescript\n * const result = CEL.eval('x * 2', new StandardFunctions(), { x: 5 });\n * ```\n */\n static eval(expression: string, functions: Functions, variables: Record<string, any>): any {\n const program = this.compile(expression, functions);\n return program.evaluate(variables);\n }\n\n /**\n * Compiles a CEL expression into a reusable program.\n *\n * This method parses the expression and returns a Program that can be evaluated\n * multiple times with different variables. This is more efficient than calling\n * eval() repeatedly with the same expression.\n *\n * @param expression The CEL expression to compile\n * @returns A compiled program\n * @throws ParseError if the expression is invalid\n *\n * @example\n * ```typescript\n * const program = cel.compile('price * quantity');\n * const result1 = program.evaluate({ price: 10, quantity: 5 });\n * const result2 = program.evaluate({ price: 20, quantity: 3 });\n * ```\n */\n compile(expression: string): Program {\n return CEL.compile(expression, this.functions);\n }\n\n /**\n * Evaluates a CEL expression with the given variables.\n *\n * This is a convenience method that compiles and evaluates the expression in one step.\n * For better performance when evaluating the same expression multiple times, use\n * compile() to create a reusable Program.\n *\n * @param expression The CEL expression to evaluate\n * @param variables A map of variable names to their values\n * @returns The result of evaluating the expression\n * @throws ParseError if the expression is invalid\n * @throws EvaluationError if an error occurs during evaluation\n *\n * @example\n * ```typescript\n * const result = cel.eval('user.age >= 18', {\n * user: { name: 'Alice', age: 25 }\n * });\n * ```\n */\n eval(expression: string, variables: Record<string, any> = {}): any {\n return CEL.eval(expression, this.functions, variables);\n }\n}\n"],"names":["ParseError","message","line","column","TokenType","Token","type","value","Lexer","input","count","ch","n","i","start","next","offset","isRaw","prefix","quote","suffix","isDouble","c","sign","pos","BinaryOp","UnaryOp","LiteralType","Literal","literalType","visitor","Identifier","name","Select","operand","field","isTest","Index","index","Call","target","functionName","args","isMacro","ListExpression","elements","MapEntry","key","MapExpression","entries","FieldInitializer","Struct","typeName","fields","Comprehension","variable","range","accumulator","initializer","condition","step","result","Unary","op","Binary","left","right","Conditional","thenExpr","otherwiseExpr","MACRO_METHODS","Parser","expr","operator","qualified","expressions","currentType","first","token","number","content","hex","codePoint","octal","lookahead","EvaluationError","sizeOf","asInt","parsed","asUInt","asDouble","asString","asBool","typeOf","has","matches","text","pattern","max","values","compare","min","a","b","size","cmp","deepEquals","leftKeys","rightKeys","containsInArray","array","item","StandardFunctions","Utilities.sizeOf","Utilities.asInt","Utilities.asUInt","Utilities.asDouble","Utilities.asString","Utilities.asBool","Utilities.typeOf","Utilities.has","Utilities.matches","Utilities.max","Utilities.min","method","e","Interpreter","variables","functions","firstArg","variableName","macroExpr","arg","saved","had","results","element","map","entry","iteratorSaved","accumulatorSaved","hadIterator","hadAccumulator","Utilities.deepEquals","Utilities.compare","Utilities.containsInArray","idx","Program","ast","CEL","expression","parser"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/parser/lexer.ts","../src/ast/operators.ts","../src/ast/expression.ts","../src/values/bytes.ts","../src/errors.ts","../src/values/numbers.ts","../src/parser/parser.ts","../src/values/type.ts","../src/values/civil.ts","../src/values/duration.ts","../src/values/timestamp.ts","../src/values/key.ts","../src/values/normalize.ts","../src/functions/utilities.ts","../src/functions/strings.ts","../src/functions/regexes.ts","../src/functions/lists.ts","../src/functions/sets.ts","../src/functions/maths.ts","../src/functions/codecs.ts","../src/functions/standard-functions.ts","../src/interpreter/interpreter.ts","../src/program.ts","../src/cel.ts","../src/printer/printer.ts"],"sourcesContent":["/**\n * ParseError is thrown when the lexer or parser encounters invalid syntax.\n */\nexport class ParseError extends Error {\n constructor(\n message: string,\n public readonly line: number,\n public readonly column: number\n ) {\n super(`${message} at ${line}:${column}`);\n this.name = 'ParseError';\n }\n}\n\n/**\n * Token types for CEL lexical analysis.\n */\nexport enum TokenType {\n // Literals\n NULL = 'NULL',\n TRUE = 'TRUE',\n FALSE = 'FALSE',\n INT = 'INT',\n UINT = 'UINT',\n DOUBLE = 'DOUBLE',\n STRING = 'STRING',\n BYTES = 'BYTES',\n IDENTIFIER = 'IDENTIFIER',\n\n // Operators\n PLUS = 'PLUS',\n MINUS = 'MINUS',\n STAR = 'STAR',\n SLASH = 'SLASH',\n PERCENT = 'PERCENT',\n EQ = 'EQ',\n NE = 'NE',\n LT = 'LT',\n LE = 'LE',\n GT = 'GT',\n GE = 'GE',\n LOGICAL_AND = 'LOGICAL_AND',\n LOGICAL_OR = 'LOGICAL_OR',\n BANG = 'BANG',\n IN = 'IN',\n\n // Delimiters\n LPAREN = 'LPAREN',\n RPAREN = 'RPAREN',\n LBRACKET = 'LBRACKET',\n RBRACKET = 'RBRACKET',\n LBRACE = 'LBRACE',\n RBRACE = 'RBRACE',\n DOT = 'DOT',\n COMMA = 'COMMA',\n COLON = 'COLON',\n QUESTION = 'QUESTION',\n\n // Special\n EOF = 'EOF',\n}\n\n/**\n * Token representation for lexical analysis.\n */\nexport class Token {\n constructor(\n public readonly type: TokenType,\n public readonly value: string,\n public readonly line: number,\n public readonly column: number\n ) {}\n\n toString(): string {\n return `${this.type}(${this.value})`;\n }\n}\n\n/**\n * Lexer for tokenizing CEL expressions.\n * Performs character-by-character scanning to produce tokens.\n */\nexport class Lexer {\n private position = 0;\n private line = 1;\n private column = 1;\n private readonly lookahead: Token[] = [];\n\n constructor(private readonly input: string) {}\n\n /**\n * Get the next token from the input.\n */\n next(): Token {\n if (this.lookahead.length > 0) {\n return this.lookahead.shift()!;\n }\n return this.token();\n }\n\n /**\n * Peek ahead at future tokens without consuming them.\n * @param count Number of tokens to look ahead (1-indexed)\n */\n peek(count: number): Token {\n while (this.lookahead.length < count) {\n this.lookahead.push(this.token());\n }\n return this.lookahead[count - 1]!;\n }\n\n private step(): void {\n if (this.position >= this.input.length) return;\n\n const ch = this.input[this.position]!;\n this.position++;\n\n if (ch === '\\r') {\n // Handle CRLF as a single newline\n if (this.position < this.input.length && this.input[this.position] === '\\n') {\n this.position++;\n }\n this.line++;\n this.column = 1;\n } else if (ch === '\\n') {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n }\n\n private forward(n: number): void {\n for (let i = 0; i < n; i++) {\n this.step();\n }\n }\n\n private token(): Token {\n this.whitespace();\n\n if (this.position >= this.input.length) {\n return new Token(TokenType.EOF, '', this.line, this.column);\n }\n\n const start = this.position;\n const line = this.line;\n const column = this.column;\n const ch = this.input[this.position]!;\n\n // Single character tokens\n switch (ch) {\n case '(':\n this.step();\n return new Token(TokenType.LPAREN, '(', line, column);\n case ')':\n this.step();\n return new Token(TokenType.RPAREN, ')', line, column);\n case '[':\n this.step();\n return new Token(TokenType.LBRACKET, '[', line, column);\n case ']':\n this.step();\n return new Token(TokenType.RBRACKET, ']', line, column);\n case '{':\n this.step();\n return new Token(TokenType.LBRACE, '{', line, column);\n case '}':\n this.step();\n return new Token(TokenType.RBRACE, '}', line, column);\n case ',':\n this.step();\n return new Token(TokenType.COMMA, ',', line, column);\n case '.':\n this.step();\n return new Token(TokenType.DOT, '.', line, column);\n case ':':\n this.step();\n return new Token(TokenType.COLON, ':', line, column);\n case '?':\n this.step();\n return new Token(TokenType.QUESTION, '?', line, column);\n case '+':\n this.step();\n return new Token(TokenType.PLUS, '+', line, column);\n case '*':\n this.step();\n return new Token(TokenType.STAR, '*', line, column);\n case '/':\n this.step();\n return new Token(TokenType.SLASH, '/', line, column);\n case '%':\n this.step();\n return new Token(TokenType.PERCENT, '%', line, column);\n }\n\n // Multi-character operators\n if (ch === '&' && this.peekChar() === '&') {\n this.forward(2);\n return new Token(TokenType.LOGICAL_AND, '&&', line, column);\n }\n if (ch === '|' && this.peekChar() === '|') {\n this.forward(2);\n return new Token(TokenType.LOGICAL_OR, '||', line, column);\n }\n if (ch === '=' && this.peekChar() === '=') {\n this.forward(2);\n return new Token(TokenType.EQ, '==', line, column);\n }\n if (ch === '!' && this.peekChar() === '=') {\n this.forward(2);\n return new Token(TokenType.NE, '!=', line, column);\n }\n if (ch === '<' && this.peekChar() === '=') {\n this.forward(2);\n return new Token(TokenType.LE, '<=', line, column);\n }\n if (ch === '>' && this.peekChar() === '=') {\n this.forward(2);\n return new Token(TokenType.GE, '>=', line, column);\n }\n if (ch === '<') {\n this.step();\n return new Token(TokenType.LT, '<', line, column);\n }\n if (ch === '>') {\n this.step();\n return new Token(TokenType.GT, '>', line, column);\n }\n if (ch === '!') {\n this.step();\n return new Token(TokenType.BANG, '!', line, column);\n }\n if (ch === '-') {\n this.step();\n return new Token(TokenType.MINUS, '-', line, column);\n }\n\n // String literals\n if (ch === '\"' || ch === \"'\") {\n return this.string(line, column, start);\n }\n\n // Raw strings or triple-quoted strings\n if ((ch === 'r' || ch === 'R') && this.position + 1 < this.input.length) {\n const next = this.input[this.position + 1]!;\n if (next === '\"' || next === \"'\") {\n return this.string(line, column, start);\n }\n }\n\n // Bytes literals\n if ((ch === 'b' || ch === 'B') && this.position + 1 < this.input.length) {\n const next = this.input[this.position + 1]!;\n if (next === '\"' || next === \"'\") {\n return this.bytes(line, column, start);\n }\n }\n\n // Numbers\n if (this.isDigit(ch)) {\n return this.number(line, column, start);\n }\n\n // Identifiers and keywords\n if (this.isLetter(ch) || ch === '_') {\n return this.identifier(line, column, start);\n }\n\n throw new ParseError(`Unexpected character: ${ch}`, line, column);\n }\n\n private string(line: number, column: number, offset: number): Token {\n let isRaw = false;\n\n // Check for raw prefix\n if (this.input[this.position] === 'r' || this.input[this.position] === 'R') {\n isRaw = true;\n this.step();\n }\n\n // Check for triple-quoted string\n if (this.position + 2 < this.input.length) {\n const prefix = this.input.substring(this.position, this.position + 3);\n if (prefix === '\"\"\"' || prefix === \"'''\") {\n const quote = this.input[this.position]!;\n this.forward(3);\n\n // Find closing triple quotes\n while (this.position + 2 < this.input.length) {\n if (\n this.input[this.position] === quote &&\n this.input[this.position + 1] === quote &&\n this.input[this.position + 2] === quote\n ) {\n this.forward(3);\n return new Token(TokenType.STRING, this.input.substring(offset, this.position), line, column);\n }\n this.step();\n }\n throw new ParseError('Unterminated triple-quoted string', line, column);\n }\n }\n\n // Regular string\n const quote = this.input[this.position]!;\n this.step(); // consume opening quote\n\n while (this.position < this.input.length) {\n const ch = this.input[this.position]!;\n if (ch === quote) {\n this.step();\n return new Token(TokenType.STRING, this.input.substring(offset, this.position), line, column);\n }\n if (ch === '\\\\' && !isRaw && this.position + 1 < this.input.length) {\n // Skip escape sequence as two chars\n this.forward(2);\n } else {\n this.step();\n }\n }\n\n throw new ParseError('Unterminated string', line, column);\n }\n\n private bytes(line: number, column: number, offset: number): Token {\n this.step(); // Skip 'b' or 'B'\n const quote = this.input[this.position]!;\n this.step();\n\n while (this.position < this.input.length) {\n const ch = this.input[this.position]!;\n if (ch === quote) {\n this.step();\n return new Token(TokenType.BYTES, this.input.substring(offset, this.position), line, column);\n }\n if (ch === '\\\\' && this.position + 1 < this.input.length) {\n this.forward(2); // Skip escape sequence\n } else {\n this.step();\n }\n }\n\n throw new ParseError('Unterminated bytes literal', line, column);\n }\n\n private number(line: number, column: number, offset: number): Token {\n // Check for hexadecimal\n if (this.input[this.position] === '0' && this.position + 1 < this.input.length) {\n const next = this.input[this.position + 1]!;\n if (next === 'x' || next === 'X') {\n this.forward(2);\n while (this.position < this.input.length && this.isHexDigit(this.input[this.position]!)) {\n this.step();\n }\n\n // Check for uint suffix\n if (this.position < this.input.length) {\n const suffix = this.input[this.position]!;\n if (suffix === 'u' || suffix === 'U') {\n this.step();\n return new Token(TokenType.UINT, this.input.substring(offset, this.position), line, column);\n }\n }\n\n return new Token(TokenType.INT, this.input.substring(offset, this.position), line, column);\n }\n }\n\n // Scan digits\n while (this.position < this.input.length && this.isDigit(this.input[this.position]!)) {\n this.step();\n }\n\n // Check for decimal point or exponent\n let isDouble = false;\n if (this.position < this.input.length && this.input[this.position] === '.') {\n isDouble = true;\n this.step();\n while (this.position < this.input.length && this.isDigit(this.input[this.position]!)) {\n this.step();\n }\n }\n\n if (this.position < this.input.length) {\n const c = this.input[this.position]!;\n if (c === 'e' || c === 'E') {\n isDouble = true;\n this.step();\n if (this.position < this.input.length) {\n const sign = this.input[this.position]!;\n if (sign === '+' || sign === '-') {\n this.step();\n }\n }\n while (this.position < this.input.length && this.isDigit(this.input[this.position]!)) {\n this.step();\n }\n }\n }\n\n // Check for uint suffix\n if (!isDouble && this.position < this.input.length) {\n const suffix = this.input[this.position]!;\n if (suffix === 'u' || suffix === 'U') {\n this.step();\n return new Token(TokenType.UINT, this.input.substring(offset, this.position), line, column);\n }\n }\n\n const type = isDouble ? TokenType.DOUBLE : TokenType.INT;\n return new Token(type, this.input.substring(offset, this.position), line, column);\n }\n\n private identifier(line: number, column: number, offset: number): Token {\n while (this.position < this.input.length) {\n const c = this.input[this.position]!;\n if (!this.isLetterOrDigit(c) && c !== '_') {\n break;\n }\n this.step();\n }\n\n const value = this.input.substring(offset, this.position);\n const type = this.typeOf(value);\n\n return new Token(type, value, line, column);\n }\n\n private typeOf(value: string): TokenType {\n switch (value) {\n case 'null':\n return TokenType.NULL;\n case 'true':\n return TokenType.TRUE;\n case 'false':\n return TokenType.FALSE;\n case 'in':\n return TokenType.IN;\n default:\n return TokenType.IDENTIFIER;\n }\n }\n\n private whitespace(): void {\n while (this.position < this.input.length) {\n const c = this.input[this.position]!;\n if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n break;\n }\n this.step();\n }\n }\n\n private peekChar(): string {\n const pos = this.position + 1;\n if (pos >= this.input.length) {\n return '\\0';\n }\n return this.input[pos]!;\n }\n\n private isHexDigit(c: string): boolean {\n return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');\n }\n\n private isDigit(c: string): boolean {\n return c >= '0' && c <= '9';\n }\n\n private isLetter(c: string): boolean {\n return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');\n }\n\n private isLetterOrDigit(c: string): boolean {\n return this.isLetter(c) || this.isDigit(c);\n }\n}\n","/**\n * Binary operators in CEL expressions.\n */\nexport enum BinaryOp {\n /** Addition (+) or string/list concatenation */\n ADD = 'ADD',\n /** Subtraction (-) */\n SUBTRACT = 'SUBTRACT',\n /** Multiplication (*) or string/list repetition */\n MULTIPLY = 'MULTIPLY',\n /** Division (/) */\n DIVIDE = 'DIVIDE',\n /** Modulo (%) */\n MODULO = 'MODULO',\n /** Equality (==) */\n EQUAL = 'EQUAL',\n /** Inequality (!=) */\n NOT_EQUAL = 'NOT_EQUAL',\n /** Less than (<) */\n LESS = 'LESS',\n /** Less than or equal (<=) */\n LESS_EQUAL = 'LESS_EQUAL',\n /** Greater than (>) */\n GREATER = 'GREATER',\n /** Greater than or equal (>=) */\n GREATER_EQUAL = 'GREATER_EQUAL',\n /** Membership test (in) */\n IN = 'IN',\n /** Logical AND (&&) */\n LOGICAL_AND = 'LOGICAL_AND',\n /** Logical OR (||) */\n LOGICAL_OR = 'LOGICAL_OR',\n}\n\n/**\n * Unary operators in CEL expressions.\n */\nexport enum UnaryOp {\n /** Logical NOT (!) */\n NOT = 'NOT',\n /** Numeric negation (-) */\n NEGATE = 'NEGATE',\n}\n\n/**\n * Types of literal values in CEL.\n */\nexport enum LiteralType {\n NULL_VALUE = 'NULL_VALUE',\n BOOL = 'BOOL',\n INT = 'INT',\n UINT = 'UINT',\n DOUBLE = 'DOUBLE',\n STRING = 'STRING',\n BYTES = 'BYTES',\n}\n","import { BinaryOp, UnaryOp, LiteralType } from './operators.js';\n\n/**\n * Visitor interface for traversing and operating on CEL expression nodes.\n * Implements the Visitor pattern for AST traversal.\n *\n * @template T The return type of visit operations\n */\nexport interface Visitor<T> {\n visitLiteral(expr: Literal): T;\n visitIdentifier(expr: Identifier): T;\n visitSelect(expr: Select): T;\n visitIndex(expr: Index): T;\n visitCall(expr: Call): T;\n visitList(expr: ListExpression): T;\n visitMap(expr: MapExpression): T;\n visitStruct(expr: Struct): T;\n visitComprehension(expr: Comprehension): T;\n visitUnary(expr: Unary): T;\n visitBinary(expr: Binary): T;\n visitConditional(expr: Conditional): T;\n}\n\n/**\n * Base interface for all CEL expression nodes in the Abstract Syntax Tree.\n * Uses the Visitor pattern to enable different operations on expressions.\n */\nexport interface Expression {\n /**\n * Accepts a visitor to perform operations on this expression node.\n *\n * @template T The return type of the visitor's visit operations\n * @param visitor The visitor that will operate on this expression node\n * @returns The result of the visitor's visit operation\n */\n accept<T>(visitor: Visitor<T>): T;\n}\n\n/**\n * Literal value expression (null, boolean, number, string, bytes).\n */\nexport class Literal implements Expression {\n constructor(\n public readonly value: any,\n public readonly literalType: LiteralType\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitLiteral(this);\n }\n}\n\n/**\n * Identifier expression (variable reference).\n */\nexport class Identifier implements Expression {\n constructor(public readonly name: string) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitIdentifier(this);\n }\n}\n\n/**\n * Field selection expression (operand.field).\n */\nexport class Select implements Expression {\n constructor(\n public readonly operand: Expression | null,\n public readonly field: string,\n public readonly isTest: boolean = false\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitSelect(this);\n }\n}\n\n/**\n * Index expression for array/map access (operand[index]).\n */\nexport class Index implements Expression {\n constructor(\n public readonly operand: Expression,\n public readonly index: Expression\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitIndex(this);\n }\n}\n\n/**\n * Function or method call expression.\n */\nexport class Call implements Expression {\n constructor(\n public readonly target: Expression | null,\n public readonly functionName: string,\n public readonly args: Expression[],\n public readonly isMacro: boolean = false\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitCall(this);\n }\n}\n\n/**\n * List literal expression ([1, 2, 3]).\n */\nexport class ListExpression implements Expression {\n constructor(public readonly elements: Expression[]) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitList(this);\n }\n}\n\n/**\n * Map entry (key-value pair in a map literal).\n */\nexport class MapEntry {\n constructor(\n public readonly key: Expression,\n public readonly value: Expression\n ) {}\n}\n\n/**\n * Map literal expression ({key: value}).\n */\nexport class MapExpression implements Expression {\n constructor(public readonly entries: MapEntry[]) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitMap(this);\n }\n}\n\n/**\n * Field initializer in a struct literal.\n */\nexport class FieldInitializer {\n constructor(\n public readonly field: string,\n public readonly value: Expression\n ) {}\n}\n\n/**\n * Struct literal expression (Type{field: value}).\n */\nexport class Struct implements Expression {\n constructor(\n public readonly typeName: string | null,\n public readonly fields: FieldInitializer[]\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitStruct(this);\n }\n}\n\n/**\n * Comprehension expression for advanced iteration constructs.\n */\nexport class Comprehension implements Expression {\n constructor(\n public readonly variable: string,\n public readonly range: Expression,\n public readonly accumulator: string,\n public readonly initializer: Expression,\n public readonly condition: Expression,\n public readonly step: Expression,\n public readonly result: Expression\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitComprehension(this);\n }\n}\n\n/**\n * Unary operation expression (!, -).\n */\nexport class Unary implements Expression {\n constructor(\n public readonly op: UnaryOp,\n public readonly operand: Expression\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitUnary(this);\n }\n}\n\n/**\n * Binary operation expression (+, -, *, /, etc.).\n */\nexport class Binary implements Expression {\n constructor(\n public readonly op: BinaryOp,\n public readonly left: Expression,\n public readonly right: Expression\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitBinary(this);\n }\n}\n\n/**\n * Conditional (ternary) expression (condition ? then : otherwise).\n */\nexport class Conditional implements Expression {\n constructor(\n public readonly condition: Expression,\n public readonly thenExpr: Expression,\n public readonly otherwiseExpr: Expression\n ) {}\n\n accept<T>(visitor: Visitor<T>): T {\n return visitor.visitConditional(this);\n }\n}\n","/**\n * Helpers for the CEL bytes type, represented as Uint8Array.\n */\n\nconst ENCODER = new TextEncoder();\nconst DECODER = new TextDecoder('utf-8');\n\n/** Reports whether the value is a CEL bytes value. */\nexport function isBytes(value: unknown): value is Uint8Array {\n return value instanceof Uint8Array;\n}\n\n/** Encodes a string as UTF-8. */\nexport function utf8Encode(text: string): Uint8Array {\n return ENCODER.encode(text);\n}\n\n/** Decodes UTF-8 bytes into a string, replacing malformed sequences. */\nexport function utf8Decode(bytes: Uint8Array): string {\n return DECODER.decode(bytes);\n}\n\n/** Compares two byte arrays by content. */\nexport function bytesEqual(left: Uint8Array, right: Uint8Array): boolean {\n if (left.length !== right.length) {\n return false;\n }\n for (let i = 0; i < left.length; i++) {\n if (left[i] !== right[i]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Orders two byte arrays lexicographically, then by length.\n *\n * Mirrors Java's `Arrays.compare(byte[], byte[])`, which compares each byte as a\n * signed value.\n */\nexport function bytesCompare(left: Uint8Array, right: Uint8Array): number {\n const size = Math.min(left.length, right.length);\n for (let i = 0; i < size; i++) {\n const a = (left[i]! << 24) >> 24;\n const b = (right[i]! << 24) >> 24;\n if (a !== b) {\n return a < b ? -1 : 1;\n }\n }\n return left.length - right.length;\n}\n\n/** Concatenates two byte arrays. */\nexport function concatBytes(left: Uint8Array, right: Uint8Array): Uint8Array {\n const result = new Uint8Array(left.length + right.length);\n result.set(left, 0);\n result.set(right, left.length);\n return result;\n}\n\n/** Renders bytes as lowercase hexadecimal, two digits per byte. */\nexport function bytesToHex(bytes: Uint8Array): string {\n let result = '';\n for (const byte of bytes) {\n result += byte.toString(16).padStart(2, '0');\n }\n return result;\n}\n","/**\n * Error thrown by the interpreter when an expression cannot be evaluated.\n *\n * Covers undefined variables, type mismatches in operators, division by zero,\n * integer overflow and evaluation limits.\n */\nexport class EvaluationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'EvaluationError';\n }\n}\n\n/**\n * Error thrown when a function receives an argument it cannot accept.\n *\n * This is the analogue of Java's IllegalArgumentException: wrong arity, an\n * unsupported type, an out-of-range index or an unparsable literal. The logical\n * operators absorb this error alongside EvaluationError.\n */\nexport class ArgumentError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ArgumentError';\n }\n}\n\n/**\n * Reports whether an error is one of the CEL error types that the logical\n * operators may absorb.\n *\n * @param error The caught value\n * @returns true for EvaluationError and ArgumentError\n */\nexport function isCelError(error: unknown): error is EvaluationError | ArgumentError {\n return error instanceof EvaluationError || error instanceof ArgumentError;\n}\n","import { EvaluationError } from '../errors.js';\n\n/**\n * Numeric helpers for the CEL value model.\n *\n * CEL `int` and `uint` values are represented as `bigint`; `double` values as\n * `number`. These helpers implement the exact 64-bit semantics of the Java\n * reference implementation.\n */\n\n/** Smallest signed 64-bit integer. */\nexport const INT64_MIN = -(2n ** 63n);\n/** Largest signed 64-bit integer. */\nexport const INT64_MAX = 2n ** 63n - 1n;\n\n/** Reports whether the value is a CEL int (a bigint). */\nexport function isInt(value: unknown): value is bigint {\n return typeof value === 'bigint';\n}\n\n/** Reports whether the value is a CEL double (a number). */\nexport function isDouble(value: unknown): value is number {\n return typeof value === 'number';\n}\n\n/** Reports whether the value is a CEL int or double. */\nexport function isNumeric(value: unknown): value is bigint | number {\n return typeof value === 'bigint' || typeof value === 'number';\n}\n\n/**\n * Verifies that an integer result fits in 64 bits.\n *\n * @param value The result of an integer operation\n * @returns The value unchanged\n * @throws EvaluationError if the value is outside the signed 64-bit range\n */\nexport function checkInt64(value: bigint): bigint {\n if (value < INT64_MIN || value > INT64_MAX) {\n throw new EvaluationError('Integer overflow');\n }\n return value;\n}\n\n/**\n * Converts a double to a 64-bit integer the way Java's `Number.longValue()` does:\n * truncation toward zero, NaN becomes zero, and out-of-range values saturate.\n */\nexport function truncateToInt64(value: number): bigint {\n if (Number.isNaN(value)) {\n return 0n;\n }\n if (value >= 2 ** 63) {\n return INT64_MAX;\n }\n if (value <= -(2 ** 63)) {\n return INT64_MIN;\n }\n return BigInt(Math.trunc(value));\n}\n\n/** Normalises negative zero to positive zero, as equality treats them alike. */\nfunction zero(value: number): number {\n return value === 0 ? 0 : value;\n}\n\n/**\n * Compares two doubles the way Java's `Double.compare` does, after normalising\n * signed zeros: NaN is greater than everything else and equal to itself.\n */\nfunction compareDoubles(left: number, right: number): number {\n const a = zero(left);\n const b = zero(right);\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n const leftNaN = Number.isNaN(a);\n const rightNaN = Number.isNaN(b);\n if (leftNaN && rightNaN) {\n return 0;\n }\n if (leftNaN) {\n return 1;\n }\n if (rightNaN) {\n return -1;\n }\n return 0;\n}\n\n/** Compares a bigint against a finite double exactly. */\nfunction compareIntToDouble(left: bigint, right: number): number {\n if (Number.isInteger(right)) {\n const exact = BigInt(right);\n return left < exact ? -1 : left > exact ? 1 : 0;\n }\n // The double lies strictly between floor and floor + 1\n const floor = BigInt(Math.floor(right));\n return left <= floor ? -1 : 1;\n}\n\n/**\n * Orders two numbers exactly, without the precision loss of a double conversion.\n *\n * Two ints compare as integers and two doubles as doubles. A mixed pair is\n * compared exactly, so an int above the range a double can represent is not\n * mistaken for the double it would round to.\n *\n * @returns A negative number, zero, or a positive number\n */\nexport function order(left: bigint | number, right: bigint | number): number {\n if (typeof left === 'bigint' && typeof right === 'bigint') {\n return left < right ? -1 : left > right ? 1 : 0;\n }\n if (typeof left === 'number' && typeof right === 'number') {\n return compareDoubles(left, right);\n }\n // Exactly one side is a double; a non-finite one has no exact representation to compare against\n const scalar = typeof left === 'number' ? left : (right as number);\n if (!Number.isFinite(scalar)) {\n return compareDoubles(Number(left), Number(right));\n }\n if (typeof left === 'bigint') {\n return compareIntToDouble(left, right as number);\n }\n return -compareIntToDouble(right as bigint, left);\n}\n\n/**\n * Renders a double the way Java's `Double.toString` does.\n *\n * Values with magnitude in [1e-3, 1e7) print in plain decimal notation with at\n * least one fractional digit (`1.0`, `3.14`); everything else prints in\n * computerised scientific notation (`1.0E10`, `1.234E-5`).\n */\nexport function javaDoubleToString(value: number): string {\n if (Number.isNaN(value)) {\n return 'NaN';\n }\n if (value === Infinity) {\n return 'Infinity';\n }\n if (value === -Infinity) {\n return '-Infinity';\n }\n if (value === 0) {\n return Object.is(value, -0) ? '-0.0' : '0.0';\n }\n const magnitude = Math.abs(value);\n if (magnitude >= 1e-3 && magnitude < 1e7) {\n const text = String(value);\n return text.includes('.') ? text : text + '.0';\n }\n const [mantissa, exponent] = value.toExponential().split('e') as [string, string];\n const digits = mantissa.includes('.') ? mantissa : mantissa + '.0';\n return `${digits}E${exponent.replace('+', '')}`;\n}\n","import {\n Expression,\n Literal,\n Identifier,\n Select,\n Index,\n Call,\n ListExpression,\n MapExpression,\n MapEntry,\n Struct,\n FieldInitializer,\n Unary,\n Binary,\n Conditional,\n BinaryOp,\n UnaryOp,\n LiteralType,\n} from '../ast/index.js';\nimport { Lexer, Token, TokenType, ParseError } from './lexer.js';\nimport { utf8Encode } from '../values/bytes.js';\nimport { INT64_MIN, INT64_MAX } from '../values/numbers.js';\n\n// Re-export ParseError for convenience\nexport { ParseError } from './lexer.js';\n\n/**\n * Set of macro method names that require special handling.\n */\nconst MACRO_METHODS = new Set(['map', 'filter', 'all', 'exists', 'existsOne', 'sortBy']);\n\n/**\n * Maximum nesting depth of an expression, guarding against stack exhaustion.\n */\nconst MAX_DEPTH = 256;\n\n/**\n * Recursive descent parser for CEL (Common Expression Language).\n * Parses CEL expressions into an Abstract Syntax Tree (AST).\n */\nexport class Parser {\n private readonly lexer: Lexer;\n private current: Token;\n private depth = 0;\n\n constructor(input: string) {\n this.lexer = new Lexer(input);\n this.current = this.lexer.next();\n }\n\n /**\n * Parse a CEL expression from the input string.\n * @returns The parsed Expression AST node\n * @throws ParseError if the input contains syntax errors\n */\n parse(): Expression {\n const expr = this.parseExpr();\n if (this.current.type !== TokenType.EOF) {\n throw new ParseError(\n `Unexpected token after expression: ${this.current.value}`,\n this.current.line,\n this.current.column\n );\n }\n return expr;\n }\n\n // expr = conditionalOr ( '?' conditionalOr ':' expr )?\n private parseExpr(): Expression {\n if (++this.depth > MAX_DEPTH) {\n throw new ParseError('Expression nesting too deep', this.current.line, this.current.column);\n }\n try {\n const condition = this.parseConditionalOr();\n\n if (this.match(TokenType.QUESTION)) {\n const thenExpr = this.parseConditionalOr();\n this.expect(TokenType.COLON);\n const otherwiseExpr = this.parseExpr();\n return new Conditional(condition, thenExpr, otherwiseExpr);\n }\n\n return condition;\n } finally {\n this.depth--;\n }\n }\n\n // conditionalOr = conditionalAnd ( '||' conditionalAnd )*\n private parseConditionalOr(): Expression {\n let left = this.parseConditionalAnd();\n\n while (this.match(TokenType.LOGICAL_OR)) {\n const right = this.parseConditionalAnd();\n left = new Binary(BinaryOp.LOGICAL_OR, left, right);\n }\n\n return left;\n }\n\n // conditionalAnd = relation ( '&&' relation )*\n private parseConditionalAnd(): Expression {\n let left = this.parseRelation();\n\n while (this.match(TokenType.LOGICAL_AND)) {\n const right = this.parseRelation();\n left = new Binary(BinaryOp.LOGICAL_AND, left, right);\n }\n\n return left;\n }\n\n // relation = addition ( relop addition )*\n // relop = '<=' | '>=' | '!=' | '==' | '<' | '>' | 'in'\n private parseRelation(): Expression {\n let left = this.parseAddition();\n\n while (this.isRelationalOp(this.current.type)) {\n const op = this.current.type;\n this.advance();\n const right = this.parseAddition();\n left = new Binary(this.toBinaryOp(op), left, right);\n }\n\n return left;\n }\n\n // addition = multiplication ( ('+' | '-') multiplication )*\n private parseAddition(): Expression {\n let left = this.parseMultiplication();\n\n while (this.current.type === TokenType.PLUS || this.current.type === TokenType.MINUS) {\n const op = this.current.type;\n this.advance();\n const right = this.parseMultiplication();\n left = new Binary(op === TokenType.PLUS ? BinaryOp.ADD : BinaryOp.SUBTRACT, left, right);\n }\n\n return left;\n }\n\n // multiplication = unary ( ('*' | '/' | '%') unary )*\n private parseMultiplication(): Expression {\n let left = this.parseUnary();\n\n while (\n this.current.type === TokenType.STAR ||\n this.current.type === TokenType.SLASH ||\n this.current.type === TokenType.PERCENT\n ) {\n const op = this.current.type;\n this.advance();\n const right = this.parseUnary();\n const operator =\n op === TokenType.STAR\n ? BinaryOp.MULTIPLY\n : op === TokenType.SLASH\n ? BinaryOp.DIVIDE\n : BinaryOp.MODULO;\n left = new Binary(operator, left, right);\n }\n\n return left;\n }\n\n // unary = '!'+ member | '-'+ member | member\n private parseUnary(): Expression {\n if (this.current.type === TokenType.BANG) {\n this.advance();\n return new Unary(UnaryOp.NOT, this.parseUnary());\n } else if (this.current.type === TokenType.MINUS) {\n this.advance();\n return new Unary(UnaryOp.NEGATE, this.parseUnary());\n }\n\n return this.parseMember();\n }\n\n // member = primary ( selector | index | fieldCall )*\n private parseMember(): Expression {\n let expr = this.parsePrimary();\n\n while (true) {\n if (this.current.type === TokenType.DOT) {\n this.advance();\n const field = this.expectIdentifier();\n\n // Check if it's a method call or a field selection\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.LPAREN) {\n this.advance();\n const args = this.parseExprList();\n this.expect(TokenType.RPAREN);\n const isMacro = MACRO_METHODS.has(field);\n expr = new Call(expr, field, args, isMacro);\n } else {\n expr = new Select(expr, field);\n }\n } else if (this.current.type === TokenType.LBRACKET) {\n this.advance();\n const index = this.parseExpr();\n this.expect(TokenType.RBRACKET);\n expr = new Index(expr, index);\n } else {\n break;\n }\n }\n\n return expr;\n }\n\n // primary = literal | ident callArgs? | listLiteral | mapLiteral | structLiteral | '(' expr ')' | '.' ident callArgs?\n private parsePrimary(): Expression {\n // Check for literals\n if (this.isLiteralToken(this.current.type)) {\n return this.parseLiteral();\n }\n\n // List literal\n if (this.current.type === TokenType.LBRACKET) {\n return this.parseListLiteral();\n }\n\n // Map or struct literal\n if (this.current.type === TokenType.LBRACE) {\n return this.parseMapOrStructLiteral(null);\n }\n\n // Parenthesized expression\n if (this.current.type === TokenType.LPAREN) {\n this.advance();\n const expr = this.parseExpr();\n this.expect(TokenType.RPAREN);\n return expr;\n }\n\n // Leading dot (e.g., .identifier or .method())\n if (this.current.type === TokenType.DOT) {\n this.advance();\n const field = this.expectIdentifier();\n\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.LPAREN) {\n this.advance();\n const args = this.parseExprList();\n this.expect(TokenType.RPAREN);\n return new Call(null, field, args);\n }\n\n return new Select(null, field);\n }\n\n // Identifier (possibly followed by call args or struct literal)\n if (this.current.type === TokenType.IDENTIFIER) {\n const name = this.current.value;\n this.advance();\n\n // Function call\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.LPAREN) {\n const line = this.current.line;\n const column = this.current.column;\n this.advance();\n const args = this.parseExprList();\n this.expect(TokenType.RPAREN);\n if (name === 'has' && args.length === 1) {\n return this.test(args[0]!, line, column);\n }\n return new Call(null, name, args);\n }\n\n // Check for qualified identifier followed by struct literal\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.DOT && this.isQualifiedStructLiteral()) {\n const qualified = this.parseQualifiedIdent(name);\n return this.parseMapOrStructLiteral(qualified);\n }\n\n // Check for struct literal with simple type name\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.LBRACE) {\n return this.parseMapOrStructLiteral(name);\n }\n\n return new Identifier(name);\n }\n\n throw new ParseError(\n `Unexpected token: ${this.current.value}`,\n this.current.line,\n this.current.column\n );\n }\n\n // Rewrites the has() macro into a presence test on the selected field\n private test(expr: Expression, line: number, column: number): Expression {\n if (expr instanceof Select) {\n return new Select(expr.operand, expr.field, true);\n }\n throw new ParseError('has() requires a field selection, for example has(a.b)', line, column);\n }\n\n // listLiteral = '[' exprList? ','? ']'\n private parseListLiteral(): Expression {\n this.expect(TokenType.LBRACKET);\n\n const elements: Expression[] = [];\n if (this.current.type !== TokenType.RBRACKET) {\n elements.push(...this.parseExprList());\n // Optional trailing comma\n if (this.current.type === TokenType.COMMA) {\n this.advance();\n }\n }\n\n this.expect(TokenType.RBRACKET);\n return new ListExpression(elements);\n }\n\n // mapLiteral or structLiteral\n private parseMapOrStructLiteral(typeName: string | null): Expression {\n this.expect(TokenType.LBRACE);\n\n if (this.current.type === TokenType.RBRACE) {\n this.advance();\n if (typeName !== null) {\n return new Struct(typeName, []);\n }\n return new MapExpression([]);\n }\n\n // Try to determine if this is a struct (field: expr) or map (expr: expr)\n const isStruct =\n this.current.type === TokenType.IDENTIFIER && this.peekAhead(1).type === TokenType.COLON;\n\n if (isStruct || typeName !== null) {\n const fields = this.parseFieldInits();\n if (this.current.type === TokenType.COMMA) {\n this.advance();\n }\n this.expect(TokenType.RBRACE);\n return new Struct(typeName, fields);\n } else {\n const entries = this.parseMapInits();\n if (this.current.type === TokenType.COMMA) {\n this.advance();\n }\n this.expect(TokenType.RBRACE);\n return new MapExpression(entries);\n }\n }\n\n // exprList = expr ( ',' expr )*\n private parseExprList(): Expression[] {\n const expressions: Expression[] = [];\n\n // Check for empty list - current could be RPAREN or RBRACKET\n const currentType = this.current.type;\n if (currentType === TokenType.RPAREN || currentType === TokenType.RBRACKET) {\n return expressions;\n }\n\n expressions.push(this.parseExpr());\n\n while (this.current.type === TokenType.COMMA) {\n this.advance();\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.RPAREN || this.current.type === TokenType.RBRACKET) {\n break;\n }\n expressions.push(this.parseExpr());\n }\n\n return expressions;\n }\n\n // mapInits = mapInit ( ',' mapInit )*\n private parseMapInits(): MapEntry[] {\n const entries: MapEntry[] = [];\n\n entries.push(this.parseMapInit());\n while (this.current.type === TokenType.COMMA) {\n this.advance();\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.RBRACE) {\n break;\n }\n entries.push(this.parseMapInit());\n }\n\n return entries;\n }\n\n // mapInit = expr ':' expr\n private parseMapInit(): MapEntry {\n const key = this.parseExpr();\n this.expect(TokenType.COLON);\n const value = this.parseExpr();\n return new MapEntry(key, value);\n }\n\n // fieldInits = fieldInit ( ',' fieldInit )*\n private parseFieldInits(): FieldInitializer[] {\n const fields: FieldInitializer[] = [];\n\n fields.push(this.parseFieldInit());\n while (this.current.type === TokenType.COMMA) {\n this.advance();\n // @ts-expect-error - Token type changes after advance()\n if (this.current.type === TokenType.RBRACE) {\n break;\n }\n fields.push(this.parseFieldInit());\n }\n\n return fields;\n }\n\n // fieldInit = ident ':' expr\n private parseFieldInit(): FieldInitializer {\n const field = this.expectIdentifier();\n this.expect(TokenType.COLON);\n const value = this.parseExpr();\n return new FieldInitializer(field, value);\n }\n\n // qualifiedIdent = ident ( '.' ident )*\n private parseQualifiedIdent(first: string): string {\n let qualified = first;\n\n while (this.current.type === TokenType.DOT) {\n this.advance();\n qualified += '.';\n qualified += this.expectIdentifier();\n }\n\n return qualified;\n }\n\n private parseLiteral(): Expression {\n const token = this.current;\n this.advance();\n\n switch (token.type) {\n case TokenType.NULL:\n return new Literal(null, LiteralType.NULL_VALUE);\n case TokenType.TRUE:\n return new Literal(true, LiteralType.BOOL);\n case TokenType.FALSE:\n return new Literal(false, LiteralType.BOOL);\n case TokenType.INT:\n return new Literal(this.parseIntLiteral(token), LiteralType.INT);\n case TokenType.UINT:\n return new Literal(this.parseUintLiteral(token), LiteralType.UINT);\n case TokenType.DOUBLE:\n return new Literal(Number(token.value), LiteralType.DOUBLE);\n case TokenType.STRING:\n return new Literal(this.parseStringLiteral(token.value), LiteralType.STRING);\n case TokenType.BYTES:\n return new Literal(this.parseBytesLiteral(token.value), LiteralType.BYTES);\n default:\n throw new ParseError(`Not a literal: ${token.value}`, token.line, token.column);\n }\n }\n\n private parseIntLiteral(token: Token): bigint {\n const value = token.value;\n const negative = value.startsWith('-');\n const digits = negative ? value.substring(1) : value;\n const magnitude = BigInt(digits);\n return this.checkRange(negative ? -magnitude : magnitude, token);\n }\n\n private parseUintLiteral(token: Token): bigint {\n // Remove 'u' or 'U' suffix\n const digits = token.value.substring(0, token.value.length - 1);\n return this.checkRange(BigInt(digits), token);\n }\n\n private checkRange(value: bigint, token: Token): bigint {\n if (value < INT64_MIN || value > INT64_MAX) {\n throw new ParseError(\n `Integer literal out of range: ${token.value}`,\n token.line,\n token.column\n );\n }\n return value;\n }\n\n private parseStringLiteral(value: string): string {\n const isRaw = value.startsWith('r') || value.startsWith('R');\n let content: string;\n\n if (isRaw && (value.substring(1).startsWith('\"\"\"') || value.substring(1).startsWith(\"'''\"))) {\n // Raw triple-quoted string: r\"\"\"...\"\"\" or r'''...'''\n content = value.substring(4, value.length - 3);\n } else if (value.startsWith('\"\"\"') || value.startsWith(\"'''\")) {\n // Triple-quoted string: \"\"\"...\"\"\" or '''...'''\n content = value.substring(3, value.length - 3);\n content = this.unescapeString(content);\n } else if (isRaw) {\n // Raw string: r\"...\" or r'...'\n content = value.substring(2, value.length - 1);\n } else {\n // Regular string: \"...\" or '...'\n content = value.substring(1, value.length - 1);\n content = this.unescapeString(content);\n }\n\n return content;\n }\n\n private parseBytesLiteral(value: string): Uint8Array {\n // Remove b\"...\" or B'...' wrapper and process escapes\n const content = value.substring(2, value.length - 1);\n return this.unescapeBytes(content);\n }\n\n /**\n * Decodes the escapes of a bytes literal.\n *\n * Character escapes and plain text accumulate in a pending buffer that is\n * UTF-8 encoded when flushed, while \\xHH and octal escapes write a raw byte.\n */\n private unescapeBytes(value: string): Uint8Array {\n const result: number[] = [];\n let pending = '';\n const flush = (): void => {\n if (pending.length > 0) {\n result.push(...utf8Encode(pending));\n pending = '';\n }\n };\n let i = 0;\n\n while (i < value.length) {\n if (value[i] !== '\\\\' || i + 1 >= value.length) {\n pending += value[i]!;\n i++;\n continue;\n }\n\n const next = value[i + 1]!;\n const simple = this.simpleEscape(next);\n if (simple !== null) {\n pending += simple;\n i += 2;\n } else if (next === 'x' && i + 4 <= value.length) {\n flush();\n result.push(parseInt(value.substring(i + 2, i + 4), 16));\n i += 4;\n } else if (next === 'u' && i + 6 <= value.length) {\n pending += String.fromCharCode(parseInt(value.substring(i + 2, i + 6), 16));\n i += 6;\n } else if (next === 'U' && i + 10 <= value.length) {\n pending += String.fromCodePoint(parseInt(value.substring(i + 2, i + 10), 16));\n i += 10;\n } else if (this.isOctal(value, i)) {\n flush();\n result.push(parseInt(value.substring(i + 1, i + 4), 8));\n i += 4;\n } else {\n pending += value[i]!;\n i++;\n }\n }\n\n flush();\n return Uint8Array.from(result);\n }\n\n private simpleEscape(value: string): string | null {\n switch (value) {\n case '\\\\':\n return '\\\\';\n case '\"':\n return '\"';\n case \"'\":\n return \"'\";\n case '`':\n return '`';\n case '?':\n return '?';\n case 'a':\n return '\\u0007';\n case 'b':\n return '\\b';\n case 'f':\n return '\\f';\n case 'n':\n return '\\n';\n case 'r':\n return '\\r';\n case 't':\n return '\\t';\n case 'v':\n return '\\u000B';\n default:\n return null;\n }\n }\n\n private isOctal(value: string, index: number): boolean {\n return (\n index + 3 < value.length &&\n value[index + 1]! >= '0' &&\n value[index + 1]! <= '3' &&\n value[index + 2]! >= '0' &&\n value[index + 2]! <= '7' &&\n value[index + 3]! >= '0' &&\n value[index + 3]! <= '7'\n );\n }\n\n private unescapeString(value: string): string {\n let result = '';\n let i = 0;\n\n while (i < value.length) {\n if (value[i] === '\\\\' && i + 1 < value.length) {\n const next = value[i + 1]!;\n switch (next) {\n case '\\\\':\n result += '\\\\';\n i += 2;\n break;\n case '\"':\n result += '\"';\n i += 2;\n break;\n case \"'\":\n result += \"'\";\n i += 2;\n break;\n case '`':\n result += '`';\n i += 2;\n break;\n case '?':\n result += '?';\n i += 2;\n break;\n case 'a':\n result += '\\u0007';\n i += 2;\n break;\n case 'b':\n result += '\\b';\n i += 2;\n break;\n case 'f':\n result += '\\f';\n i += 2;\n break;\n case 'n':\n result += '\\n';\n i += 2;\n break;\n case 'r':\n result += '\\r';\n i += 2;\n break;\n case 't':\n result += '\\t';\n i += 2;\n break;\n case 'v':\n result += '\\u000B';\n i += 2;\n break;\n case 'x':\n // Hexadecimal escape: \\xHH\n if (i + 3 < value.length) {\n const hex = value.substring(i + 2, i + 4);\n result += String.fromCharCode(parseInt(hex, 16));\n i += 4;\n } else {\n result += value[i]!;\n i++;\n }\n break;\n case 'u':\n // Unicode escape: \\uHHHH\n if (i + 5 < value.length) {\n const hex = value.substring(i + 2, i + 6);\n result += String.fromCharCode(parseInt(hex, 16));\n i += 6;\n } else {\n result += value[i]!;\n i++;\n }\n break;\n case 'U':\n // Unicode escape: \\UHHHHHHHH\n if (i + 9 < value.length) {\n const hex = value.substring(i + 2, i + 10);\n const codePoint = parseInt(hex, 16);\n result += String.fromCodePoint(codePoint);\n i += 10;\n } else {\n result += value[i]!;\n i++;\n }\n break;\n default:\n // Check for octal escape: \\[0-3][0-7][0-7]\n if (\n i + 3 < value.length &&\n next >= '0' &&\n next <= '3' &&\n value[i + 2]! >= '0' &&\n value[i + 2]! <= '7' &&\n value[i + 3]! >= '0' &&\n value[i + 3]! <= '7'\n ) {\n const octal = value.substring(i + 1, i + 4);\n result += String.fromCharCode(parseInt(octal, 8));\n i += 4;\n } else {\n result += value[i]!;\n i++;\n }\n }\n } else {\n result += value[i]!;\n i++;\n }\n }\n\n return result;\n }\n\n private isLiteralToken(type: TokenType): boolean {\n return (\n type === TokenType.NULL ||\n type === TokenType.TRUE ||\n type === TokenType.FALSE ||\n type === TokenType.INT ||\n type === TokenType.UINT ||\n type === TokenType.DOUBLE ||\n type === TokenType.STRING ||\n type === TokenType.BYTES\n );\n }\n\n private isRelationalOp(type: TokenType): boolean {\n return (\n type === TokenType.LT ||\n type === TokenType.LE ||\n type === TokenType.GT ||\n type === TokenType.GE ||\n type === TokenType.EQ ||\n type === TokenType.NE ||\n type === TokenType.IN\n );\n }\n\n private toBinaryOp(type: TokenType): BinaryOp {\n switch (type) {\n case TokenType.LT:\n return BinaryOp.LESS;\n case TokenType.LE:\n return BinaryOp.LESS_EQUAL;\n case TokenType.GT:\n return BinaryOp.GREATER;\n case TokenType.GE:\n return BinaryOp.GREATER_EQUAL;\n case TokenType.EQ:\n return BinaryOp.EQUAL;\n case TokenType.NE:\n return BinaryOp.NOT_EQUAL;\n case TokenType.IN:\n return BinaryOp.IN;\n default:\n throw new ParseError(\n `Unknown relational operator: ${type}`,\n this.current.line,\n this.current.column\n );\n }\n }\n\n private match(type: TokenType): boolean {\n if (this.current.type === type) {\n this.advance();\n return true;\n }\n return false;\n }\n\n private expect(type: TokenType): void {\n if (this.current.type !== type) {\n throw new ParseError(\n `Expected ${type} but found ${this.current.type}`,\n this.current.line,\n this.current.column\n );\n }\n this.advance();\n }\n\n private expectIdentifier(): string {\n if (this.current.type !== TokenType.IDENTIFIER) {\n throw new ParseError(\n `Expected identifier but found ${this.current.value}`,\n this.current.line,\n this.current.column\n );\n }\n const name = this.current.value;\n this.advance();\n return name;\n }\n\n private advance(): void {\n this.current = this.lexer.next();\n }\n\n private peekAhead(count: number): Token {\n return this.lexer.peek(count);\n }\n\n // Check if we have a pattern like: . ident ( . ident )* {\n private isQualifiedStructLiteral(): boolean {\n let lookahead = 1;\n let token = this.peekAhead(lookahead);\n\n // Must start with identifier after dot\n if (token.type !== TokenType.IDENTIFIER) {\n return false;\n }\n\n lookahead++;\n token = this.peekAhead(lookahead);\n\n // Skip additional .ident sequences\n while (token.type === TokenType.DOT) {\n lookahead++;\n token = this.peekAhead(lookahead);\n if (token.type !== TokenType.IDENTIFIER) {\n return false;\n }\n lookahead++;\n token = this.peekAhead(lookahead);\n }\n\n // Must end with {\n return token.type === TokenType.LBRACE;\n }\n}\n","/**\n * A CEL type value, as returned by the `type()` function.\n *\n * Type values are interned, compare equal by name and are bound as identifiers,\n * so the specification form `type(42) == int` holds. They render as their bare\n * name, so `string(type(42))` is `\"int\"`.\n */\nexport class Type {\n /** The type of a null value. */\n static readonly NULL = new Type('null_type');\n /** The boolean type. */\n static readonly BOOL = new Type('bool');\n /** The signed integer type. */\n static readonly INT = new Type('int');\n /** The unsigned integer type. */\n static readonly UINT = new Type('uint');\n /** The double precision floating point type. */\n static readonly DOUBLE = new Type('double');\n /** The string type. */\n static readonly STRING = new Type('string');\n /** The bytes type. */\n static readonly BYTES = new Type('bytes');\n /** The list type. */\n static readonly LIST = new Type('list');\n /** The map type. */\n static readonly MAP = new Type('map');\n /** The timestamp type. */\n static readonly TIMESTAMP = new Type('timestamp');\n /** The duration type. */\n static readonly DURATION = new Type('duration');\n /** The type of a type value. */\n static readonly TYPE = new Type('type');\n /** The type of a value this library does not recognise. */\n static readonly UNKNOWN = new Type('unknown');\n\n private static readonly BY_NAME: ReadonlyMap<string, Type> = new Map(\n [\n Type.NULL,\n Type.BOOL,\n Type.INT,\n Type.UINT,\n Type.DOUBLE,\n Type.STRING,\n Type.BYTES,\n Type.LIST,\n Type.MAP,\n Type.TIMESTAMP,\n Type.DURATION,\n Type.TYPE,\n ].map((type) => [type.name, type])\n );\n\n private constructor(readonly name: string) {}\n\n /**\n * Returns the type with the given name, or null when the name does not denote a CEL type.\n *\n * Used to resolve bare type names such as `int` when they appear as identifiers.\n * `unknown` is deliberately not resolvable.\n *\n * @param name The candidate type name\n * @returns The matching type, or null\n */\n static of(name: string): Type | null {\n return Type.BY_NAME.get(name) ?? null;\n }\n\n /**\n * Reports whether the value is a Type.\n */\n static isType(value: unknown): value is Type {\n return value instanceof Type;\n }\n\n equals(other: unknown): boolean {\n return other instanceof Type && other.name === this.name;\n }\n\n toString(): string {\n return this.name;\n }\n}\n","import { ArgumentError, EvaluationError } from '../errors.js';\n\n/**\n * Proleptic Gregorian calendar arithmetic and time-zone field extraction.\n *\n * The UTC path is pure BigInt arithmetic (Howard Hinnant's algorithms) and is\n * exact for the whole timestamp range. Named zones resolve through\n * Intl.DateTimeFormat, which requires full ICU data in the runtime.\n */\n\nexport const SECONDS_PER_DAY = 86_400n;\n\n/** Floor division for bigint. */\nexport function floorDiv(dividend: bigint, divisor: bigint): bigint {\n const quotient = dividend / divisor;\n return dividend % divisor !== 0n && dividend < 0n !== divisor < 0n ? quotient - 1n : quotient;\n}\n\n/** Floor modulo for bigint; the result has the sign of the divisor. */\nexport function floorMod(dividend: bigint, divisor: bigint): bigint {\n const remainder = dividend % divisor;\n return remainder !== 0n && remainder < 0n !== divisor < 0n ? remainder + divisor : remainder;\n}\n\n/**\n * Returns the number of days since 1970-01-01 for a proleptic Gregorian date.\n *\n * @param year The year (may be zero or negative)\n * @param month The month, 1-12\n * @param day The day of month, 1-31\n */\nexport function daysFromCivil(year: bigint, month: number, day: number): bigint {\n const y = month <= 2 ? year - 1n : year;\n const era = (y >= 0n ? y : y - 399n) / 400n;\n const yoe = y - era * 400n;\n const m = BigInt(month);\n const doy = (153n * (m + (month > 2 ? -3n : 9n)) + 2n) / 5n + BigInt(day) - 1n;\n const doe = yoe * 365n + yoe / 4n - yoe / 100n + doy;\n return era * 146_097n + doe - 719_468n;\n}\n\n/**\n * Returns the proleptic Gregorian date for a count of days since 1970-01-01.\n */\nexport function civilFromDays(days: bigint): { year: bigint; month: number; day: number } {\n const z = days + 719_468n;\n const era = (z >= 0n ? z : z - 146_096n) / 146_097n;\n const doe = z - era * 146_097n;\n const yoe = (doe - doe / 1460n + doe / 36_524n - doe / 146_096n) / 365n;\n const y = yoe + era * 400n;\n const doy = doe - (365n * yoe + yoe / 4n - yoe / 100n);\n const mp = (5n * doy + 2n) / 153n;\n const day = Number(doy - (153n * mp + 2n) / 5n + 1n);\n const month = Number(mp < 10n ? mp + 3n : mp - 9n);\n return { year: month <= 2 ? y + 1n : y, month, day };\n}\n\n/** Reports whether the year is a leap year in the proleptic Gregorian calendar. */\nexport function isLeapYear(year: bigint): boolean {\n return year % 4n === 0n && (year % 100n !== 0n || year % 400n === 0n);\n}\n\n/** Returns the number of days in the given month. */\nexport function daysInMonth(year: bigint, month: number): number {\n switch (month) {\n case 2:\n return isLeapYear(year) ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/** The broken-down civil fields of an instant in some zone. */\nexport interface CivilFields {\n year: bigint;\n /** Month of year, 1-12. */\n month: number;\n /** Day of month, 1-31. */\n day: number;\n hour: number;\n minute: number;\n second: number;\n /** Day of week where Sunday is 0. */\n weekday: number;\n /** Day of year, 1-366. */\n dayOfYear: number;\n}\n\n/** Breaks a count of seconds since the epoch into UTC civil fields. */\nexport function utcFields(seconds: bigint): CivilFields {\n const days = floorDiv(seconds, SECONDS_PER_DAY);\n const secondOfDay = Number(floorMod(seconds, SECONDS_PER_DAY));\n const { year, month, day } = civilFromDays(days);\n return {\n year,\n month,\n day,\n hour: Math.floor(secondOfDay / 3600),\n minute: Math.floor((secondOfDay % 3600) / 60),\n second: secondOfDay % 60,\n // 1970-01-01 was a Thursday\n weekday: Number(floorMod(days + 4n, 7n)),\n dayOfYear: Number(days - daysFromCivil(year, 1, 1)) + 1,\n };\n}\n\nconst FORMATTERS = new Map<string, Intl.DateTimeFormat>();\n\n/**\n * Resolves an IANA zone identifier to a formatter, validating it.\n *\n * @throws ArgumentError if the zone is not a string or is unknown\n */\nexport function zoneFormatter(zone: unknown): Intl.DateTimeFormat {\n if (typeof zone !== 'string') {\n throw new ArgumentError(`Time zone must be a string: ${String(zone)}`);\n }\n const cached = FORMATTERS.get(zone);\n if (cached) {\n return cached;\n }\n let formatter: Intl.DateTimeFormat;\n try {\n formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: zone,\n hourCycle: 'h23',\n era: 'short',\n year: 'numeric',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n });\n } catch {\n throw new ArgumentError(`Invalid time zone: ${zone}`);\n }\n FORMATTERS.set(zone, formatter);\n return formatter;\n}\n\n// Date can represent roughly ±271,821 years around the epoch\nconst MAX_DATE_SECONDS = 8_640_000_000_000n;\n\n/**\n * Returns the zone's UTC offset, in seconds, at the given instant.\n */\nfunction offsetSeconds(formatter: Intl.DateTimeFormat, seconds: bigint): bigint {\n if (seconds > MAX_DATE_SECONDS || seconds < -MAX_DATE_SECONDS) {\n throw new EvaluationError('Timestamp out of range for time zone conversion');\n }\n const parts = formatter.formatToParts(new Date(Number(seconds) * 1000));\n const field = (type: string): string => parts.find((part) => part.type === type)?.value ?? '0';\n let year = BigInt(field('year'));\n if (field('era').startsWith('B')) {\n year = 1n - year;\n }\n const hour = Number(field('hour')) % 24;\n const wall =\n daysFromCivil(year, Number(field('month')), Number(field('day'))) * SECONDS_PER_DAY +\n BigInt(hour * 3600 + Number(field('minute')) * 60 + Number(field('second')));\n return wall - seconds;\n}\n\n/**\n * Breaks a count of seconds since the epoch into civil fields in the given zone.\n *\n * @param seconds Seconds since 1970-01-01T00:00:00Z\n * @param zone An IANA zone identifier, or null for UTC\n */\nexport function fieldsOf(seconds: bigint, zone: unknown): CivilFields {\n if (zone === null || zone === undefined) {\n return utcFields(seconds);\n }\n const formatter = zoneFormatter(zone);\n return utcFields(seconds + offsetSeconds(formatter, seconds));\n}\n","import { ArgumentError } from '../errors.js';\nimport { floorDiv, floorMod } from './civil.js';\n\nconst NANOS_PER_SECOND = 1_000_000_000n;\n\nconst DURATION_FORM = /^-?(?:\\d+(?:\\.\\d+)?(?:ns|us|µs|ms|s|m|h))+$/;\nconst DURATION_PART = /(\\d+)(?:\\.(\\d+))?(ns|us|µs|ms|s|m|h)/g;\n\nconst UNIT_NANOS: Record<string, bigint> = {\n ns: 1n,\n us: 1_000n,\n µs: 1_000n,\n ms: 1_000_000n,\n s: NANOS_PER_SECOND,\n m: NANOS_PER_SECOND * 60n,\n h: NANOS_PER_SECOND * 3600n,\n};\n\n/**\n * A CEL duration with nanosecond precision.\n *\n * Follows the java.time convention: `nanos` is always in `0..999_999_999` and the\n * sign is carried by `seconds`, so -1.5s is `{ seconds: -2n, nanos: 500_000_000 }`.\n */\nexport class Duration {\n /** The largest number of seconds a duration may span, per the CEL specification. */\n static readonly SPAN = 315_576_000_000n;\n\n static readonly ZERO = new Duration(0n, 0);\n\n private constructor(\n readonly seconds: bigint,\n readonly nanos: number\n ) {}\n\n /**\n * Creates a duration from seconds and a nanosecond adjustment, normalising the\n * adjustment into the seconds.\n */\n static ofSeconds(seconds: bigint, nanoAdjustment: bigint = 0n): Duration {\n const total = seconds + floorDiv(nanoAdjustment, NANOS_PER_SECOND);\n const nanos = Number(floorMod(nanoAdjustment, NANOS_PER_SECOND));\n return new Duration(total, nanos);\n }\n\n static ofNanos(nanos: bigint): Duration {\n return Duration.ofSeconds(0n, nanos);\n }\n\n static ofMillis(millis: bigint): Duration {\n return Duration.ofSeconds(0n, millis * 1_000_000n);\n }\n\n static ofMinutes(minutes: bigint): Duration {\n return new Duration(minutes * 60n, 0);\n }\n\n static ofHours(hours: bigint): Duration {\n return new Duration(hours * 3600n, 0);\n }\n\n /**\n * Parses a CEL duration literal such as `\"300ms\"`, `\"-1.5h\"` or `\"2h45m\"`.\n *\n * Units are `ns`, `us`, `µs`, `ms`, `s`, `m` and `h`. The value is accumulated\n * exactly and rounded half up to the nearest nanosecond.\n *\n * @throws ArgumentError if the format is invalid or the span exceeds ±10 000 years\n */\n static parse(text: string): Duration {\n if (!DURATION_FORM.test(text)) {\n throw new ArgumentError(`Invalid duration format: ${text}`);\n }\n const parts = Array.from(text.matchAll(DURATION_PART));\n // Accumulate over a common power-of-ten denominator so fractions stay exact\n const scale = Math.max(0, ...parts.map((part) => part[2]?.length ?? 0));\n const denominator = 10n ** BigInt(scale);\n let numerator = 0n;\n for (const part of parts) {\n const whole = part[1]!;\n const fraction = part[2] ?? '';\n const digits = BigInt(whole + fraction) * 10n ** BigInt(scale - fraction.length);\n numerator += digits * UNIT_NANOS[part[3]!]!;\n }\n let nanos = numerator / denominator;\n if ((numerator % denominator) * 2n >= denominator) {\n nanos += 1n;\n }\n const seconds = nanos / NANOS_PER_SECOND;\n if (seconds > Duration.SPAN) {\n throw new ArgumentError(`Duration out of range: ${text}`);\n }\n const result = Duration.ofSeconds(seconds, nanos % NANOS_PER_SECOND);\n return text.startsWith('-') ? result.negated() : result;\n }\n\n /** Reports whether the value is a Duration. */\n static isDuration(value: unknown): value is Duration {\n return value instanceof Duration;\n }\n\n isNegative(): boolean {\n return this.seconds < 0n;\n }\n\n isZero(): boolean {\n return this.seconds === 0n && this.nanos === 0;\n }\n\n negated(): Duration {\n return Duration.ofSeconds(-this.seconds, -BigInt(this.nanos));\n }\n\n plus(other: Duration): Duration {\n return Duration.ofSeconds(this.seconds + other.seconds, BigInt(this.nanos + other.nanos));\n }\n\n minus(other: Duration): Duration {\n return Duration.ofSeconds(this.seconds - other.seconds, BigInt(this.nanos - other.nanos));\n }\n\n /** The total length in nanoseconds. */\n toNanos(): bigint {\n return this.seconds * NANOS_PER_SECOND + BigInt(this.nanos);\n }\n\n /** The whole number of milliseconds, truncated toward zero. */\n toMillis(): bigint {\n return this.toNanos() / 1_000_000n;\n }\n\n /** The whole number of seconds, truncated toward negative infinity (the seconds field). */\n toSeconds(): bigint {\n return this.seconds;\n }\n\n /** The whole number of minutes, truncated toward zero. */\n toMinutes(): bigint {\n return this.seconds / 60n;\n }\n\n /** The whole number of hours, truncated toward zero. */\n toHours(): bigint {\n return this.seconds / 3600n;\n }\n\n compareTo(other: Duration): number {\n if (this.seconds !== other.seconds) {\n return this.seconds < other.seconds ? -1 : 1;\n }\n return this.nanos - other.nanos;\n }\n\n equals(other: unknown): boolean {\n return (\n other instanceof Duration && other.seconds === this.seconds && other.nanos === this.nanos\n );\n }\n\n /**\n * Renders the duration the way the CEL specification does: a seconds count with\n * an `s` suffix, for example `\"3600s\"`, `\"1.5s\"` or `\"-90s\"`.\n */\n toString(): string {\n if (this.isNegative()) {\n return '-' + this.negated().toString();\n }\n if (this.nanos === 0) {\n return `${this.seconds}s`;\n }\n const fraction = String(this.nanos).padStart(9, '0').replace(/0+$/, '');\n return `${this.seconds}.${fraction}s`;\n }\n}\n","import { ArgumentError, EvaluationError } from '../errors.js';\nimport {\n SECONDS_PER_DAY,\n daysFromCivil,\n daysInMonth,\n floorDiv,\n floorMod,\n utcFields,\n} from './civil.js';\nimport { Duration } from './duration.js';\n\nconst NANOS_PER_SECOND = 1_000_000_000n;\n\nconst RFC3339 =\n /^([+-]?\\d{4,9})-(\\d{2})-(\\d{2})[Tt](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,9}))?)?([Zz]|[+-]\\d{2}:\\d{2})$/;\n\n/**\n * A CEL timestamp: an instant on the UTC time line with nanosecond precision.\n *\n * `nanos` is always in `0..999_999_999`; `seconds` counts from\n * 1970-01-01T00:00:00Z and may be negative.\n */\nexport class Timestamp {\n /** Epoch second of the smallest supported instant (java.time.Instant.MIN). */\n static readonly MIN_SECONDS = -31_557_014_167_219_200n;\n /** Epoch second of the largest supported instant (java.time.Instant.MAX). */\n static readonly MAX_SECONDS = 31_556_889_864_403_199n;\n\n private constructor(\n readonly seconds: bigint,\n readonly nanos: number\n ) {}\n\n /**\n * Creates a timestamp from epoch seconds and a nanosecond adjustment.\n *\n * @throws ArgumentError if the instant is outside the supported range\n */\n static ofEpochSeconds(seconds: bigint, nanoAdjustment: bigint = 0n): Timestamp {\n const total = seconds + floorDiv(nanoAdjustment, NANOS_PER_SECOND);\n const nanos = Number(floorMod(nanoAdjustment, NANOS_PER_SECOND));\n if (total < Timestamp.MIN_SECONDS || total > Timestamp.MAX_SECONDS) {\n throw new ArgumentError(`Timestamp out of range: ${seconds}`);\n }\n return new Timestamp(total, nanos);\n }\n\n /** Creates a timestamp from epoch milliseconds. */\n static ofEpochMillis(millis: bigint): Timestamp {\n return Timestamp.ofEpochSeconds(0n, millis * 1_000_000n);\n }\n\n /** Converts a JavaScript Date. */\n static fromDate(date: Date): Timestamp {\n const millis = date.getTime();\n if (Number.isNaN(millis)) {\n throw new ArgumentError('Invalid timestamp value: Invalid Date');\n }\n return Timestamp.ofEpochMillis(BigInt(millis));\n }\n\n /** The current instant, at millisecond resolution. */\n static now(): Timestamp {\n return Timestamp.ofEpochMillis(BigInt(Date.now()));\n }\n\n /**\n * Parses an RFC 3339 timestamp such as `2024-01-01T00:00:00Z` or\n * `2024-01-01T01:00:00.5+01:00`.\n *\n * @throws ArgumentError if the text is not a valid timestamp\n */\n static parse(text: string): Timestamp {\n const match = RFC3339.exec(text);\n if (!match) {\n throw new ArgumentError(`Invalid timestamp value: ${text}`);\n }\n const year = BigInt(match[1]!);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const hour = Number(match[4]);\n const minute = Number(match[5]);\n const second = Number(match[6] ?? '0');\n const nanos = Number((match[7] ?? '').padEnd(9, '0'));\n const offset = match[8]!;\n if (\n month < 1 ||\n month > 12 ||\n day < 1 ||\n day > daysInMonth(year, month) ||\n hour > 23 ||\n minute > 59 ||\n second > 59\n ) {\n throw new ArgumentError(`Invalid timestamp value: ${text}`);\n }\n let offsetSeconds = 0n;\n if (offset !== 'Z' && offset !== 'z') {\n const sign = offset.startsWith('-') ? -1n : 1n;\n const hours = Number(offset.slice(1, 3));\n const minutes = Number(offset.slice(4, 6));\n if (hours > 18 || minutes > 59) {\n throw new ArgumentError(`Invalid timestamp value: ${text}`);\n }\n offsetSeconds = sign * BigInt(hours * 3600 + minutes * 60);\n }\n const seconds =\n daysFromCivil(year, month, day) * SECONDS_PER_DAY +\n BigInt(hour * 3600 + minute * 60 + second) -\n offsetSeconds;\n return Timestamp.ofEpochSeconds(seconds, BigInt(nanos));\n }\n\n /** Reports whether the value is a Timestamp. */\n static isTimestamp(value: unknown): value is Timestamp {\n return value instanceof Timestamp;\n }\n\n /** Converts to a JavaScript Date, truncating to milliseconds. */\n toDate(): Date {\n return new Date(Number(this.seconds) * 1000 + Math.floor(this.nanos / 1_000_000));\n }\n\n /**\n * Adds a duration.\n *\n * @throws EvaluationError if the result is outside the supported range\n */\n plus(duration: Duration): Timestamp {\n return this.shift(duration.seconds, duration.nanos);\n }\n\n /**\n * Subtracts a duration.\n *\n * @throws EvaluationError if the result is outside the supported range\n */\n minus(duration: Duration): Timestamp {\n return this.shift(-duration.seconds, -duration.nanos);\n }\n\n private shift(seconds: bigint, nanos: number): Timestamp {\n try {\n return Timestamp.ofEpochSeconds(this.seconds + seconds, BigInt(this.nanos + nanos));\n } catch (error) {\n if (error instanceof ArgumentError) {\n throw new EvaluationError('Timestamp out of range');\n }\n throw error;\n }\n }\n\n /** The duration from this instant to another (`other - this`). */\n until(other: Timestamp): Duration {\n return Duration.ofSeconds(other.seconds - this.seconds, BigInt(other.nanos - this.nanos));\n }\n\n compareTo(other: Timestamp): number {\n if (this.seconds !== other.seconds) {\n return this.seconds < other.seconds ? -1 : 1;\n }\n return this.nanos - other.nanos;\n }\n\n equals(other: unknown): boolean {\n return (\n other instanceof Timestamp && other.seconds === this.seconds && other.nanos === this.nanos\n );\n }\n\n /**\n * Renders the instant in ISO-8601 form, the way java.time.Instant does:\n * `2024-03-05T14:30:45.250Z`, with the fraction shown in groups of three\n * digits only as far as needed.\n */\n toString(): string {\n const fields = utcFields(this.seconds);\n const pad = (value: number): string => String(value).padStart(2, '0');\n let year: string;\n if (fields.year > 9999n) {\n year = '+' + fields.year;\n } else if (fields.year < 0n) {\n year = '-' + String(-fields.year).padStart(4, '0');\n } else {\n year = String(fields.year).padStart(4, '0');\n }\n let fraction = '';\n if (this.nanos !== 0) {\n if (this.nanos % 1_000_000 === 0) {\n fraction = '.' + String(this.nanos / 1_000_000).padStart(3, '0');\n } else if (this.nanos % 1000 === 0) {\n fraction = '.' + String(this.nanos / 1000).padStart(6, '0');\n } else {\n fraction = '.' + String(this.nanos).padStart(9, '0');\n }\n }\n return `${year}-${pad(fields.month)}-${pad(fields.day)}T${pad(fields.hour)}:${pad(fields.minute)}:${pad(fields.second)}${fraction}Z`;\n }\n}\n","import { bytesToHex, isBytes } from './bytes.js';\nimport { Duration } from './duration.js';\nimport { Timestamp } from './timestamp.js';\nimport { Type } from './type.js';\n\n/**\n * Canonical keys for hashing CEL values.\n *\n * JavaScript Map and Set compare keys with SameValueZero, which does not match\n * CEL equality: `1` and `1.0` are equal in CEL, byte arrays compare by content,\n * and lists and maps compare structurally. `canonicalKey` renders a value as a\n * string that is identical for exactly those values CEL considers equal, so\n * membership tests can use a native Set in constant time.\n */\n\nlet nanCounter = 0;\nconst IDENTITIES = new WeakMap<object, number>();\nlet identityCounter = 0;\n\nfunction identityOf(value: object): number {\n let id = IDENTITIES.get(value);\n if (id === undefined) {\n id = ++identityCounter;\n IDENTITIES.set(value, id);\n }\n return id;\n}\n\nfunction numberKey(value: number): string {\n if (Number.isNaN(value)) {\n // NaN never equals anything, itself included\n return `nan:${++nanCounter}`;\n }\n if (value === 0) {\n return 'n:0';\n }\n if (Number.isInteger(value)) {\n return `n:${BigInt(value)}`;\n }\n return `n:${value}`;\n}\n\n/**\n * Returns a string that is equal for two values exactly when CEL equality holds.\n */\nexport function canonicalKey(value: unknown): string {\n if (value === null || value === undefined) {\n return 'z';\n }\n switch (typeof value) {\n case 'boolean':\n return value ? 'b:1' : 'b:0';\n case 'string':\n return `s${value.length}:${value}`;\n case 'bigint':\n return `n:${value}`;\n case 'number':\n return numberKey(value);\n case 'object':\n break;\n default:\n return `o:${identityOf(value as object)}`;\n }\n if (isBytes(value)) {\n return `y:${bytesToHex(value)}`;\n }\n if (Array.isArray(value)) {\n return `[${value.map(canonicalKey).join(',')}]`;\n }\n if (value instanceof Map) {\n const entries = Array.from(\n value.entries(),\n ([k, v]) => `${canonicalKey(k)}=${canonicalKey(v)}`\n );\n entries.sort();\n return `{${entries.join(',')}}`;\n }\n if (value instanceof Timestamp) {\n return `t:${value.seconds}.${value.nanos}`;\n }\n if (value instanceof Duration) {\n return `d:${value.seconds}.${value.nanos}`;\n }\n if (value instanceof Type) {\n return `T:${value.name}`;\n }\n const proto = Object.getPrototypeOf(value);\n if (proto === Object.prototype || proto === null) {\n const entries = Object.entries(value as Record<string, unknown>).map(\n ([k, v]) => `${canonicalKey(k)}=${canonicalKey(v)}`\n );\n entries.sort();\n return `{${entries.join(',')}}`;\n }\n return `o:${identityOf(value as object)}`;\n}\n\n/** A set of CEL values keyed by CEL equality. */\nexport class KeySet {\n private readonly keys = new Set<string>();\n\n /** Adds the value; returns true if it was not already present. */\n add(value: unknown): boolean {\n const key = canonicalKey(value);\n if (this.keys.has(key)) {\n return false;\n }\n this.keys.add(key);\n return true;\n }\n\n has(value: unknown): boolean {\n return this.keys.has(canonicalKey(value));\n }\n\n get size(): number {\n return this.keys.size;\n }\n}\n\n/** A map from CEL values to arbitrary values, keyed by CEL equality. */\nexport class KeyMap<V> {\n private readonly entries = new Map<string, V>();\n\n set(key: unknown, value: V): void {\n this.entries.set(canonicalKey(key), value);\n }\n\n get(key: unknown): V | undefined {\n return this.entries.get(canonicalKey(key));\n }\n\n has(key: unknown): boolean {\n return this.entries.has(canonicalKey(key));\n }\n\n get size(): number {\n return this.entries.size;\n }\n}\n","import { ArgumentError } from '../errors.js';\nimport { Duration } from './duration.js';\nimport { Timestamp } from './timestamp.js';\nimport { Type } from './type.js';\n\n/**\n * Converts a JavaScript value into the CEL value model.\n *\n * Applied to variables entering `Program.evaluate()` and to the results of\n * custom functions, so that every code path inside the interpreter sees exactly\n * one representation per CEL type:\n *\n * - `undefined` becomes `null`\n * - integer-valued numbers become `bigint` (CEL int); other numbers stay doubles\n * - `Date` becomes `Timestamp`\n * - arrays are copied with normalised elements\n * - `Map` instances are copied with normalised keys and values\n * - plain objects become `Map<string, unknown>`\n * - `bigint`, `string`, `boolean`, `Uint8Array`, `Timestamp`, `Duration` and `Type`\n * pass through; other class instances are left as they are\n *\n * @throws ArgumentError if the value contains a cycle\n */\nexport function normalize(value: unknown): unknown {\n return convert(value, new Set(), true);\n}\n\n/**\n * Converts a value returned by a function into the CEL value model.\n *\n * Like {@link normalize}, except that numbers are left as doubles: a function\n * returning a JavaScript number has produced a CEL double, and one that wants to\n * return an int returns a `bigint`.\n */\nexport function normalizeResult(value: unknown): unknown {\n return convert(value, new Set(), false);\n}\n\n/** Reports whether the value is a plain object (not a class instance). */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction convert(value: unknown, ancestors: Set<object>, integers: boolean): unknown {\n switch (typeof value) {\n case 'undefined':\n return null;\n case 'number':\n return integers && Number.isInteger(value) ? BigInt(value) : value;\n case 'bigint':\n case 'string':\n case 'boolean':\n return value;\n case 'object':\n break;\n default:\n return value;\n }\n if (value === null) {\n return null;\n }\n if (\n value instanceof Uint8Array ||\n value instanceof Timestamp ||\n value instanceof Duration ||\n value instanceof Type\n ) {\n return value;\n }\n if (value instanceof Date) {\n return Timestamp.fromDate(value);\n }\n if (Array.isArray(value)) {\n return descend(value, ancestors, () => value.map((item) => convert(item, ancestors, integers)));\n }\n if (value instanceof Map) {\n return descend(value, ancestors, () => {\n const result = new Map<unknown, unknown>();\n for (const [k, v] of value) {\n result.set(convert(k, ancestors, integers), convert(v, ancestors, integers));\n }\n return result;\n });\n }\n if (isPlainObject(value)) {\n return descend(value, ancestors, () => {\n const result = new Map<string, unknown>();\n for (const [k, v] of Object.entries(value)) {\n result.set(k, convert(v, ancestors, integers));\n }\n return result;\n });\n }\n return value;\n}\n\nfunction descend<T>(value: object, ancestors: Set<object>, body: () => T): T {\n if (ancestors.has(value)) {\n throw new ArgumentError('Cyclic value');\n }\n ancestors.add(value);\n try {\n return body();\n } finally {\n ancestors.delete(value);\n }\n}\n","/**\n * Utility helper methods for libcel.\n *\n * Functions are exported so library users can call them directly. They operate\n * on the CEL value model: `bigint` for int, `number` for double, `Uint8Array`\n * for bytes, `Map` for maps, and the `Timestamp`, `Duration` and `Type` classes.\n */\nimport { ArgumentError, EvaluationError } from '../errors.js';\nimport { Type } from '../values/type.js';\nimport { Timestamp } from '../values/timestamp.js';\nimport { Duration } from '../values/duration.js';\nimport { fieldsOf } from '../values/civil.js';\nimport { KeyMap } from '../values/key.js';\nimport { isPlainObject } from '../values/normalize.js';\nimport { isBytes, utf8Decode, utf8Encode, bytesEqual, bytesCompare } from '../values/bytes.js';\nimport {\n javaDoubleToString,\n order,\n truncateToInt64,\n INT64_MIN,\n INT64_MAX,\n} from '../values/numbers.js';\n\nexport { order } from '../values/numbers.js';\n\n/**\n * The largest collection or string an expression may generate.\n *\n * CEL evaluates untrusted input, so operations whose size is controlled by the\n * expression itself refuse to allocate beyond this ceiling rather than exhausting\n * the heap.\n */\nexport const LIMIT = 1_000_000;\n\n/** The largest number of seconds a duration may span, per the CEL specification. */\nexport const SPAN = Duration.SPAN;\n\nconst INT_TEXT = /^[+-]?\\d+$/;\nconst DOUBLE_TEXT = /^[+-]?(?:\\d+\\.?\\d*(?:[eE][+-]?\\d+)?|\\.\\d+(?:[eE][+-]?\\d+)?|Infinity|NaN)$/;\n\n/**\n * Refuses a result that would exceed {@link LIMIT}.\n *\n * Bounding each operation's output, and not only its inputs, is what stops two\n * separately legal values from being combined into one that exhausts the heap.\n *\n * @param size The size the operation is about to produce\n * @param what The operation being bounded, named in the error message\n * @throws EvaluationError if the size exceeds the limit\n */\nexport function limit(size: number | bigint, what: string): void {\n if (size > LIMIT) {\n throw new EvaluationError(`${what} exceeds the evaluation limit of ${LIMIT}`);\n }\n}\n\n/** Reports whether the value is a CEL map (a Map, or a plain object not yet normalised). */\nexport function isMap(value: unknown): value is Map<unknown, unknown> {\n return value instanceof Map;\n}\n\n/** Counts the Unicode code points in a string. */\nexport function codePointCount(value: string): number {\n let count = 0;\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n if (code >= 0xd800 && code <= 0xdbff && i + 1 < value.length) {\n const next = value.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n i++;\n }\n }\n count++;\n }\n return count;\n}\n\n/**\n * Returns the UTF-16 offset of the given code point index, or -1 when the index\n * exceeds the number of code points.\n */\nexport function offsetByCodePoints(value: string, index: number): number {\n let offset = 0;\n for (let remaining = index; remaining > 0; remaining--) {\n if (offset >= value.length) {\n return -1;\n }\n const code = value.charCodeAt(offset);\n if (code >= 0xd800 && code <= 0xdbff && offset + 1 < value.length) {\n const next = value.charCodeAt(offset + 1);\n offset += next >= 0xdc00 && next <= 0xdfff ? 2 : 1;\n } else {\n offset++;\n }\n }\n return offset > value.length ? -1 : offset;\n}\n\n/**\n * Returns the size/length of the given value.\n *\n * Strings are measured in Unicode code points; bytes, lists and maps by their\n * element count; null is 0.\n *\n * @throws ArgumentError if the value type is unsupported\n */\nexport function sizeOf(value: unknown): bigint {\n if (value === null || value === undefined) {\n return 0n;\n }\n if (typeof value === 'string') {\n return BigInt(codePointCount(value));\n }\n if (isBytes(value)) {\n return BigInt(value.length);\n }\n if (Array.isArray(value)) {\n return BigInt(value.length);\n }\n if (value instanceof Map) {\n return BigInt(value.size);\n }\n if (isPlainObject(value)) {\n return BigInt(Object.keys(value).length);\n }\n throw new ArgumentError(`size() not supported for type: ${typeOf(value)}`);\n}\n\n/**\n * Converts the given value to a signed 64-bit integer.\n *\n * Accepted inputs: bigint, number (truncated toward zero), string holding a\n * decimal integer, boolean (true = 1), and Timestamp (epoch seconds).\n *\n * @throws ArgumentError if the value cannot be converted\n */\nexport function asInt(value: unknown): bigint {\n if (typeof value === 'bigint') {\n return value;\n }\n if (typeof value === 'number') {\n return truncateToInt64(value);\n }\n if (typeof value === 'string') {\n if (INT_TEXT.test(value.trim()) && value.trim() === value) {\n const parsed = BigInt(value);\n if (parsed >= INT64_MIN && parsed <= INT64_MAX) {\n return parsed;\n }\n }\n throw new ArgumentError(`Cannot convert to int: ${value}`);\n }\n if (typeof value === 'boolean') {\n return value ? 1n : 0n;\n }\n if (value instanceof Timestamp) {\n return value.seconds;\n }\n throw new ArgumentError(`Cannot convert to int: ${asString(value)}`);\n}\n\n/**\n * Converts the given value to an unsigned 64-bit integer.\n *\n * @throws ArgumentError if the value is negative or cannot be converted\n */\nexport function asUInt(value: unknown): bigint {\n const result = asInt(value);\n if (result < 0n) {\n throw new ArgumentError(`Cannot convert negative value to uint: ${asString(value)}`);\n }\n return result;\n}\n\n/**\n * Converts the given value to a double.\n *\n * Accepted inputs: number, bigint, and string parsable as a decimal number.\n *\n * @throws ArgumentError if the value cannot be converted\n */\nexport function asDouble(value: unknown): number {\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string') {\n const text = value.trim();\n if (DOUBLE_TEXT.test(text)) {\n return Number(text);\n }\n throw new ArgumentError(`Cannot convert to double: ${value}`);\n }\n throw new ArgumentError(`Cannot convert to double: ${asString(value)}`);\n}\n\n/**\n * Converts the given value to its string representation.\n *\n * Returns \"null\" for null, decodes bytes as UTF-8, renders a Duration in the\n * CEL form (\"3600s\"), a Timestamp in RFC 3339, a double the way Java does\n * (\"1.0\", \"1.0E10\") and a Type as its bare name.\n */\nexport function asString(value: unknown): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number') {\n return javaDoubleToString(value);\n }\n if (typeof value === 'bigint' || typeof value === 'boolean') {\n return String(value);\n }\n if (isBytes(value)) {\n return utf8Decode(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(asString).join(', ')}]`;\n }\n if (value instanceof Map) {\n return `{${Array.from(value, ([k, v]) => `${asString(k)}=${asString(v)}`).join(', ')}}`;\n }\n if (isPlainObject(value)) {\n return `{${Object.entries(value)\n .map(([k, v]) => `${k}=${asString(v)}`)\n .join(', ')}}`;\n }\n return String(value);\n}\n\n/**\n * Converts the given value to bytes, encoding a string as UTF-8.\n *\n * @throws ArgumentError if the value cannot be converted\n */\nexport function asBytes(value: unknown): Uint8Array {\n if (isBytes(value)) {\n return value;\n }\n if (typeof value === 'string') {\n return utf8Encode(value);\n }\n throw new ArgumentError(`Cannot convert to bytes: ${asString(value)}`);\n}\n\n/**\n * Converts the given value to a boolean using common truthiness rules.\n *\n * Numbers are true if non-zero. Strings are true if non-empty. Collections and\n * maps are true if non-empty. Null is false.\n */\nexport function asBool(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'bigint') {\n return value !== 0n;\n }\n if (typeof value === 'number') {\n return value !== 0;\n }\n if (typeof value === 'string') {\n return value.length > 0;\n }\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n if (value instanceof Map) {\n return value.size > 0;\n }\n if (isPlainObject(value)) {\n return Object.keys(value).length > 0;\n }\n return value !== null && value !== undefined;\n}\n\n/**\n * Returns the CEL type of the given value.\n *\n * @returns The type value, or Type.UNKNOWN for a value this library does not recognise\n */\nexport function typeOf(value: unknown): Type {\n if (value === null || value === undefined) {\n return Type.NULL;\n }\n switch (typeof value) {\n case 'boolean':\n return Type.BOOL;\n case 'bigint':\n return Type.INT;\n case 'number':\n return Type.DOUBLE;\n case 'string':\n return Type.STRING;\n case 'object':\n break;\n default:\n return Type.UNKNOWN;\n }\n if (isBytes(value)) {\n return Type.BYTES;\n }\n if (value instanceof Timestamp) {\n return Type.TIMESTAMP;\n }\n if (value instanceof Duration) {\n return Type.DURATION;\n }\n if (Array.isArray(value)) {\n return Type.LIST;\n }\n if (value instanceof Map || isPlainObject(value)) {\n return Type.MAP;\n }\n if (value instanceof Type) {\n return Type.TYPE;\n }\n return Type.UNKNOWN;\n}\n\n/**\n * Checks whether a map contains the given key.\n *\n * @returns true if target is a map and contains the key under CEL equality; false otherwise\n */\nexport function has(target: unknown, field: unknown): boolean {\n if (target instanceof Map) {\n return contains(target, field);\n }\n if (isPlainObject(target)) {\n return typeof field === 'string' && Object.prototype.hasOwnProperty.call(target, field);\n }\n return false;\n}\n\n/**\n * Reports whether the map holds the given key, comparing keys the way CEL compares values.\n *\n * An integer key therefore matches a double probe of the same value, so\n * membership, indexing and presence tests all agree.\n */\nexport function contains(map: Map<unknown, unknown>, key: unknown): boolean {\n if (map.has(key)) {\n return true;\n }\n for (const candidate of map.keys()) {\n if (equals(candidate, key)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Returns the value stored under the given key, comparing keys the way CEL compares values.\n *\n * @returns The matching value, or undefined when no key matches\n */\nexport function select(map: Map<unknown, unknown>, key: unknown): unknown {\n if (map.has(key)) {\n return map.get(key);\n }\n for (const [candidate, value] of map) {\n if (equals(candidate, key)) {\n return value;\n }\n }\n return undefined;\n}\n\n/**\n * Tests whether the given regular expression matches any part of the text.\n *\n * @throws ArgumentError if the pattern is invalid\n */\nexport function matches(text: string, pattern: string): boolean {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch {\n throw new ArgumentError(`Invalid regular expression: ${pattern}`);\n }\n return regex.test(text);\n}\n\n/**\n * Parses or provides a Timestamp from the given value.\n *\n * Accepted inputs: null returns the current time, a string is parsed as RFC 3339,\n * a bigint is treated as epoch seconds, and a Date or Timestamp is converted.\n *\n * @throws ArgumentError if the input type or format is invalid\n */\nexport function timestamp(value: unknown): Timestamp {\n if (value === null || value === undefined) {\n return Timestamp.now();\n }\n if (value instanceof Timestamp) {\n return value;\n }\n if (value instanceof Date) {\n return Timestamp.fromDate(value);\n }\n if (typeof value === 'string') {\n return Timestamp.parse(value);\n }\n if (typeof value === 'bigint') {\n return Timestamp.ofEpochSeconds(value);\n }\n throw new ArgumentError(`Invalid timestamp value: ${asString(value)}`);\n}\n\n/**\n * Parses a CEL duration string such as \"300ms\", \"-1.5h\" or \"2h45m\".\n *\n * @throws ArgumentError if the format or unit is invalid\n */\nexport function duration(value: string): Duration {\n return Duration.parse(value);\n}\n\n/**\n * Converts the given value to a Duration: a Duration is returned as is and a\n * string is parsed.\n *\n * @throws ArgumentError if the value cannot be converted\n */\nexport function asDuration(value: unknown): Duration {\n if (value instanceof Duration) {\n return value;\n }\n if (typeof value === 'string') {\n return Duration.parse(value);\n }\n throw new ArgumentError(`Cannot convert to duration: ${asString(value)}`);\n}\n\nfunction at(value: unknown, zone: unknown) {\n const instant = value instanceof Timestamp ? value : timestamp(value);\n return { instant, fields: fieldsOf(instant.seconds, zone ?? null) };\n}\n\n/** Returns the day of month (1-31) for the timestamp, in the zone or UTC. */\nexport function dateOf(value: unknown, zone: unknown = null): bigint {\n return BigInt(at(value, zone).fields.day);\n}\n\n/** Returns the zero-based month (0-11) for the timestamp, in the zone or UTC. */\nexport function monthOf(value: unknown, zone: unknown = null): bigint {\n return BigInt(at(value, zone).fields.month - 1);\n}\n\n/** Returns the year for the timestamp, in the zone or UTC. */\nexport function yearOf(value: unknown, zone: unknown = null): bigint {\n return at(value, zone).fields.year;\n}\n\n/** Returns the hour of day for a timestamp, or the whole number of hours in a duration. */\nexport function hoursOf(value: unknown, zone: unknown = null): bigint {\n if (value instanceof Duration) {\n return value.toHours();\n }\n return BigInt(at(value, zone).fields.hour);\n}\n\n/** Returns the minute for a timestamp, or the whole number of minutes in a duration. */\nexport function minutesOf(value: unknown, zone: unknown = null): bigint {\n if (value instanceof Duration) {\n return value.toMinutes();\n }\n return BigInt(at(value, zone).fields.minute);\n}\n\n/** Returns the second for a timestamp, or the whole number of seconds in a duration. */\nexport function secondsOf(value: unknown, zone: unknown = null): bigint {\n if (value instanceof Duration) {\n return value.toSeconds();\n }\n return BigInt(at(value, zone).fields.second);\n}\n\n/** Returns the millisecond for a timestamp, or the whole number of milliseconds in a duration. */\nexport function millisecondsOf(value: unknown, zone: unknown = null): bigint {\n if (value instanceof Duration) {\n return value.toMillis();\n }\n return BigInt(Math.floor(at(value, zone).instant.nanos / 1_000_000));\n}\n\n/** Returns the day of week for the timestamp, where Sunday is 0. */\nexport function weekdayOf(value: unknown, zone: unknown = null): bigint {\n return BigInt(at(value, zone).fields.weekday);\n}\n\n/** Returns the zero-based day of year for the timestamp. */\nexport function ordinalOf(value: unknown, zone: unknown = null): bigint {\n return BigInt(at(value, zone).fields.dayOfYear - 1);\n}\n\n/**\n * Returns the maximum element from a non-empty list of values.\n *\n * @throws ArgumentError if the list is empty or values are not comparable\n */\nexport function max(values: unknown[]): unknown {\n if (values.length === 0) {\n throw new ArgumentError('max() requires at least one argument');\n }\n let result = values[0];\n for (let i = 1; i < values.length; i++) {\n if (compare(values[i], result) > 0) {\n result = values[i];\n }\n }\n return result;\n}\n\n/**\n * Returns the minimum element from a non-empty list of values.\n *\n * @throws ArgumentError if the list is empty or values are not comparable\n */\nexport function min(values: unknown[]): unknown {\n if (values.length === 0) {\n throw new ArgumentError('min() requires at least one argument');\n }\n let result = values[0];\n for (let i = 1; i < values.length; i++) {\n if (compare(values[i], result) < 0) {\n result = values[i];\n }\n }\n return result;\n}\n\n/**\n * Compares two values for deep equality.\n *\n * Lists and maps are compared element by element, numbers are compared\n * numerically across int and double, bytes by content, and NaN is never equal\n * to anything.\n */\nexport function equals(left: unknown, right: unknown): boolean {\n if (left === null || left === undefined || right === null || right === undefined) {\n return (left ?? null) === (right ?? null);\n }\n if (isBytes(left) && isBytes(right)) {\n return bytesEqual(left, right);\n }\n if (Array.isArray(left) && Array.isArray(right)) {\n if (left.length !== right.length) {\n return false;\n }\n for (let i = 0; i < left.length; i++) {\n if (!equals(left[i], right[i])) {\n return false;\n }\n }\n return true;\n }\n const leftMap = toMap(left);\n const rightMap = toMap(right);\n if (leftMap && rightMap) {\n if (leftMap.size !== rightMap.size) {\n return false;\n }\n // Indexed by CEL key equality, so an int key matches a double probe\n const indexed = new KeyMap<unknown>();\n for (const [key, value] of rightMap) {\n indexed.set(key, value);\n }\n for (const [key, value] of leftMap) {\n if (!indexed.has(key) || !equals(value, indexed.get(key))) {\n return false;\n }\n }\n return true;\n }\n if (\n (typeof left === 'bigint' || typeof left === 'number') &&\n (typeof right === 'bigint' || typeof right === 'number')\n ) {\n if (Number.isNaN(left) || Number.isNaN(right)) {\n return false;\n }\n return order(left, right) === 0;\n }\n if (left instanceof Timestamp || left instanceof Duration || left instanceof Type) {\n return left.equals(right);\n }\n return left === right;\n}\n\nfunction toMap(value: unknown): Map<unknown, unknown> | null {\n if (value instanceof Map) {\n return value;\n }\n if (isPlainObject(value)) {\n return new Map(Object.entries(value));\n }\n return null;\n}\n\n/**\n * Deep equality check for CEL values. Alias of {@link equals}.\n */\nexport const deepEquals = equals;\n\n/**\n * Compares two values using a common set of rules.\n *\n * Supported comparisons: numbers (exactly, across int and double), strings (by\n * UTF-16 code unit), booleans, timestamps, durations and bytes.\n *\n * @throws ArgumentError if the values cannot be compared\n */\nexport function compare(a: unknown, b: unknown): number {\n if (\n (typeof a === 'bigint' || typeof a === 'number') &&\n (typeof b === 'bigint' || typeof b === 'number')\n ) {\n return order(a, b);\n }\n if (typeof a === 'string' && typeof b === 'string') {\n return a < b ? -1 : a > b ? 1 : 0;\n }\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return a === b ? 0 : a ? 1 : -1;\n }\n if (a instanceof Timestamp && b instanceof Timestamp) {\n return a.compareTo(b);\n }\n if (a instanceof Duration && b instanceof Duration) {\n return a.compareTo(b);\n }\n if (isBytes(a) && isBytes(b)) {\n return bytesCompare(a, b);\n }\n throw new ArgumentError('Cannot compare values of different types');\n}\n\n/**\n * Reports whether the array contains the value under CEL equality.\n */\nexport function containsInArray(array: unknown[], value: unknown): boolean {\n for (const item of array) {\n if (equals(item, value)) {\n return true;\n }\n }\n return false;\n}\n","/**\n * String functions from the CEL strings extension library.\n *\n * Functions are exported so library users can call them directly. Indices and\n * lengths count Unicode code points, so a supplementary character such as an\n * emoji is one position and is never split.\n */\nimport { ArgumentError, EvaluationError } from '../errors.js';\nimport { isBytes, utf8Encode, bytesToHex } from '../values/bytes.js';\nimport * as Utilities from './utilities.js';\n\n// Translates a code point index into the UTF-16 offset the string methods expect\nfunction offset(value: string, index: bigint, name: string): number {\n if (index < 0n || index > BigInt(Utilities.codePointCount(value))) {\n throw new ArgumentError(`${name}() index out of range: ${index}`);\n }\n return Utilities.offsetByCodePoints(value, Number(index));\n}\n\n// Translates a UTF-16 offset back into a code point index\nfunction position(value: string, found: number): bigint {\n return found < 0 ? -1n : BigInt(Utilities.codePointCount(value.substring(0, found)));\n}\n\n/**\n * Returns the character at the given index as a single character string, or an\n * empty string at the end.\n *\n * @throws ArgumentError if the index is out of range\n */\nexport function charAt(value: string, index: bigint): string {\n const at = offset(value, index, 'charAt');\n if (at === value.length) {\n return '';\n }\n return String.fromCodePoint(value.codePointAt(at)!);\n}\n\n/**\n * Returns the index of the first occurrence of a substring at or after the\n * offset, or -1 when absent.\n *\n * @throws ArgumentError if the offset is out of range\n */\nexport function indexOf(value: string, search: string, start: bigint = 0n): bigint {\n return position(value, value.indexOf(search, offset(value, start, 'indexOf')));\n}\n\n/**\n * Returns the index of the last occurrence of a substring, searching backwards\n * from the offset when one is given, or -1 when absent.\n *\n * @throws ArgumentError if the offset is out of range\n */\nexport function lastIndexOf(value: string, search: string, start?: bigint): bigint {\n if (start === undefined) {\n return position(value, value.lastIndexOf(search));\n }\n return position(value, value.lastIndexOf(search, offset(value, start, 'lastIndexOf')));\n}\n\n/** Lowercases the ASCII letters of the string, leaving other characters untouched. */\nexport function lower(value: string): string {\n return value.replace(/[A-Z]/g, (ch) => String.fromCharCode(ch.charCodeAt(0) + 32));\n}\n\n/** Uppercases the ASCII letters of the string, leaving other characters untouched. */\nexport function upper(value: string): string {\n return value.replace(/[a-z]/g, (ch) => String.fromCharCode(ch.charCodeAt(0) - 32));\n}\n\n/**\n * Returns the substring between the given code point indices, or from the start\n * index to the end.\n *\n * @throws ArgumentError if the range is invalid\n */\nexport function substring(value: string, start: bigint, end?: bigint): string {\n if (end === undefined) {\n return value.substring(offset(value, start, 'substring'));\n }\n if (start > end) {\n throw new ArgumentError(`substring() range out of bounds: ${start}:${end}`);\n }\n return value.substring(offset(value, start, 'substring'), offset(value, end, 'substring'));\n}\n\n/** Reverses the string, preserving surrogate pairs. */\nexport function reverse(value: string): string {\n return Array.from(value).reverse().join('');\n}\n\n/**\n * Replaces occurrences of a literal substring.\n *\n * @param limit The maximum number of replacements, or -1 for all\n */\nexport function replace(value: string, from: string, to: string, limit: bigint = -1n): string {\n if (limit === 0n || from === '') {\n return value;\n }\n let result = '';\n let index = 0;\n let count = 0n;\n while (limit < 0n || count < limit) {\n const found = value.indexOf(from, index);\n if (found < 0) {\n break;\n }\n result += value.substring(index, found) + to;\n Utilities.limit(result.length, 'replace()');\n index = found + from.length;\n count++;\n }\n result += value.substring(index);\n Utilities.limit(result.length, 'replace()');\n return result;\n}\n\n/**\n * Splits a string around occurrences of a literal separator, following Java's\n * `String.split` limit semantics: a positive limit caps the number of parts with\n * the last part holding the unsplit remainder, and a negative limit keeps trailing\n * empty strings.\n *\n * @param limit The maximum number of parts, or -1 for no limit\n */\nexport function split(value: string, separator: string, limit: bigint = -1n): string[] {\n if (limit === 0n) {\n return [];\n }\n let parts: string[];\n if (separator === '') {\n // An empty pattern matches at every position, including the end\n parts = value === '' ? [''] : [...value.split(''), ''];\n } else {\n parts = value.split(separator);\n }\n if (limit > 0n && BigInt(parts.length) > limit) {\n const keep = Number(limit) - 1;\n parts = [...parts.slice(0, keep), parts.slice(keep).join(separator)];\n }\n return parts;\n}\n\n/**\n * Joins a list of strings with the given separator.\n *\n * @throws ArgumentError if any element is not a string\n */\nexport function join(values: unknown[], separator: string): string {\n // Projected before anything is allocated: two bounded inputs can still combine into a huge one\n let projected = Math.max(0, values.length - 1) * separator.length;\n for (const value of values) {\n if (typeof value !== 'string') {\n throw new ArgumentError('join() requires a list of strings');\n }\n projected += value.length;\n Utilities.limit(projected, 'join()');\n }\n let result = '';\n for (const value of values as string[]) {\n if (result.length > 0) {\n result += separator;\n }\n result += value;\n }\n return result;\n}\n\n/**\n * Formats a string using the CEL format verbs.\n *\n * Supported verbs are %s, %d, %f, %e, %b, %o, %x, %X and %%, each accepting an\n * optional precision such as %.3f.\n *\n * @throws ArgumentError if a verb is unknown or the argument count does not match\n */\nexport function format(template: string, args: unknown[]): string {\n let result = '';\n let next = 0;\n let i = 0;\n\n while (i < template.length) {\n const ch = template[i]!;\n if (ch !== '%') {\n result += ch;\n i++;\n continue;\n }\n if (i + 1 >= template.length) {\n throw new ArgumentError(\"format() has a trailing '%'\");\n }\n if (template[i + 1] === '%') {\n result += '%';\n i += 2;\n continue;\n }\n\n let precision = -1;\n let at = i + 1;\n if (template[at] === '.') {\n at++;\n const digits = at;\n while (at < template.length && template[at]! >= '0' && template[at]! <= '9') {\n at++;\n }\n if (at === digits) {\n throw new ArgumentError('format() precision requires digits');\n }\n precision = number(template.substring(digits, at));\n }\n if (at >= template.length) {\n throw new ArgumentError('format() has an incomplete verb');\n }\n if (next >= args.length) {\n throw new ArgumentError('format() has more verbs than arguments');\n }\n\n result += convert(template[at]!, precision, args[next]);\n if (result.length > Utilities.LIMIT) {\n throw new EvaluationError(\n `format() output exceeds the evaluation limit of ${Utilities.LIMIT}`\n );\n }\n next++;\n i = at + 1;\n }\n\n if (next !== args.length) {\n throw new ArgumentError('format() has more arguments than verbs');\n }\n return result;\n}\n\n// Reads a precision, refusing one large enough to make the formatted output exhaust the heap\nfunction number(digits: string): number {\n const value = digits.length > 18 ? Infinity : Number(digits);\n if (value > Utilities.LIMIT) {\n throw new EvaluationError(\n `format() precision exceeds the evaluation limit of ${Utilities.LIMIT}`\n );\n }\n return value;\n}\n\nfunction convert(verb: string, precision: number, value: unknown): string {\n switch (verb) {\n case 's':\n return Utilities.asString(value);\n case 'd':\n return Utilities.asInt(value).toString();\n case 'f':\n return fixed(Utilities.asDouble(value), precision < 0 ? 6 : precision);\n case 'e':\n return scientific(Utilities.asDouble(value), precision < 0 ? 6 : precision);\n case 'b':\n return typeof value === 'boolean' ? String(value) : unsigned(Utilities.asInt(value), 2);\n case 'o':\n return unsigned(Utilities.asInt(value), 8);\n case 'x':\n return hex(value, false);\n case 'X':\n return hex(value, true);\n default:\n throw new ArgumentError(`format() has an unknown verb: %${verb}`);\n }\n}\n\n// Renders a 64-bit value as its unsigned two's complement digits, like Long.toBinaryString\nfunction unsigned(value: bigint, radix: number): string {\n return BigInt.asUintN(64, value).toString(radix);\n}\n\n/**\n * Renders a double with the given number of fractional digits, rounding half up\n * on its shortest decimal representation the way Java's\n * `BigDecimal.valueOf(d).setScale(p, HALF_UP)` does.\n */\nexport function fixed(value: number, precision: number): string {\n if (!Number.isFinite(value)) {\n throw new ArgumentError(`Cannot format non-finite value: ${value}`);\n }\n const negative = value < 0;\n const [mantissa, exponent] = Math.abs(value).toExponential().split('e') as [string, string];\n const digits = mantissa.replace('.', '');\n // value = digits × 10^-scale\n const scale = digits.length - 1 - Number(exponent);\n let scaled = BigInt(digits);\n if (scale <= precision) {\n scaled *= 10n ** BigInt(precision - scale);\n } else {\n const divisor = 10n ** BigInt(scale - precision);\n const quotient = scaled / divisor;\n const remainder = scaled % divisor;\n scaled = remainder * 2n >= divisor ? quotient + 1n : quotient;\n }\n const text = scaled.toString().padStart(precision + 1, '0');\n const whole = text.substring(0, text.length - precision);\n const fraction = text.substring(text.length - precision);\n const result = precision > 0 ? `${whole}.${fraction}` : whole;\n return negative && scaled !== 0n ? `-${result}` : result;\n}\n\nfunction scientific(value: number, precision: number): string {\n if (value === 0) {\n return fixed(0, precision) + 'e+00';\n }\n if (!Number.isFinite(value)) {\n throw new ArgumentError(`Cannot format non-finite value: ${value}`);\n }\n const exponent = Math.floor(Math.log10(Math.abs(value)));\n const mantissa = value / Math.pow(10, exponent);\n const sign = exponent < 0 ? '-' : '+';\n const magnitude = Math.abs(exponent);\n return `${fixed(mantissa, precision)}e${sign}${magnitude < 10 ? '0' : ''}${magnitude}`;\n}\n\nfunction hex(value: unknown, upper: boolean): string {\n let result: string;\n if (isBytes(value)) {\n result = bytesToHex(value);\n } else if (typeof value === 'string') {\n result = bytesToHex(utf8Encode(value));\n } else {\n result = unsigned(Utilities.asInt(value), 16);\n }\n return upper ? result.toUpperCase() : result;\n}\n\n/**\n * Escapes the string for inclusion in a CEL string literal, without the\n * enclosing quotes.\n */\nexport function escape(value: string): string {\n let result = '';\n for (let i = 0; i < value.length; i++) {\n const ch = value[i]!;\n const code = value.charCodeAt(i);\n switch (ch) {\n case '\\\\':\n result += '\\\\\\\\';\n break;\n case '\"':\n result += '\\\\\"';\n break;\n case '\\n':\n result += '\\\\n';\n break;\n case '\\r':\n result += '\\\\r';\n break;\n case '\\t':\n result += '\\\\t';\n break;\n case '\\b':\n result += '\\\\b';\n break;\n case '\\f':\n result += '\\\\f';\n break;\n case '\\u0007':\n result += '\\\\a';\n break;\n case '\\u000B':\n result += '\\\\v';\n break;\n default:\n if (code < 0x20 || code === 0x7f) {\n result += '\\\\u' + code.toString(16).padStart(4, '0');\n } else {\n result += ch;\n }\n }\n }\n return result;\n}\n\n/** Returns the string as a quoted CEL string literal, including the double quotes. */\nexport function quote(value: string): string {\n return `\"${escape(value)}\"`;\n}\n\n/**\n * Escapes bytes for inclusion in a CEL bytes literal, without the enclosing\n * quotes.\n */\nexport function escapeBytes(value: Uint8Array): string {\n let result = '';\n for (const byte of value) {\n switch (byte) {\n case 0x5c:\n result += '\\\\\\\\';\n break;\n case 0x22:\n result += '\\\\\"';\n break;\n case 0x0a:\n result += '\\\\n';\n break;\n case 0x0d:\n result += '\\\\r';\n break;\n case 0x09:\n result += '\\\\t';\n break;\n default:\n if (byte < 0x20 || byte >= 0x7f) {\n result += '\\\\x' + byte.toString(16).padStart(2, '0');\n } else {\n result += String.fromCharCode(byte);\n }\n }\n }\n return result;\n}\n","/**\n * Regular expression functions from the CEL regex extension library.\n *\n * Replacement strings refer to capture groups as `\\1` through `\\9`, and `\\0` for\n * the whole match. Functions are exported so library users can call them directly.\n */\nimport { ArgumentError } from '../errors.js';\nimport * as Utilities from './utilities.js';\n\ntype Piece = { text: string } | { group: number };\n\nfunction compile(pattern: string, flags: string): RegExp {\n try {\n return new RegExp(pattern, flags);\n } catch {\n throw new ArgumentError(`Invalid regular expression: ${pattern}`);\n }\n}\n\n/** Counts the capture groups a pattern declares. */\nexport function groupCount(pattern: string): number {\n compile(pattern, '');\n return new RegExp(`${pattern}|`).exec('')!.length - 1;\n}\n\n/**\n * Replaces matches of the pattern with the given replacement.\n *\n * @param limit The maximum number of replacements, or -1 for all\n * @throws ArgumentError if the pattern or a group reference is invalid\n */\nexport function replace(\n value: string,\n pattern: string,\n replacement: string,\n limit: bigint = -1n\n): string {\n const regex = compile(pattern, 'g');\n const pieces = rewrite(replacement, groupCount(pattern), pattern);\n let result = '';\n let last = 0;\n let count = 0n;\n\n let match: RegExpExecArray | null;\n while ((match = regex.exec(value)) !== null) {\n if (limit >= 0n && count >= limit) {\n break;\n }\n result += value.substring(last, match.index) + expand(pieces, match);\n Utilities.limit(result.length, 'regex.replace()');\n last = match.index + match[0].length;\n if (match[0].length === 0) {\n // Step past an empty match so the search advances\n regex.lastIndex++;\n }\n count++;\n }\n result += value.substring(last);\n Utilities.limit(result.length, 'regex.replace()');\n return result;\n}\n\n/**\n * Returns the first match of the pattern, or null when there is none.\n *\n * If the pattern declares a capture group, the first group is returned instead of\n * the whole match.\n *\n * @throws ArgumentError if the pattern is invalid or declares more than one group\n */\nexport function extract(value: string, pattern: string): string | null {\n const groups = groupCount(pattern);\n if (groups > 1) {\n throw new ArgumentError(`extract() supports at most one capture group: ${pattern}`);\n }\n const match = compile(pattern, '').exec(value);\n if (match === null) {\n return null;\n }\n return groups === 1 ? (match[1] ?? null) : match[0];\n}\n\n/**\n * Returns every match of the pattern in the given text.\n *\n * If the pattern declares a capture group, the first group of each match is\n * returned instead of the whole match; matches where the group did not\n * participate are skipped.\n *\n * @throws ArgumentError if the pattern is invalid or declares more than one group\n */\nexport function extractAll(value: string, pattern: string): string[] {\n const groups = groupCount(pattern);\n if (groups > 1) {\n throw new ArgumentError(`extractAll() supports at most one capture group: ${pattern}`);\n }\n const regex = compile(pattern, 'g');\n const result: string[] = [];\n let match: RegExpExecArray | null;\n while ((match = regex.exec(value)) !== null) {\n const found = groups === 1 ? match[1] : match[0];\n if (found !== undefined) {\n result.push(found);\n }\n if (match[0].length === 0) {\n regex.lastIndex++;\n }\n }\n return result;\n}\n\n// Parses backslash group references out of a replacement template\nfunction rewrite(replacement: string, groups: number, pattern: string): Piece[] {\n const pieces: Piece[] = [];\n let text = '';\n let i = 0;\n while (i < replacement.length) {\n const ch = replacement[i]!;\n if (ch === '\\\\' && i + 1 < replacement.length) {\n const next = replacement[i + 1]!;\n if (next >= '0' && next <= '9') {\n const group = next.charCodeAt(0) - 48;\n if (group > groups) {\n throw new ArgumentError(\n `Replacement refers to group ${group} but ${pattern} has ${groups}`\n );\n }\n if (text.length > 0) {\n pieces.push({ text });\n text = '';\n }\n pieces.push({ group });\n } else {\n text += '\\\\' + next;\n }\n i += 2;\n } else {\n text += ch;\n i++;\n }\n }\n if (text.length > 0) {\n pieces.push({ text });\n }\n return pieces;\n}\n\nfunction expand(pieces: Piece[], match: RegExpExecArray): string {\n let result = '';\n for (const piece of pieces) {\n if ('text' in piece) {\n result += piece.text;\n } else {\n result += match[piece.group] ?? '';\n }\n }\n return result;\n}\n","/**\n * List functions from the CEL lists extension library.\n *\n * Functions are exported so library users can call them directly. All of them\n * return new lists and never modify their input.\n */\nimport { ArgumentError, EvaluationError } from '../errors.js';\nimport { KeySet } from '../values/key.js';\nimport * as Utilities from './utilities.js';\n\n/** Removes duplicate elements under CEL equality, preserving first appearance order. */\nexport function distinct(values: unknown[]): unknown[] {\n const seen = new KeySet();\n const result: unknown[] = [];\n for (const value of values) {\n if (seen.add(value)) {\n result.push(value);\n }\n }\n return result;\n}\n\n/**\n * Flattens nested lists to the requested depth.\n *\n * @throws ArgumentError if the depth is less than 1\n */\nexport function flatten(values: unknown[], depth: bigint = 1n): unknown[] {\n if (depth < 1n) {\n throw new ArgumentError('flatten() depth must be at least 1');\n }\n const result: unknown[] = [];\n for (const value of values) {\n if (Array.isArray(value)) {\n result.push(...(depth > 1n ? flatten(value, depth - 1n) : value));\n } else {\n result.push(value);\n }\n }\n return result;\n}\n\n/** Returns the elements in reverse order. */\nexport function reverse(values: unknown[]): unknown[] {\n return [...values].reverse();\n}\n\n/**\n * Returns the elements between the given indices.\n *\n * @throws ArgumentError if the range is invalid\n */\nexport function slice(values: unknown[], start: bigint, end: bigint): unknown[] {\n if (start < 0n || end > BigInt(values.length) || start > end) {\n throw new ArgumentError(`slice() range out of bounds: ${start}:${end}`);\n }\n return values.slice(Number(start), Number(end));\n}\n\n/**\n * Sorts the list using the standard CEL ordering.\n *\n * @throws ArgumentError if the elements are not mutually comparable\n */\nexport function sort(values: unknown[]): unknown[] {\n return [...values].sort(Utilities.compare);\n}\n\n/**\n * Returns the first element.\n *\n * @throws ArgumentError if the list is empty\n */\nexport function first(values: unknown[]): unknown {\n if (values.length === 0) {\n throw new ArgumentError('first() requires a non-empty list');\n }\n return values[0];\n}\n\n/**\n * Returns the last element.\n *\n * @throws ArgumentError if the list is empty\n */\nexport function last(values: unknown[]): unknown {\n if (values.length === 0) {\n throw new ArgumentError('last() requires a non-empty list');\n }\n return values[values.length - 1];\n}\n\n/**\n * Returns the integers from zero up to, but not including, the given bound.\n *\n * @param count The exclusive upper bound; negative values yield an empty list\n * @throws EvaluationError if the count exceeds the evaluation limit\n */\nexport function range(count: bigint): bigint[] {\n if (count > BigInt(Utilities.LIMIT)) {\n throw new EvaluationError(`range() exceeds the evaluation limit of ${Utilities.LIMIT}`);\n }\n const result: bigint[] = [];\n for (let i = 0n; i < count; i++) {\n result.push(i);\n }\n return result;\n}\n\n/** Reports whether the list contains the value, using deep equality. */\nexport function contains(values: unknown[], value: unknown): boolean {\n return Utilities.containsInArray(values, value);\n}\n","/**\n * Set functions from the CEL sets extension library.\n *\n * Lists are treated as unordered collections; duplicates do not affect the\n * results. Functions are exported so library users can call them directly.\n */\nimport { KeySet } from '../values/key.js';\n\n// Indexes a list by CEL equality so membership resolves without scanning\nfunction index(values: unknown[]): KeySet {\n const result = new KeySet();\n for (const value of values) {\n result.add(value);\n }\n return result;\n}\n\n/** Reports whether every element of the subset appears in the values. */\nexport function contains(values: unknown[], subset: unknown[]): boolean {\n const indexed = index(values);\n return subset.every((value) => indexed.has(value));\n}\n\n/** Reports whether the two lists contain the same elements, ignoring order and duplicates. */\nexport function equivalent(left: unknown[], right: unknown[]): boolean {\n return contains(left, right) && contains(right, left);\n}\n\n/** Reports whether the two lists share at least one element. */\nexport function intersects(left: unknown[], right: unknown[]): boolean {\n const indexed = index(left);\n return right.some((value) => indexed.has(value));\n}\n","/**\n * Numeric functions from the CEL math extension library.\n *\n * Functions that take a single argument accept both ints and doubles and\n * preserve the input type where the operation allows it. Functions are exported\n * so library users can call them directly.\n */\nimport { ArgumentError, EvaluationError } from '../errors.js';\nimport { INT64_MIN } from '../values/numbers.js';\nimport * as Utilities from './utilities.js';\n\nfunction spread(values: unknown[]): unknown[] {\n if (values.length === 1 && Array.isArray(values[0])) {\n return values[0];\n }\n return values;\n}\n\n/**\n * Returns the largest of the given values; a single list argument is spread.\n *\n * @throws ArgumentError if no values are given or they are not comparable\n */\nexport function greatest(values: unknown[]): unknown {\n return Utilities.max(spread(values));\n}\n\n/**\n * Returns the smallest of the given values; a single list argument is spread.\n *\n * @throws ArgumentError if no values are given or they are not comparable\n */\nexport function least(values: unknown[]): unknown {\n return Utilities.min(spread(values));\n}\n\n/**\n * Returns the absolute value, preserving the numeric type.\n *\n * @throws EvaluationError if the value is the minimum int, whose magnitude is not representable\n */\nexport function abs(value: unknown): bigint | number {\n if (typeof value === 'number') {\n return Math.abs(value);\n }\n const number = Utilities.asInt(value);\n if (number === INT64_MIN) {\n throw new EvaluationError('Integer overflow');\n }\n return number < 0n ? -number : number;\n}\n\n/** Returns the smallest double not less than the value. */\nexport function ceil(value: unknown): number {\n return Math.ceil(Utilities.asDouble(value));\n}\n\n/** Returns the largest double not greater than the value. */\nexport function floor(value: unknown): number {\n return Math.floor(Utilities.asDouble(value));\n}\n\n/** Rounds to the nearest double, with ties rounding away from zero. */\nexport function round(value: unknown): number {\n const number = Utilities.asDouble(value);\n return number < 0 ? -Math.round(-number) : Math.round(number);\n}\n\n/** Truncates toward zero. */\nexport function trunc(value: unknown): number {\n const number = Utilities.asDouble(value);\n return number < 0 ? Math.ceil(number) : Math.floor(number);\n}\n\n/** Returns -1, 0 or 1 by sign, preserving the numeric type. */\nexport function sign(value: unknown): bigint | number {\n if (typeof value === 'number') {\n return Math.sign(value);\n }\n const number = Utilities.asInt(value);\n return number < 0n ? -1n : number > 0n ? 1n : 0n;\n}\n\n/** Returns the square root as a double. */\nexport function sqrt(value: unknown): number {\n return Math.sqrt(Utilities.asDouble(value));\n}\n\n/** Reports whether the value is NaN. */\nexport function isNaN(value: unknown): boolean {\n return Number.isNaN(Utilities.asDouble(value));\n}\n\n/** Reports whether the value is positive or negative infinity. */\nexport function isInf(value: unknown): boolean {\n const number = Utilities.asDouble(value);\n return number === Infinity || number === -Infinity;\n}\n\n/** Reports whether the value is neither NaN nor infinite. */\nexport function isFinite(value: unknown): boolean {\n return Number.isFinite(Utilities.asDouble(value));\n}\n\n/** Returns the bitwise AND of two ints. */\nexport function and(left: unknown, right: unknown): bigint {\n return BigInt.asIntN(64, Utilities.asInt(left) & Utilities.asInt(right));\n}\n\n/** Returns the bitwise OR of two ints. */\nexport function or(left: unknown, right: unknown): bigint {\n return BigInt.asIntN(64, Utilities.asInt(left) | Utilities.asInt(right));\n}\n\n/** Returns the bitwise exclusive OR of two ints. */\nexport function xor(left: unknown, right: unknown): bigint {\n return BigInt.asIntN(64, Utilities.asInt(left) ^ Utilities.asInt(right));\n}\n\n/** Returns the bitwise complement of an int. */\nexport function not(value: unknown): bigint {\n return BigInt.asIntN(64, ~Utilities.asInt(value));\n}\n\nfunction shiftCount(count: unknown): bigint {\n const bits = Utilities.asInt(count);\n if (bits < 0n) {\n throw new ArgumentError(`Shift count must not be negative: ${bits}`);\n }\n return bits;\n}\n\n/**\n * Shifts an int left by the given number of bits, wrapping at 64 bits.\n *\n * @throws ArgumentError if the count is negative\n */\nexport function left(value: unknown, count: unknown): bigint {\n const bits = shiftCount(count);\n return bits >= 64n ? 0n : BigInt.asIntN(64, Utilities.asInt(value) << bits);\n}\n\n/**\n * Shifts an int right by the given number of bits, without sign extension.\n *\n * @throws ArgumentError if the count is negative\n */\nexport function right(value: unknown, count: unknown): bigint {\n const bits = shiftCount(count);\n return bits >= 64n ? 0n : BigInt.asIntN(64, BigInt.asUintN(64, Utilities.asInt(value)) >> bits);\n}\n","/**\n * Encoding functions from the CEL encoders extension library.\n *\n * Functions are exported so library users can call them directly. The codec is\n * implemented by hand so that it behaves identically in browsers and Node.\n */\nimport { ArgumentError } from '../errors.js';\nimport { utf8Decode } from '../values/bytes.js';\nimport * as Utilities from './utilities.js';\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst VALUES = new Map<string, number>(Array.from(ALPHABET, (ch, i) => [ch, i]));\n\n/**\n * Encodes bytes, or a string as UTF-8, in standard base64 with padding.\n *\n * @throws ArgumentError if the value cannot be converted to bytes\n */\nexport function encode(value: unknown): string {\n const bytes = Utilities.asBytes(value);\n Utilities.limit(4 * Math.ceil(bytes.length / 3), 'base64.encode()');\n let result = '';\n let i = 0;\n for (; i + 2 < bytes.length; i += 3) {\n const chunk = (bytes[i]! << 16) | (bytes[i + 1]! << 8) | bytes[i + 2]!;\n result +=\n ALPHABET[chunk >> 18]! +\n ALPHABET[(chunk >> 12) & 63]! +\n ALPHABET[(chunk >> 6) & 63]! +\n ALPHABET[chunk & 63]!;\n }\n const rest = bytes.length - i;\n if (rest === 1) {\n const chunk = bytes[i]! << 16;\n result += ALPHABET[chunk >> 18]! + ALPHABET[(chunk >> 12) & 63]! + '==';\n } else if (rest === 2) {\n const chunk = (bytes[i]! << 16) | (bytes[i + 1]! << 8);\n result +=\n ALPHABET[chunk >> 18]! + ALPHABET[(chunk >> 12) & 63]! + ALPHABET[(chunk >> 6) & 63]! + '=';\n }\n return result;\n}\n\n/**\n * Decodes standard base64 text into bytes.\n *\n * Only the standard alphabet is accepted; padding is optional but must be\n * well formed when present.\n *\n * @throws ArgumentError if the text is not valid base64\n */\nexport function decode(value: unknown): Uint8Array {\n if (typeof value !== 'string') {\n throw new ArgumentError('base64.decode() requires string arguments');\n }\n let data = value;\n let padding = 0;\n while (data.endsWith('=') && padding < 2) {\n data = data.substring(0, data.length - 1);\n padding++;\n }\n const remainder = data.length % 4;\n if (\n data.includes('=') ||\n remainder === 1 ||\n (padding > 0 && (remainder === 0 || padding !== 4 - remainder))\n ) {\n throw new ArgumentError(`Invalid base64 input: ${value}`);\n }\n const result: number[] = [];\n let buffer = 0;\n let bits = 0;\n for (const ch of data) {\n const sextet = VALUES.get(ch);\n if (sextet === undefined) {\n throw new ArgumentError(`Invalid base64 input: ${value}`);\n }\n buffer = ((buffer << 6) | sextet) & 0xffff;\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n result.push((buffer >> bits) & 0xff);\n }\n }\n return Uint8Array.from(result);\n}\n\n/**\n * Decodes base64 text into a UTF-8 string.\n *\n * @throws ArgumentError if the text is not valid base64\n */\nexport function text(value: string): string {\n return utf8Decode(decode(value));\n}\n","import { Functions, EvaluationError, ArgumentError } from './functions.js';\nimport * as Utilities from './utilities.js';\nimport * as Strings from './strings.js';\nimport * as Regexes from './regexes.js';\nimport * as Lists from './lists.js';\nimport * as Sets from './sets.js';\nimport * as Maths from './maths.js';\nimport * as Codecs from './codecs.js';\n\n/**\n * Names of the namespaced functions this library provides, such as `math.abs`.\n */\nconst QUALIFIED: ReadonlySet<string> = new Set<string>([\n 'math.greatest',\n 'math.least',\n 'math.abs',\n 'math.ceil',\n 'math.floor',\n 'math.round',\n 'math.trunc',\n 'math.sign',\n 'math.sqrt',\n 'math.isNaN',\n 'math.isInf',\n 'math.isFinite',\n 'math.bitAnd',\n 'math.bitOr',\n 'math.bitXor',\n 'math.bitNot',\n 'math.bitShiftLeft',\n 'math.bitShiftRight',\n 'sets.contains',\n 'sets.equivalent',\n 'sets.intersects',\n 'base64.encode',\n 'base64.decode',\n 'lists.range',\n 'strings.quote',\n 'regex.replace',\n 'regex.extract',\n 'regex.extractAll',\n]);\n\nconst MACROS = new Set(['map', 'filter', 'all', 'exists', 'existsOne', 'sortBy']);\n\nconst TIME_ACCESSORS = new Set([\n 'getDate',\n 'getMonth',\n 'getFullYear',\n 'getHours',\n 'getMinutes',\n 'getSeconds',\n 'getMilliseconds',\n 'getDayOfWeek',\n 'getDayOfYear',\n]);\n\n/**\n * Checks the argument count of a function call.\n *\n * @throws ArgumentError if the count is outside [least, most]\n */\nexport function require(name: string, args: unknown[], least: number, most: number): void {\n if (args.length < least || args.length > most) {\n throw new ArgumentError(\n `${name}() requires ${least === most ? least : `${least} to ${most}`} argument(s)`\n );\n }\n}\n\n/** Returns the optional time-zone argument of a timestamp accessor. */\nfunction zone(args: unknown[]): unknown {\n return args.length > 1 ? args[1] : null;\n}\n\n/**\n * Requires a string argument.\n *\n * @throws ArgumentError if the value is not a string\n */\nexport function text(value: unknown, name: string): string {\n if (typeof value === 'string') {\n return value;\n }\n throw new ArgumentError(`${name}() requires string arguments`);\n}\n\n/**\n * Requires a list argument.\n *\n * @throws ArgumentError if the value is not a list\n */\nexport function list(value: unknown, name: string): unknown[] {\n if (Array.isArray(value)) {\n return value;\n }\n throw new ArgumentError(`${name}() requires a list`);\n}\n\nfunction single(name: string, args: unknown[], operation: (value: unknown) => unknown): unknown {\n require(name, args, 1, 1);\n return operation(args[0]);\n}\n\nfunction pair(\n name: string,\n args: unknown[],\n operation: (left: unknown, right: unknown) => unknown\n): unknown {\n require(name, args, 2, 2);\n return operation(args[0], args[1]);\n}\n\n/**\n * Standard CEL function library implementation.\n *\n * Provides all built-in CEL functions including:\n * - Type conversions: int(), uint(), double(), string(), bool(), bytes(), dyn()\n * - Type checking: type()\n * - Collection operations: size(), has()\n * - String operations: contains(), startsWith(), endsWith(), matches()\n * - Date/time: timestamp(), duration() and the getXxx() accessors\n * - Math operations: max(), min()\n *\n * This class can be extended to add custom functions while retaining\n * all standard CEL functionality.\n */\nexport class StandardFunctions implements Functions {\n knows(name: string): boolean {\n return QUALIFIED.has(name);\n }\n\n callFunction(name: string, args: unknown[]): unknown {\n if (name.indexOf('.') > 0) {\n return this.callQualified(name, args);\n }\n\n switch (name) {\n case 'size':\n require(name, args, 1, 1);\n return Utilities.sizeOf(args[0]);\n case 'int':\n require(name, args, 1, 1);\n return Utilities.asInt(args[0]);\n case 'uint':\n require(name, args, 1, 1);\n return Utilities.asUInt(args[0]);\n case 'double':\n require(name, args, 1, 1);\n return Utilities.asDouble(args[0]);\n case 'string':\n require(name, args, 1, 1);\n return Utilities.asString(args[0]);\n case 'bool':\n require(name, args, 1, 1);\n return Utilities.asBool(args[0]);\n case 'type':\n require(name, args, 1, 1);\n return Utilities.typeOf(args[0]);\n case 'has':\n if (args.length !== 2) {\n throw new ArgumentError('has() requires 2 arguments');\n }\n return Utilities.has(args[0], args[1]);\n case 'matches':\n if (args.length !== 2) {\n throw new ArgumentError('matches() requires 2 arguments');\n }\n return Utilities.matches(text(args[0], name), text(args[1], name));\n case 'timestamp':\n require(name, args, 0, 1);\n return Utilities.timestamp(args.length > 0 ? args[0] : null);\n case 'duration':\n require(name, args, 1, 1);\n return Utilities.asDuration(args[0]);\n case 'getDate':\n require(name, args, 1, 2);\n return Utilities.dateOf(args[0], zone(args));\n case 'getMonth':\n require(name, args, 1, 2);\n return Utilities.monthOf(args[0], zone(args));\n case 'getFullYear':\n require(name, args, 1, 2);\n return Utilities.yearOf(args[0], zone(args));\n case 'getHours':\n require(name, args, 1, 2);\n return Utilities.hoursOf(args[0], zone(args));\n case 'getMinutes':\n require(name, args, 1, 2);\n return Utilities.minutesOf(args[0], zone(args));\n case 'getSeconds':\n require(name, args, 1, 2);\n return Utilities.secondsOf(args[0], zone(args));\n case 'getDayOfWeek':\n require(name, args, 1, 2);\n return Utilities.weekdayOf(args[0], zone(args));\n case 'getDayOfYear':\n require(name, args, 1, 2);\n return Utilities.ordinalOf(args[0], zone(args));\n case 'getMilliseconds':\n require(name, args, 1, 2);\n return Utilities.millisecondsOf(args[0], zone(args));\n case 'bytes':\n require(name, args, 1, 1);\n return Utilities.asBytes(args[0]);\n case 'dyn':\n require(name, args, 1, 1);\n return args[0];\n case 'max':\n return Utilities.max(args);\n case 'min':\n return Utilities.min(args);\n default:\n throw new ArgumentError(`Unknown function: ${name}`);\n }\n }\n\n callMethod(target: unknown, method: string, args: unknown[]): unknown {\n if (target === null || target === undefined) {\n throw new ArgumentError('Cannot call method on null');\n }\n\n switch (method) {\n case 'contains':\n if (typeof target === 'string' && args.length === 1 && typeof args[0] === 'string') {\n return target.includes(args[0]);\n } else if (Array.isArray(target) && args.length === 1) {\n return Utilities.containsInArray(target, args[0]);\n }\n throw new ArgumentError('Invalid arguments for contains()');\n\n case 'startsWith':\n if (typeof target === 'string' && args.length === 1 && typeof args[0] === 'string') {\n return target.startsWith(args[0]);\n }\n throw new ArgumentError('startsWith() requires string target and argument');\n\n case 'endsWith':\n if (typeof target === 'string' && args.length === 1 && typeof args[0] === 'string') {\n return target.endsWith(args[0]);\n }\n throw new ArgumentError('endsWith() requires string target and argument');\n\n case 'toLowerCase':\n if (typeof target === 'string' && args.length === 0) {\n return target.toLowerCase();\n }\n throw new ArgumentError('toLowerCase() requires string target');\n\n case 'toUpperCase':\n if (typeof target === 'string' && args.length === 0) {\n return target.toUpperCase();\n }\n throw new ArgumentError('toUpperCase() requires string target');\n\n case 'trim':\n if (typeof target === 'string' && args.length === 0) {\n return target.trim();\n }\n throw new ArgumentError('trim() requires string target');\n\n case 'replace':\n require(method, args, 2, 3);\n return Strings.replace(\n text(target, method),\n text(args[0], method),\n text(args[1], method),\n args.length > 2 ? Utilities.asInt(args[2]) : -1n\n );\n\n case 'split':\n require(method, args, 1, 2);\n return Strings.split(\n text(target, method),\n text(args[0], method),\n args.length > 1 ? Utilities.asInt(args[1]) : -1n\n );\n\n case 'charAt':\n require(method, args, 1, 1);\n return Strings.charAt(text(target, method), Utilities.asInt(args[0]));\n\n case 'indexOf':\n require(method, args, 1, 2);\n return Strings.indexOf(\n text(target, method),\n text(args[0], method),\n args.length > 1 ? Utilities.asInt(args[1]) : 0n\n );\n\n case 'lastIndexOf':\n require(method, args, 1, 2);\n return Strings.lastIndexOf(\n text(target, method),\n text(args[0], method),\n args.length > 1 ? Utilities.asInt(args[1]) : undefined\n );\n\n case 'lowerAscii':\n require(method, args, 0, 0);\n return Strings.lower(text(target, method));\n\n case 'upperAscii':\n require(method, args, 0, 0);\n return Strings.upper(text(target, method));\n\n case 'substring':\n require(method, args, 1, 2);\n return Strings.substring(\n text(target, method),\n Utilities.asInt(args[0]),\n args.length > 1 ? Utilities.asInt(args[1]) : undefined\n );\n\n case 'join':\n require(method, args, 0, 1);\n return Strings.join(list(target, method), args.length > 0 ? text(args[0], method) : '');\n\n case 'format':\n require(method, args, 1, 1);\n return Strings.format(text(target, method), list(args[0], method));\n\n case 'matches':\n require(method, args, 1, 1);\n return Utilities.matches(text(target, method), text(args[0], method));\n\n case 'reverse':\n require(method, args, 0, 0);\n return Array.isArray(target)\n ? Lists.reverse(target)\n : Strings.reverse(text(target, method));\n\n case 'distinct':\n require(method, args, 0, 0);\n return Lists.distinct(list(target, method));\n\n case 'flatten':\n require(method, args, 0, 1);\n return Lists.flatten(list(target, method), args.length > 0 ? Utilities.asInt(args[0]) : 1n);\n\n case 'slice':\n require(method, args, 2, 2);\n return Lists.slice(\n list(target, method),\n Utilities.asInt(args[0]),\n Utilities.asInt(args[1])\n );\n\n case 'sort':\n require(method, args, 0, 0);\n return Lists.sort(list(target, method));\n\n case 'first':\n require(method, args, 0, 0);\n return Lists.first(list(target, method));\n\n case 'last':\n require(method, args, 0, 0);\n return Lists.last(list(target, method));\n\n case 'size':\n return Utilities.sizeOf(target);\n\n default:\n if (TIME_ACCESSORS.has(method)) {\n require(method, args, 0, 1);\n return this.callFunction(method, [target, ...args]);\n }\n // Macro functions are handled in the interpreter with special logic\n if (MACROS.has(method)) {\n throw new EvaluationError(\n `Macro function ${method} was not properly handled by the interpreter`\n );\n }\n return this.callNativeMethod(target, method, args);\n }\n }\n\n /**\n * Dispatches a namespaced function such as `math.abs`.\n *\n * @throws ArgumentError if the name is unknown\n */\n protected callQualified(name: string, args: unknown[]): unknown {\n switch (name) {\n case 'math.greatest':\n return Maths.greatest(args);\n case 'math.least':\n return Maths.least(args);\n case 'math.abs':\n return single(name, args, Maths.abs);\n case 'math.ceil':\n return single(name, args, Maths.ceil);\n case 'math.floor':\n return single(name, args, Maths.floor);\n case 'math.round':\n return single(name, args, Maths.round);\n case 'math.trunc':\n return single(name, args, Maths.trunc);\n case 'math.sign':\n return single(name, args, Maths.sign);\n case 'math.sqrt':\n return single(name, args, Maths.sqrt);\n case 'math.isNaN':\n return single(name, args, Maths.isNaN);\n case 'math.isInf':\n return single(name, args, Maths.isInf);\n case 'math.isFinite':\n return single(name, args, Maths.isFinite);\n case 'math.bitAnd':\n return pair(name, args, Maths.and);\n case 'math.bitOr':\n return pair(name, args, Maths.or);\n case 'math.bitXor':\n return pair(name, args, Maths.xor);\n case 'math.bitNot':\n return single(name, args, Maths.not);\n case 'math.bitShiftLeft':\n return pair(name, args, Maths.left);\n case 'math.bitShiftRight':\n return pair(name, args, Maths.right);\n case 'sets.contains':\n require(name, args, 2, 2);\n return Sets.contains(list(args[0], name), list(args[1], name));\n case 'sets.equivalent':\n require(name, args, 2, 2);\n return Sets.equivalent(list(args[0], name), list(args[1], name));\n case 'sets.intersects':\n require(name, args, 2, 2);\n return Sets.intersects(list(args[0], name), list(args[1], name));\n case 'base64.encode':\n require(name, args, 1, 1);\n return Codecs.encode(args[0]);\n case 'base64.decode':\n require(name, args, 1, 1);\n return Codecs.decode(text(args[0], name));\n case 'lists.range':\n require(name, args, 1, 1);\n return Lists.range(Utilities.asInt(args[0]));\n case 'strings.quote':\n require(name, args, 1, 1);\n return Strings.quote(text(args[0], name));\n case 'regex.replace':\n require(name, args, 3, 4);\n return Regexes.replace(\n text(args[0], name),\n text(args[1], name),\n text(args[2], name),\n args.length > 3 ? Utilities.asInt(args[3]) : -1n\n );\n case 'regex.extract':\n require(name, args, 2, 2);\n return Regexes.extract(text(args[0], name), text(args[1], name));\n case 'regex.extractAll':\n require(name, args, 2, 2);\n return Regexes.extractAll(text(args[0], name), text(args[1], name));\n default:\n throw new ArgumentError(`Unknown function: ${name}`);\n }\n }\n\n /**\n * Attempts to call a native JavaScript method on the target object.\n *\n * This is the last resort after every named method, the analogue of the Java\n * library's reflective method call.\n *\n * @throws ArgumentError if the method doesn't exist\n * @throws EvaluationError if the call fails\n */\n private callNativeMethod(target: unknown, name: string, args: unknown[]): unknown {\n const candidate = (target as Record<string, unknown>)[name];\n if (typeof candidate === 'function') {\n try {\n return (candidate as (...params: unknown[]) => unknown).apply(target, args);\n } catch (e) {\n throw new EvaluationError(\n `Invocation of method '${name}' failed: ${e instanceof Error ? e.message : String(e)}`\n );\n }\n }\n throw new ArgumentError(\n `No such method '${name}' on type ${Utilities.typeOf(target)} with ${args.length} argument(s)`\n );\n }\n}\n","import {\n Expression,\n Visitor,\n Literal,\n Identifier,\n Select,\n Index,\n Call,\n ListExpression,\n MapExpression,\n Struct,\n Comprehension,\n Unary,\n Binary,\n Conditional,\n BinaryOp,\n UnaryOp,\n} from '../ast/index.js';\nimport { Functions } from '../functions/functions.js';\nimport { EvaluationError, isCelError } from '../errors.js';\nimport { StandardFunctions } from '../functions/standard-functions.js';\nimport * as Utilities from '../functions/utilities.js';\nimport { Timestamp } from '../values/timestamp.js';\nimport { Duration } from '../values/duration.js';\nimport { Type } from '../values/type.js';\nimport { normalize, normalizeResult } from '../values/normalize.js';\nimport { isBytes, concatBytes } from '../values/bytes.js';\nimport { INT64_MIN, checkInt64, isNumeric } from '../values/numbers.js';\n\nconst OPERATOR_SPELLING: Partial<Record<BinaryOp, string>> = {\n [BinaryOp.LOGICAL_AND]: '&&',\n [BinaryOp.LOGICAL_OR]: '||',\n};\n\n/**\n * Interpreter for evaluating CEL expressions.\n *\n * Implements the Visitor pattern to traverse and evaluate the AST produced by the parser.\n * Supports all CEL operations including macros, type conversions, and complex expressions.\n *\n * Variables are normalised into the CEL value model on construction: integer-valued\n * numbers become `bigint`, plain objects become `Map`, and `Date` becomes `Timestamp`.\n *\n * Note: an Interpreter is not safe to share between concurrent evaluations; the\n * variable scope is mutated while macros run.\n */\nexport class Interpreter implements Visitor<unknown> {\n private readonly variables: Map<string, unknown>;\n private readonly functions: Functions;\n\n /**\n * Constructs an interpreter with the specified variables and functions.\n *\n * @param variables Variable bindings as a plain object or Map. If null, no variables are bound.\n * @param functions The function library. If null, StandardFunctions is used.\n */\n constructor(\n variables?: Record<string, unknown> | Map<string, unknown> | null,\n functions?: Functions | null\n ) {\n this.variables = new Map();\n if (variables instanceof Map) {\n for (const [name, value] of variables) {\n this.variables.set(name, normalize(value));\n }\n } else if (variables) {\n for (const [name, value] of Object.entries(variables)) {\n this.variables.set(name, normalize(value));\n }\n }\n this.functions = functions ?? new StandardFunctions();\n }\n\n /**\n * Evaluates a CEL expression and returns its result.\n *\n * @throws EvaluationError if evaluation fails\n */\n evaluate(expr: Expression): unknown {\n return expr.accept(this);\n }\n\n visitLiteral(expr: Literal): unknown {\n return expr.value;\n }\n\n visitIdentifier(expr: Identifier): unknown {\n if (!this.variables.has(expr.name)) {\n // Bare type names resolve to type values unless a variable shadows them\n const type = Type.of(expr.name);\n if (type !== null) {\n return type;\n }\n throw new EvaluationError(`Undefined variable: ${expr.name}`);\n }\n return this.variables.get(expr.name);\n }\n\n visitSelect(expr: Select): unknown {\n const target = expr.operand !== null ? this.evaluate(expr.operand) : this.variables;\n\n if (target === null || target === undefined) {\n if (expr.isTest) {\n return false;\n }\n throw new EvaluationError(`Cannot select field ${expr.field} from null`);\n }\n\n if (target instanceof Map) {\n if (expr.isTest) {\n return target.has(expr.field);\n }\n if (!target.has(expr.field)) {\n throw new EvaluationError(`Field ${expr.field} not found`);\n }\n return target.get(expr.field);\n }\n\n throw new EvaluationError('Cannot select field from non-map type');\n }\n\n visitCall(expr: Call): unknown {\n // For macro calls, we need special handling\n if (expr.isMacro && expr.target !== null) {\n const target = this.evaluate(expr.target);\n\n // For macros, we pass the AST expressions, not evaluated values\n if (expr.args.length === 0) {\n throw new EvaluationError(`Macro ${expr.functionName} requires arguments`);\n }\n\n // Extract variable name from first argument\n const first = expr.args[0]!;\n if (!(first instanceof Identifier)) {\n throw new EvaluationError(\n `First argument to macro ${expr.functionName} must be a variable name`\n );\n }\n\n // Remaining arguments are kept as unevaluated AST\n if (expr.args.length < 2) {\n throw new EvaluationError(`Macro ${expr.functionName} requires an expression argument`);\n }\n const steps = expr.args.slice(1);\n\n return this.evaluateMacro(target, expr.functionName, first.name, steps);\n }\n\n // Regular function call - evaluate all arguments\n const args: unknown[] = [];\n for (const arg of expr.args) {\n args.push(this.evaluate(arg));\n }\n\n if (expr.target !== null) {\n // A qualified name such as math.abs is a namespaced function unless a variable shadows it\n const namespace = this.qualify(expr.target);\n if (namespace !== null) {\n const qualified = `${namespace}.${expr.functionName}`;\n if (!this.variables.has(this.root(namespace)) && this.knows(qualified)) {\n return normalizeResult(this.functions.callFunction(qualified, args));\n }\n }\n const target = this.evaluate(expr.target);\n return normalizeResult(this.functions.callMethod(target, expr.functionName, args));\n }\n return normalizeResult(this.functions.callFunction(expr.functionName, args));\n }\n\n private knows(name: string): boolean {\n return this.functions.knows?.(name) ?? false;\n }\n\n // Flattens an identifier or a chain of selections over one into a dotted name, or null\n private qualify(expr: Expression): string | null {\n if (expr instanceof Identifier) {\n return expr.name;\n }\n if (expr instanceof Select && expr.operand !== null && !expr.isTest) {\n const prefix = this.qualify(expr.operand);\n return prefix === null ? null : `${prefix}.${expr.field}`;\n }\n return null;\n }\n\n private root(name: string): string {\n const dot = name.indexOf('.');\n return dot < 0 ? name : name.substring(0, dot);\n }\n\n private evaluateMacro(\n target: unknown,\n functionName: string,\n variableName: string,\n steps: Expression[]\n ): unknown {\n let list: unknown[];\n if (Array.isArray(target)) {\n list = target;\n } else if (target instanceof Map) {\n list = Array.from(target.keys());\n } else {\n throw new EvaluationError(`Macro ${functionName} requires a list or map target`);\n }\n\n // Save the current value of the variable (if any)\n const saved = this.variables.get(variableName);\n const had = this.variables.has(variableName);\n const bind = (item: unknown): void => {\n this.variables.set(variableName, item);\n };\n const step = steps[0]!;\n\n try {\n switch (functionName) {\n case 'map': {\n // Optional second expression makes the first a predicate: map(x, filter, transform)\n const predicate = steps.length > 1 ? steps[0]! : null;\n const transform = steps.length > 1 ? steps[1]! : step;\n const results: unknown[] = [];\n for (const item of list) {\n bind(item);\n if (predicate !== null && !this.test(predicate, functionName)) {\n continue;\n }\n results.push(this.evaluate(transform));\n }\n return results;\n }\n\n case 'filter': {\n const results: unknown[] = [];\n for (const item of list) {\n bind(item);\n if (this.test(step, functionName)) {\n results.push(item);\n }\n }\n return results;\n }\n\n case 'all': {\n for (const item of list) {\n bind(item);\n if (!this.test(step, functionName)) {\n return false;\n }\n }\n return true;\n }\n\n case 'exists': {\n for (const item of list) {\n bind(item);\n if (this.test(step, functionName)) {\n return true;\n }\n }\n return false;\n }\n\n case 'existsOne': {\n let count = 0;\n for (const item of list) {\n bind(item);\n if (this.test(step, functionName)) {\n count++;\n if (count > 1) {\n return false;\n }\n }\n }\n return count === 1;\n }\n\n case 'sortBy': {\n // Decorate, sort and undecorate: each key is evaluated exactly once and the sort is stable\n const keys: unknown[] = [];\n for (const item of list) {\n bind(item);\n keys.push(this.evaluate(step));\n }\n const order = list.map((_, index) => index);\n order.sort((left, right) => Utilities.compare(keys[left], keys[right]));\n return order.map((index) => list[index]);\n }\n\n default:\n throw new EvaluationError(`Unknown macro function: ${functionName}`);\n }\n } finally {\n // Restore the original value of the variable\n if (had) {\n this.variables.set(variableName, saved);\n } else {\n this.variables.delete(variableName);\n }\n }\n }\n\n // Evaluates a macro predicate, which the specification requires to yield a boolean\n private test(expr: Expression, functionName: string): boolean {\n const result = this.evaluate(expr);\n if (typeof result !== 'boolean') {\n throw new EvaluationError(`Macro ${functionName} requires a boolean predicate`);\n }\n return result;\n }\n\n visitList(expr: ListExpression): unknown {\n const result: unknown[] = [];\n for (const element of expr.elements) {\n result.push(this.evaluate(element));\n }\n return result;\n }\n\n visitMap(expr: MapExpression): unknown {\n const map = new Map<unknown, unknown>();\n for (const entry of expr.entries) {\n const key = this.evaluate(entry.key);\n const value = this.evaluate(entry.value);\n map.set(key, value);\n }\n return map;\n }\n\n visitStruct(expr: Struct): unknown {\n const map = new Map<string, unknown>();\n for (const field of expr.fields) {\n map.set(field.field, this.evaluate(field.value));\n }\n return map;\n }\n\n visitComprehension(expr: Comprehension): unknown {\n const range = this.evaluate(expr.range);\n if (!Array.isArray(range)) {\n throw new EvaluationError('Comprehension range must be a list');\n }\n\n const iteratorSaved = this.variables.get(expr.variable);\n const accumulatorSaved = this.variables.get(expr.accumulator);\n const hadIterator = this.variables.has(expr.variable);\n const hadAccumulator = this.variables.has(expr.accumulator);\n\n try {\n let accumulator = this.evaluate(expr.initializer);\n this.variables.set(expr.accumulator, accumulator);\n\n for (const item of range) {\n this.variables.set(expr.variable, item);\n\n const condition = this.evaluate(expr.condition);\n if (condition !== true) {\n continue;\n }\n\n accumulator = this.evaluate(expr.step);\n this.variables.set(expr.accumulator, accumulator);\n }\n\n return this.evaluate(expr.result);\n } finally {\n if (hadIterator) {\n this.variables.set(expr.variable, iteratorSaved);\n } else {\n this.variables.delete(expr.variable);\n }\n if (hadAccumulator) {\n this.variables.set(expr.accumulator, accumulatorSaved);\n } else {\n this.variables.delete(expr.accumulator);\n }\n }\n }\n\n visitUnary(expr: Unary): unknown {\n const operand = this.evaluate(expr.operand);\n\n switch (expr.op) {\n case UnaryOp.NOT:\n if (typeof operand !== 'boolean') {\n throw new EvaluationError('NOT operator requires boolean operand');\n }\n return !operand;\n\n case UnaryOp.NEGATE:\n if (typeof operand === 'bigint') {\n if (operand === INT64_MIN) {\n throw new EvaluationError('Integer overflow');\n }\n return -operand;\n }\n if (typeof operand === 'number') {\n return -operand;\n }\n if (operand instanceof Duration) {\n return operand.negated();\n }\n throw new EvaluationError('Negation requires numeric operand');\n\n default:\n throw new EvaluationError(`Unknown unary operator: ${expr.op}`);\n }\n }\n\n visitBinary(expr: Binary): unknown {\n // Logical operators absorb errors from the other operand\n if (expr.op === BinaryOp.LOGICAL_AND) {\n return this.combine(expr, false);\n }\n if (expr.op === BinaryOp.LOGICAL_OR) {\n return this.combine(expr, true);\n }\n\n const left = this.evaluate(expr.left);\n const right = this.evaluate(expr.right);\n\n switch (expr.op) {\n case BinaryOp.ADD: {\n // Bytes concatenation\n if (isBytes(left) && isBytes(right)) {\n Utilities.limit(left.length + right.length, 'Bytes concatenation');\n return concatBytes(left, right);\n }\n // Timestamp and duration arithmetic\n if (left instanceof Timestamp && right instanceof Duration) {\n return left.plus(right);\n }\n if (left instanceof Duration && right instanceof Timestamp) {\n return right.plus(left);\n }\n if (left instanceof Duration && right instanceof Duration) {\n return left.plus(right);\n }\n // String concatenation\n if (typeof left === 'string' || typeof right === 'string') {\n const head = Utilities.asString(left);\n const tail = Utilities.asString(right);\n Utilities.limit(head.length + tail.length, 'String concatenation');\n return head + tail;\n }\n // List concatenation\n if (Array.isArray(left) && Array.isArray(right)) {\n Utilities.limit(left.length + right.length, 'List concatenation');\n return [...left, ...right];\n }\n // Numeric addition\n if (isNumeric(left) && isNumeric(right)) {\n return this.arithmetic(\n left,\n right,\n (a, b) => a + b,\n (a, b) => a + b\n );\n }\n throw new EvaluationError('Invalid operands for addition');\n }\n\n case BinaryOp.SUBTRACT: {\n if (left instanceof Timestamp && right instanceof Timestamp) {\n return right.until(left);\n }\n if (left instanceof Timestamp && right instanceof Duration) {\n return left.minus(right);\n }\n if (left instanceof Duration && right instanceof Duration) {\n return left.minus(right);\n }\n if (isNumeric(left) && isNumeric(right)) {\n return this.arithmetic(\n left,\n right,\n (a, b) => a - b,\n (a, b) => a - b\n );\n }\n throw new EvaluationError('Subtraction requires numeric operands');\n }\n\n case BinaryOp.MULTIPLY: {\n if (isNumeric(left) && isNumeric(right)) {\n return this.arithmetic(\n left,\n right,\n (a, b) => a * b,\n (a, b) => a * b\n );\n }\n // String repetition\n if (typeof left === 'string' && isNumeric(right)) {\n const count = this.repetitions(right, left.length);\n return left.repeat(count);\n }\n // List repetition\n if (Array.isArray(left) && isNumeric(right)) {\n const count = this.repetitions(right, left.length);\n const result: unknown[] = [];\n for (let i = 0; i < count; i++) {\n result.push(...left);\n }\n return result;\n }\n throw new EvaluationError('Invalid operands for multiplication');\n }\n\n case BinaryOp.DIVIDE: {\n if (isNumeric(left) && isNumeric(right)) {\n if (typeof left === 'number' || typeof right === 'number') {\n // Double division follows IEEE 754, so a zero divisor yields infinity or NaN\n return Number(left) / Number(right);\n }\n if (right === 0n) {\n throw new EvaluationError('Division by zero');\n }\n if (left === INT64_MIN && right === -1n) {\n throw new EvaluationError('Integer overflow');\n }\n return left / right;\n }\n throw new EvaluationError('Division requires numeric operands');\n }\n\n case BinaryOp.MODULO: {\n if (typeof left === 'bigint' && typeof right === 'bigint') {\n if (right === 0n) {\n throw new EvaluationError('Modulo by zero');\n }\n return left % right;\n }\n throw new EvaluationError('Modulo requires integer operands');\n }\n\n case BinaryOp.EQUAL:\n return Utilities.equals(left, right);\n\n case BinaryOp.NOT_EQUAL:\n return !Utilities.equals(left, right);\n\n case BinaryOp.LESS:\n return this.compare(left, right) < 0;\n\n case BinaryOp.LESS_EQUAL:\n return this.compare(left, right) <= 0;\n\n case BinaryOp.GREATER:\n return this.compare(left, right) > 0;\n\n case BinaryOp.GREATER_EQUAL:\n return this.compare(left, right) >= 0;\n\n case BinaryOp.IN: {\n if (Array.isArray(right)) {\n return Utilities.containsInArray(right, left);\n }\n if (right instanceof Map) {\n return Utilities.contains(right, left);\n }\n if (typeof right === 'string' && typeof left === 'string') {\n return right.includes(left);\n }\n throw new EvaluationError('IN operator requires list, map, or string on right side');\n }\n\n default:\n throw new EvaluationError(`Unknown binary operator: ${expr.op}`);\n }\n }\n\n // Evaluates a logical operator: the absorbing value wins even when the other operand errors\n private combine(expr: Binary, absorbing: boolean): boolean {\n const left = this.attempt(expr.left);\n if (left === absorbing) {\n return absorbing;\n }\n\n const right = this.attempt(expr.right);\n if (right === absorbing) {\n return absorbing;\n }\n\n if (left instanceof Error) {\n throw left;\n }\n if (right instanceof Error) {\n throw right;\n }\n if (typeof left !== 'boolean' || typeof right !== 'boolean') {\n const spelling = OPERATOR_SPELLING[expr.op] ?? expr.op;\n throw new EvaluationError(`Logical operator ${spelling} requires boolean operands`);\n }\n return !absorbing;\n }\n\n // Evaluates an operand, returning the error instead of throwing it\n private attempt(expr: Expression): unknown {\n try {\n return this.evaluate(expr);\n } catch (error) {\n if (isCelError(error)) {\n return error;\n }\n throw error;\n }\n }\n\n visitConditional(expr: Conditional): unknown {\n const condition = this.evaluate(expr.condition);\n if (typeof condition !== 'boolean') {\n throw new EvaluationError('Conditional requires a boolean condition');\n }\n return condition ? this.evaluate(expr.thenExpr) : this.evaluate(expr.otherwiseExpr);\n }\n\n visitIndex(expr: Index): unknown {\n const operand = this.evaluate(expr.operand);\n const index = this.evaluate(expr.index);\n\n if (operand === null || operand === undefined) {\n throw new EvaluationError('Cannot index null value');\n }\n\n if (Array.isArray(operand)) {\n if (!isNumeric(index)) {\n throw new EvaluationError('List index must be an integer');\n }\n const idx = Number(typeof index === 'number' ? Math.trunc(index) : index);\n if (idx < 0 || idx >= operand.length) {\n throw new EvaluationError(`List index out of bounds: ${idx}`);\n }\n return operand[idx];\n }\n if (operand instanceof Map) {\n if (!Utilities.contains(operand, index)) {\n throw new EvaluationError(`Map key not found: ${Utilities.asString(index)}`);\n }\n return Utilities.select(operand, index);\n }\n if (isBytes(operand)) {\n if (!isNumeric(index)) {\n throw new EvaluationError('Bytes index must be an integer');\n }\n const at = Number(typeof index === 'number' ? Math.trunc(index) : index);\n if (at < 0 || at >= operand.length) {\n throw new EvaluationError(`Bytes index out of bounds: ${at}`);\n }\n return BigInt(operand[at]!);\n }\n if (typeof operand === 'string') {\n if (!isNumeric(index)) {\n throw new EvaluationError('String index must be an integer');\n }\n // Indexed by code point, so a supplementary character is one position and is never split\n const idx = Number(typeof index === 'number' ? Math.trunc(index) : index);\n const offset = idx < 0 ? -1 : Utilities.offsetByCodePoints(operand, idx);\n if (offset < 0 || offset >= operand.length) {\n throw new EvaluationError(`String index out of bounds: ${idx}`);\n }\n return String.fromCodePoint(operand.codePointAt(offset)!);\n }\n\n throw new EvaluationError(`Cannot index type: ${Utilities.typeOf(operand)}`);\n }\n\n // Validates a repetition count against the evaluation limit, before anything is allocated\n private repetitions(count: bigint | number, width: number): number {\n const repeats = typeof count === 'bigint' ? count : BigInt(Math.trunc(count));\n if (repeats < 0n) {\n throw new EvaluationError(`Repetition count must not be negative: ${repeats}`);\n }\n // Bounding the count first keeps the product within range\n if (repeats > BigInt(Utilities.LIMIT) || repeats * BigInt(width) > BigInt(Utilities.LIMIT)) {\n throw new EvaluationError(`Repetition exceeds the evaluation limit of ${Utilities.LIMIT}`);\n }\n return Number(repeats);\n }\n\n // Applies an arithmetic operator: two ints stay exact 64-bit, otherwise both become doubles\n private arithmetic(\n left: bigint | number,\n right: bigint | number,\n ints: (a: bigint, b: bigint) => bigint,\n doubles: (a: number, b: number) => number\n ): bigint | number {\n if (typeof left === 'bigint' && typeof right === 'bigint') {\n return checkInt64(ints(left, right));\n }\n return doubles(Number(left), Number(right));\n }\n\n // Ordering for the relational operators\n private compare(left: unknown, right: unknown): number {\n if ((left === null || left === undefined) && (right === null || right === undefined)) {\n return 0;\n }\n if (left === null || left === undefined) {\n return -1;\n }\n if (right === null || right === undefined) {\n return 1;\n }\n\n if (Array.isArray(left) && Array.isArray(right)) {\n const size = Math.min(left.length, right.length);\n for (let i = 0; i < size; i++) {\n const cmp = this.compare(left[i], right[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n return left.length - right.length;\n }\n\n try {\n return Utilities.compare(left, right);\n } catch (error) {\n if (isCelError(error)) {\n throw new EvaluationError(\n `Cannot compare types: ${Utilities.typeOf(left)} and ${Utilities.typeOf(right)}`\n );\n }\n throw error;\n }\n }\n}\n","import { Expression } from './ast/index.js';\nimport { Functions } from './functions/index.js';\nimport { Interpreter } from './interpreter/index.js';\n\n/**\n * A compiled CEL program that can be evaluated multiple times.\n *\n * A Program represents a parsed CEL expression that can be efficiently evaluated\n * with different sets of variables. This is more efficient than parsing the\n * expression each time it needs to be evaluated.\n *\n * Programs are created using CEL.compile() and should be reused when the same\n * expression needs to be evaluated multiple times.\n *\n * @example\n * ```typescript\n * const program = cel.compile('price * quantity');\n * const result1 = program.evaluate({ price: 10, quantity: 5 });\n * const result2 = program.evaluate({ price: 20, quantity: 3 });\n * ```\n */\nexport class Program {\n /**\n * Creates a new compiled program.\n *\n * This constructor is typically called by CEL.compile() and should not be used directly.\n *\n * @param ast The abstract syntax tree of the compiled expression\n * @param functions The function library to use for evaluation\n */\n constructor(\n private readonly ast: Expression,\n private readonly functions: Functions\n ) {}\n\n /**\n * Evaluates the compiled program with the given variables.\n *\n * @param variables A map of variable names to their values\n * @returns The result of evaluating the expression\n * @throws EvaluationError if an error occurs during evaluation\n *\n * @example\n * ```typescript\n * const result = program.evaluate({\n * x: 10,\n * y: 20,\n * items: [1, 2, 3]\n * });\n * ```\n */\n evaluate(variables: Record<string, unknown> | Map<string, unknown> = {}): unknown {\n const interpreter = new Interpreter(variables, this.functions);\n return interpreter.evaluate(this.ast);\n }\n}\n","import { Parser } from './parser/index.js';\nimport { Functions, StandardFunctions } from './functions/index.js';\nimport { Program } from './program.js';\n\n/**\n * The main entry point for evaluating CEL expressions.\n *\n * The CEL class provides methods to compile and evaluate CEL expressions.\n * It supports all standard CEL operators, functions, and macros.\n *\n * @example\n * ```typescript\n * const cel = new CEL();\n * const result = cel.eval('x * 2 + y', { x: 10, y: 5 });\n * console.log(result); // 25\n * ```\n */\nexport class CEL {\n private readonly functions: Functions;\n\n /**\n * Creates a new CEL evaluator with the standard function library.\n */\n constructor();\n\n /**\n * Creates a new CEL evaluator.\n *\n * @param functions Optional custom function library. If not provided, the standard\n * CEL function library will be used.\n */\n constructor(functions?: Functions | null);\n\n constructor(functions?: Functions | null) {\n this.functions = functions ?? new StandardFunctions();\n }\n\n /**\n * Compiles a CEL expression using the provided function library.\n *\n * This static convenience method avoids the need to instantiate CEL when\n * callers just need to compile once.\n *\n * @param expression The CEL expression to compile\n * @param functions The function library to use when compiling the program\n * @returns A compiled Program using the provided functions\n * @throws ParseError if the expression is invalid\n *\n * @example\n * ```typescript\n * const program = CEL.compile('x + y', new StandardFunctions());\n * ```\n */\n static compile(expression: string, functions: Functions): Program {\n const parser = new Parser(expression);\n return new Program(parser.parse(), functions);\n }\n\n /**\n * Evaluates a CEL expression with the given variables using the provided function library.\n *\n * This static convenience method avoids the need to instantiate CEL when callers\n * just need to evaluate an expression once.\n *\n * @param expression The CEL expression to evaluate\n * @param functions The function library to use when evaluating the expression\n * @param variables A map of variable names to their values\n * @returns The result of evaluating the expression\n * @throws ParseError if the expression is invalid\n * @throws EvaluationError if an error occurs during evaluation\n *\n * @example\n * ```typescript\n * const result = CEL.eval('x * 2', new StandardFunctions(), { x: 5 });\n * ```\n */\n static eval(\n expression: string,\n functions: Functions,\n variables: Record<string, unknown> | Map<string, unknown>\n ): unknown {\n const program = this.compile(expression, functions);\n return program.evaluate(variables);\n }\n\n /**\n * Compiles a CEL expression into a reusable program.\n *\n * This method parses the expression and returns a Program that can be evaluated\n * multiple times with different variables. This is more efficient than calling\n * eval() repeatedly with the same expression.\n *\n * @param expression The CEL expression to compile\n * @returns A compiled program\n * @throws ParseError if the expression is invalid\n *\n * @example\n * ```typescript\n * const program = cel.compile('price * quantity');\n * const result1 = program.evaluate({ price: 10, quantity: 5 });\n * const result2 = program.evaluate({ price: 20, quantity: 3 });\n * ```\n */\n compile(expression: string): Program {\n return CEL.compile(expression, this.functions);\n }\n\n /**\n * Evaluates a CEL expression with the given variables.\n *\n * This is a convenience method that compiles and evaluates the expression in one step.\n * For better performance when evaluating the same expression multiple times, use\n * compile() to create a reusable Program.\n *\n * @param expression The CEL expression to evaluate\n * @param variables A map of variable names to their values\n * @returns The result of evaluating the expression\n * @throws ParseError if the expression is invalid\n * @throws EvaluationError if an error occurs during evaluation\n *\n * @example\n * ```typescript\n * const result = cel.eval('user.age >= 18', {\n * user: { name: 'Alice', age: 25 }\n * });\n * ```\n */\n eval(\n expression: string,\n variables: Record<string, unknown> | Map<string, unknown> = {}\n ): unknown {\n return CEL.eval(expression, this.functions, variables);\n }\n}\n","import {\n Binary,\n BinaryOp,\n Call,\n Comprehension,\n Conditional,\n Expression,\n Identifier,\n Index,\n ListExpression,\n Literal,\n LiteralType,\n MapExpression,\n Select,\n Struct,\n Unary,\n UnaryOp,\n Visitor,\n} from '../ast/index.js';\nimport { ArgumentError } from '../errors.js';\nimport * as Strings from '../functions/strings.js';\nimport * as Utilities from '../functions/utilities.js';\nimport { javaDoubleToString } from '../values/numbers.js';\n\nconst CONDITIONAL = 1;\nconst MEMBER = 8;\nconst PRIMARY = 9;\n\n/**\n * Rendering options for {@link Printer}.\n */\nexport class PrinterOptions {\n /**\n * @param wrap Whether to break long constructs across lines\n * @param indent The number of spaces per indentation level\n * @param width The maximum line width before a construct is broken\n */\n constructor(\n readonly wrap: boolean,\n readonly indent: number,\n readonly width: number\n ) {}\n\n /** Options for a single line rendering. */\n static compact(): PrinterOptions {\n return new PrinterOptions(false, 0, Number.MAX_SAFE_INTEGER);\n }\n\n /** Options for a multi-line rendering indented by two spaces at a width of 100. */\n static pretty(): PrinterOptions {\n return new PrinterOptions(true, 2, 100);\n }\n}\n\n/**\n * Renders an expression tree back into CEL source text.\n *\n * The compact form is a single line that parses back into an equivalent tree,\n * with parentheses only where operator precedence requires them. The pretty form\n * breaks lists, maps, structs, argument lists and logical chains across lines\n * once they no longer fit within the configured width.\n *\n * Expressions built by the parser always round-trip. A {@link Comprehension},\n * which the parser never produces, is rendered in a diagnostic form that is not\n * valid CEL.\n *\n * @example\n * ```typescript\n * const expr = new Parser('a + (b * c)').parse();\n * Printer.print(expr); // 'a + b * c'\n * Printer.print(expr, PrinterOptions.pretty()); // same, it fits on one line\n * ```\n */\nexport class Printer implements Visitor<string> {\n private level = 0;\n\n private constructor(private readonly options: PrinterOptions) {}\n\n /**\n * Renders the given expression as CEL source.\n *\n * @param expr The expression to render\n * @param options The rendering options; compact by default\n * @returns The rendered text\n */\n static print(expr: Expression, options: PrinterOptions = PrinterOptions.compact()): string {\n return new Printer(options).text(expr);\n }\n\n private static precedence(expr: Expression): number {\n if (expr instanceof Conditional) {\n return CONDITIONAL;\n }\n if (expr instanceof Binary) {\n switch (expr.op) {\n case BinaryOp.LOGICAL_OR:\n return 2;\n case BinaryOp.LOGICAL_AND:\n return 3;\n case BinaryOp.EQUAL:\n case BinaryOp.NOT_EQUAL:\n case BinaryOp.LESS:\n case BinaryOp.LESS_EQUAL:\n case BinaryOp.GREATER:\n case BinaryOp.GREATER_EQUAL:\n case BinaryOp.IN:\n return 4;\n case BinaryOp.ADD:\n case BinaryOp.SUBTRACT:\n return 5;\n case BinaryOp.MULTIPLY:\n case BinaryOp.DIVIDE:\n case BinaryOp.MODULO:\n return 6;\n }\n }\n if (expr instanceof Unary) {\n return 7;\n }\n return PRIMARY;\n }\n\n private static spelling(op: BinaryOp): string {\n switch (op) {\n case BinaryOp.ADD:\n return '+';\n case BinaryOp.SUBTRACT:\n return '-';\n case BinaryOp.MULTIPLY:\n return '*';\n case BinaryOp.DIVIDE:\n return '/';\n case BinaryOp.MODULO:\n return '%';\n case BinaryOp.EQUAL:\n return '==';\n case BinaryOp.NOT_EQUAL:\n return '!=';\n case BinaryOp.LESS:\n return '<';\n case BinaryOp.LESS_EQUAL:\n return '<=';\n case BinaryOp.GREATER:\n return '>';\n case BinaryOp.GREATER_EQUAL:\n return '>=';\n case BinaryOp.LOGICAL_AND:\n return '&&';\n case BinaryOp.LOGICAL_OR:\n return '||';\n case BinaryOp.IN:\n return 'in';\n }\n }\n\n private static decimal(value: number): string {\n if (!Number.isFinite(value)) {\n throw new ArgumentError(`Cannot render ${value} as a CEL literal`);\n }\n return javaDoubleToString(value);\n }\n\n // Renders a node without any enclosing parentheses\n private text(expr: Expression): string {\n if (this.options.wrap) {\n const compact = Printer.print(expr, PrinterOptions.compact());\n if (this.level * this.options.indent + compact.length <= this.options.width) {\n return compact;\n }\n }\n return expr.accept(this);\n }\n\n // Renders a node, adding parentheses when its precedence is below the required level\n private render(expr: Expression, least: number): string {\n const body = this.text(expr);\n return Printer.precedence(expr) < least ? `(${body})` : body;\n }\n\n // Renders children one level deeper when wrapping\n private nested<T>(body: () => T): T {\n const broken = this.options.wrap ? 1 : 0;\n this.level += broken;\n try {\n return body();\n } finally {\n this.level -= broken;\n }\n }\n\n visitLiteral(expr: Literal): string {\n const value = expr.value;\n switch (expr.literalType) {\n case LiteralType.NULL_VALUE:\n return 'null';\n case LiteralType.BOOL:\n case LiteralType.INT:\n return String(value);\n case LiteralType.UINT:\n return `${value}u`;\n case LiteralType.DOUBLE:\n return Printer.decimal(Utilities.asDouble(value));\n case LiteralType.STRING:\n return Strings.quote(Utilities.asString(value));\n case LiteralType.BYTES:\n return `b\"${Strings.escapeBytes(Utilities.asBytes(value))}\"`;\n }\n }\n\n visitIdentifier(expr: Identifier): string {\n return expr.name;\n }\n\n visitSelect(expr: Select): string {\n const operand = expr.operand === null ? '' : this.render(expr.operand, MEMBER);\n const selection = `${operand}.${expr.field}`;\n return expr.isTest ? `has(${selection})` : selection;\n }\n\n visitCall(expr: Call): string {\n const target = expr.target === null ? '' : `${this.render(expr.target, MEMBER)}.`;\n const args = this.nested(() => expr.args.map((arg) => this.text(arg)));\n return `${target}${expr.functionName}${this.group('(', args, ')')}`;\n }\n\n visitList(expr: ListExpression): string {\n return this.group('[', this.parts(expr.elements), ']');\n }\n\n visitMap(expr: MapExpression): string {\n const entries = this.nested(() =>\n expr.entries.map((entry) => `${this.text(entry.key)}: ${this.text(entry.value)}`)\n );\n return this.group('{', entries, '}');\n }\n\n visitStruct(expr: Struct): string {\n const fields = this.nested(() =>\n expr.fields.map((field) => `${field.field}: ${this.text(field.value)}`)\n );\n return `${expr.typeName ?? ''}${this.group('{', fields, '}')}`;\n }\n\n visitComprehension(expr: Comprehension): string {\n const parts = [\n expr.variable,\n this.text(expr.range),\n expr.accumulator,\n this.text(expr.initializer),\n this.text(expr.condition),\n this.text(expr.step),\n this.text(expr.result),\n ];\n return `__comprehension__${this.group('(', parts, ')')}`;\n }\n\n visitUnary(expr: Unary): string {\n const operator = expr.op === UnaryOp.NOT ? '!' : '-';\n return operator + this.render(expr.operand, 7);\n }\n\n visitBinary(expr: Binary): string {\n const order = Printer.precedence(expr);\n const left = this.render(expr.left, order);\n const right = this.render(expr.right, order + 1);\n const operator = Printer.spelling(expr.op);\n\n if (\n this.options.wrap &&\n (expr.op === BinaryOp.LOGICAL_AND || expr.op === BinaryOp.LOGICAL_OR)\n ) {\n return `${left}\\n${this.pad(this.level)}${operator} ${right}`;\n }\n return `${left} ${operator} ${right}`;\n }\n\n visitConditional(expr: Conditional): string {\n const condition = this.render(expr.condition, CONDITIONAL + 1);\n const [then, otherwise] = this.nested(() => [\n this.render(expr.thenExpr, CONDITIONAL + 1),\n this.render(expr.otherwiseExpr, CONDITIONAL),\n ]);\n\n if (this.options.wrap) {\n const inner = this.pad(this.level + 1);\n return `${condition}\\n${inner}? ${then}\\n${inner}: ${otherwise}`;\n }\n return `${condition} ? ${then} : ${otherwise}`;\n }\n\n visitIndex(expr: Index): string {\n return `${this.render(expr.operand, MEMBER)}[${this.text(expr.index)}]`;\n }\n\n private parts(expressions: Expression[]): string[] {\n return this.nested(() => expressions.map((expr) => this.text(expr)));\n }\n\n private group(open: string, parts: string[], close: string): string {\n if (!this.options.wrap || parts.length === 0) {\n return `${open}${parts.join(', ')}${close}`;\n }\n const inner = this.pad(this.level + 1);\n return `${open}\\n${inner}${parts.join(`,\\n${inner}`)}\\n${this.pad(this.level)}${close}`;\n }\n\n private pad(depth: number): string {\n return ' '.repeat(depth * this.options.indent);\n }\n}\n"],"names":["ParseError","message","line","column","TokenType","Token","type","value","Lexer","input","count","ch","n","i","start","next","offset","isRaw","prefix","quote","suffix","isDouble","sign","c","pos","BinaryOp","UnaryOp","LiteralType","Literal","literalType","visitor","Identifier","name","Select","operand","field","isTest","Index","index","Call","target","functionName","args","isMacro","ListExpression","elements","MapEntry","key","MapExpression","entries","FieldInitializer","Struct","typeName","fields","Comprehension","variable","range","accumulator","initializer","condition","step","result","Unary","op","Binary","left","right","Conditional","thenExpr","otherwiseExpr","ENCODER","DECODER","isBytes","utf8Encode","text","utf8Decode","bytes","bytesEqual","bytesCompare","size","a","b","concatBytes","bytesToHex","byte","EvaluationError","ArgumentError","isCelError","error","INT64_MIN","INT64_MAX","isInt","isNumeric","checkInt64","truncateToInt64","zero","compareDoubles","leftNaN","rightNaN","compareIntToDouble","exact","floor","order","scalar","javaDoubleToString","magnitude","mantissa","exponent","MACRO_METHODS","MAX_DEPTH","Parser","expr","operator","qualified","expressions","currentType","first","token","negative","digits","content","pending","flush","simple","hex","codePoint","octal","lookahead","_Type","other","Type","SECONDS_PER_DAY","floorDiv","dividend","divisor","quotient","floorMod","remainder","daysFromCivil","year","month","day","y","era","yoe","doy","doe","civilFromDays","days","z","mp","isLeapYear","daysInMonth","utcFields","seconds","secondOfDay","FORMATTERS","zoneFormatter","zone","cached","formatter","MAX_DATE_SECONDS","offsetSeconds","parts","part","hour","fieldsOf","NANOS_PER_SECOND","DURATION_FORM","DURATION_PART","UNIT_NANOS","_Duration","nanos","nanoAdjustment","total","millis","minutes","hours","scale","denominator","numerator","whole","fraction","Duration","RFC3339","_Timestamp","date","match","minute","second","duration","pad","Timestamp","nanCounter","IDENTITIES","identityCounter","identityOf","id","numberKey","canonicalKey","k","v","proto","KeySet","KeyMap","normalize","convert","normalizeResult","isPlainObject","ancestors","integers","descend","item","body","LIMIT","SPAN","INT_TEXT","DOUBLE_TEXT","limit","what","isMap","codePointCount","code","offsetByCodePoints","remaining","sizeOf","typeOf","asInt","parsed","asString","asUInt","asDouble","asBytes","asBool","has","contains","map","candidate","equals","select","matches","pattern","regex","timestamp","asDuration","at","instant","dateOf","monthOf","yearOf","hoursOf","minutesOf","secondsOf","millisecondsOf","weekdayOf","ordinalOf","max","values","compare","min","leftMap","toMap","rightMap","indexed","deepEquals","containsInArray","array","Utilities.codePointCount","Utilities.offsetByCodePoints","position","found","charAt","indexOf","search","lastIndexOf","lower","upper","substring","end","reverse","replace","from","to","Utilities.limit","split","separator","keep","join","projected","format","template","precision","number","Utilities.LIMIT","verb","Utilities.asString","Utilities.asInt","fixed","Utilities.asDouble","scientific","unsigned","radix","scaled","escape","escapeBytes","compile","flags","groupCount","replacement","pieces","rewrite","last","expand","extract","groups","extractAll","group","piece","distinct","seen","flatten","depth","slice","sort","Utilities.compare","Utilities.containsInArray","subset","equivalent","intersects","spread","greatest","Utilities.max","least","Utilities.min","abs","ceil","round","trunc","sqrt","isNaN","isInf","isFinite","and","or","xor","not","shiftCount","bits","ALPHABET","VALUES","encode","Utilities.asBytes","chunk","rest","decode","data","padding","buffer","sextet","QUALIFIED","MACROS","TIME_ACCESSORS","require","most","list","single","operation","pair","StandardFunctions","Utilities.sizeOf","Utilities.asUInt","Utilities.asBool","Utilities.typeOf","Utilities.has","Utilities.matches","Utilities.timestamp","Utilities.asDuration","Utilities.dateOf","Utilities.monthOf","Utilities.yearOf","Utilities.hoursOf","Utilities.minutesOf","Utilities.secondsOf","Utilities.weekdayOf","Utilities.ordinalOf","Utilities.millisecondsOf","method","Strings.replace","Strings.split","Strings.charAt","Strings.indexOf","Strings.lastIndexOf","Strings.lower","Strings.upper","Strings.substring","Strings.join","Strings.format","Lists.reverse","Strings.reverse","Lists.distinct","Lists.flatten","Lists.slice","Lists.sort","Lists.first","Lists.last","Maths.greatest","Maths.least","Maths.abs","Maths.ceil","Maths.floor","Maths.round","Maths.trunc","Maths.sign","Maths.sqrt","Maths.isNaN","Maths.isInf","Maths.isFinite","Maths.and","Maths.or","Maths.xor","Maths.not","Maths.left","Maths.right","Sets.contains","Sets.equivalent","Sets.intersects","Codecs.encode","Codecs.decode","Lists.range","Strings.quote","Regexes.replace","Regexes.extract","Regexes.extractAll","e","OPERATOR_SPELLING","Interpreter","variables","functions","steps","arg","namespace","dot","variableName","saved","had","bind","predicate","transform","results","keys","_","element","entry","iteratorSaved","accumulatorSaved","hadIterator","hadAccumulator","head","tail","Utilities.equals","Utilities.contains","absorbing","spelling","idx","Utilities.select","width","repeats","ints","doubles","cmp","Program","ast","CEL","expression","parser","CONDITIONAL","MEMBER","PRIMARY","PrinterOptions","wrap","indent","Printer","options","compact","broken","Strings.escapeBytes","selection","then","otherwise","inner","open","close"],"mappings":"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"}