@loancrate/json-selector 4.0.0 → 5.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.
Files changed (66) hide show
  1. package/README.md +27 -88
  2. package/dist/access-guards.d.ts +16 -0
  3. package/dist/access-guards.d.ts.map +1 -0
  4. package/dist/access-util.d.ts +7 -0
  5. package/dist/access-util.d.ts.map +1 -0
  6. package/dist/access.d.ts +9 -12
  7. package/dist/access.d.ts.map +1 -1
  8. package/dist/ast.d.ts +95 -1
  9. package/dist/ast.d.ts.map +1 -1
  10. package/dist/bind.d.ts +19 -0
  11. package/dist/bind.d.ts.map +1 -0
  12. package/dist/errors.d.ts +134 -0
  13. package/dist/errors.d.ts.map +1 -0
  14. package/dist/evaluate.d.ts +24 -7
  15. package/dist/evaluate.d.ts.map +1 -1
  16. package/dist/evaluation-context.d.ts +17 -0
  17. package/dist/evaluation-context.d.ts.map +1 -0
  18. package/dist/format.d.ts +7 -1
  19. package/dist/format.d.ts.map +1 -1
  20. package/dist/functions/FallbackMapView.d.ts +18 -0
  21. package/dist/functions/FallbackMapView.d.ts.map +1 -0
  22. package/dist/functions/builtins/array.d.ts +4 -0
  23. package/dist/functions/builtins/array.d.ts.map +1 -0
  24. package/dist/functions/builtins/index.d.ts +4 -0
  25. package/dist/functions/builtins/index.d.ts.map +1 -0
  26. package/dist/functions/builtins/math.d.ts +4 -0
  27. package/dist/functions/builtins/math.d.ts.map +1 -0
  28. package/dist/functions/builtins/string.d.ts +4 -0
  29. package/dist/functions/builtins/string.d.ts.map +1 -0
  30. package/dist/functions/builtins/type.d.ts +4 -0
  31. package/dist/functions/builtins/type.d.ts.map +1 -0
  32. package/dist/functions/datatype.d.ts +90 -0
  33. package/dist/functions/datatype.d.ts.map +1 -0
  34. package/dist/functions/index.d.ts +7 -0
  35. package/dist/functions/index.d.ts.map +1 -0
  36. package/dist/functions/provider.d.ts +6 -0
  37. package/dist/functions/provider.d.ts.map +1 -0
  38. package/dist/functions/registry.d.ts +20 -0
  39. package/dist/functions/registry.d.ts.map +1 -0
  40. package/dist/functions/types.d.ts +68 -0
  41. package/dist/functions/types.d.ts.map +1 -0
  42. package/dist/functions/validation.d.ts +30 -0
  43. package/dist/functions/validation.d.ts.map +1 -0
  44. package/dist/get.d.ts +3 -1
  45. package/dist/get.d.ts.map +1 -1
  46. package/dist/index.d.ts +5 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/json-selector.esm.js +4270 -1612
  49. package/dist/json-selector.esm.js.map +1 -1
  50. package/dist/json-selector.umd.js +4595 -1893
  51. package/dist/json-selector.umd.js.map +1 -1
  52. package/dist/lexer.d.ts +22 -7
  53. package/dist/lexer.d.ts.map +1 -1
  54. package/dist/parse.d.ts +3 -1
  55. package/dist/parse.d.ts.map +1 -1
  56. package/dist/parser.d.ts +79 -9
  57. package/dist/parser.d.ts.map +1 -1
  58. package/dist/set.d.ts +3 -1
  59. package/dist/set.d.ts.map +1 -1
  60. package/dist/token.d.ts +27 -17
  61. package/dist/token.d.ts.map +1 -1
  62. package/dist/util.d.ts +5 -0
  63. package/dist/util.d.ts.map +1 -1
  64. package/dist/visitor.d.ts +11 -1
  65. package/dist/visitor.d.ts.map +1 -1
  66. package/package.json +4 -2
package/README.md CHANGED
@@ -1,31 +1,14 @@
1
1
  # LoanCrate JSON Selectors
2
2
 
