@gabrielbryk/jq-ts 1.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["keywordKinds: Record<string, TokenKind | undefined>","tokens: Token[]","tokens: Token[]","extract: FilterNode | undefined","handler: FilterNode | undefined","branches: { cond: FilterNode; then: FilterNode }[]","items: FilterNode[]","entries: ObjectEntry[]","expr: FilterNode","args: FilterNode[]","isPlainObject","describeType","emit","builtins: Record<string, BuiltinSpec>","describeType","evaluate","keyStr: string","result: Value[]","pairs: { val: Value; key: Value }[]","seen: Value[]","seenKeys: Value[]","result: ValueObject","entries: Value[]","transformed: Value[]","parts: string[]","isPlainObject","obj: Record<string, Value>","arr: Value[]","byKey: Record<string, (string | number)[][]>","actions: Record<number, (string | number)[][]>","finalArr: Value[]","DEFAULT_LIMITS: ResolvedLimits","limits: ResolvedLimits","env: EnvStack","result: Value[]","partials: Record<string, Value>[]","next: Record<string, Value>[]","result: Record<string, Value>","next: Record<string, Value>"],"sources":["../src/errors.ts","../src/tokens.ts","../src/lexer.ts","../src/parser.ts","../src/value.ts","../src/builtins.ts","../src/validate.ts","../src/limits.ts","../src/eval.ts","../src/index.ts"],"sourcesContent":["import type { Span } from './span'\n\n/**\n * Categories of errors that can occur during processing.\n * - `lex`: Errors during lexical analysis (invalid characters).\n * - `parse`: Errors during parsing (syntax errors).\n * - `validate`: Errors during semantics checking (unsupported features).\n * - `runtime`: Errors during execution (type errors, limits).\n */\nexport type ErrorKind = 'lex' | 'parse' | 'validate' | 'runtime'\n\n/**\n * Common interface for all errors thrown by the jq-ts library.\n */\nexport interface JqTsError extends Error {\n /** The category of the error. */\n kind: ErrorKind\n /** The source code span where the error occurred. */\n span: Span\n}\n\nclass BaseError extends Error implements JqTsError {\n kind: ErrorKind\n span: Span\n\n constructor(kind: ErrorKind, message: string, span: Span) {\n super(message)\n this.kind = kind\n this.span = span\n const pascalKind = kind.charAt(0).toUpperCase() + kind.slice(1)\n this.name = `${pascalKind}Error`\n }\n}\n\n/**\n * Thrown when the lexer encounters invalid input characters.\n */\nexport class LexError extends BaseError {\n constructor(message: string, span: Span) {\n super('lex', message, span)\n }\n}\n\n/**\n * Thrown when the parser encounters invalid syntax.\n */\nexport class ParseError extends BaseError {\n constructor(message: string, span: Span) {\n super('parse', message, span)\n }\n}\n\n/**\n * Thrown when the AST contains unsupported or invalid features (e.g., restricted operators).\n */\nexport class ValidationError extends BaseError {\n constructor(message: string, span: Span) {\n super('validate', message, span)\n }\n}\n\n/**\n * Thrown during execution for runtime issues (type errors, limits exceeded, user-raised errors).\n */\nexport class RuntimeError extends BaseError {\n constructor(message: string, span: Span) {\n super('runtime', message, span)\n }\n}\n","import type { Span } from './span'\n\nexport type TokenKind =\n | 'Null'\n | 'True'\n | 'False'\n | 'Number'\n | 'String'\n | 'Identifier'\n | 'Variable'\n | 'Dot'\n | 'Comma'\n | 'Pipe'\n | 'Alt'\n | 'LParen'\n | 'RParen'\n | 'LBracket'\n | 'RBracket'\n | 'LBrace'\n | 'RBrace'\n | 'Colon'\n | 'Plus'\n | 'Minus'\n | 'Star'\n | 'Slash'\n | 'Percent'\n | 'EqualEqual'\n | 'BangEqual'\n | 'Less'\n | 'LessEqual'\n | 'Greater'\n | 'GreaterEqual'\n | 'If'\n | 'Then'\n | 'Elif'\n | 'Else'\n | 'End'\n | 'As'\n | 'And'\n | 'Or'\n | 'Not'\n | 'Reduce'\n | 'Foreach'\n | 'Try'\n | 'Catch'\n | 'DotDot'\n | 'Semicolon'\n | 'EOF'\n\nexport interface Token {\n kind: TokenKind\n span: Span\n value?: string | number\n}\n\nexport const keywordKinds: Record<string, TokenKind | undefined> = {\n if: 'If',\n then: 'Then',\n elif: 'Elif',\n else: 'Else',\n end: 'End',\n as: 'As',\n and: 'And',\n or: 'Or',\n not: 'Not',\n null: 'Null',\n true: 'True',\n false: 'False',\n reduce: 'Reduce',\n foreach: 'Foreach',\n try: 'Try',\n catch: 'Catch',\n}\n","import { LexError } from './errors'\nimport type { Span } from './span'\nimport type { Token, TokenKind } from './tokens'\nimport { keywordKinds } from './tokens'\n\nexport const lex = (text: string): Token[] => {\n const tokens: Token[] = []\n const length = text.length\n let pos = 0\n\n const peek = (offset = 0) => text[pos + offset]\n const advance = () => text[pos++]\n const makeSpan = (start: number, end: number): Span => ({ start, end })\n const pushToken = (kind: TokenKind, start: number, end: number, value?: string | number) => {\n tokens.push({ kind, span: makeSpan(start, end), value })\n }\n\n const isWhitespace = (ch: string | undefined) =>\n ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r'\n const isDigit = (ch: string | undefined) => !!ch && ch >= '0' && ch <= '9'\n const isIdentifierStart = (ch: string | undefined) =>\n !!ch && ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_')\n const isIdentifierPart = (ch: string | undefined) => isIdentifierStart(ch) || isDigit(ch)\n\n while (pos < length) {\n const ch = peek()\n if (isWhitespace(ch)) {\n advance()\n continue\n }\n if (ch === '#') {\n while (pos < length && peek() !== '\\n') advance()\n continue\n }\n const start = pos\n switch (ch) {\n case '\"': {\n const endPos = readString(start)\n const value = readStringValue(start, start + 1, endPos - 1)\n pushToken('String', start, endPos, value)\n continue\n }\n case '.': {\n advance()\n if (peek() === '.') {\n advance()\n pushToken('DotDot', start, pos)\n } else {\n pushToken('Dot', start, pos)\n }\n continue\n }\n case ';': {\n advance()\n pushToken('Semicolon', start, pos)\n continue\n }\n case ',': {\n advance()\n pushToken('Comma', start, pos)\n continue\n }\n case '|': {\n advance()\n pushToken('Pipe', start, pos)\n continue\n }\n case '/': {\n advance()\n if (peek() === '/') {\n advance()\n pushToken('Alt', start, pos)\n } else {\n pushToken('Slash', start, pos)\n }\n continue\n }\n case '(': {\n advance()\n pushToken('LParen', start, pos)\n continue\n }\n case ')': {\n advance()\n pushToken('RParen', start, pos)\n continue\n }\n case '[': {\n advance()\n pushToken('LBracket', start, pos)\n continue\n }\n case ']': {\n advance()\n pushToken('RBracket', start, pos)\n continue\n }\n case '{': {\n advance()\n pushToken('LBrace', start, pos)\n continue\n }\n case '}': {\n advance()\n pushToken('RBrace', start, pos)\n continue\n }\n case ':': {\n advance()\n pushToken('Colon', start, pos)\n continue\n }\n case '+': {\n advance()\n pushToken('Plus', start, pos)\n continue\n }\n case '-': {\n advance()\n pushToken('Minus', start, pos)\n continue\n }\n case '*': {\n advance()\n pushToken('Star', start, pos)\n continue\n }\n case '%': {\n advance()\n pushToken('Percent', start, pos)\n continue\n }\n case '=': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('EqualEqual', start, pos)\n } else {\n throw new LexError('Unexpected \"=\" (only \"==\" supported)', makeSpan(start, pos))\n }\n continue\n }\n case '!': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('BangEqual', start, pos)\n } else {\n throw new LexError('Unexpected \"!\" (only \"!=\" supported)', makeSpan(start, pos))\n }\n continue\n }\n case '<': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('LessEqual', start, pos)\n } else {\n pushToken('Less', start, pos)\n }\n continue\n }\n case '>': {\n advance()\n if (peek() === '=') {\n advance()\n pushToken('GreaterEqual', start, pos)\n } else {\n pushToken('Greater', start, pos)\n }\n continue\n }\n case '$': {\n advance()\n if (!isIdentifierStart(peek())) {\n throw new LexError('Expected identifier after \"$\"', makeSpan(start, pos))\n }\n const nameStart = pos\n while (isIdentifierPart(peek())) advance()\n pushToken('Variable', start, pos, text.slice(nameStart, pos))\n continue\n }\n default:\n break\n }\n\n if (isDigit(ch)) {\n const end = readNumber(start)\n const raw = text.slice(start, end)\n const value = Number(raw)\n if (!Number.isFinite(value)) {\n throw new LexError(`Invalid number literal: ${raw}`, makeSpan(start, end))\n }\n pushToken('Number', start, end, value)\n continue\n }\n\n if (isIdentifierStart(ch)) {\n while (isIdentifierPart(peek())) advance()\n const raw = text.slice(start, pos)\n const keyword = keywordKinds[raw]\n if (keyword === 'Null' || keyword === 'True' || keyword === 'False') {\n pushToken(keyword, start, pos)\n } else if (keyword) {\n pushToken(keyword, start, pos)\n } else {\n pushToken('Identifier', start, pos, raw)\n }\n continue\n }\n\n throw new LexError(`Unexpected character \"${ch}\"`, makeSpan(start, start + 1))\n }\n\n pushToken('EOF', pos, pos)\n return tokens\n\n function readNumber(tokenStart: number): number {\n while (isDigit(peek())) advance()\n if (peek() === '.' && isDigit(peek(1))) {\n advance()\n while (isDigit(peek())) advance()\n }\n if (peek() === 'e' || peek() === 'E') {\n advance()\n if (peek() === '+' || peek() === '-') advance()\n if (!isDigit(peek())) {\n throw new LexError(`Invalid exponent in number literal`, makeSpan(tokenStart, pos))\n }\n while (isDigit(peek())) advance()\n }\n return pos\n }\n\n function readString(tokenStart: number): number {\n advance() // consume opening \"\n while (pos < length) {\n const current = advance()\n if (current === '\"') {\n return pos\n }\n if (current === '\\\\') {\n const esc = advance()\n if (!esc) {\n break\n }\n if ('\"\\\\/bfnrt'.includes(esc)) {\n continue\n }\n if (esc === 'u') {\n for (let i = 0; i < 4; i += 1) {\n const hex = advance()\n if (!hex || !isHexDigit(hex)) {\n throw new LexError(\n 'Invalid Unicode escape in string literal',\n makeSpan(tokenStart, pos)\n )\n }\n }\n continue\n }\n throw new LexError(`Invalid escape sequence \"\\\\${esc}\"`, makeSpan(tokenStart, pos))\n }\n }\n throw new LexError('Unterminated string literal', makeSpan(tokenStart, pos))\n }\n\n function readStringValue(tokenStart: number, innerStart: number, innerEnd: number): string {\n let result = ''\n let i = innerStart\n while (i < innerEnd) {\n const ch = text[i]\n if (ch === '\\\\') {\n const next = text[i + 1]\n switch (next) {\n case '\"':\n case '\\\\':\n case '/':\n result += next\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 'u': {\n const hex = text.slice(i + 2, i + 6)\n result += String.fromCharCode(Number.parseInt(hex, 16))\n i += 6\n break\n }\n default:\n throw new LexError(\n `Invalid escape sequence \"\\\\${next}\"`,\n makeSpan(tokenStart, tokenStart + (i - innerStart) + 2)\n )\n }\n } else {\n result += ch\n i += 1\n }\n }\n return result\n }\n}\n\nconst isHexDigit = (ch: string | undefined) =>\n !!ch && ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F'))\n","import { ParseError } from './errors'\nimport { lex } from './lexer'\nimport type { Span } from './span'\nimport type { Token, TokenKind } from './tokens'\nimport type {\n FilterNode,\n LiteralValue,\n ArrayNode,\n ObjectEntry,\n ObjectKey,\n ObjectNode,\n BinaryOp,\n TryNode,\n ReduceNode,\n ForeachNode,\n} from './ast'\n\n/**\n * Parses a jq source string into an Abstract Syntax Tree (AST).\n *\n * @param source - The input jq query string.\n * @returns The root {@link FilterNode} of the AST.\n * @throws {LexError} If the source contains invalid characters.\n * @throws {ParseError} If the syntax is invalid.\n */\nexport const parse = (source: string): FilterNode => {\n const parser = new Parser(lex(source))\n return parser.parseFilter()\n}\n\nclass Parser {\n private current = 0\n\n constructor(private readonly tokens: Token[]) {}\n\n parseFilter(): FilterNode {\n const expr = this.parseBinding()\n this.consume('EOF', 'Expected end of expression')\n return expr\n }\n\n private parseBinding(): FilterNode {\n let expr = this.parseComma()\n while (this.match('As')) {\n const varToken = this.consume('Variable', 'Expected variable name after \"as\"')\n this.consume('Pipe', 'Expected \"|\" after variable binding')\n const body = this.parseBinding()\n expr = {\n kind: 'As',\n bind: expr,\n name: String(varToken.value),\n body,\n span: spanBetween(expr.span, body.span),\n }\n }\n return expr\n }\n\n private parseComma(): FilterNode {\n let expr = this.parsePipe()\n while (this.match('Comma')) {\n const right = this.parsePipe()\n expr = {\n kind: 'Comma',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parsePipe(): FilterNode {\n let expr = this.parsePipeOperand()\n while (this.match('Pipe')) {\n const right = this.parsePipeOperand()\n expr = {\n kind: 'Pipe',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parsePipeOperand(): FilterNode {\n return this.parseAlt()\n }\n\n private parseAlt(): FilterNode {\n let expr = this.parseOr()\n while (this.match('Alt')) {\n const right = this.parseOr()\n expr = {\n kind: 'Alt',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parseOr(): FilterNode {\n let expr = this.parseAnd()\n while (this.match('Or')) {\n const right = this.parseAnd()\n expr = {\n kind: 'Bool',\n op: 'Or',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parseAnd(): FilterNode {\n let expr = this.parseComparison()\n while (this.match('And')) {\n const right = this.parseComparison()\n expr = {\n kind: 'Bool',\n op: 'And',\n left: expr,\n right,\n span: spanBetween(expr.span, right.span),\n }\n }\n return expr\n }\n\n private parseComparison(): FilterNode {\n let expr = this.parseAdd()\n while (true) {\n if (this.match('EqualEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Eq')\n } else if (this.match('BangEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Neq')\n } else if (this.match('Less')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Lt')\n } else if (this.match('LessEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Lte')\n } else if (this.match('Greater')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Gt')\n } else if (this.match('GreaterEqual')) {\n const right = this.parseAdd()\n expr = this.makeBinary(expr, right, 'Gte')\n } else {\n break\n }\n }\n return expr\n }\n\n private parseAdd(): FilterNode {\n let expr = this.parseMul()\n while (true) {\n if (this.match('Plus')) {\n const right = this.parseMul()\n expr = this.makeBinary(expr, right, '+')\n } else if (this.match('Minus')) {\n const right = this.parseMul()\n expr = this.makeBinary(expr, right, '-')\n } else {\n break\n }\n }\n return expr\n }\n\n private parseMul(): FilterNode {\n let expr = this.parseUnary()\n while (true) {\n if (this.match('Star')) {\n const right = this.parseUnary()\n expr = this.makeBinary(expr, right, '*')\n } else if (this.match('Slash')) {\n const right = this.parseUnary()\n expr = this.makeBinary(expr, right, '/')\n } else if (this.match('Percent')) {\n const right = this.parseUnary()\n expr = this.makeBinary(expr, right, '%')\n } else {\n break\n }\n }\n return expr\n }\n\n private parseUnary(): FilterNode {\n if (this.match('Not')) {\n const op = this.previous()\n const expr = this.parseUnary()\n return {\n kind: 'Unary',\n op: 'Not',\n expr,\n span: spanBetween(op.span, expr.span),\n }\n }\n if (this.match('Minus')) {\n const op = this.previous()\n const expr = this.parseUnary()\n return {\n kind: 'Unary',\n op: 'Neg',\n expr,\n span: spanBetween(op.span, expr.span),\n }\n }\n return this.parsePostfix()\n }\n\n private parsePostfix(): FilterNode {\n let expr = this.parsePrimary()\n while (true) {\n if (this.match('Dot')) {\n expr = this.finishFieldAccess(expr)\n continue\n }\n if (this.match('LBracket')) {\n if (this.match('RBracket')) {\n const close = this.previous()\n expr = {\n kind: 'Iterate',\n target: expr,\n span: spanBetween(expr.span, close.span),\n }\n continue\n }\n const index = this.parsePipe()\n const closing = this.consume('RBracket', 'Expected \"]\" after index expression')\n expr = {\n kind: 'IndexAccess',\n target: expr,\n index,\n span: spanBetween(expr.span, closing.span),\n }\n continue\n }\n break\n }\n return expr\n }\n\n private parsePrimary(): FilterNode {\n if (this.match('Dot')) {\n return this.parseLeadingDot(this.previous())\n }\n if (this.match('Null')) return this.literalNode(null, this.previous().span)\n if (this.match('True')) return this.literalNode(true, this.previous().span)\n if (this.match('False')) return this.literalNode(false, this.previous().span)\n if (this.match('Number')) {\n return this.literalNode(Number(this.previous().value), this.previous().span)\n }\n if (this.match('String')) {\n return this.literalNode(String(this.previous().value), this.previous().span)\n }\n if (this.match('Variable')) {\n const token = this.previous()\n return {\n kind: 'Var',\n name: String(token.value),\n span: token.span,\n }\n }\n if (this.match('Identifier')) {\n return this.finishIdentifier(this.previous())\n }\n if (this.match('If')) {\n return this.parseIf(this.previous())\n }\n if (this.match('LParen')) {\n const start = this.previous()\n const expr = this.parseComma()\n const close = this.consume('RParen', 'Expected \")\" after expression')\n expr.span = spanBetween(start.span, close.span)\n return expr\n }\n if (this.match('LBracket')) {\n return this.parseArray(this.previous())\n }\n if (this.match('LBrace')) {\n return this.parseObject(this.previous())\n }\n if (this.match('Reduce')) return this.parseReduce(this.previous())\n if (this.match('Foreach')) return this.parseForeach(this.previous())\n if (this.match('Try')) return this.parseTry(this.previous())\n if (this.match('DotDot')) return { kind: 'Recurse', span: this.previous().span }\n throw this.error(this.peek(), 'Unexpected token')\n }\n\n private parseReduce(start: Token): ReduceNode {\n const source = this.parsePipe()\n this.consume('As', 'Expected \"as\" after reduce source')\n const varToken = this.consume('Variable', 'Expected variable after \"as\"')\n this.consume('LParen', 'Expected \"(\" after variable')\n const init = this.parseComma()\n this.consume('Semicolon', 'Expected \";\" after init')\n const update = this.parseComma()\n const end = this.consume('RParen', 'Expected \")\" after update')\n return {\n kind: 'Reduce',\n source,\n var: String(varToken.value),\n init,\n update,\n span: spanBetween(start.span, end.span),\n }\n }\n\n private parseForeach(start: Token): ForeachNode {\n const source = this.parsePipe()\n this.consume('As', 'Expected \"as\" after foreach source')\n const varToken = this.consume('Variable', 'Expected variable after \"as\"')\n this.consume('LParen', 'Expected \"(\" after variable')\n const init = this.parseComma()\n this.consume('Semicolon', 'Expected \";\" after init')\n const update = this.parseComma()\n let extract: FilterNode | undefined\n if (this.match('Semicolon')) {\n extract = this.parseComma()\n }\n const end = this.consume('RParen', 'Expected \")\" after foreach body')\n return {\n kind: 'Foreach',\n source,\n var: String(varToken.value),\n init,\n update,\n extract,\n span: spanBetween(start.span, end.span),\n }\n }\n\n private parseTry(start: Token): TryNode {\n const body = this.parseComma()\n let handler: FilterNode | undefined\n let endSpan = body.span\n if (this.match('Catch')) {\n handler = this.parseComma()\n endSpan = handler.span\n }\n return {\n kind: 'Try',\n body,\n handler,\n span: spanBetween(start.span, endSpan),\n }\n }\n\n private parseIf(start: Token): FilterNode {\n const branches: { cond: FilterNode; then: FilterNode }[] = []\n const firstCond = this.parsePipe()\n this.consume('Then', 'Expected \"then\" after condition')\n const firstThen = this.parsePipe()\n branches.push({ cond: firstCond, then: firstThen })\n\n while (this.match('Elif')) {\n const cond = this.parsePipe()\n this.consume('Then', 'Expected \"then\" after elif condition')\n const thenBranch = this.parsePipe()\n branches.push({ cond, then: thenBranch })\n }\n\n this.consume('Else', 'Expected \"else\" in if expression')\n const elseBranch = this.parsePipe()\n const endToken = this.consume('End', 'Expected \"end\" to close if expression')\n return {\n kind: 'If',\n branches,\n else: elseBranch,\n span: spanBetween(start.span, endToken.span),\n }\n }\n\n private parseArray(start: Token): ArrayNode {\n const items: FilterNode[] = []\n if (!this.check('RBracket')) {\n do {\n items.push(this.parsePipe())\n } while (this.match('Comma'))\n }\n const end = this.consume('RBracket', 'Expected \"]\" after array literal')\n return {\n kind: 'Array',\n items,\n span: spanBetween(start.span, end.span),\n }\n }\n\n private parseObject(start: Token): ObjectNode {\n const entries: ObjectEntry[] = []\n if (!this.check('RBrace')) {\n do {\n entries.push(this.parseObjectEntry())\n } while (this.match('Comma'))\n }\n const end = this.consume('RBrace', 'Expected \"}\" after object literal')\n return {\n kind: 'Object',\n entries,\n span: spanBetween(start.span, end.span),\n }\n }\n\n private parseObjectEntry(): ObjectEntry {\n const key = this.parseObjectKey()\n this.consume('Colon', 'Expected \":\" after object key')\n const value = this.parsePipe()\n return { key, value }\n }\n\n private parseObjectKey(): ObjectKey {\n if (this.match('Identifier')) {\n const token = this.previous()\n return {\n kind: 'KeyIdentifier',\n name: String(token.value),\n span: token.span,\n }\n }\n if (this.match('String')) {\n const token = this.previous()\n return {\n kind: 'KeyString',\n value: String(token.value),\n span: token.span,\n }\n }\n if (this.match('LParen')) {\n const start = this.previous()\n const expr = this.parseComma()\n const closing = this.consume('RParen', 'Expected \")\" after computed key expression')\n return {\n kind: 'KeyExpr',\n expr,\n span: spanBetween(start.span, closing.span),\n }\n }\n throw this.error(this.peek(), 'Expected identifier, string, or \"(expr)\" as object key')\n }\n\n private finishFieldAccess(target: FilterNode): FilterNode {\n if (this.match('Identifier')) {\n const token = this.previous()\n return {\n kind: 'FieldAccess',\n target,\n field: String(token.value),\n span: spanBetween(target.span, token.span),\n }\n }\n if (this.match('String')) {\n const token = this.previous()\n return {\n kind: 'FieldAccess',\n target,\n field: String(token.value),\n span: spanBetween(target.span, token.span),\n }\n }\n throw this.error(this.peek(), 'Expected field name after \".\"')\n }\n\n private parseLeadingDot(dot: Token): FilterNode {\n let expr: FilterNode = { kind: 'Identity', span: dot.span }\n while (true) {\n if (this.check('Identifier') || this.check('String')) {\n expr = this.finishFieldAccess(expr)\n continue\n }\n if (this.match('LBracket')) {\n if (this.match('RBracket')) {\n const close = this.previous()\n expr = {\n kind: 'Iterate',\n target: expr,\n span: spanBetween(expr.span, close.span),\n }\n continue\n }\n const index = this.parsePipe()\n const closing = this.consume('RBracket', 'Expected \"]\" after index expression')\n expr = {\n kind: 'IndexAccess',\n target: expr,\n index,\n span: spanBetween(expr.span, closing.span),\n }\n continue\n }\n break\n }\n return expr\n }\n\n private finishIdentifier(token: Token): FilterNode {\n if (this.match('LParen')) {\n const args = this.parseCallArguments()\n const closing = this.consume('RParen', 'Expected \")\" after arguments')\n return {\n kind: 'Call',\n name: String(token.value),\n args,\n span: spanBetween(token.span, closing.span),\n }\n }\n return {\n kind: 'Call',\n name: String(token.value),\n args: [],\n span: token.span,\n }\n }\n\n private parseCallArguments(): FilterNode[] {\n const args: FilterNode[] = []\n if (this.check('RParen')) {\n return args\n }\n do {\n args.push(this.parsePipe())\n } while (this.match('Semicolon'))\n return args\n }\n\n private literalNode(value: LiteralValue, span: Span): FilterNode {\n return { kind: 'Literal', value, span }\n }\n\n private makeBinary(left: FilterNode, right: FilterNode, op: BinaryOp): FilterNode {\n return {\n kind: 'Binary',\n op,\n left,\n right,\n span: spanBetween(left.span, right.span),\n }\n }\n\n private match(kind: TokenKind): boolean {\n if (this.check(kind)) {\n this.advance()\n return true\n }\n return false\n }\n\n private consume(kind: TokenKind, message: string): Token {\n if (this.check(kind)) return this.advance()\n throw this.error(this.peek(), message)\n }\n\n private check(kind: TokenKind): boolean {\n if (this.isAtEnd()) return kind === 'EOF'\n return this.peek().kind === kind\n }\n\n private advance(): Token {\n if (!this.isAtEnd()) this.current += 1\n return this.previous()\n }\n\n private isAtEnd(): boolean {\n return this.peek().kind === 'EOF'\n }\n\n private peek(): Token {\n return this.tokens[this.current] ?? { kind: 'EOF', span: { start: 0, end: 0 } }\n }\n\n private previous(): Token {\n return this.tokens[this.current - 1] ?? { kind: 'EOF', span: { start: 0, end: 0 } }\n }\n\n private error(token: Token, message: string): ParseError {\n return new ParseError(message, token.span)\n }\n}\n\nconst spanBetween = (a: Span, b: Span): Span => ({\n start: Math.min(a.start, b.start),\n end: Math.max(a.end, b.end),\n})\n","/**\n * Represents any valid JSON value supported by the jq-ts runtime.\n * This is a recursive type definition that matches the structure of JSON data.\n */\n// Use interface to break circular reference for Value type\nexport type Value = null | boolean | number | string | ValueArray | ValueObject\n\n/**\n * Represents a JSON array containing {@link Value} items.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ValueArray extends Array<Value> {}\n\n/**\n * Represents a JSON object with string keys and {@link Value} values.\n */\nexport interface ValueObject {\n [key: string]: Value\n}\n\n/**\n * Checks if a value is considered \"truthy\" in jq logic.\n * In jq, only `false` and `null` are falsey; everything else (including 0 and empty strings) is truthy.\n *\n * @param value - The value to check.\n * @returns `true` if truthy, `false` otherwise.\n */\nexport const isTruthy = (value: Value): boolean => !(value === false || value === null)\n\n/**\n * deeply compares two JSON values for equality.\n *\n * @param a - The first value.\n * @param b - The second value.\n * @returns `true` if the values are structurally equal, `false` otherwise.\n */\nexport const valueEquals = (a: Value, b: Value): boolean => {\n if (a === b) {\n // Handles primitives not involving NaN.\n return true\n }\n if (typeof a !== typeof b) {\n return false\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Object.is(a, b)\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i += 1) {\n if (!valueEquals(a[i]!, b[i]!)) return false\n }\n return true\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const aKeys = Object.keys(a).sort()\n const bKeys = Object.keys(b).sort()\n if (aKeys.length !== bKeys.length) return false\n for (let i = 0; i < aKeys.length; i += 1) {\n const key = aKeys[i]!\n if (key !== bKeys[i]) return false\n // Type safe access via key existence check implicit in loop\n if (!valueEquals(a[key]!, b[key]!)) return false\n }\n return true\n }\n return false\n}\n\n/**\n * Compares two JSON values according to standard jq ordering rules.\n *\n * The sort order is: null < false < true < numbers < strings < arrays < objects.\n * Arrays and objects are compared recursively.\n *\n * @param a - The first value.\n * @param b - The second value.\n * @returns `-1` if `a < b`, `0` if `a == b`, and `1` if `a > b`.\n */\nexport const compareValues = (a: Value, b: Value): -1 | 0 | 1 => {\n if (valueEquals(a, b)) return 0\n const rankDiff = typeRank(a) - typeRank(b)\n if (rankDiff !== 0) return rankDiff < 0 ? -1 : 1\n\n if (typeof a === 'number' && typeof b === 'number') {\n return a < b ? -1 : 1\n }\n if (typeof a === 'string' && typeof b === 'string') {\n return a < b ? -1 : 1\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n const len = Math.min(a.length, b.length)\n for (let i = 0; i < len; i += 1) {\n const cmp = compareValues(a[i]!, b[i]!)\n if (cmp !== 0) return cmp\n }\n return a.length < b.length ? -1 : 1\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const aKeys = Object.keys(a).sort()\n const bKeys = Object.keys(b).sort()\n const len = Math.min(aKeys.length, bKeys.length)\n for (let i = 0; i < len; i += 1) {\n const key = aKeys[i]!\n const keyCmp = compareStrings(key, bKeys[i]!)\n if (keyCmp !== 0) return keyCmp\n const valueCmp = compareValues(a[key]!, b[key]!)\n if (valueCmp !== 0) return valueCmp\n }\n return aKeys.length < bKeys.length ? -1 : 1\n }\n\n // Remaining ranks are booleans and null which have already been handled by rank diff.\n return 0\n}\n\nconst compareStrings = (a: string, b: string): -1 | 0 | 1 => {\n if (a === b) return 0\n return a < b ? -1 : 1\n}\n\nconst typeRank = (value: Value): number => {\n if (value === null) return 0\n if (value === false) return 1\n if (value === true) return 2\n if (typeof value === 'number') return 3\n if (typeof value === 'string') return 4\n if (Array.isArray(value)) return 5\n return 6 // object\n}\n\n/**\n * Checks if a value is a plain JSON object (and not null or an array).\n *\n * @param value - The value to check.\n * @returns `true` if `value` is a non-null object (and not an array).\n */\nexport const isPlainObject = (value: Value): value is ValueObject =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\n/**\n * Returns the type name of a value as a string (e.g., \"null\", \"boolean\", \"number\", \"string\", \"array\", \"object\").\n * This corresponds to the output of the `type` builtin.\n *\n * @param value - The value to inspect.\n * @returns The lower-case type name.\n */\nexport const describeType = (value: Value): string => {\n if (value === null) return 'null'\n if (typeof value === 'boolean') return 'boolean'\n if (typeof value === 'number') return 'number'\n if (typeof value === 'string') return 'string'\n if (Array.isArray(value)) return 'array'\n return 'object'\n}\n","import type { FilterNode } from './ast'\nimport type { Span } from './span'\nimport { RuntimeError } from './errors'\nimport {\n type Value,\n type ValueObject,\n describeType,\n isTruthy,\n valueEquals,\n compareValues,\n isPlainObject,\n} from './value'\nimport type { LimitTracker } from './limits'\nimport type { EnvStack } from './eval'\n\nexport type Evaluator = (\n node: FilterNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n) => Generator<Value>\n\nexport interface BuiltinSpec {\n name: string\n arity: number\n apply: (\n input: Value,\n args: FilterNode[],\n env: EnvStack,\n tracker: LimitTracker,\n evaluate: Evaluator,\n span: Span\n ) => Generator<Value>\n}\n\nconst emit = (value: Value, span: Span, tracker: LimitTracker): Value => {\n tracker.emit(span)\n return value\n}\n\n// Helper: Ensure value is a number integer for array indexing\nconst ensureIndex = (val: Value): number | undefined => {\n if (typeof val === 'number' && Number.isInteger(val)) return val\n if (typeof val === 'string' && /^-?\\d+$/.test(val)) return parseInt(val, 10)\n return undefined\n}\n\nconst stableStringify = (value: Value): string => {\n if (value === null) return 'null'\n if (typeof value === 'boolean') return value ? 'true' : 'false'\n if (typeof value === 'number') return value.toString()\n if (typeof value === 'string') return JSON.stringify(value)\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`\n }\n // Object: sort keys\n const keys = Object.keys(value).sort()\n const entries = keys.map(\n (k) =>\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n `${JSON.stringify(k)}:${stableStringify((value as ValueObject)[k]!)}`\n )\n return `{${entries.join(',')}}`\n}\n\nexport const builtins: Record<string, BuiltinSpec> = {\n type: {\n name: 'type',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n yield emit(describeType(input), span, tracker)\n },\n },\n tostring: {\n name: 'tostring',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n yield emit(stableStringify(input), span, tracker)\n },\n },\n tonumber: {\n name: 'tonumber',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input === 'number') {\n yield emit(input, span, tracker)\n return\n }\n if (typeof input === 'string') {\n const num = Number(input)\n if (!Number.isFinite(num)) {\n throw new RuntimeError(`Cannot convert string \"${input}\" to number`, span)\n }\n yield emit(num, span, tracker)\n return\n }\n throw new RuntimeError(`Cannot convert ${describeType(input)} to number`, span)\n },\n },\n length: {\n name: 'length',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (typeof input === 'string') {\n // Use Array.from to count codepoints correctly\n yield emit(Array.from(input).length, span, tracker)\n } else if (Array.isArray(input)) {\n yield emit(input.length, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n // Safe because isPlainObject check implies it's not null/array, but here we can just use Object.keys\n yield emit(Object.keys(input).length, span, tracker)\n } else {\n throw new RuntimeError(`Cannot take length of ${describeType(input)}`, span)\n }\n },\n },\n keys: {\n name: 'keys',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (Array.isArray(input)) {\n const indices = Array.from({ length: input.length }, (_, i) => i)\n yield emit(indices, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n const sortedKeys = Object.keys(input).sort()\n yield emit(sortedKeys, span, tracker)\n } else {\n throw new RuntimeError(`keys expects an array or object`, span)\n }\n },\n },\n has: {\n name: 'has',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const keyFilter = args[0]!\n for (const key of evaluate(keyFilter, input, env, tracker)) {\n if (Array.isArray(input)) {\n const idx = ensureIndex(key)\n yield emit(idx !== undefined && idx >= 0 && idx < input.length, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n let keyStr: string\n if (typeof key === 'string') keyStr = key\n else if (typeof key === 'number') keyStr = key.toString()\n else {\n throw new RuntimeError(`has() key must be string or number for object input`, span)\n }\n yield emit(Object.prototype.hasOwnProperty.call(input, keyStr), span, tracker)\n } else {\n throw new RuntimeError(`has() expects an array or object input`, span)\n }\n }\n },\n },\n error: {\n name: 'error',\n arity: 1,\n // eslint-disable-next-line require-yield\n apply: function* (input, args, env, tracker, evaluate, span) {\n for (const msg of evaluate(args[0]!, input, env, tracker)) {\n throw new RuntimeError(typeof msg === 'string' ? msg : stableStringify(msg), span)\n }\n },\n },\n map: {\n name: 'map',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('map expects an array', span)\n const result: Value[] = []\n const filter = args[0]!\n // Step limit: \"process step\"? Maybe not per element if AST handles it.\n // But we are running a loop here. The evaluate() call inside will step.\n // We should probably check limits if loop is huge?\n // The evaluate() inside handles steps.\n for (const item of input) {\n // tracker.step(span) ? Plan said \"Call tracker.step(span) inside per-element loops\"\n tracker.step(span)\n for (const output of evaluate(filter, item, env, tracker)) {\n result.push(output)\n }\n }\n yield emit(result, span, tracker)\n },\n },\n select: {\n name: 'select',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const filter = args[0]!\n for (const res of evaluate(filter, input, env, tracker)) {\n if (isTruthy(res)) {\n yield emit(input, span, tracker)\n // \"emit original input once\" if ANY output is truthy?\n // jq documentation: \"select(f) produces its input calls if f returns true...\"\n // If f produces multiple values, does it emit multiple times?\n // jq: `1 | select(., .)` -> `1` (checks 1), `1` (checks 1) -> yields 1, 1?\n // `echo 1 | jq 'select(true, true)'` -> `1 \\n 1`.\n // So if filter yields multiple truthy values, it emits input multiple times.\n // Wait, plan says: \"if any output is truthy... emit original input once; otherwise emit nothing.\"\n // My plan might have simplified it. Jq's behavior is typically \"for each output of condition, if truthy yield input\".\n // \"The function `select(foo)` produces its input unchanged if `foo` returns true for that input, and produces no output otherwise.\"\n // Usually implies streaming.\n // Let's stick to the Plan's text for now if precise, or standard behavior.\n // Plan text: \"run filter arg on input value; if any output is truthy (per isTruthy), emit original input once; otherwise emit nothing.\"\n // I will follow the PLAN. It says \"emit original input once\".\n return // Stop after first truthy?\n }\n }\n },\n },\n sort: {\n name: 'sort',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('sort expects an array', span)\n const sorted = sortStable(input, (a, b) => compareValues(a, b))\n tracker.step(span) // Accounting for the sort op itself\n yield emit(sorted, span, tracker)\n },\n },\n sort_by: {\n name: 'sort_by',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('sort_by expects an array', span)\n const filter = args[0]!\n // Compute keys\n const pairs: { val: Value; key: Value }[] = []\n for (const item of input) {\n tracker.step(span)\n const keys = Array.from(evaluate(filter, item, env, tracker))\n if (keys.length !== 1)\n throw new RuntimeError('sort_by key expression must return exactly one value', span)\n pairs.push({ val: item, key: keys[0]! })\n }\n const sorted = sortStable(pairs, (a, b) => compareValues(a.key, b.key))\n yield emit(\n sorted.map((p) => p.val),\n span,\n tracker\n )\n },\n },\n unique: {\n name: 'unique',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('unique expects an array', span)\n // \"unique\" in jq usually implies sorting too.\n // But Plan says: \"Preserve first occurrence order; dedupe via valueEquals.\"\n // Actually standard jq `unique` outputs SORTED array.\n // But let's check the Plan text again carefully.\n // Plan: \"unique/0: input array only. Preserve first occurrence order; dedupe via valueEquals.\"\n // This describes `unique_stable` or generic deduping, NOT `unique` (which sorts).\n // If the plan requested this specific behavior, I should follow it.\n // \"Preserve first occurrence order\" is explicit.\n const seen: Value[] = []\n const result: Value[] = []\n for (const item of input) {\n tracker.step(span) // step per item\n if (!seen.some((s) => valueEquals(s, item))) {\n seen.push(item)\n result.push(item)\n }\n }\n yield emit(result, span, tracker)\n },\n },\n unique_by: {\n name: 'unique_by',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('unique_by expects an array', span)\n const filter = args[0]!\n const seenKeys: Value[] = []\n const result: Value[] = []\n for (const item of input) {\n tracker.step(span)\n const keys = Array.from(evaluate(filter, item, env, tracker))\n if (keys.length !== 1)\n throw new RuntimeError('unique_by key expression must return exactly one value', span)\n const key = keys[0]!\n if (!seenKeys.some((s) => valueEquals(s, key))) {\n seenKeys.push(key)\n result.push(item)\n }\n }\n yield emit(result, span, tracker)\n },\n },\n to_entries: {\n name: 'to_entries',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (Array.isArray(input)) {\n const result = input.map((v, i) => ({ key: i, value: v }))\n yield emit(result, span, tracker)\n } else if (input !== null && typeof input === 'object') {\n const keys = Object.keys(input).sort()\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n const result = keys.map((k) => ({ key: k, value: (input as ValueObject)[k]! }))\n yield emit(result, span, tracker)\n } else {\n throw new RuntimeError('to_entries expects array or object', span)\n }\n },\n },\n from_entries: {\n name: 'from_entries',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n if (!Array.isArray(input)) throw new RuntimeError('from_entries expects an array', span)\n const result: ValueObject = {}\n for (const item of input) {\n tracker.step(span)\n if (item === null || typeof item !== 'object' || Array.isArray(item)) {\n throw new RuntimeError('from_entries expects array of objects', span)\n }\n const obj = item\n if (!('key' in obj) || !('value' in obj)) {\n throw new RuntimeError('from_entries items must have \"key\" and \"value\"', span)\n }\n const key = obj['key']\n if (typeof key !== 'string') {\n throw new RuntimeError('from_entries object keys must be strings', span)\n }\n result[key] = obj['value']!\n }\n yield emit(result, span, tracker)\n },\n },\n with_entries: {\n name: 'with_entries',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // to_entries\n let entries: Value[]\n if (Array.isArray(input)) {\n entries = input.map((v, i) => ({ key: i, value: v }))\n } else if (input !== null && typeof input === 'object') {\n const keys = Object.keys(input).sort()\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n entries = keys.map((k) => ({ key: k, value: (input as ValueObject)[k]! }))\n } else {\n throw new RuntimeError('with_entries expects array or object', span)\n }\n\n // map(f)\n const transformed: Value[] = []\n const filter = args[0]!\n for (const entry of entries) {\n tracker.step(span)\n for (const outVar of evaluate(filter, entry, env, tracker)) {\n transformed.push(outVar)\n }\n }\n\n // from_entries\n const result: ValueObject = {}\n for (const item of transformed) {\n if (item === null || typeof item !== 'object' || Array.isArray(item)) {\n throw new RuntimeError('with_entries filter must produce objects', span)\n }\n const obj = item\n if (!('key' in obj) || !('value' in obj)) {\n throw new RuntimeError('with_entries items must have \"key\" and \"value\"', span)\n }\n const key = obj['key']\n if (typeof key !== 'string') {\n throw new RuntimeError('with_entries keys must be strings', span)\n }\n result[key] = obj['value']!\n }\n yield emit(result, span, tracker)\n },\n },\n split: {\n name: 'split',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (typeof input !== 'string') throw new RuntimeError('split input must be a string', span)\n const sepGen = evaluate(args[0]!, input, env, tracker)\n for (const sep of sepGen) {\n if (typeof sep !== 'string')\n throw new RuntimeError('split separator must be a string', span)\n // Split logic\n yield emit(input.split(sep), span, tracker)\n }\n },\n },\n join: {\n name: 'join',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (!Array.isArray(input)) throw new RuntimeError('join input must be an array', span)\n const sepGen = evaluate(args[0]!, input, env, tracker)\n for (const sep of sepGen) {\n if (typeof sep !== 'string') throw new RuntimeError('join separator must be a string', span)\n const parts: string[] = []\n for (const item of input) {\n if (typeof item !== 'string') {\n throw new RuntimeError(`join expects strings, but got ${describeType(item)}`, span)\n }\n parts.push(item)\n }\n yield emit(parts.join(sep), span, tracker)\n }\n },\n },\n startswith: {\n name: 'startswith',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (typeof input !== 'string')\n throw new RuntimeError('startswith input must be a string', span)\n const prefixGen = evaluate(args[0]!, input, env, tracker)\n for (const prefix of prefixGen) {\n if (typeof prefix !== 'string')\n throw new RuntimeError('startswith prefix must be a string', span)\n yield emit(input.startsWith(prefix), span, tracker)\n }\n },\n },\n endswith: {\n name: 'endswith',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n if (typeof input !== 'string') throw new RuntimeError('endswith input must be a string', span)\n const suffixGen = evaluate(args[0]!, input, env, tracker)\n for (const suffix of suffixGen) {\n if (typeof suffix !== 'string')\n throw new RuntimeError('endswith suffix must be a string', span)\n yield emit(input.endsWith(suffix), span, tracker)\n }\n },\n },\n contains: {\n name: 'contains',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n const bGen = evaluate(args[0]!, input, env, tracker)\n for (const b of bGen) {\n yield emit(checkContains(input, b), span, tracker)\n }\n },\n },\n paths: {\n name: 'paths',\n arity: 0,\n apply: function* (input, _args, _env, tracker, _eval, span) {\n // \"paths\": \"emit all paths to leaf scalars...\".\n // If input is scalar, emit `[]`.\n // If input is `{}`, emit `[]`? \"empty arrays/objects\".\n yield* traversePaths(input, [], span, tracker)\n },\n },\n getpath: {\n name: 'getpath',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n for (const pathVal of evaluate(args[0]!, input, env, tracker)) {\n const path = ensurePath(pathVal, span)\n const res = getPath(input, path)\n yield emit(res ?? null, span, tracker)\n }\n },\n },\n setpath: {\n name: 'setpath',\n arity: 2,\n apply: function* (input, args, env, tracker, evaluate, span) {\n // args[0] is path, args[1] is value\n const paths = Array.from(evaluate(args[0]!, input, env, tracker))\n const values = Array.from(evaluate(args[1]!, input, env, tracker))\n for (const pathVal of paths) {\n const path = ensurePath(pathVal, span)\n for (const val of values) {\n const res = updatePath(input, path, () => val, span)\n yield emit(res ?? null, span, tracker) // Should not return undefined for setpath\n }\n }\n },\n },\n delpaths: {\n name: 'delpaths',\n arity: 1,\n apply: function* (input, args, env, tracker, evaluate, span) {\n for (const pathsVal of evaluate(args[0]!, input, env, tracker)) {\n if (!Array.isArray(pathsVal))\n throw new RuntimeError('delpaths expects an array of paths', span)\n const paths = pathsVal.map((p) => ensurePath(p, span))\n const res = deletePaths(input, paths, span)\n yield emit(res, span, tracker)\n }\n },\n },\n}\n\nconst checkContains = (a: Value, b: Value): boolean => {\n if (a === b) return true\n if (typeof a !== typeof b) return false\n if (typeof a === 'string' && typeof b === 'string') {\n return a.includes(b)\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n return b.every((bItem) => a.some((aItem) => checkContains(aItem, bItem)))\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const keys = Object.keys(b)\n for (const key of keys) {\n if (!Object.prototype.hasOwnProperty.call(a, key)) return false\n const valA = a[key]!\n const valB = b[key]!\n if (!checkContains(valA, valB)) return false\n }\n return true\n }\n return valueEquals(a, b)\n}\n\n/**\n * Recursively traverses a JSON value to find all paths to leaf nodes.\n * Yields paths as arrays of strings/numbers.\n */\nfunction* traversePaths(\n root: Value,\n currentPath: (string | number)[],\n span: Span,\n tracker: LimitTracker\n): Generator<Value> {\n tracker.step(span)\n const isLeaf =\n root === null ||\n typeof root !== 'object' ||\n (Array.isArray(root) && root.length === 0) ||\n (isPlainObject(root) && Object.keys(root).length === 0)\n\n if (isLeaf) {\n yield emit([...currentPath], span, tracker)\n return\n }\n\n if (Array.isArray(root)) {\n for (let i = 0; i < root.length; i++) {\n yield* traversePaths(root[i]!, [...currentPath, i], span, tracker)\n }\n } else if (isPlainObject(root)) {\n const keys = Object.keys(root).sort()\n for (const key of keys) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n yield* traversePaths((root as ValueObject)[key]!, [...currentPath, key], span, tracker)\n }\n }\n}\n\n// Logic to check if we should emit path (redundant if traversePaths handles logic)\n// Removed from usage above.\n\nconst isPath = (val: Value): val is (string | number)[] => {\n if (!Array.isArray(val)) return false\n return val.every((p) => typeof p === 'string' || (typeof p === 'number' && Number.isInteger(p)))\n}\n\nconst ensurePath = (val: Value, span: Span): (string | number)[] => {\n if (isPath(val)) return val\n throw new RuntimeError('Path must be an array of strings or integers', span)\n}\n\nconst getPath = (root: Value, path: (string | number)[]): Value | undefined => {\n let curr = root\n for (const part of path) {\n if (curr === null) return undefined\n if (typeof part === 'string' && isPlainObject(curr)) {\n if (!Object.prototype.hasOwnProperty.call(curr, part)) return undefined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n curr = (curr as ValueObject)[part]!\n } else if (typeof part === 'number' && Array.isArray(curr)) {\n if (part < 0 || part >= curr.length) return undefined\n curr = curr[part]!\n } else {\n return undefined\n }\n }\n return curr\n}\n\n/**\n * Immutably updates a value at a given path.\n * Creates intermediate objects/arrays as needed.\n */\nconst updatePath = (\n root: Value,\n path: (string | number)[],\n updateFn: (val: Value | undefined) => Value | undefined,\n span: Span,\n depth = 0\n): Value | undefined => {\n if (path.length === 0) {\n return updateFn(root)\n }\n const [head, ...tail] = path\n\n if (typeof head === 'string') {\n let obj: Record<string, Value> = {}\n if (isPlainObject(root)) {\n obj = { ...root }\n } else if (root === null) {\n obj = {}\n } else {\n throw new RuntimeError(`Cannot index ${describeType(root)} with string \"${head}\"`, span)\n }\n\n const child = Object.prototype.hasOwnProperty.call(obj, head) ? obj[head]! : undefined\n const newVal = updatePath(child ?? null, tail, updateFn, span, depth + 1)\n if (newVal === undefined) {\n delete obj[head]\n } else {\n obj[head] = newVal\n }\n return obj\n }\n\n if (typeof head === 'number') {\n let arr: Value[] = []\n if (Array.isArray(root)) {\n arr = [...root]\n } else if (root === null) {\n arr = []\n } else {\n throw new RuntimeError(`Cannot index ${describeType(root)} with number ${head}`, span)\n }\n\n const idx = head < 0 ? arr.length + head : head\n if (idx < 0) throw new RuntimeError('Invalid negative index', span)\n\n const child = idx < arr.length ? arr[idx] : null\n const newVal = updatePath(child ?? null, tail, updateFn, span, depth + 1)\n\n if (newVal === undefined) {\n // This branch is for setpath returning undefined?\n // setpath never returns undefined from leaf.\n // If `updatePath` is used for `delpaths` (splice), we need different logic.\n // But `setpath` uses this.\n // If leaf returns undefined (delete), we delete.\n // But `setpath` typically sets to null if null passed? No, `setpath(p, null)` sets to `null`.\n // `setpath` implies leaf returns Value.\n // But if `updatePath` supports deletions...\n // For array, standard `path[i] = undefined` behavior?\n // We'll treat undefined as \"do not set\" or \"hole\"?\n // `setpath` behavior: set to value.\n if (idx >= arr.length) {\n while (arr.length < idx) arr.push(null)\n arr.push(newVal!)\n } else {\n arr[idx] = newVal!\n }\n } else {\n if (idx >= arr.length) {\n while (arr.length < idx) arr.push(null)\n arr.push(newVal)\n } else {\n arr[idx] = newVal\n }\n }\n return arr\n }\n\n throw new RuntimeError(`Path segment must be string or integer`, span)\n}\n\nconst deletePaths = (root: Value, paths: (string | number)[][], span: Span): Value => {\n // Collect paths relevant to this level\n // Group by head\n // Paths ending here (empty tail) -> means delete this node?\n // If root is object:\n // Filter paths that are for this object (strings).\n // Reconstruct object excluding deleted keys, and recursing on others.\n\n // Check if any path is empty -> means delete ROOT.\n if (paths.some((p) => p.length === 0)) return null // Or undefined? delpaths returns ??\n // delpaths on root? `null | delpaths([[]])` -> null?\n // `1 | delpaths([[]])` -> 1? or null?\n // If we delete the root, what do we return?\n // Usually delpaths is structural.\n // If we delete root, maybe return null.\n\n if (isPlainObject(root)) {\n const result: ValueObject = { ...root }\n const relevantPaths = paths.filter((p) => p.length > 0 && typeof p[0] === 'string')\n\n // Group by key\n const byKey: Record<string, (string | number)[][]> = {}\n for (const p of relevantPaths) {\n const key = p[0] as string\n if (!byKey[key]) byKey[key] = []\n byKey[key].push(p.slice(1))\n }\n\n for (const key of Object.keys(byKey)) {\n const tails = byKey[key]!\n if (tails.some((t) => t.length === 0)) {\n // Delete this key\n delete result[key]\n } else {\n // Recurse\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n result[key] = deletePaths((root as ValueObject)[key]!, tails, span)\n }\n }\n return result\n }\n\n if (Array.isArray(root)) {\n const relevantPaths = paths.filter((p) => p.length > 0 && typeof p[0] === 'number')\n\n // Mark indices to delete or recurse\n // We cannot simply splice because indices shift.\n // We map original indices to actions.\n const actions: Record<number, (string | number)[][]> = {}\n for (const p of relevantPaths) {\n let idx = p[0] as number\n if (idx < 0) idx = root.length + idx\n if (idx < 0 || idx >= root.length) continue // Ignore OOB\n if (!actions[idx]) actions[idx] = []\n actions[idx]!.push(p.slice(1))\n }\n\n // Construct new array\n const finalArr: Value[] = []\n for (let i = 0; i < root.length; i++) {\n const tails = actions[i]\n if (tails) {\n if (tails.some((t) => t.length === 0)) {\n // Delete this element (skip push)\n continue\n } else {\n finalArr.push(deletePaths(root[i]!, tails, span))\n }\n } else {\n finalArr.push(root[i]!)\n }\n }\n return finalArr\n }\n\n return root\n}\n\n// Helper for stable sort\nfunction sortStable<T>(arr: T[], compare: (a: T, b: T) => number): T[] {\n return arr\n .map((item, index) => ({ item, index }))\n .sort((a, b) => {\n const cmp = compare(a.item, b.item)\n return cmp !== 0 ? cmp : a.index - b.index\n })\n .map((p) => p.item)\n}\n","import type { FilterNode } from './ast'\nimport { ValidationError } from './errors'\nimport { builtins } from './builtins'\n\n/**\n * Validates the AST for correctness and supported features.\n * Checks for unknown function calls and arity mismatches.\n *\n * @param node - The root AST node to validate.\n * @throws {ValidationError} If validation fails.\n */\nexport const validate = (node: FilterNode): void => {\n visit(node)\n}\n\nconst visit = (node: FilterNode): void => {\n switch (node.kind) {\n case 'Identity':\n case 'Literal':\n case 'Var':\n return\n case 'FieldAccess':\n visit(node.target)\n return\n case 'IndexAccess':\n visit(node.target)\n visit(node.index)\n return\n case 'Array':\n node.items.forEach(visit)\n return\n case 'Object':\n node.entries.forEach((entry) => {\n if (entry.key.kind === 'KeyExpr') {\n visit(entry.key.expr)\n }\n visit(entry.value)\n })\n return\n case 'Pipe':\n case 'Comma':\n case 'Alt':\n visit(node.left)\n visit(node.right)\n return\n case 'Binary':\n case 'Bool':\n visit(node.left)\n visit(node.right)\n return\n case 'Unary':\n visit(node.expr)\n return\n case 'If':\n node.branches.forEach((branch) => {\n visit(branch.cond)\n visit(branch.then)\n })\n visit(node.else)\n return\n case 'As':\n visit(node.bind)\n visit(node.body)\n return\n case 'Call': {\n const builtin = builtins[node.name]\n if (!builtin) {\n throw new ValidationError(`Unknown function: ${node.name}`, node.span)\n }\n if (builtin.arity !== node.args.length) {\n throw new ValidationError(\n `Function ${node.name} expects ${builtin.arity} arguments, but got ${node.args.length}`,\n node.span\n )\n }\n node.args.forEach(visit)\n return\n }\n case 'Reduce':\n visit(node.source)\n visit(node.init)\n visit(node.update)\n return\n case 'Foreach':\n visit(node.source)\n visit(node.init)\n visit(node.update)\n if (node.extract) visit(node.extract)\n return\n case 'Try':\n visit(node.body)\n if (node.handler) visit(node.handler)\n return\n case 'Recurse':\n case 'Iterate':\n return\n default: {\n // Exhaustive check\n const exhaustive: never = node\n return exhaustive\n }\n }\n}\n","import { RuntimeError } from './errors'\nimport type { Span } from './span'\n\n/**\n * Configuration options for execution limits.\n * All fields are optional and default to safe values if strictly undefined.\n */\nexport interface LimitsConfig {\n /** Maximum number of AST nodes to visit during execution. Default: 100,000. */\n maxSteps?: number\n /** Maximum recursion depth for execution and parsing. Default: 200. */\n maxDepth?: number\n /** Maximum number of values to yield from a single output emitter. Default: 10,000. */\n maxOutputs?: number\n}\n\n/**\n * Fully resolved limits with defaults applied.\n */\nexport interface ResolvedLimits {\n maxSteps: number\n maxDepth: number\n maxOutputs: number\n}\n\nconst DEFAULT_LIMITS: ResolvedLimits = {\n maxSteps: 100_000,\n maxDepth: 200,\n maxOutputs: 10_000,\n}\n\n/**\n * Resolves a partial limits configuration into a complete one with defaults.\n *\n * @param config - The user-provided configuration.\n * @returns The resolved limits.\n */\nexport const resolveLimits = (config: LimitsConfig = {}): ResolvedLimits => ({\n maxSteps: config.maxSteps ?? DEFAULT_LIMITS.maxSteps,\n maxDepth: config.maxDepth ?? DEFAULT_LIMITS.maxDepth,\n maxOutputs: config.maxOutputs ?? DEFAULT_LIMITS.maxOutputs,\n})\n\n/**\n * Tracks execution usage against defined limits.\n * Throws {@link RuntimeError} if any limit is exceeded.\n */\nexport class LimitTracker {\n private steps = 0\n private depth = 0\n private outputs = 0\n\n constructor(private readonly limits: ResolvedLimits) {}\n\n /**\n * Records a single execution step (AST node visit).\n * @param span - The source span for error reporting.\n */\n step(span: Span): void {\n this.steps += 1\n if (this.steps > this.limits.maxSteps) {\n throw new RuntimeError('Step limit exceeded', span)\n }\n }\n\n /**\n * Enters a new scope/stack frame, incrementing the depth counter.\n * @param span - The source span for error reporting.\n */\n enter(span: Span): void {\n this.depth += 1\n if (this.depth > this.limits.maxDepth) {\n throw new RuntimeError('Max depth exceeded', span)\n }\n }\n\n /**\n * Exits the current scope, decrementing the depth counter.\n */\n exit(): void {\n this.depth = Math.max(0, this.depth - 1)\n }\n\n /**\n * Records an output value being emitted.\n * @param span - The source span for error reporting.\n */\n emit(span: Span): void {\n this.outputs += 1\n if (this.outputs > this.limits.maxOutputs) {\n throw new RuntimeError('Output limit exceeded', span)\n }\n }\n}\n","import type { FilterNode, ObjectKey } from './ast'\nimport { RuntimeError } from './errors'\nimport { LimitTracker, resolveLimits, type LimitsConfig } from './limits'\nimport type { Span } from './span'\nimport { isTruthy, valueEquals, compareValues, type Value } from './value'\nimport { builtins } from './builtins'\n\nexport type EnvFrame = Map<string, Value>\nexport type EnvStack = EnvFrame[]\n\nexport interface EvalOptions {\n limits?: LimitsConfig\n}\n\nexport const runAst = (ast: FilterNode, input: Value, options: EvalOptions = {}): Value[] => {\n const tracker = new LimitTracker(resolveLimits(options.limits))\n const env: EnvStack = [new Map<string, Value>()]\n return Array.from<Value>(evaluate(ast, input, env, tracker))\n}\n\n/**\n * Evaluates an AST node against an input value.\n * This is a generator function that yields results lazily.\n *\n * @param node - The AST node to evaluate.\n * @param input - The current input value (context).\n * @param env - The variable environment stack.\n * @param tracker - Limits tracker for cycle/output limits.\n */\nfunction* evaluate(\n node: FilterNode,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value, void, undefined> {\n tracker.step(node.span)\n tracker.enter(node.span)\n try {\n switch (node.kind) {\n case 'Identity':\n yield emit(input, node.span, tracker)\n return\n case 'Literal':\n yield emit(node.value, node.span, tracker)\n return\n case 'Var':\n yield emit(getVar(env, node.name, node.span), node.span, tracker)\n return\n case 'FieldAccess':\n yield* evalField(node, input, env, tracker)\n return\n case 'IndexAccess':\n yield* evalIndex(node, input, env, tracker)\n return\n case 'Array':\n yield emit(buildArray(node, input, env, tracker), node.span, tracker)\n return\n case 'Object':\n yield* buildObjects(node, input, env, tracker)\n return\n case 'Pipe':\n for (const left of evaluate(node.left, input, env, tracker)) {\n yield* evaluate(node.right, left, env, tracker)\n }\n return\n case 'Comma':\n yield* evaluate(node.left, input, env, tracker)\n yield* evaluate(node.right, input, env, tracker)\n return\n case 'Alt': {\n const leftValues = Array.from<Value>(evaluate(node.left, input, env, tracker))\n const valid = leftValues.filter((v) => v !== null && v !== false)\n if (valid.length > 0) {\n for (const v of valid) {\n yield v\n }\n } else {\n yield* evaluate(node.right, input, env, tracker)\n }\n return\n }\n case 'Unary':\n if (node.op === 'Not') {\n for (const value of evaluate(node.expr, input, env, tracker)) {\n yield emit(!isTruthy(value), node.span, tracker)\n }\n } else {\n for (const value of evaluate(node.expr, input, env, tracker)) {\n yield emit(applyUnaryNeg(value, node.span), node.span, tracker)\n }\n }\n return\n case 'Binary':\n yield* evalBinary(node, input, env, tracker)\n return\n case 'Bool':\n if (node.op === 'Or') {\n for (const left of evaluate(node.left, input, env, tracker)) {\n if (isTruthy(left)) {\n yield emit(true, node.span, tracker)\n } else {\n for (const right of evaluate(node.right, input, env, tracker)) {\n yield emit(isTruthy(right), node.span, tracker)\n }\n }\n }\n } else {\n for (const left of evaluate(node.left, input, env, tracker)) {\n if (!isTruthy(left)) {\n yield emit(false, node.span, tracker)\n } else {\n for (const right of evaluate(node.right, input, env, tracker)) {\n yield emit(isTruthy(right), node.span, tracker)\n }\n }\n }\n }\n return\n case 'If':\n for (const branch of node.branches) {\n const condValues = Array.from<Value>(evaluate(branch.cond, input, env, tracker))\n if (condValues.length > 1) {\n throw new RuntimeError('Condition produced multiple values', branch.cond.span)\n }\n if (condValues.length === 1 && isTruthy(condValues[0]!)) {\n yield* evaluate(branch.then, input, env, tracker)\n return\n }\n }\n yield* evaluate(node.else, input, env, tracker)\n return\n case 'As': {\n const boundValues = Array.from<Value>(evaluate(node.bind, input, env, tracker))\n for (const value of boundValues) {\n pushBinding(env, node.name, value)\n try {\n yield* evaluate(node.body, input, env, tracker)\n } finally {\n popBinding(env)\n }\n }\n return\n }\n case 'Call': {\n const builtin = builtins[node.name]\n if (!builtin) {\n throw new RuntimeError(`Unknown function: ${node.name}/${node.args.length}`, node.span)\n }\n yield* builtin.apply(input, node.args, env, tracker, evaluate, node.span)\n return\n }\n case 'Reduce':\n yield* evalReduce(node, input, env, tracker)\n return\n case 'Foreach':\n yield* evalForeach(node, input, env, tracker)\n return\n case 'Try':\n yield* evalTry(node, input, env, tracker)\n return\n case 'Recurse':\n yield* evalRecurse(node, input, env, tracker)\n return\n case 'Iterate':\n yield* evalIterate(node, input, env, tracker)\n return\n }\n } finally {\n tracker.exit()\n }\n}\n\nconst emit = (value: Value, span: Span, tracker: LimitTracker): Value => {\n tracker.emit(span)\n return value\n}\n\nconst evalField = function* (\n node: Extract<FilterNode, { kind: 'FieldAccess' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n for (const container of evaluate(node.target, input, env, tracker)) {\n if (container === null) {\n yield emit(null, node.span, tracker)\n continue\n }\n if (isPlainObject(container)) {\n yield emit(\n Object.prototype.hasOwnProperty.call(container, node.field) ? container[node.field]! : null,\n node.span,\n tracker\n )\n continue\n }\n throw new RuntimeError(`Cannot index ${describeType(container)} with string`, node.span)\n }\n}\n\nconst evalIndex = function* (\n node: Extract<FilterNode, { kind: 'IndexAccess' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n const indexValues = Array.from<Value>(evaluate(node.index, input, env, tracker))\n for (const container of evaluate(node.target, input, env, tracker)) {\n if (container === null) {\n yield emit(null, node.span, tracker)\n continue\n }\n if (isValueArray(container)) {\n for (const idxValue of indexValues) {\n const index = ensureInteger(idxValue, node.span)\n const resolved = index < 0 ? container.length + index : index\n if (resolved < 0 || resolved >= container.length) {\n yield emit(null, node.span, tracker)\n } else {\n yield emit(container[resolved]!, node.span, tracker)\n }\n }\n continue\n }\n if (isPlainObject(container)) {\n for (const keyValue of indexValues) {\n if (typeof keyValue !== 'string') {\n throw new RuntimeError(`Cannot index object with ${describeType(keyValue)}`, node.span)\n }\n yield emit(\n Object.prototype.hasOwnProperty.call(container, keyValue) ? container[keyValue]! : null,\n node.span,\n tracker\n )\n }\n continue\n }\n throw new RuntimeError(`Cannot index ${describeType(container)}`, node.span)\n }\n}\n\nconst evalIterate = function* (\n node: Extract<FilterNode, { kind: 'Iterate' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n for (const container of evaluate(node.target, input, env, tracker)) {\n if (container === null) {\n // jq null | .[] outputs nothing\n continue\n }\n if (isValueArray(container)) {\n for (const item of container) {\n yield emit(item, node.span, tracker)\n }\n continue\n }\n if (isPlainObject(container)) {\n const keys = Object.keys(container).sort()\n for (const key of keys) {\n yield emit(container[key]!, node.span, tracker)\n }\n continue\n }\n throw new RuntimeError(`Cannot iterate over ${describeType(container)}`, node.span)\n }\n}\n\nconst evalReduce = function* (\n node: Extract<FilterNode, { kind: 'Reduce' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n const initValues = Array.from(evaluate(node.init, input, env, tracker))\n if (initValues.length !== 1) {\n throw new RuntimeError('Reduce init must single value', node.init.span)\n }\n let acc = initValues[0]!\n\n for (const item of evaluate(node.source, input, env, tracker)) {\n tracker.step(node.span)\n pushBinding(env, node.var, item)\n try {\n const updates = Array.from(evaluate(node.update, acc, env, tracker))\n if (updates.length !== 1) {\n throw new RuntimeError('Reduce update must produce single value', node.update.span)\n }\n acc = updates[0]!\n } finally {\n popBinding(env)\n }\n }\n yield emit(acc, node.span, tracker)\n}\n\nconst evalForeach = function* (\n node: Extract<FilterNode, { kind: 'Foreach' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n const initValues = Array.from(evaluate(node.init, input, env, tracker))\n if (initValues.length !== 1) {\n throw new RuntimeError('Foreach init must single value', node.init.span)\n }\n let acc = initValues[0]!\n\n for (const item of evaluate(node.source, input, env, tracker)) {\n tracker.step(node.span)\n pushBinding(env, node.var, item)\n try {\n const updates = Array.from(evaluate(node.update, acc, env, tracker))\n if (updates.length !== 1) {\n throw new RuntimeError('Foreach update must produce single value', node.update.span)\n }\n acc = updates[0]!\n\n if (node.extract) {\n for (const extracted of evaluate(node.extract, acc, env, tracker)) {\n yield emit(extracted, node.span, tracker)\n }\n } else {\n yield emit(acc, node.span, tracker)\n }\n } finally {\n popBinding(env)\n }\n }\n}\n\nconst evalTry = function* (\n node: Extract<FilterNode, { kind: 'Try' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n try {\n yield* evaluate(node.body, input, env, tracker)\n } catch (err) {\n if (err instanceof RuntimeError) {\n if (node.handler) {\n // Bind error message to input\n yield* evaluate(node.handler, err.message, env, tracker)\n }\n // If no handler, suppress error (emit nothing)\n } else {\n throw err\n }\n }\n}\n\nconst evalRecurse = function* (\n node: Extract<FilterNode, { kind: 'Recurse' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n yield emit(input, node.span, tracker)\n tracker.step(node.span)\n\n if (isValueArray(input)) {\n for (const item of input) {\n yield* evaluate(node, item, env, tracker)\n }\n } else if (isPlainObject(input)) {\n const keys = Object.keys(input).sort()\n for (const key of keys) {\n yield* evaluate(node, input[key]!, env, tracker)\n }\n }\n}\n\nconst buildArray = (\n node: Extract<FilterNode, { kind: 'Array' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Value[] => {\n const result: Value[] = []\n node.items.forEach((item) => {\n for (const value of evaluate(item, input, env, tracker)) {\n result.push(value)\n }\n })\n return result\n}\n\nconst buildObjects = function* (\n node: Extract<FilterNode, { kind: 'Object' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n if (node.entries.length === 0) {\n yield emit({}, node.span, tracker)\n return\n }\n\n let partials: Record<string, Value>[] = [{}]\n for (const entry of node.entries) {\n const keys = resolveObjectKeys(entry.key, input, env, tracker)\n const values = Array.from<Value>(evaluate(entry.value, input, env, tracker))\n const next: Record<string, Value>[] = []\n partials.forEach((partial) => {\n keys.forEach((key) => {\n values.forEach((value) => {\n next.push(extendRecord(partial, key, value))\n })\n })\n })\n partials = next\n if (partials.length === 0) {\n return\n }\n }\n for (const obj of partials) {\n yield emit(obj, node.span, tracker)\n }\n}\n\nconst resolveObjectKeys = (\n key: ObjectKey,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): string[] => {\n if (key.kind === 'KeyIdentifier') return [key.name]\n if (key.kind === 'KeyString') return [key.value]\n const values = Array.from<Value>(evaluate(key.expr, input, env, tracker))\n return values.map((value) => {\n if (typeof value !== 'string') {\n throw new RuntimeError('Object key expression must produce strings', key.span)\n }\n return value\n })\n}\n\nconst evalBinary = function* (\n node: Extract<FilterNode, { kind: 'Binary' }>,\n input: Value,\n env: EnvStack,\n tracker: LimitTracker\n): Generator<Value> {\n const leftValues = Array.from<Value>(evaluate(node.left, input, env, tracker))\n const rightValues = Array.from<Value>(evaluate(node.right, input, env, tracker))\n for (const left of leftValues) {\n for (const right of rightValues) {\n yield emit(applyBinaryOp(node.op, left, right, node.span), node.span, tracker)\n }\n }\n}\n\nconst applyBinaryOp = (op: string, left: Value, right: Value, span: Span): Value => {\n switch (op) {\n case '+':\n return applyPlus(left, right, span)\n case '-':\n return applyMinus(left, right, span)\n case '*':\n return applyMultiply(left, right, span)\n case '/':\n return applyDivide(left, right, span)\n case '%':\n return applyModulo(left, right, span)\n case 'Eq':\n return valueEquals(left, right)\n case 'Neq':\n return !valueEquals(left, right)\n case 'Lt':\n return compareValues(left, right) < 0\n case 'Lte':\n return compareValues(left, right) <= 0\n case 'Gt':\n return compareValues(left, right) > 0\n case 'Gte':\n return compareValues(left, right) >= 0\n default:\n throw new RuntimeError(`Unsupported operator ${op}`, span)\n }\n}\n\nconst applyUnaryNeg = (value: Value, span: Span): Value => {\n if (typeof value === 'number') return -value\n throw new RuntimeError('Unary \"-\" expects a number', span)\n}\n\nconst applyPlus = (left: Value, right: Value, span: Span): Value => {\n if (left === null) return cloneValue(right)\n if (right === null) return cloneValue(left)\n if (typeof left === 'number' && typeof right === 'number') return left + right\n if (typeof left === 'string' && typeof right === 'string') return left + right\n if (isValueArray(left) && isValueArray(right)) return [...left, ...right]\n if (isPlainObject(left) && isPlainObject(right)) return mergeShallowObjects(left, right)\n throw new RuntimeError(`Cannot add ${describeType(left)} and ${describeType(right)}`, span)\n}\n\nconst applyMinus = (left: Value, right: Value, span: Span): Value => {\n if (typeof left === 'number' && typeof right === 'number') return left - right\n if (isValueArray(left) && isValueArray(right)) {\n return left.filter((item) => !right.some((candidate) => valueEquals(item, candidate)))\n }\n throw new RuntimeError(`Cannot subtract ${describeType(right)} from ${describeType(left)}`, span)\n}\n\nconst applyMultiply = (left: Value, right: Value, span: Span): Value => {\n if (typeof left === 'number' && typeof right === 'number') return left * right\n if (typeof left === 'string' && typeof right === 'number') return repeatString(left, right, span)\n if (typeof right === 'string' && typeof left === 'number') return repeatString(right, left, span)\n if (isPlainObject(left) && isPlainObject(right)) return deepMergeObjects(left, right)\n throw new RuntimeError(`Cannot multiply ${describeType(left)} and ${describeType(right)}`, span)\n}\n\nconst applyDivide = (left: Value, right: Value, span: Span): Value => {\n if (typeof left !== 'number' || typeof right !== 'number') {\n throw new RuntimeError('Division expects two numbers', span)\n }\n if (right === 0) throw new RuntimeError('Division by zero', span)\n return left / right\n}\n\nconst applyModulo = (left: Value, right: Value, span: Span): Value => {\n if (typeof left !== 'number' || typeof right !== 'number') {\n throw new RuntimeError('Modulo expects two numbers', span)\n }\n if (right === 0) throw new RuntimeError('Modulo by zero', span)\n return left % right\n}\n\nconst repeatString = (text: string, countValue: number, span: Span): string => {\n const count = ensureInteger(countValue, span)\n if (count < 0) throw new RuntimeError('String repeat expects non-negative count', span)\n return text.repeat(count)\n}\n\nconst deepMergeObjects = (left: Record<string, Value>, right: Record<string, Value>): Value => {\n const result: Record<string, Value> = {}\n Object.keys(left).forEach((key) => {\n const leftValue = left[key]\n if (leftValue !== undefined) {\n result[key] = cloneValue(leftValue)\n }\n })\n Object.keys(right).forEach((key) => {\n const existing = result[key]\n const rightValue = right[key]\n if (rightValue === undefined) {\n return\n }\n if (existing !== undefined && isPlainObject(existing) && isPlainObject(rightValue)) {\n result[key] = deepMergeObjects(existing, rightValue)\n } else {\n result[key] = cloneValue(rightValue)\n }\n })\n return result\n}\n\nconst cloneValue = (value: Value): Value => {\n if (isValueArray(value)) {\n return value.map((item) => cloneValue(item))\n }\n if (isPlainObject(value)) {\n const result: Record<string, Value> = {}\n Object.keys(value).forEach((key) => {\n const child = value[key]\n if (child !== undefined) {\n result[key] = cloneValue(child)\n }\n })\n return result\n }\n return value\n}\n\nconst getVar = (env: EnvStack, name: string, span: Span): Value => {\n for (let i = env.length - 1; i >= 0; i -= 1) {\n const frame = env[i]\n if (frame && frame.has(name)) {\n return frame.get(name)!\n }\n }\n throw new RuntimeError(`Unbound variable: $${name}`, span)\n}\n\nconst pushBinding = (env: EnvStack, name: string, value: Value) => {\n env.push(new Map<string, Value>([[name, value]]))\n}\n\nconst popBinding = (env: EnvStack) => {\n env.pop()\n}\n\nconst ensureInteger = (value: Value, span: Span): number => {\n if (typeof value !== 'number' || !Number.isInteger(value)) {\n throw new RuntimeError('Index must be an integer number', span)\n }\n return value\n}\n\nconst extendRecord = (\n base: Record<string, Value>,\n key: string,\n value: Value\n): Record<string, Value> => {\n const next: Record<string, Value> = {}\n Object.keys(base).forEach((existingKey) => {\n const existingValue = base[existingKey]\n if (existingValue !== undefined) {\n next[existingKey] = existingValue\n }\n })\n next[key] = value\n return next\n}\n\nconst mergeShallowObjects = (\n left: Record<string, Value>,\n right: Record<string, Value>\n): Record<string, Value> => {\n const result: Record<string, Value> = {}\n Object.keys(left).forEach((key) => {\n const leftValue = left[key]\n if (leftValue !== undefined) {\n result[key] = leftValue\n }\n })\n Object.keys(right).forEach((key) => {\n const rightValue = right[key]\n if (rightValue !== undefined) {\n result[key] = rightValue\n }\n })\n return result\n}\n\nconst isValueArray = (value: Value): value is Value[] => Array.isArray(value)\n\nconst isPlainObject = (value: Value): value is Record<string, Value> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst describeType = (value: Value): string => {\n if (value === null) return 'null'\n if (typeof value === 'boolean') return 'boolean'\n if (typeof value === 'number') return 'number'\n if (typeof value === 'string') return 'string'\n if (Array.isArray(value)) return 'array'\n return 'object'\n}\n","import { parse } from './parser'\nimport { validate } from './validate'\nimport { runAst, type EvalOptions } from './eval'\nimport type { Value } from './value'\nimport { LimitTracker, resolveLimits, type LimitsConfig, type ResolvedLimits } from './limits'\nimport { LexError, ParseError, ValidationError, RuntimeError } from './errors'\n\nexport { parse, validate, runAst, LimitTracker, resolveLimits }\nexport type { EvalOptions, Value, LimitsConfig, ResolvedLimits }\nexport { LexError, ParseError, ValidationError, RuntimeError }\n\n/**\n * Runs a jq query against a JSON input.\n *\n * @param source - The jq query string (e.g., `.foo | .bar`).\n * @param input - The JSON input value (object, array, string, number, boolean, or null).\n * @param options - Execution options including limits.\n * @returns An array of results. jq queries always produce zero or more values.\n * @throws {LexError} If the query contains invalid characters.\n * @throws {ParseError} If the query syntax is invalid.\n * @throws {ValidationError} If the query uses unsupported features.\n * @throws {RuntimeError} If execution fails (e.g., type error) or exceeds limits.\n */\nexport const run = (source: string, input: Value, options: EvalOptions = {}): Value[] => {\n const ast = parse(source)\n validate(ast)\n return runAst(ast, input, options)\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,102 @@
1
+ {
2
+ "name": "@gabrielbryk/jq-ts",
3
+ "version": "1.1.0",
4
+ "description": "Deterministic TypeScript implementation of a jq subset for workflow isolates",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.mts",
8
+ "license": "MIT",
9
+ "scripts": {
10
+ "dev": "vitest",
11
+ "build": "tsdown",
12
+ "clean": "rimraf dist coverage docs .turbo node_modules/.cache",
13
+ "typecheck": "tsc --noEmit",
14
+ "typecheck:watch": "tsc --noEmit --watch",
15
+ "format:write": "prettier --write .",
16
+ "format:check": "prettier --check .",
17
+ "check-exports": "attw --pack . --ignore-rules=cjs-resolves-to-esm",
18
+ "lint": "eslint .",
19
+ "lint:fix": "eslint . --fix",
20
+ "test": "vitest run",
21
+ "test:coverage": "vitest run --coverage",
22
+ "test:watch": "vitest",
23
+ "audit": "pnpm audit --audit-level=moderate",
24
+ "size": "size-limit",
25
+ "size:why": "size-limit --why",
26
+ "docs": "typedoc",
27
+ "docs:watch": "typedoc --watch",
28
+ "local-release": "changeset version && changeset publish",
29
+ "release": "changeset publish",
30
+ "prepublishOnly": "pnpm run ci",
31
+ "ci": "pnpm run build && pnpm run format:check && pnpm run check-exports && pnpm run lint && pnpm run test",
32
+ "prepare": "husky",
33
+ "lint-staged": "lint-staged"
34
+ },
35
+ "keywords": [
36
+ "jq",
37
+ "json",
38
+ "query",
39
+ "filter",
40
+ "workflow",
41
+ "deterministic",
42
+ "interpreter",
43
+ "typescript"
44
+ ],
45
+ "homepage": "https://github.com/gabrielbryk/jq-ts",
46
+ "bugs": {
47
+ "url": "https://github.com/gabrielbryk/jq-ts/issues"
48
+ },
49
+ "author": "Gabriel Bryk <me@gabebryk.com> (https://gabebryk.com/)",
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "git+https://github.com/gabrielbryk/jq-ts.git"
53
+ },
54
+ "files": [
55
+ "dist"
56
+ ],
57
+ "type": "module",
58
+ "devDependencies": {
59
+ "@arethetypeswrong/cli": "^0.18.2",
60
+ "@changesets/cli": "^2.29.8",
61
+ "@commitlint/cli": "^20.2.0",
62
+ "@commitlint/config-conventional": "^20.2.0",
63
+ "@eslint/js": "^9.39.2",
64
+ "@size-limit/preset-small-lib": "^11.2.0",
65
+ "@types/bun": "latest",
66
+ "@types/node": "^25.0.1",
67
+ "@vitest/coverage-v8": "^4.0.15",
68
+ "eslint": "^9.39.2",
69
+ "husky": "^9.1.7",
70
+ "knip": "^5.73.4",
71
+ "lint-staged": "^16.2.7",
72
+ "prettier": "^3.7.4",
73
+ "rimraf": "^6.1.2",
74
+ "size-limit": "^11.2.0",
75
+ "tsdown": "^0.17.3",
76
+ "typedoc": "^0.28.15",
77
+ "typescript": "^5.9.3",
78
+ "typescript-eslint": "^8.49.0",
79
+ "vitest": "^4.0.15"
80
+ },
81
+ "exports": {
82
+ "./package.json": "./package.json",
83
+ ".": {
84
+ "import": {
85
+ "types": "./dist/index.d.mts",
86
+ "default": "./dist/index.mjs"
87
+ },
88
+ "require": {
89
+ "types": "./dist/index.d.cts",
90
+ "default": "./dist/index.cjs"
91
+ }
92
+ }
93
+ },
94
+ "pnpm": {
95
+ "onlyBuiltDependencies": [
96
+ "esbuild"
97
+ ]
98
+ },
99
+ "peerDependencies": {
100
+ "typescript": "^5.0.0"
101
+ }
102
+ }