@wirecat/cli-base 0.23.0 → 0.25.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 (104) hide show
  1. package/README.md +23 -4
  2. package/THIRD_PARTY_NOTICES +760 -0
  3. package/dist/commands/document.d.ts +10 -10
  4. package/dist/commands/document.d.ts.map +1 -1
  5. package/dist/commands/document.js +27 -9
  6. package/dist/commands/document.js.map +1 -1
  7. package/dist/commands/index.d.ts +16 -4
  8. package/dist/commands/index.d.ts.map +1 -1
  9. package/dist/commands/index.js +10 -3
  10. package/dist/commands/index.js.map +1 -1
  11. package/dist/completion/index.js +2 -2
  12. package/dist/completion/index.js.map +1 -1
  13. package/dist/deadline.js +1 -1
  14. package/dist/deadline.js.map +1 -1
  15. package/dist/dev/lint.d.ts +10 -2
  16. package/dist/dev/lint.d.ts.map +1 -1
  17. package/dist/dev/lint.js +132 -7
  18. package/dist/dev/lint.js.map +1 -1
  19. package/dist/dev/main.d.ts.map +1 -1
  20. package/dist/dev/main.js +14 -3
  21. package/dist/dev/main.js.map +1 -1
  22. package/dist/errors.d.ts +3 -3
  23. package/dist/errors.d.ts.map +1 -1
  24. package/dist/errors.js.map +1 -1
  25. package/dist/failure.d.ts +3 -3
  26. package/dist/failure.d.ts.map +1 -1
  27. package/dist/failure.js +9 -7
  28. package/dist/failure.js.map +1 -1
  29. package/dist/logging.d.ts +1 -1
  30. package/dist/logging.d.ts.map +1 -1
  31. package/dist/logging.js +5 -3
  32. package/dist/logging.js.map +1 -1
  33. package/dist/output-buffer.js +3 -3
  34. package/dist/output-buffer.js.map +1 -1
  35. package/dist/query/dates.d.ts +15 -0
  36. package/dist/query/dates.d.ts.map +1 -0
  37. package/dist/query/dates.js +104 -0
  38. package/dist/query/dates.js.map +1 -0
  39. package/dist/query/evaluate.d.ts +15 -0
  40. package/dist/query/evaluate.d.ts.map +1 -0
  41. package/dist/query/evaluate.js +70 -0
  42. package/dist/query/evaluate.js.map +1 -0
  43. package/dist/query/fields.d.ts +54 -0
  44. package/dist/query/fields.d.ts.map +1 -0
  45. package/dist/query/fields.js +87 -0
  46. package/dist/query/fields.js.map +1 -0
  47. package/dist/query/help.d.ts +5 -0
  48. package/dist/query/help.d.ts.map +1 -0
  49. package/dist/query/help.js +18 -0
  50. package/dist/query/help.js.map +1 -0
  51. package/dist/query/index.d.ts +13 -0
  52. package/dist/query/index.d.ts.map +1 -0
  53. package/dist/query/index.js +13 -0
  54. package/dist/query/index.js.map +1 -0
  55. package/dist/query/parser.d.ts +9 -0
  56. package/dist/query/parser.d.ts.map +1 -0
  57. package/dist/query/parser.js +303 -0
  58. package/dist/query/parser.js.map +1 -0
  59. package/dist/query/registry.d.ts +23 -0
  60. package/dist/query/registry.d.ts.map +1 -0
  61. package/dist/query/registry.js +77 -0
  62. package/dist/query/registry.js.map +1 -0
  63. package/dist/query/types.d.ts +45 -0
  64. package/dist/query/types.d.ts.map +1 -0
  65. package/dist/query/types.js +17 -0
  66. package/dist/query/types.js.map +1 -0
  67. package/dist/query/validate.d.ts +11 -0
  68. package/dist/query/validate.d.ts.map +1 -0
  69. package/dist/query/validate.js +82 -0
  70. package/dist/query/validate.js.map +1 -0
  71. package/dist/result-fields.js +1 -1
  72. package/dist/result-fields.js.map +1 -1
  73. package/dist/standards/errors.d.ts +3 -3
  74. package/dist/standards/errors.d.ts.map +1 -1
  75. package/dist/standards/errors.js +7 -7
  76. package/dist/standards/errors.js.map +1 -1
  77. package/dist/standards/index.d.ts +2 -2
  78. package/dist/standards/index.d.ts.map +1 -1
  79. package/dist/standards/index.js +2 -2
  80. package/dist/standards/index.js.map +1 -1
  81. package/dist/standards/lint.d.ts +1 -1
  82. package/dist/standards/lint.d.ts.map +1 -1
  83. package/dist/standards/lint.js +31 -1
  84. package/dist/standards/lint.js.map +1 -1
  85. package/dist/standards/log.d.ts +7 -3
  86. package/dist/standards/log.d.ts.map +1 -1
  87. package/dist/standards/log.js +7 -3
  88. package/dist/standards/log.js.map +1 -1
  89. package/dist/standards/output.d.ts +10 -8
  90. package/dist/standards/output.d.ts.map +1 -1
  91. package/dist/standards/output.js +7 -5
  92. package/dist/standards/output.js.map +1 -1
  93. package/dist/standards/registry.d.ts +2 -0
  94. package/dist/standards/registry.d.ts.map +1 -1
  95. package/dist/standards/registry.js +3 -1
  96. package/dist/standards/registry.js.map +1 -1
  97. package/dist/standards/steps.d.ts +1 -1
  98. package/dist/standards/steps.js +2 -2
  99. package/dist/standards/steps.js.map +1 -1
  100. package/dist/standards/vocabulary.d.ts +18 -0
  101. package/dist/standards/vocabulary.d.ts.map +1 -1
  102. package/dist/standards/vocabulary.js +91 -14
  103. package/dist/standards/vocabulary.js.map +1 -1
  104. package/package.json +7 -2