3
- LoanCrate JSON Selectors are based on a subset of [JMESPath](https://jmespath.org)
4
- with the following additions:
3
+ A TypeScript library for querying and mutating JSON documents using [JMESPath](https://jmespath.org)-style expressions. Fully implements both the original JMESPath specification and [JMESPath Community Edition](https://jmespath.site/main/), with two extensions for ID-based access and bare numeric literals.
5
4
 
6
- - A shorthand/extension for selecting an object from an array based on ID.
7
- - A root-node expression, as added in the [JMESPath Community Edition](https://jmespath.site/main/#spec-root-node).
5
+ Key capabilities:
8
6
 
9
- Currently, the subset includes everything except [functions](https://jmespath.org/specification.html#functions-expressions),
10
- object projections ([`*` wildcard](https://jmespath.org/specification.html#wildcard-expressions) not within brackets),
11
- and multi-select [lists](https://jmespath.org/specification.html#multiselect-list) and [hashes](https://jmespath.org/specification.html#multiselect-hash).
12
- The library passes all of the [JMESPath compliance tests](https://github.com/jmespath/jmespath.test) not using those specific features.
13
-
14
- To allow for selection by ID, we extend index expressions to accept a
15
- [raw string literal](https://jmespath.org/specification.html#raw-string-literals)
16
- (as opposed to a numeric literal), which represents the value of the `id` property
17
- of the desired object from an array of objects.
18
- Formally, `x['y']` would be equivalent to `x[?id == 'y'] | [0]` in JMESPath.
19
- This should be unambiguous relative to the existing grammar and semantics.
20
-
21
- In addition to the extensions above, this library offers the following features compared to [jmespath.js](https://github.com/jmespath/jmespath.js):
22
-
23
- - Written using TypeScript with a hand-written Pratt parser
24
- - Type definitions for the abstract syntax tree (AST) produced by the parser
25
- - Typed visitor pattern for accessing AST nodes
26
- - Formatting of an AST back into an expression string
27
- - Read/write/delete accessors allow modification of the input data referenced by a selector
28
- - Detailed error reporting for syntax errors
7
+ - **Parse** expression strings into a typed AST
8
+ - **Evaluate** selectors against JSON data
9
+ - **Format** ASTs back into expression strings (round-trip safe)
10
+ - **Read/write/delete** values via selector-based accessors, including strict `*OrThrow` variants
11
+ - **Extend** with custom functions via a pluggable registry
29
12
 
30
13
  ## Installation
31
14
 
@@ -33,7 +16,7 @@ In addition to the extensions above, this library offers the following features
33
16
  npm add @loancrate/json-selector
34
17
  ```
35
18
 
36
- ## Usage
19
+ ## Quick Start
37
20
 
38
21
  ```ts
39
22
  import {
@@ -61,69 +44,25 @@ accessor.delete();
61
44
  console.log(obj.foo.bar[0].value); // undefined
62
45
  ```
63
46
 
64
- ## Operator Precedence
65
-
66
- As mentioned above, JSON Selectors are based on
67
- [JMESPath](https://jmespath.org). Although JMESPath claims to have an "ABNF
68
- grammar with a complete specification", the
69
- [specification](https://jmespath.org/specification.html) is not complete
70
- regarding operator precedence, since it only mentions the relative precedence of
71
- 5 tokens (`|`, `||`, `&&`, `!`, and `]`). To discover the precedence of other
72
- operators, we must turn to the [JMESPath source
73
- code](https://github.com/jmespath/jmespath.js/blob/master/jmespath.js). It is
74
- implemented as a [Top-Down Operator Precedence (TDOP)
75
- parser](https://eli.thegreenplace.net/2010/01/02/top-down-operator-precedence-parsing),
76
- which is based on principles like "token binding power", "null denotation"
77
- (**nud**), and "left denotation" (**led**). Given knowledge of these principles
78
- and the [binding power
79
- table](https://github.com/jmespath/jmespath.js/blob/master/jmespath.js#L474-L501)
80
- from the source, we can reverse-engineer the operator precedence of JMESPath.
81
-
82
- The expression grammar has three categories of operators:
83
-
84
- **Logical and comparison operators** follow traditional precedence rules (from
85
- lowest to highest):
86
-
87
- - pipe: `|`
88
- - or: `||`
89
- - and: `&&`
90
- - compare: `<=`, `>=`, `<`, `>`, `==`, `!=`
91
- - not: `!` (prefix)
92
-
93
- Higher-precedence operators bind more tightly. For example, `a || b && c`
94
- parses as `a || (b && c)`, and `a || b.c` parses as `a || (b.c)` because
95
- access operators have higher precedence than `||`.
96
-
97
- **Access operators** chain left-to-right as postfix operators:
98
-
99
- - member access: `.field`
100
- - index access: `[0]`, `[n:m]` (slices)
101
- - ID access: `['id']` (shorthand for `[?id == 'id'] | [0]`)
102
-
103
- For example, `a[0].b.c['id'].d.e` parses as `(((((a[0]).b).c)['id']).d).e` -
104
- each operator applies to the complete expression on its left, building up the
105
- chain step by step.
106
-
107
- **Projection operators** create projections that map over collections:
108
-
109
- - flatten: `[]` (flatten arrays)
110
- - filter: `[?condition]` (filter by condition)
111
- - star: `[*]` (map over array values)
112
-
113
- Projections terminate before logical, comparison, and pipe operators, but
114
- continue with access operators and can chain with other projections. For
115
- example:
116
-
117
- - `items[*].name` - projects over items, accessing name from each
118
- - `items[*].tags[]` - projects over items, then flattens tags arrays
119
- - `items[*] || []` - projection completes before the `||`, result is `(items[*]) || []`
120
-
121
- **Note on chained flattens**: Multiple flattens compound to flatten deeper
122
- levels. For example, on data `[[[1,2]], [[3,4]]]`:
123
-
124
- - `[]` gives `[[1,2], [3,4]]` (one level)
125
- - `[][]` gives `[1,2,3,4]` (two levels)
126
- - `[*][]` gives `[[1,2], [3,4]]` (projects then flattens once - not the same as `[][]`)
47
+ Use `getOrThrow()`, `setOrThrow()`, and `deleteOrThrow()` when you want accessor failures surfaced as `AccessorError` (instead of `null` reads or no-op writes/deletes).
48
+
49
+ ## Documentation
50
+
51
+ - [**Language Reference**](docs/language.md) Expression syntax, operators, precedence, projections, and extensions
52
+ - [**Function Reference**](docs/functions.md) All 43 built-in functions with signatures and behavior
53
+ - [**API Reference**](docs/api.md) — TypeScript exports, accessors, visitor, function system, errors, and AST
54
+ - [**Benchmarks**](docs/benchmark.md) Parsing performance benchmarks and cross-library comparison
55
+
56
+ ## Standards and Extensions
57
+
58
+ The library fully implements the original [JMESPath specification](https://jmespath.org) and [JMESPath Community Edition](https://jmespath.site/main/), including root-node expressions (`$`), arithmetic, ternary conditionals, and lexical-scope `let` expressions. Compliance is verified against both official [JMESPath test fixtures](https://github.com/jmespath/jmespath.test) and JMESPath Community Edition fixtures.
59
+
60
+ Two extensions are added:
61
+
62
+ - **ID-based access**: `x['id']` selects the first array element whose `id` property matches — equivalent to `x[?id == 'id'] | [0]` in standard JMESPath.
63
+ - **Bare numeric literals**: Numbers like `0`, `-1`, `3.14` can appear directly in expressions without backtick delimiters, enabling natural syntax like `foo[?price > 0]` and `a - 1`.
64
+
65
+ Compatibility options (`strictJsonLiterals`, `rawStringBackslashEscape`, `evaluateNullMultiSelect`) control standards-compliance behavior. See the [Language Reference](docs/language.md#legacy-compatibility) for details.
127
66
 
128
67
  ## License
129
68
 
@@ -0,0 +1,16 @@
1
+ import { JsonSelector } from "./ast";
2
+ import { AccessorError } from "./errors";
3
+ type ReadOnlySelectorType = "not" | "compare" | "arithmetic" | "unaryArithmetic" | "and" | "or" | "ternary" | "functionCall" | "expressionRef" | "variableRef" | "let" | "multiSelectList" | "multiSelectHash" | "literal" | "current" | "root";
4
+ export type ReadOnlySelector = Extract<JsonSelector, {
5
+ type: ReadOnlySelectorType;
6
+ }>;
7
+ type AccessOperation = "get" | "set" | "delete";
8
+ export declare function readOnlyError(selector: ReadOnlySelector, operation: "set" | "delete", construct?: string): AccessorError;
9
+ export declare function requireObjectContext(value: unknown, selector: JsonSelector, operation: AccessOperation): Record<string, unknown>;
10
+ export declare function requireObjectParent(value: unknown, selector: JsonSelector, operation: AccessOperation): Record<string, unknown>;
11
+ export declare function requireArrayParent(value: unknown, selector: JsonSelector, operation: AccessOperation): unknown[];
12
+ export declare function requireArrayOrStringParent(value: unknown, selector: JsonSelector, operation: AccessOperation): unknown[] | string;
13
+ export declare function resolveInBoundsIndex(arr: unknown[], index: number, selector: JsonSelector, operation: AccessOperation): number;
14
+ export declare function requireIdIndex(arr: unknown[], id: string | number, selector: JsonSelector, operation: AccessOperation): number;
15
+ export {};
16
+ //# sourceMappingURL=access-guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-guards.d.ts","sourceRoot":"","sources":["../src/access-guards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAA0B,aAAa,EAAE,MAAM,UAAU,CAAC;AAIjE,KAAK,oBAAoB,GACrB,KAAK,GACL,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,KAAK,GACL,IAAI,GACJ,SAAS,GACT,cAAc,GACd,eAAe,GACf,aAAa,GACb,KAAK,GACL,iBAAiB,GACjB,iBAAiB,GACjB,SAAS,GACT,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,OAAO,CACpC,YAAY,EACZ;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAC/B,CAAC;AAqBF,KAAK,eAAe,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC;AAmBhD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,KAAK,GAAG,QAAQ,EAC3B,SAAS,SAAsC,GAC9C,aAAa,CAOf;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,eAAe,GACzB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,eAAe,GACzB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,eAAe,GACzB,OAAO,EAAE,CAkBX;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,eAAe,GACzB,OAAO,EAAE,GAAG,MAAM,CAkBpB;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,OAAO,EAAE,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,eAAe,GACzB,MAAM,CAWR;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EAAE,EACd,EAAE,EAAE,MAAM,GAAG,MAAM,EACnB,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,eAAe,GACzB,MAAM,CAWR"}
@@ -0,0 +1,7 @@
1
+ import { JsonSelector } from "./ast";
2
+ import type { EvaluationContext } from "./evaluation-context";
3
+ export declare function replaceArray(target: unknown[], source: readonly unknown[]): unknown[];
4
+ export declare function invertedFilter(value: unknown[], condition: JsonSelector, evalCtx: EvaluationContext): unknown[];
5
+ /** Returns the complement of a slice: the elements that would NOT be selected by the given slice parameters. */
6
+ export declare function invertedSlice(value: unknown[], start: number | undefined, end?: number, step?: number): unknown[];
7
+ //# sourceMappingURL=access-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-util.d.ts","sourceRoot":"","sources":["../src/access-util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,wBAAgB,YAAY,CAC1B,MAAM,EAAE,OAAO,EAAE,EACjB,MAAM,EAAE,SAAS,OAAO,EAAE,GACzB,OAAO,EAAE,CAIX;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EAAE,EAChB,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,iBAAiB,GACzB,OAAO,EAAE,CAIX;AAED,gHAAgH;AAChH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EAAE,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,CAAC,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,EAAE,CA6BX"}
package/dist/access.d.ts CHANGED
@@ -1,21 +1,18 @@
1
1
  import { JsonSelector } from "./ast";
2
+ import type { EvaluationContext } from "./evaluation-context";
3
+ /** A selector-based accessor not yet bound to a specific context object, supporting get/set/delete operations. */
2
4
  export interface UnboundAccessor {
3
5
  readonly selector: JsonSelector;
4
6
  isValidContext(context: unknown, rootContext?: unknown): boolean;
5
7
  get(context: unknown, rootContext?: unknown): unknown;
8
+ getOrThrow(context: unknown, rootContext?: unknown): unknown;
6
9
  set(value: unknown, context: unknown, rootContext?: unknown): void;
10
+ setOrThrow(value: unknown, context: unknown, rootContext?: unknown): void;
7
11
  delete(context: unknown, rootContext?: unknown): void;
12
+ deleteOrThrow(context: unknown, rootContext?: unknown): void;
8
13
  }
9
- export declare function makeJsonSelectorAccessor(selector: JsonSelector): UnboundAccessor;
10
- export interface Accessor<T> {
11
- readonly selector: JsonSelector;
12
- readonly valid: boolean;
13
- readonly path: string;
14
- get(): T;
15
- set(value: T): void;
16
- delete(): void;
17
- }
18
- export declare function bindJsonSelectorAccessor(unbound: UnboundAccessor, context: unknown, rootContext?: unknown): Accessor<unknown>;
19
- export declare function accessWithJsonSelector(selector: JsonSelector, context: unknown, rootContext?: unknown): Accessor<unknown>;
20
- export declare function invertedSlice(value: unknown[], start: number | undefined, end?: number, step?: number): unknown[];
14
+ /** Configuration for accessor creation, providing the function provider used during evaluation. */
15
+ export type AccessorOptions = Omit<EvaluationContext, "rootContext">;
16
+ /** Compiles a selector AST into an {@link UnboundAccessor} that can be repeatedly bound to different contexts. */
17
+ export declare function makeJsonSelectorAccessor(selector: JsonSelector, options?: Partial<AccessorOptions>): UnboundAccessor;
21
18
  //# sourceMappingURL=access.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAuBrC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACjE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACtD,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACnE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACvD;AAyDD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,YAAY,GACrB,eAAe,CA0VjB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,GAAG,IAAI,CAAC,CAAC;IACT,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACpB,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,OAAO,EAChB,WAAW,UAAU,GACpB,QAAQ,CAAC,OAAO,CAAC,CAiBnB;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,OAAO,EAChB,WAAW,UAAU,GACpB,QAAQ,CAAC,OAAO,CAAC,CAMnB;AAqBD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EAAE,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,CAAC,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,EAAE,CA6BX"}
1
+ {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,YAAY,EAQb,MAAM,OAAO,CAAC;AAaf,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAe9D,kHAAkH;AAClH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACjE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACtD,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC7D,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACnE,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1E,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACtD,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9D;AA2GD,mGAAmG;AACnG,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;AAErE,kHAAkH;AAClH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GACjC,eAAe,CAIjB"}
package/dist/ast.d.ts CHANGED
@@ -1,44 +1,65 @@
1
1
  import { JsonValue } from "type-fest";
2
+ /** Discriminator string for each AST node variant, used for exhaustive pattern matching. */
2
3
  export type JsonSelectorNodeType = JsonSelector["type"];
4
+ /** The current context value (`@`), implicit when no explicit token is written. */
3
5
  export interface JsonSelectorCurrent {
4
6
  type: "current";
7
+ /** When true, the `@` token was explicitly written (not an implicit placeholder). */
8
+ explicit?: boolean;
5
9
  }
10
+ /** Reference to the root document (`$`), enabling access to top-level data from nested contexts. */
6
11
  export interface JsonSelectorRoot {
7
12
  type: "root";
8
13
  }
14
+ /** A constant JSON value embedded directly in the expression (e.g. `'hello'`, `` `42` ``, `true`). */
9
15
  export interface JsonSelectorLiteral {
10
16
  type: "literal";
11
17
  value: JsonValue;
18
+ /** When true, this literal was written with backtick syntax (e.g., `` `true` `` instead of bare `true`). */
19
+ backtickSyntax?: boolean;
12
20
  }
21
+ /** A bare field name applied to the current context, e.g. `foo`. */
13
22
  export interface JsonSelectorIdentifier {
14
23
  type: "identifier";
15
24
  id: string;
16
25
  }
26
+ /** Dot-notation property access on a sub-expression, e.g. `expr.field`. */
17
27
  export interface JsonSelectorFieldAccess {
18
28
  type: "fieldAccess";
19
29
  expression: JsonSelector;
20
30
  field: string;
21
31
  }
32
+ /** Numeric array index access on a sub-expression, e.g. `expr[0]` or `expr[-1]`. */
22
33
  export interface JsonSelectorIndexAccess {
23
34
  type: "indexAccess";
24
35
  expression: JsonSelector;
25
36
  index: number;
26
37
  }
38
+ /** LoanCrate extension: selects an array element by its `id` property, e.g. `expr['my-id']`. */
27
39
  export interface JsonSelectorIdAccess {
28
40
  type: "idAccess";
29
41
  expression: JsonSelector;
30
42
  id: string;
31
43
  }
44
+ /** Array wildcard projection (`[*]`), applying an optional sub-expression to each element. */
32
45
  export interface JsonSelectorProject {
33
46
  type: "project";
34
47
  expression: JsonSelector;
35
48
  projection?: JsonSelector;
36
49
  }
50
+ /** Wildcard projection over object values (`.*`), optionally applying a sub-expression to each value. */
51
+ export interface JsonSelectorObjectProject {
52
+ type: "objectProject";
53
+ expression: JsonSelector;
54
+ projection?: JsonSelector;
55
+ }
56
+ /** Array filter that retains only elements where the condition is truthy, e.g. `expr[?age > 18]`. */
37
57
  export interface JsonSelectorFilter {
38
58
  type: "filter";
39
59
  expression: JsonSelector;
40
60
  condition: JsonSelector;
41
61
  }
62
+ /** Python-style array slice with optional start, end, and step, e.g. `expr[0:5:2]`. */
42
63
  export interface JsonSelectorSlice {
43
64
  type: "slice";
44
65
  expression: JsonSelector;
@@ -46,35 +67,108 @@ export interface JsonSelectorSlice {
46
67
  end?: number;
47
68
  step?: number;
48
69
  }
70
+ /** Flattens one level of nested arrays, e.g. `expr[]`. */
49
71
  export interface JsonSelectorFlatten {
50
72
  type: "flatten";
51
73
  expression: JsonSelector;
52
74
  }
75
+ /** Logical negation: converts a truthy value to `false` and a falsy/empty value to `true`. */
53
76
  export interface JsonSelectorNot {
54
77
  type: "not";
55
78
  expression: JsonSelector;
56
79
  }
80
+ /** The set of relational and equality operators supported in comparisons. */
57
81
  export type JsonSelectorCompareOperator = "<" | "<=" | "==" | ">=" | ">" | "!=";
82
+ /** Binary comparison using a relational or equality operator, e.g. `a == b` or `age >= 18`. */
58
83
  export interface JsonSelectorCompare {
59
84
  type: "compare";
60
85
  operator: JsonSelectorCompareOperator;
61
86
  lhs: JsonSelector;
62
87
  rhs: JsonSelector;
63
88
  }
89
+ /** The set of arithmetic operators supported in binary arithmetic expressions. */
90
+ export type JsonSelectorArithmeticOperator = "+" | "-" | "*" | "/" | "%" | "//";
91
+ /** Binary arithmetic operation, e.g. `a + b`, `price * quantity`, `x // 2`. */
92
+ export interface JsonSelectorArithmetic {
93
+ type: "arithmetic";
94
+ operator: JsonSelectorArithmeticOperator;
95
+ lhs: JsonSelector;
96
+ rhs: JsonSelector;
97
+ }
98
+ /** The set of arithmetic operators supported in unary arithmetic expressions. */
99
+ export type JsonSelectorUnaryArithmeticOperator = "+" | "-";
100
+ /** Unary arithmetic operation, e.g. `-a` or `+value`. */
101
+ export interface JsonSelectorUnaryArithmetic {
102
+ type: "unaryArithmetic";
103
+ operator: JsonSelectorUnaryArithmeticOperator;
104
+ expression: JsonSelector;
105
+ }
106
+ /** Short-circuit logical AND: returns the left operand if falsy, otherwise the right operand. */
64
107
  export interface JsonSelectorAnd {
65
108
  type: "and";
66
109
  lhs: JsonSelector;
67
110
  rhs: JsonSelector;
68
111
  }
112
+ /** Short-circuit logical OR: returns the left operand if truthy, otherwise the right operand. */
69
113
  export interface JsonSelectorOr {
70
114
  type: "or";
71
115
  lhs: JsonSelector;
72
116
  rhs: JsonSelector;
73
117
  }
118
+ /** Conditional expression (`condition ? consequent : alternate`) using JMESPath truthiness rules. */
119
+ export interface JsonSelectorTernary {
120
+ type: "ternary";
121
+ condition: JsonSelector;
122
+ consequent: JsonSelector;
123
+ alternate: JsonSelector;
124
+ }
125
+ /** Pipe operator (`|`) that evaluates the right side against the result of the left side, resetting projections. */
74
126
  export interface JsonSelectorPipe {
75
127
  type: "pipe";
76
128
  lhs: JsonSelector;
77
129
  rhs: JsonSelector;
130
+ /** When true, this pipe originated from dot syntax (e.g., `foo.func()`, `foo.{...}`, `foo.[...]`). */
131
+ dotSyntax?: boolean;
132
+ }
133
+ /** Named function invocation with zero or more argument expressions, e.g. `length(foo)`. */
134
+ export interface JsonSelectorFunctionCall {
135
+ type: "functionCall";
136
+ name: string;
137
+ args: JsonSelector[];
138
+ }
139
+ /** Unevaluated expression reference (`&expr`) passed to higher-order functions like `sort_by` and `map`. */
140
+ export interface JsonSelectorExpressionRef {
141
+ type: "expressionRef";
142
+ expression: JsonSelector;
143
+ }
144
+ /** Reference to a lexical-scope variable (`$name`) bound by a `let` expression. */
145
+ export interface JsonSelectorVariableRef {
146
+ type: "variableRef";
147
+ /** Variable name without the leading `$`. */
148
+ name: string;
149
+ }
150
+ /** Lexical-scope expression: binds variables for use within the `expression` body. */
151
+ export interface JsonSelectorLet {
152
+ type: "let";
153
+ bindings: Array<{
154
+ name: string;
155
+ value: JsonSelector;
156
+ }>;
157
+ expression: JsonSelector;
78
158
  }
79
- export type JsonSelector = JsonSelectorCurrent | JsonSelectorRoot | JsonSelectorLiteral | JsonSelectorIdentifier | JsonSelectorFieldAccess | JsonSelectorIndexAccess | JsonSelectorIdAccess | JsonSelectorProject | JsonSelectorFilter | JsonSelectorSlice | JsonSelectorFlatten | JsonSelectorNot | JsonSelectorCompare | JsonSelectorAnd | JsonSelectorOr | JsonSelectorPipe;
159
+ /** Evaluates multiple expressions in parallel and collects the results into an array, e.g. `[foo, bar]`. */
160
+ export interface JsonSelectorMultiSelectList {
161
+ type: "multiSelectList";
162
+ expressions: JsonSelector[];
163
+ }
164
+ /** Evaluates named expressions and collects the results into a new object, e.g. `{a: foo, b: bar}`. */
165
+ export interface JsonSelectorMultiSelectHash {
166
+ type: "multiSelectHash";
167
+ entries: Array<{
168
+ key: string;
169
+ value: JsonSelector;
170
+ }>;
171
+ }
172
+ /** Discriminated union of all AST node types produced by the selector parser. */
173
+ export type JsonSelector = JsonSelectorCurrent | JsonSelectorRoot | JsonSelectorLiteral | JsonSelectorIdentifier | JsonSelectorFieldAccess | JsonSelectorIndexAccess | JsonSelectorIdAccess | JsonSelectorProject | JsonSelectorObjectProject | JsonSelectorFilter | JsonSelectorSlice | JsonSelectorFlatten | JsonSelectorNot | JsonSelectorCompare | JsonSelectorArithmetic | JsonSelectorUnaryArithmetic | JsonSelectorAnd | JsonSelectorOr | JsonSelectorTernary | JsonSelectorPipe | JsonSelectorFunctionCall | JsonSelectorExpressionRef | JsonSelectorVariableRef | JsonSelectorLet | JsonSelectorMultiSelectList | JsonSelectorMultiSelectHash;
80
174
  //# sourceMappingURL=ast.d.ts.map
package/dist/ast.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,YAAY,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,YAAY,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,YAAY,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,YAAY,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,YAAY,CAAC;IACzB,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,YAAY,CAAC;IACzB,SAAS,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,YAAY,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,CAAC;IACZ,UAAU,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,MAAM,2BAA2B,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;AAEhF,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,2BAA2B,CAAC;IACtC,GAAG,EAAE,YAAY,CAAC;IAClB,GAAG,EAAE,YAAY,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,YAAY,CAAC;IAClB,GAAG,EAAE,YAAY,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,YAAY,CAAC;IAClB,GAAG,EAAE,YAAY,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,YAAY,CAAC;IAClB,GAAG,EAAE,YAAY,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GACpB,mBAAmB,GACnB,gBAAgB,GAChB,mBAAmB,GACnB,sBAAsB,GACtB,uBAAuB,GACvB,uBAAuB,GACvB,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,iBAAiB,GACjB,mBAAmB,GACnB,eAAe,GACf,mBAAmB,GACnB,eAAe,GACf,cAAc,GACd,gBAAgB,CAAC"}
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"}
package/dist/bind.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import { AccessorOptions, UnboundAccessor } from "./access";
2
+ import { JsonSelector } from "./ast";
3
+ /** A selector accessor bound to a specific context, providing typed get/set/delete and validity checking. */
4
+ export interface Accessor<T> {
5
+ readonly selector: JsonSelector;
6
+ readonly valid: boolean;
7
+ readonly path: string;
8
+ get(): T;
9
+ getOrThrow(): T;
10
+ set(value: T): void;
11
+ setOrThrow(value: T): void;
12
+ delete(): void;
13
+ deleteOrThrow(): void;
14
+ }
15
+ /** Binds an {@link UnboundAccessor} to a specific context and root, producing a ready-to-use {@link Accessor}. */
16
+ export declare function bindJsonSelectorAccessor(unbound: UnboundAccessor, context: unknown, rootContext?: unknown): Accessor<unknown>;
17
+ /** One-step convenience: parses a selector into an accessor already bound to the given context. */
18
+ export declare function accessWithJsonSelector(selector: JsonSelector, context: unknown, rootContext?: unknown, options?: Partial<AccessorOptions>): Accessor<unknown>;
19
+ //# sourceMappingURL=bind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bind.d.ts","sourceRoot":"","sources":["../src/bind.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEf,eAAe,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGrC,6GAA6G;AAC7G,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,GAAG,IAAI,CAAC,CAAC;IACT,UAAU,IAAI,CAAC,CAAC;IAChB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACpB,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3B,MAAM,IAAI,IAAI,CAAC;IACf,aAAa,IAAI,IAAI,CAAC;CACvB;AAED,kHAAkH;AAClH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,OAAO,EAChB,WAAW,UAAU,GACpB,QAAQ,CAAC,OAAO,CAAC,CA0BnB;AAED,mGAAmG;AACnG,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,OAAO,EAChB,WAAW,UAAU,EACrB,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GACjC,QAAQ,CAAC,OAAO,CAAC,CAMnB"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Base class for all json-selector library errors.
3
+ */
4
+ export declare class JsonSelectorError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ /**
8
+ * Base class for parse-time errors.
9
+ */
10
+ export declare class JsonSelectorSyntaxError extends JsonSelectorError {
11
+ readonly expression: string;
12
+ readonly offset: number;
13
+ constructor(message: string, expression: string, offset: number);
14
+ }
15
+ /**
16
+ * Lexer error for unknown/invalid characters.
17
+ */
18
+ export declare class UnexpectedCharacterError extends JsonSelectorSyntaxError {
19
+ readonly character: string;
20
+ constructor(expression: string, offset: number, character: string);
21
+ }
22
+ /**
23
+ * Lexer error for missing closing delimiters.
24
+ */
25
+ export declare class UnterminatedTokenError extends JsonSelectorSyntaxError {
26
+ readonly tokenKind: string;
27
+ readonly expectedDelimiter: string;
28
+ constructor(expression: string, offset: number, tokenKind: string, expectedDelimiter: string);
29
+ }
30
+ /**
31
+ * Lexer error for malformed token internals.
32
+ */
33
+ export declare class InvalidTokenError extends JsonSelectorSyntaxError {
34
+ readonly tokenKind: string;
35
+ readonly detail: string;
36
+ constructor(expression: string, offset: number, tokenKind: string, detail: string);
37
+ }
38
+ /**
39
+ * Parser/lexer error for an unexpected token.
40
+ */
41
+ export declare class UnexpectedTokenError extends JsonSelectorSyntaxError {
42
+ readonly token: string;
43
+ readonly expected?: string | undefined;
44
+ readonly context?: string | undefined;
45
+ constructor(expression: string, offset: number, token: string, expected?: string | undefined, context?: string | undefined);
46
+ }
47
+ /**
48
+ * Parser error for unexpected EOF.
49
+ */
50
+ export declare class UnexpectedEndOfInputError extends JsonSelectorSyntaxError {
51
+ readonly expected?: string | undefined;
52
+ constructor(expression: string, expected?: string | undefined);
53
+ }
54
+ /**
55
+ * Base class for evaluation/runtime errors.
56
+ */
57
+ export declare class JsonSelectorRuntimeError extends JsonSelectorError {
58
+ }
59
+ /**
60
+ * Base class for runtime type errors.
61
+ */
62
+ export declare class JsonSelectorTypeError extends JsonSelectorRuntimeError {
63
+ }
64
+ export type AccessorErrorCode = "NOT_WRITABLE" | "MISSING_PARENT" | "TYPE_MISMATCH" | "INDEX_OUT_OF_BOUNDS" | "MISSING_ID";
65
+ /**
66
+ * Error thrown when an accessor operation cannot be applied to the given context.
67
+ */
68
+ export declare class AccessorError extends JsonSelectorRuntimeError {
69
+ readonly code: AccessorErrorCode;
70
+ readonly path: string;
71
+ readonly operation: "get" | "set" | "delete";
72
+ constructor(code: AccessorErrorCode, path: string, operation: "get" | "set" | "delete", message: string);
73
+ }
74
+ /**
75
+ * Error thrown when reading an unbound lexical-scope variable.
76
+ */
77
+ export declare class UndefinedVariableError extends JsonSelectorRuntimeError {
78
+ readonly variableName: string;
79
+ constructor(variableName: string);
80
+ }
81
+ /**
82
+ * Error thrown when arithmetic requires a number but receives another type.
83
+ */
84
+ export declare class NotANumberError extends JsonSelectorTypeError {
85
+ readonly operator: string;
86
+ readonly operandRole: string;
87
+ readonly actualType: string;
88
+ constructor(operator: string, operandRole: string, actualType: string, message?: string);
89
+ }
90
+ /**
91
+ * Error thrown when division or integer division has a zero divisor.
92
+ */
93
+ export declare class DivideByZeroError extends NotANumberError {
94
+ readonly divisor: number;
95
+ constructor(operator: "/" | "//", divisor: number);
96
+ }
97
+ /**
98
+ * Base error class for all function-related errors.
99
+ */
100
+ export declare class FunctionError extends JsonSelectorRuntimeError {
101
+ readonly functionName: string;
102
+ constructor(functionName: string, message: string);
103
+ }
104
+ /**
105
+ * Error thrown when an unknown function is called.
106
+ */
107
+ export declare class UnknownFunctionError extends FunctionError {
108
+ constructor(functionName: string);
109
+ }
110
+ /**
111
+ * Error thrown when a function is called with the wrong number of arguments.
112
+ */
113
+ export declare class InvalidArityError extends FunctionError {
114
+ constructor(functionName: string, message: string);
115
+ }
116
+ /** Base error for argument-level validation failures, carrying both the function and argument names. */
117
+ export declare class InvalidArgumentError extends FunctionError {
118
+ readonly argumentName: string;
119
+ constructor(functionName: string, argumentName: string, message: string);
120
+ }
121
+ /**
122
+ * Error thrown when a function argument has the wrong type.
123
+ */
124
+ export declare class InvalidArgumentTypeError extends InvalidArgumentError {
125
+ constructor(functionName: string, argumentName: string, message: string);
126
+ }
127
+ /**
128
+ * Error thrown when a function argument has a valid type but an invalid value
129
+ * (e.g. negative integer where non-negative is required, non-integer float, pad string length != 1).
130
+ */
131
+ export declare class InvalidArgumentValueError extends InvalidArgumentError {
132
+ constructor(functionName: string, argumentName: string, message: string);
133
+ }
134
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,iBAAiB;aAG1C,UAAU,EAAE,MAAM;aAClB,MAAM,EAAE,MAAM;gBAF9B,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM;CAIjC;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,uBAAuB;aAIjD,SAAS,EAAE,MAAM;gBAFjC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACE,SAAS,EAAE,MAAM;CAQpC;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,uBAAuB;aAI/C,SAAS,EAAE,MAAM;aACjB,iBAAiB,EAAE,MAAM;gBAHzC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACE,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM;CAQ5C;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,uBAAuB;aAI1C,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;gBAH9B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACE,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM;CAQjC;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,uBAAuB;aAI7C,KAAK,EAAE,MAAM;aACb,QAAQ,CAAC,EAAE,MAAM;aACjB,OAAO,CAAC,EAAE,MAAM;gBAJhC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACE,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,YAAA,EACjB,OAAO,CAAC,EAAE,MAAM,YAAA;CAUnC;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,uBAAuB;aAGlD,QAAQ,CAAC,EAAE,MAAM;gBADjC,UAAU,EAAE,MAAM,EACF,QAAQ,CAAC,EAAE,MAAM,YAAA;CAIpC;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,iBAAiB;CAAG;AAElE;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,wBAAwB;CAAG;AAEtE,MAAM,MAAM,iBAAiB,GACzB,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,qBAAqB,GACrB,YAAY,CAAC;AAEjB;;GAEG;AACH,qBAAa,aAAc,SAAQ,wBAAwB;aAEvC,IAAI,EAAE,iBAAiB;aACvB,IAAI,EAAE,MAAM;aACZ,SAAS,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ;gBAFnC,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,EACnD,OAAO,EAAE,MAAM;CAIlB;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,wBAAwB;aACtC,YAAY,EAAE,MAAM;gBAApB,YAAY,EAAE,MAAM;CAGjD;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,qBAAqB;aAEtC,QAAQ,EAAE,MAAM;aAChB,WAAW,EAAE,MAAM;aACnB,UAAU,EAAE,MAAM;gBAFlB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClC,OAAO,CAAC,EAAE,MAAM;CAOnB;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;aAGlC,OAAO,EAAE,MAAM;gBAD/B,QAAQ,EAAE,GAAG,GAAG,IAAI,EACJ,OAAO,EAAE,MAAM;CASlC;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,wBAAwB;aAEvC,YAAY,EAAE,MAAM;gBAApB,YAAY,EAAE,MAAM,EACpC,OAAO,EAAE,MAAM;CAIlB;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,aAAa;gBACzC,YAAY,EAAE,MAAM;CAGjC;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAGlD;AAED,wGAAwG;AACxG,qBAAa,oBAAqB,SAAQ,aAAa;aAGnC,YAAY,EAAE,MAAM;gBADpC,YAAY,EAAE,MAAM,EACJ,YAAY,EAAE,MAAM,EACpC,OAAO,EAAE,MAAM;CAIlB;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,oBAAoB;gBACpD,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAGxE;AAED;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,oBAAoB;gBACrD,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAGxE"}
@@ -1,18 +1,35 @@
1
- import { JsonSelector, JsonSelectorCompareOperator } from "./ast";
2
- export declare function evaluateJsonSelector(selector: JsonSelector, context: unknown, rootContext?: unknown): unknown;
3
- export declare function project(value: unknown[], projection: JsonSelector | undefined, rootContext: unknown): unknown[];
4
- export declare function project(value: unknown, projection: JsonSelector | undefined, rootContext: unknown): unknown[] | null;
5
- export declare function filter(value: unknown[], condition: JsonSelector, rootContext: unknown): unknown[];
6
- export declare function filter(value: unknown, condition: JsonSelector, rootContext: unknown): unknown[] | null;
1
+ import { JsonSelector, JsonSelectorArithmeticOperator, JsonSelectorCompareOperator, JsonSelectorCurrent, JsonSelectorUnaryArithmeticOperator } from "./ast";
2
+ import type { EvaluationContext } from "./evaluation-context";
3
+ /** Evaluates a parsed selector AST against a JSON context value, returning the selected result. */
4
+ export declare function evaluateJsonSelector(selector: JsonSelector, context: unknown, evalCtx?: Partial<EvaluationContext>): unknown;
5
+ /** @deprecated Use the form with `Partial<EvaluationContext>` instead. */
6
+ export declare function evaluateJsonSelector(selector: JsonSelector, context: unknown, rootContext?: unknown, options?: Omit<EvaluationContext, "rootContext">): unknown;
7
+ export declare function performArithmetic(lv: unknown, rv: unknown, operator: JsonSelectorArithmeticOperator): number;
8
+ export declare function performUnaryArithmetic(value: unknown, operator: JsonSelectorUnaryArithmeticOperator): number;
9
+ /** Checks whether a projection is trivial (absent or `@`), meaning array elements pass through unchanged. */
10
+ export declare function isIdentityProjection(selector: JsonSelector | undefined): selector is JsonSelectorCurrent | undefined;
11
+ /** Applies a wildcard array projection (`[*]`), evaluating the optional sub-expression against each element. */
12
+ export declare function project(value: unknown[], projection: JsonSelector | undefined, evalCtx: EvaluationContext): unknown[];
13
+ export declare function project(value: unknown, projection: JsonSelector | undefined, evalCtx: EvaluationContext): unknown;
14
+ /** Projects over an object's values (`.*`), optionally applying a sub-expression to each value and filtering out nulls. */
15
+ export declare function objectProject(value: unknown, projection: JsonSelector | undefined, evalCtx: EvaluationContext): unknown[] | null;
16
+ /** Filters array elements, keeping only those where the condition evaluates to a truthy value. */
17
+ export declare function filter(value: unknown[], condition: JsonSelector, evalCtx: EvaluationContext): unknown[];
18
+ export declare function filter(value: unknown, condition: JsonSelector, evalCtx: EvaluationContext): unknown[] | null;
19
+ /** Extracts a sub-sequence from an array or string using Python-style slice semantics. */
7
20
  export declare function slice(value: unknown[], start: number | undefined, end?: number, step?: number): unknown[];
8
- export declare function slice(value: unknown, start: number | undefined, end?: number, step?: number): unknown[] | null;
21
+ export declare function slice(value: string, start: number | undefined, end?: number, step?: number): string;
22
+ export declare function slice(value: unknown, start: number | undefined, end?: number, step?: number): unknown[] | string | null;
23
+ /** Resolves optional slice parameters against an array length, clamping negative indices and applying defaults. */
9
24
  export declare function normalizeSlice(length: number, start?: number, end?: number, step?: number): {
10
25
  start: number;
11
26
  end: number;
12
27
  step: number;
13
28
  };
29
+ /** Flattens one level of nested arrays; returns `null` for non-array input. */
14
30
  export declare function flatten(value: unknown[]): unknown[];
15
31
  export declare function flatten(value: unknown): unknown[] | null;
32
+ /** Applies a comparison operator to two values; ordering operators require both operands to be numbers. */
16
33
  export declare function compare(lv: number, rv: number, operator: JsonSelectorCompareOperator): boolean;
17
34
  export declare function compare(lv: unknown, rv: unknown, operator: JsonSelectorCompareOperator): boolean | null;
18
35
  //# sourceMappingURL=evaluate.d.ts.map