@@ -0,0 +1,303 @@
1
+ // Port of Lucene 9.12.3 StandardSyntaxParser.jj and BooleanModifiersQueryNodeProcessor (Apache-2.0).
2
+ // Notices: THIRD_PARTY_NOTICES; upstream sources and the reference generator: cli-messaging scripts/search-reference.
3
+ // Adjacency is Query(DisjQuery*), not ConjQuery.
4
+ import { QUERY_LIMITS, queryError, walkQuery, } from "./types.js";
5
+ const whitespace = (c) => /[ \t\n\r\u3000]/u.test(c);
6
+ const reserved = new Set([
7
+ "+",
8
+ "-",
9
+ "!",
10
+ "(",
11
+ ")",
12
+ ":",
13
+ "=",
14
+ "^",
15
+ "@",
16
+ "<",
17
+ ">",
18
+ "[",
19
+ "]",
20
+ '"',
21
+ "{",
22
+ "}",
23
+ "~",
24
+ "\\",
25
+ "/",
26
+ ]);
27
+ const decodeEscapes = (raw, span, fail) => {
28
+ let out = "";
29
+ for (let at = 0; at < raw.length; at++) {
30
+ if (raw[at] !== "\\") {
31
+ out += raw[at];
32
+ continue;
33
+ }
34
+ if (++at >= raw.length)
35
+ fail("query.invalid-escape", span);
36
+ if (raw[at] === "u") {
37
+ const hex = raw.slice(at + 1, at + 5);
38
+ if (!/^[0-9a-fA-F]{4}$/.test(hex))
39
+ fail("query.invalid-escape", span);
40
+ out += String.fromCharCode(Number.parseInt(hex, 16));
41
+ at += 4;
42
+ }
43
+ else
44
+ out += raw[at];
45
+ }
46
+ return out;
47
+ };
48
+ const tokensOf = (text, fail = queryError) => {
49
+ const tokens = [];
50
+ let at = 0;
51
+ let range = false;
52
+ while (at < text.length) {
53
+ const start = at;
54
+ const c = text[at] ?? "";
55
+ if (whitespace(c)) {
56
+ at++;
57
+ continue;
58
+ }
59
+ let kind = c;
60
+ if (c === '"' || (!range && c === "/")) {
61
+ at++;
62
+ while (at < text.length && text[at] !== c) {
63
+ if (text[at] === "\\" && (c === '"' || text[at + 1] === "/"))
64
+ at++;
65
+ at++;
66
+ }
67
+ if (at >= text.length)
68
+ fail("query.unclosed-literal", { start, end: at });
69
+ at++;
70
+ if (c === "/" && /^[dgimsuvy]+(?:$|[ \t\n\r)])/.test(text.slice(at)))
71
+ fail("query.unsupported-regex-flags", { start: at, end: at + 1 }, "Lucene regex does not take JavaScript flags");
72
+ kind = c === '"' ? "quoted" : "regex";
73
+ }
74
+ else if (range && c !== "]" && c !== "}") {
75
+ while (at < text.length && !whitespace(text[at] ?? "") && !["]", "}"].includes(text[at] ?? ""))
76
+ at++;
77
+ kind = "rangeValue";
78
+ }
79
+ else if (reserved.has(c)) {
80
+ if (c === "\\") {
81
+ at += 2;
82
+ while (at < text.length &&
83
+ !whitespace(text[at] ?? "") &&
84
+ (!reserved.has(text[at] ?? "") || ["+", "-"].includes(text[at] ?? "")))
85
+ at++;
86
+ kind = "term";
87
+ }
88
+ else {
89
+ at++;
90
+ if ((c === "<" || c === ">") && text[at] === "=") {
91
+ at++;
92
+ kind += "=";
93
+ }
94
+ if (c === "[" || c === "{")
95
+ range = true;
96
+ if (c === "]" || c === "}")
97
+ range = false;
98
+ }
99
+ }
100
+ else {
101
+ at++;
102
+ while (at < text.length) {
103
+ const next = text[at] ?? "";
104
+ if (next === "\\") {
105
+ if (at + 1 >= text.length)
106
+ fail("query.invalid-escape", { start: at, end: at + 1 });
107
+ at += 2;
108
+ continue;
109
+ }
110
+ if (whitespace(next) || (reserved.has(next) && next !== "+" && next !== "-"))
111
+ break;
112
+ at++;
113
+ }
114
+ const raw = text.slice(start, at);
115
+ kind =
116
+ { AND: "AND", OR: "OR", NOT: "NOT", "&&": "AND", "||": "OR" }[raw] ??
117
+ (/^\d+(?:\.\d+)?$/u.test(raw) ? "number" : "term");
118
+ }
119
+ tokens.push({ kind, raw: text.slice(start, at), span: { start, end: at } });
120
+ }
121
+ tokens.push({ kind: "EOF", raw: "", span: { start: at, end: at } });
122
+ return tokens;
123
+ };
124
+ export const parseLucene = (text, { defaultField = "text", ...context } = {}) => {
125
+ const fail = (reason, span, alternative) => queryError(reason, span, alternative, context);
126
+ if (text.length > QUERY_LIMITS.bytes || new TextEncoder().encode(text).length > QUERY_LIMITS.bytes)
127
+ fail("query.too-large", { start: 0, end: text.length });
128
+ const tokens = tokensOf(text, fail);
129
+ let at = 0;
130
+ let count = 0;
131
+ let depth = 0;
132
+ const peek = () => tokens[at];
133
+ const take = () => tokens[at++];
134
+ const expect = (kind) => {
135
+ if (peek().kind !== kind)
136
+ fail("query.invalid-syntax", peek().span);
137
+ return take();
138
+ };
139
+ const built = (node) => {
140
+ if (++count > QUERY_LIMITS.nodes)
141
+ fail("query.too-large", node.span);
142
+ return node;
143
+ };
144
+ const combine = (clauses, occur) => {
145
+ const first = clauses[0];
146
+ const last = clauses.at(-1);
147
+ if (!first || !last)
148
+ fail("query.invalid-syntax", peek().span);
149
+ if (clauses.length === 1)
150
+ return first;
151
+ return {
152
+ node: built({
153
+ kind: "boolean",
154
+ clauses: clauses.map(({ node, modifier }) => ({ node, occur: modifier ?? occur })),
155
+ span: { start: first.node.span.start, end: last.node.span.end },
156
+ }),
157
+ };
158
+ };
159
+ const query = (field, implicit = false) => {
160
+ if (++depth > QUERY_LIMITS.depth)
161
+ fail("query.too-large", peek().span);
162
+ const clauses = [];
163
+ do {
164
+ clauses.push(disjunction(field, implicit));
165
+ } while (!["EOF", ")"].includes(peek().kind));
166
+ const result = combine(clauses, "must");
167
+ depth--;
168
+ if (result.modifier === "mustNot")
169
+ return built({ kind: "boolean", clauses: [{ node: result.node, occur: "mustNot" }], span: result.node.span });
170
+ return result.node;
171
+ };
172
+ const disjunction = (field, implicit) => {
173
+ const clauses = [conjunction(field, implicit)];
174
+ while (peek().kind === "OR") {
175
+ take();
176
+ clauses.push(conjunction(field, implicit));
177
+ }
178
+ return combine(clauses, "should");
179
+ };
180
+ const conjunction = (field, implicit) => {
181
+ const clauses = [clause(field, implicit)];
182
+ while (peek().kind === "AND") {
183
+ take();
184
+ clauses.push(clause(field, implicit));
185
+ }
186
+ return combine(clauses, "must");
187
+ };
188
+ const clause = (inherited, inheritedImplicit) => {
189
+ let modifier;
190
+ if (["+", "-", "NOT", "!"].includes(peek().kind))
191
+ modifier = take().kind === "+" ? "must" : "mustNot";
192
+ let field = inherited;
193
+ // An error about `field:value` points at the field, where the comparison form already starts.
194
+ let start;
195
+ let implicit = inheritedImplicit;
196
+ if (peek().kind === "term" && [":", "=", "<", ">", "<=", ">="].includes(tokens[at + 1]?.kind ?? "")) {
197
+ const token = take();
198
+ field = decodeEscapes(token.raw, token.span, fail);
199
+ start = token.span.start;
200
+ implicit = false;
201
+ let operator = take();
202
+ if (operator.kind === ":" && ["<", ">", "<=", ">="].includes(peek().kind))
203
+ operator = take();
204
+ if (["<", ">", "<=", ">="].includes(operator.kind)) {
205
+ const value = take();
206
+ if (!["term", "number", "quoted"].includes(value.kind))
207
+ fail("query.invalid-syntax", value.span);
208
+ const decoded = decodeEscapes(value.kind === "quoted" ? value.raw.slice(1, -1) : value.raw, value.span, fail);
209
+ const lower = operator.kind.startsWith(">");
210
+ const node = built({
211
+ kind: "predicate",
212
+ field,
213
+ operator: "range",
214
+ value: lower ? decoded : "*",
215
+ upper: lower ? "*" : decoded,
216
+ lowerInclusive: !lower || operator.kind.endsWith("="),
217
+ upperInclusive: lower || operator.kind.endsWith("="),
218
+ span: { start: token.span.start, end: value.span.end },
219
+ });
220
+ return { node, ...(modifier ? { modifier } : {}) };
221
+ }
222
+ }
223
+ let node;
224
+ if (peek().kind === "(") {
225
+ const start = take().span.start;
226
+ node = query(field, implicit);
227
+ const end = expect(")").span.end;
228
+ node = { ...node, span: { start, end } };
229
+ }
230
+ else if (["[", "{"].includes(peek().kind)) {
231
+ const opening = take();
232
+ const lower = take();
233
+ if (!["rangeValue", "quoted"].includes(lower.kind))
234
+ fail("query.invalid-syntax", lower.span);
235
+ const separator = take();
236
+ if (separator.raw !== "TO")
237
+ fail("query.invalid-syntax", separator.span);
238
+ const upper = take();
239
+ if (!["rangeValue", "quoted"].includes(upper.kind))
240
+ fail("query.invalid-syntax", upper.span);
241
+ const closing = take();
242
+ if (!["]", "}"].includes(closing.kind))
243
+ fail("query.invalid-syntax", closing.span);
244
+ const decode = (t) => decodeEscapes(t.kind === "quoted" ? t.raw.slice(1, -1) : t.raw, t.span, fail);
245
+ node = built({
246
+ kind: "predicate",
247
+ field,
248
+ operator: "range",
249
+ value: decode(lower),
250
+ upper: decode(upper),
251
+ lowerInclusive: opening.kind === "[",
252
+ upperInclusive: closing.kind === "]",
253
+ span: { start: start ?? opening.span.start, end: closing.span.end },
254
+ });
255
+ }
256
+ else {
257
+ const token = take();
258
+ if (!["term", "number", "quoted", "regex"].includes(token.kind))
259
+ fail("query.invalid-syntax", token.span);
260
+ const raw = ["term", "number"].includes(token.kind) ? token.raw : token.raw.slice(1, -1);
261
+ if (field === "fn")
262
+ fail("query.unsupported-operator", token.span, "interval functions are not supported");
263
+ const wildcard = ["term", "number"].includes(token.kind) && /(?<!\\)[*?]/u.test(raw);
264
+ node = built({
265
+ kind: "predicate",
266
+ field,
267
+ operator: token.kind === "regex" ? "regex" : token.kind === "quoted" ? "phrase" : wildcard ? "wildcard" : "term",
268
+ value: token.kind === "regex" || wildcard ? raw : decodeEscapes(raw, token.span, fail),
269
+ span: { start: start ?? token.span.start, end: token.span.end },
270
+ ...(implicit ? { implicit: true } : {}),
271
+ });
272
+ }
273
+ if (peek().kind === "~")
274
+ fail("query.unsupported-operator", peek().span, node.kind === "predicate" && node.operator === "phrase"
275
+ ? "proximity (~) is not supported — drop the ~ for the exact phrase, or join the words with AND"
276
+ : "fuzzy matching (~) is not supported — use a prefix such as word* to catch word forms");
277
+ if (["^", "@"].includes(peek().kind))
278
+ fail("query.unsupported-operator", peek().span, "boost and minimum-should-match are not supported");
279
+ return { node, ...(modifier ? { modifier } : {}) };
280
+ };
281
+ const root = query(defaultField, true);
282
+ expect("EOF");
283
+ if (defaultField === "none") {
284
+ const bare = walkQuery(root).find((node) => node.implicit);
285
+ if (bare)
286
+ queryError("query.bare-word", bare.span, `"${bare.value}" has no field; write field:value`, context, {
287
+ word: bare.value,
288
+ });
289
+ }
290
+ return { version: 1, language: "lucene-v1", root };
291
+ };
292
+ /** Bare terms eligible for forgiving retrieval; explicit syntax keeps strict semantics. */
293
+ export const implicitTextTerms = (text) => {
294
+ const tokens = tokensOf(text);
295
+ if (tokens.some(({ kind }) => ["AND", "OR", "NOT", "+", "-", "!", "(", ")"].includes(kind)))
296
+ return new Set();
297
+ return new Set(tokens.flatMap((token, index) => token.kind === "term" &&
298
+ ![":", "=", "<", ">", "<=", ">="].includes(tokens[index - 1]?.kind ?? "") &&
299
+ ![":", "=", "<", ">", "<=", ">="].includes(tokens[index + 1]?.kind ?? "")
300
+ ? [token.span.start]
301
+ : []));
302
+ };
303
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/query/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { FieldSpec, QueryRegistry } from "./fields.js";
2
+ /** A field as `commands --json` carries it: everything but the hook. */
3
+ export type FieldInfo = Omit<FieldSpec, "validate">;
4
+ export interface QueryInfo extends Omit<QueryRegistry, "fields"> {
5
+ fields: FieldInfo[];
6
+ }
7
+ export declare const describeQuery: (registry: QueryRegistry) => QueryInfo;
8
+ /** Why an example or default term would not run against these fields, per field name; empty when every one runs. */
9
+ export declare const exampleProblems: (registry: QueryRegistry) => {
10
+ field: string;
11
+ problem: string;
12
+ }[];
13
+ /** One list's query: field names unique and snake_case, every example and default runs. Throws naming every problem. */
14
+ export declare const defineQuery: (registry: QueryRegistry) => QueryRegistry;
15
+ /** The query reasons every CLI shares; a CLI adds its own (`query.invalid-tag`) with `defineReasons`. */
16
+ export declare const QUERY_REASONS: {
17
+ reason: string;
18
+ code: "authentication_error" | "cancelled" | "configuration_error" | "confirmation_required" | "internal_error" | "invalid_response" | "network_error" | "not_found" | "outcome_unknown" | "permission_error" | "provider_error" | "provider_unavailable" | "rate_limited" | "timeout" | "validation_error";
19
+ message: string;
20
+ details: string[];
21
+ step?: string | undefined;
22
+ }[];
23
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/query/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAK3D,wEAAwE;AACxE,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;AACnD,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;IAC9D,MAAM,EAAE,SAAS,EAAE,CAAA;CACpB;AAED,eAAO,MAAM,aAAa,aAAc,aAAa,KAAG,SAKtD,CAAA;AAEF,oHAAoH;AACpH,eAAO,MAAM,eAAe,aAAc,aAAa,KAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAoB3F,CAAA;AAED,wHAAwH;AACxH,eAAO,MAAM,WAAW,aAAc,aAAa,KAAG,aASrD,CAAA;AAID,yGAAyG;AACzG,eAAO,MAAM,aAAa;;;;;;GA6BzB,CAAA"}
@@ -0,0 +1,77 @@
1
+ import { isCliError } from "../errors.js";
2
+ import { defineReasons } from "../standards/errors.js";
3
+ import { duplicates, RegistryError, SNAKE_CASE } from "../standards/registry.js";
4
+ import { parseLucene } from "./parser.js";
5
+ import { walkQuery } from "./types.js";
6
+ import { validateQuery } from "./validate.js";
7
+ export const describeQuery = (registry) => ({
8
+ entity: registry.entity,
9
+ backend: registry.backend,
10
+ fields: registry.fields.map(({ validate: _, ...field }) => field),
11
+ ...(registry.defaults && registry.defaults.length > 0 ? { defaults: [...registry.defaults] } : {}),
12
+ });
13
+ /** Why an example or default term would not run against these fields, per field name; empty when every one runs. */
14
+ export const exampleProblems = (registry) => {
15
+ // An example proves syntax and type; whether a provider filters the field is the list's answer at run time.
16
+ const syntaxOnly = { ...registry, backend: "sql" };
17
+ const problem = (text, field) => {
18
+ try {
19
+ const named = walkQuery(validateQuery(parseLucene(text, { defaultField: "none" }), syntaxOnly).root);
20
+ return named.every((node) => node.field === field) ? undefined : `"${text}" does not name ${field}`;
21
+ }
22
+ catch (failure) {
23
+ if (!isCliError(failure))
24
+ throw failure;
25
+ return `"${text}": ${failure.message}`;
26
+ }
27
+ };
28
+ const defaults = (registry.defaults ?? []).map((term) => {
29
+ const field = term.replace(/^-/, "").split(/[:<>=]/)[0] ?? "";
30
+ return { field, problem: problem(term.replace(/^-/, ""), field) };
31
+ });
32
+ return [
33
+ ...registry.fields.map((field) => ({ field: field.name, problem: problem(field.example, field.name) })),
34
+ ...defaults,
35
+ ].filter((entry) => entry.problem !== undefined);
36
+ };
37
+ /** One list's query: field names unique and snake_case, every example and default runs. Throws naming every problem. */
38
+ export const defineQuery = (registry) => {
39
+ const names = registry.fields.map((field) => field.name);
40
+ const problems = [
41
+ ...duplicates(names).map((name) => `"${name}" is listed twice`),
42
+ ...names.filter((name) => !SNAKE_CASE.test(name)).map((name) => `"${name}" is not snake_case`),
43
+ ...exampleProblems(registry).map(({ field, problem }) => `${field}: ${problem}`),
44
+ ];
45
+ if (problems.length > 0)
46
+ throw new RegistryError(`${registry.entity} query`, problems);
47
+ return registry;
48
+ };
49
+ const SPAN = ["span", "alternative", "guide"];
50
+ /** The query reasons every CLI shares; a CLI adds its own (`query.invalid-tag`) with `defineReasons`. */
51
+ export const QUERY_REASONS = defineReasons([
52
+ ["query.bare-word", "a word in the query has no field", ["word"]],
53
+ ["query.invalid-ast", "the query tree is not valid", []],
54
+ ["query.invalid-date", "a date in the query cannot be read", []],
55
+ ["query.invalid-escape", "an escape in the query is not valid", []],
56
+ ["query.invalid-number", "a number in the query cannot be read", []],
57
+ ["query.invalid-regex", "a regular expression in the query is not valid", []],
58
+ ["query.invalid-syntax", "the query cannot be parsed", []],
59
+ ["query.invalid-timezone", "the time zone is not known", []],
60
+ ["query.missing-value", "a field in the query has no value", []],
61
+ ["query.too-large", "the query is over one of its limits", []],
62
+ ["query.unclosed-literal", "a quote or bracket in the query is not closed", []],
63
+ ["query.unknown-field", "a field in the query is not known", ["fields"]],
64
+ ["query.unknown-value", "a value in the query is not known", []],
65
+ ["query.unsupported-field", "this list cannot filter by that field", ["supported"]],
66
+ ["query.unsupported-operator", "this field does not take that operator", []],
67
+ ["query.unsupported-placement", "this field works only as a required term", []],
68
+ ["query.unsupported-regex", "that regular expression is not supported", []],
69
+ ["query.unsupported-regex-flags", "regular expression flags are not supported", []],
70
+ ["query.unsupported-version", "the query version is not supported", []],
71
+ ].map(([reason, message, details]) => ({
72
+ reason,
73
+ code: "validation_error",
74
+ message,
75
+ details: [...SPAN, ...details],
76
+ })));
77
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/query/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAEhF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAQ7C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAuB,EAAa,EAAE,CAAC,CAAC;IACpE,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;IACzB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC;IACjE,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACnG,CAAC,CAAA;AAEF,oHAAoH;AACpH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAuB,EAAwC,EAAE;IAC/F,4GAA4G;IAC5G,MAAM,UAAU,GAAkB,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACjE,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,KAAa,EAAsB,EAAE;QAClE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,CAAA;YACpG,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,mBAAmB,KAAK,EAAE,CAAA;QACrG,CAAC;QAAC,OAAO,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,MAAM,OAAO,CAAA;YACvC,OAAO,IAAI,IAAI,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;QACxC,CAAC;IACH,CAAC,CAAA;IACD,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC7D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAA;IACnE,CAAC,CAAC,CAAA;IACF,OAAO;QACL,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvG,GAAG,QAAQ;KACZ,CAAC,MAAM,CAAC,CAAC,KAAK,EAA+C,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAA;AAC/F,CAAC,CAAA;AAED,wHAAwH;AACxH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAuB,EAAiB,EAAE;IACpE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACxD,MAAM,QAAQ,GAAG;QACf,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,mBAAmB,CAAC;QAC/D,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,qBAAqB,CAAC;QAC9F,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,OAAO,EAAE,CAAC;KACjF,CAAA;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,GAAG,QAAQ,CAAC,MAAM,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACtF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;AAE7C,yGAAyG;AACzG,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAEtC;IACE,CAAC,iBAAiB,EAAE,kCAAkC,EAAE,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC,mBAAmB,EAAE,6BAA6B,EAAE,EAAE,CAAC;IACxD,CAAC,oBAAoB,EAAE,oCAAoC,EAAE,EAAE,CAAC;IAChE,CAAC,sBAAsB,EAAE,qCAAqC,EAAE,EAAE,CAAC;IACnE,CAAC,sBAAsB,EAAE,sCAAsC,EAAE,EAAE,CAAC;IACpE,CAAC,qBAAqB,EAAE,gDAAgD,EAAE,EAAE,CAAC;IAC7E,CAAC,sBAAsB,EAAE,4BAA4B,EAAE,EAAE,CAAC;IAC1D,CAAC,wBAAwB,EAAE,4BAA4B,EAAE,EAAE,CAAC;IAC5D,CAAC,qBAAqB,EAAE,mCAAmC,EAAE,EAAE,CAAC;IAChE,CAAC,iBAAiB,EAAE,qCAAqC,EAAE,EAAE,CAAC;IAC9D,CAAC,wBAAwB,EAAE,+CAA+C,EAAE,EAAE,CAAC;IAC/E,CAAC,qBAAqB,EAAE,mCAAmC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACxE,CAAC,qBAAqB,EAAE,mCAAmC,EAAE,EAAE,CAAC;IAChE,CAAC,yBAAyB,EAAE,uCAAuC,EAAE,CAAC,WAAW,CAAC,CAAC;IACnF,CAAC,4BAA4B,EAAE,wCAAwC,EAAE,EAAE,CAAC;IAC5E,CAAC,6BAA6B,EAAE,0CAA0C,EAAE,EAAE,CAAC;IAC/E,CAAC,yBAAyB,EAAE,0CAA0C,EAAE,EAAE,CAAC;IAC3E,CAAC,+BAA+B,EAAE,4CAA4C,EAAE,EAAE,CAAC;IACnF,CAAC,2BAA2B,EAAE,oCAAoC,EAAE,EAAE,CAAC;CAE1E,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM;IACN,IAAI,EAAE,kBAAkB;IACxB,OAAO;IACP,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;CAC/B,CAAC,CAAC,CACJ,CAAA"}
@@ -0,0 +1,45 @@
1
+ export declare const QUERY_LIMITS: {
2
+ readonly bytes: 8192;
3
+ readonly depth: 32;
4
+ readonly nodes: 256;
5
+ };
6
+ export type Span = {
7
+ start: number;
8
+ end: number;
9
+ };
10
+ export type Occur = "must" | "should" | "mustNot";
11
+ export type Operator = "term" | "phrase" | "wildcard" | "regex" | "range";
12
+ export interface Predicate {
13
+ kind: "predicate";
14
+ field: string;
15
+ operator: Operator;
16
+ value: string;
17
+ upper?: string;
18
+ lowerInclusive?: boolean;
19
+ upperInclusive?: boolean;
20
+ span: Span;
21
+ /** A bare word, under no field. */
22
+ implicit?: true;
23
+ }
24
+ export type QueryNode = Predicate | {
25
+ kind: "boolean";
26
+ clauses: {
27
+ occur: Occur;
28
+ node: QueryNode;
29
+ }[];
30
+ span: Span;
31
+ };
32
+ export interface QueryAst {
33
+ version: 1;
34
+ language: "lucene-v1";
35
+ root: QueryNode;
36
+ }
37
+ /** Who reports a query error: `chats list`, `search`. Without it the message starts with `query:`. */
38
+ export interface QueryContext {
39
+ command?: string;
40
+ /** Where the query language is explained. */
41
+ guide?: string;
42
+ }
43
+ export declare function queryError(reason: string, span: Span, alternative?: string, context?: QueryContext, details?: Record<string, unknown>): never;
44
+ export declare const walkQuery: (node: QueryNode) => Predicate[];
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;aACvB,KAAK,EAAE,IAAI;aACX,KAAK,EAAE,EAAE;aACT,KAAK,EAAE,GAAG;CACF,CAAA;AAEV,MAAM,MAAM,IAAI,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AACjD,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;AACjD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAA;AACzE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,WAAW,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,mCAAmC;IACnC,QAAQ,CAAC,EAAE,IAAI,CAAA;CAChB;AACD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAA;AACjH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,CAAC,CAAA;IACV,QAAQ,EAAE,WAAW,CAAA;IACrB,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,sGAAsG;AACtG,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,YAAiB,EAC1B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,KAAK,CAYP;AAED,eAAO,MAAM,SAAS,SAAU,SAAS,KAAG,SAAS,EACqC,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { CliError } from "../errors.js";
2
+ export const QUERY_LIMITS = {
3
+ bytes: 8192,
4
+ depth: 32,
5
+ nodes: 256,
6
+ };
7
+ export function queryError(reason, span, alternative, context = {}, details = {}) {
8
+ throw new CliError("validation_error", `${context.command ?? "query"}: ${reason} at position ${span.start + 1}${alternative ? ` — ${alternative}` : ""}`, {
9
+ reason,
10
+ span,
11
+ ...(alternative ? { alternative } : {}),
12
+ ...(context.guide ? { guide: context.guide } : {}),
13
+ ...details,
14
+ });
15
+ }
16
+ export const walkQuery = (node) => node.kind === "predicate" ? [node] : node.clauses.flatMap(({ node }) => walkQuery(node));
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAEvC,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,GAAG;CACF,CAAA;AA+BV,MAAM,UAAU,UAAU,CACxB,MAAc,EACd,IAAU,EACV,WAAoB,EACpB,OAAO,GAAiB,EAAE,EAC1B,OAAO,GAA4B,EAAE;IAErC,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,KAAK,MAAM,gBAAgB,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACjH;QACE,MAAM;QACN,IAAI;QACJ,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,OAAO;KACX,CACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAe,EAAe,EAAE,CACxD,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { QueryRegistry } from "./fields.js";
2
+ import { type QueryAst, type QueryContext } from "./types.js";
3
+ export interface ValidateOptions extends QueryContext {
4
+ /** Day boundaries in time values; validity does not depend on it but for a day a zone skips. */
5
+ zone?: string;
6
+ }
7
+ /** Checks every term against the list's fields: name, operator, value by type, placement, the field's own hook. */
8
+ export declare const validateQuery: (ast: QueryAst, registry: QueryRegistry, options?: ValidateOptions) => QueryAst;
9
+ /** The fields a query names, so a default on a field the query names is lifted. */
10
+ export declare const fieldsNamed: (ast: QueryAst) => Set<string>;
11
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/query/validate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAyC,MAAM,YAAY,CAAA;AAEpH,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,gGAAgG;IAChG,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAiDD,mHAAmH;AACnH,eAAO,MAAM,aAAa,QAAS,QAAQ,YAAY,aAAa,YAAW,eAAe,KAAQ,QAiCrG,CAAA;AAED,mFAAmF;AACnF,eAAO,MAAM,WAAW,QAAS,QAAQ,KAAG,GAAG,CAAC,MAAM,CAA2D,CAAA"}
@@ -0,0 +1,82 @@
1
+ import { isCliError } from "../errors.js";
2
+ import { dateEndpoint } from "./dates.js";
3
+ import { queryError, walkQuery } from "./types.js";
4
+ // dates.ts raises without a command; its errors are re-raised here under the command that ran.
5
+ const inContext = (context, run) => {
6
+ try {
7
+ run();
8
+ }
9
+ catch (failure) {
10
+ if (!isCliError(failure) || typeof failure.details.reason !== "string" || failure.details.span === undefined)
11
+ throw failure;
12
+ const { reason, span, alternative } = failure.details;
13
+ queryError(reason, span, alternative, context);
14
+ }
15
+ };
16
+ const bounds = (node) => node.operator === "range" ? [node.value, node.upper ?? "*"].filter((bound) => bound !== "*") : [node.value];
17
+ const checkValue = (field, node, options) => {
18
+ const fail = (reason, alternative) => queryError(reason, node.span, alternative, options);
19
+ if (node.value === "" && field.type !== "txt")
20
+ fail("query.missing-value");
21
+ if (node.operator === "wildcard")
22
+ return;
23
+ switch (field.type) {
24
+ case "enum":
25
+ if (!field.values?.includes(node.value.toLowerCase()))
26
+ fail("query.unknown-value", `${field.name} takes ${field.values?.join(", ")}`);
27
+ return;
28
+ case "bool":
29
+ if (!["true", "false"].includes(node.value.toLowerCase()))
30
+ fail("query.unknown-value", `${field.name} takes true, false`);
31
+ return;
32
+ case "num":
33
+ for (const bound of bounds(node))
34
+ if (!Number.isFinite(Number(bound)) || bound.trim() === "")
35
+ fail("query.invalid-number", `${field.name} takes a number`);
36
+ return;
37
+ case "time":
38
+ inContext(options, () => {
39
+ for (const bound of bounds(node))
40
+ dateEndpoint(bound, options.zone ?? "UTC", "lower", true, node.span);
41
+ });
42
+ return;
43
+ default:
44
+ return;
45
+ }
46
+ };
47
+ /** Checks every term against the list's fields: name, operator, value by type, placement, the field's own hook. */
48
+ export const validateQuery = (ast, registry, options = {}) => {
49
+ const byName = new Map(registry.fields.map((field) => [field.name, field]));
50
+ const visit = (node, required) => {
51
+ if (node.kind === "boolean") {
52
+ for (const clause of node.clauses)
53
+ visit(clause.node, required && clause.occur === "must");
54
+ return;
55
+ }
56
+ const field = byName.get(node.field);
57
+ if (!field)
58
+ queryError("query.unknown-field", node.span, `no field "${node.field}"`, options, {
59
+ fields: registry.fields.map((one) => one.name),
60
+ });
61
+ if (registry.backend === "native" && !field.native)
62
+ queryError("query.unsupported-field", node.span, `the source cannot filter by ${field.name}`, options, {
63
+ supported: registry.fields.filter((one) => one.native).map((one) => one.name),
64
+ });
65
+ // `field:*` asks whether the field has a value, which every type answers.
66
+ const presence = node.operator === "wildcard" && node.value === "*";
67
+ if (!presence && !field.operators.includes(node.operator))
68
+ queryError("query.unsupported-operator", node.span, `${field.name} takes ${field.operators.join(", ")}`, options);
69
+ if (field.placement === "and" && !required)
70
+ queryError("query.unsupported-placement", node.span, `${field.name} only as a required term, not under OR or NOT`, options);
71
+ if (presence)
72
+ return;
73
+ checkValue(field, node, options);
74
+ if (field.validate)
75
+ inContext(options, () => field.validate?.(node));
76
+ };
77
+ visit(ast.root, true);
78
+ return ast;
79
+ };
80
+ /** The fields a query names, so a default on a field the query names is lifted. */
81
+ export const fieldsNamed = (ast) => new Set(walkQuery(ast.root).map((node) => node.field));
82
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/query/validate.ts"],"names":[],"mappings":"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"}
@@ -39,7 +39,7 @@ const select = (value, paths, item = false) => {
39
39
  }
40
40
  target[parts.at(-1)] = found;
41
41
  }
42
- for (const name of ["operationId", "sendId"])
42
+ for (const name of ["operation_id", "send_id"])
43
43
  if (Object.hasOwn(value, name))
44
44
  result[name] = value[name];
45
45
  return result;