@wirecat/cli-base 0.24.0 → 0.26.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.
- package/README.md +27 -4
- package/THIRD_PARTY_NOTICES +760 -0
- package/dist/commands/document.d.ts +10 -10
- package/dist/commands/document.d.ts.map +1 -1
- package/dist/commands/document.js +27 -9
- package/dist/commands/document.js.map +1 -1
- package/dist/commands/index.d.ts +16 -4
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +10 -3
- package/dist/commands/index.js.map +1 -1
- package/dist/completion/index.js +2 -2
- package/dist/completion/index.js.map +1 -1
- package/dist/deadline.js +1 -1
- package/dist/deadline.js.map +1 -1
- package/dist/dev/lint.d.ts +10 -2
- package/dist/dev/lint.d.ts.map +1 -1
- package/dist/dev/lint.js +134 -7
- package/dist/dev/lint.js.map +1 -1
- package/dist/dev/main.d.ts.map +1 -1
- package/dist/dev/main.js +14 -3
- package/dist/dev/main.js.map +1 -1
- package/dist/errors.d.ts +3 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/failure.d.ts +3 -3
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +9 -7
- package/dist/failure.js.map +1 -1
- package/dist/logging.d.ts +1 -1
- package/dist/logging.d.ts.map +1 -1
- package/dist/logging.js +5 -3
- package/dist/logging.js.map +1 -1
- package/dist/output-buffer.js +3 -3
- package/dist/output-buffer.js.map +1 -1
- package/dist/query/dates.d.ts +15 -0
- package/dist/query/dates.d.ts.map +1 -0
- package/dist/query/dates.js +104 -0
- package/dist/query/dates.js.map +1 -0
- package/dist/query/evaluate.d.ts +15 -0
- package/dist/query/evaluate.d.ts.map +1 -0
- package/dist/query/evaluate.js +70 -0
- package/dist/query/evaluate.js.map +1 -0
- package/dist/query/fields.d.ts +54 -0
- package/dist/query/fields.d.ts.map +1 -0
- package/dist/query/fields.js +87 -0
- package/dist/query/fields.js.map +1 -0
- package/dist/query/help.d.ts +5 -0
- package/dist/query/help.d.ts.map +1 -0
- package/dist/query/help.js +18 -0
- package/dist/query/help.js.map +1 -0
- package/dist/query/index.d.ts +13 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +13 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/parser.d.ts +9 -0
- package/dist/query/parser.d.ts.map +1 -0
- package/dist/query/parser.js +303 -0
- package/dist/query/parser.js.map +1 -0
- package/dist/query/registry.d.ts +23 -0
- package/dist/query/registry.d.ts.map +1 -0
- package/dist/query/registry.js +77 -0
- package/dist/query/registry.js.map +1 -0
- package/dist/query/types.d.ts +53 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/types.js +44 -0
- package/dist/query/types.js.map +1 -0
- package/dist/query/validate.d.ts +11 -0
- package/dist/query/validate.d.ts.map +1 -0
- package/dist/query/validate.js +82 -0
- package/dist/query/validate.js.map +1 -0
- package/dist/result-fields.js +1 -1
- package/dist/result-fields.js.map +1 -1
- package/dist/standards/errors.d.ts +3 -3
- package/dist/standards/errors.d.ts.map +1 -1
- package/dist/standards/errors.js +7 -7
- package/dist/standards/errors.js.map +1 -1
- package/dist/standards/index.d.ts +2 -2
- package/dist/standards/index.d.ts.map +1 -1
- package/dist/standards/index.js +2 -2
- package/dist/standards/index.js.map +1 -1
- package/dist/standards/lint.d.ts +1 -1
- package/dist/standards/lint.d.ts.map +1 -1
- package/dist/standards/lint.js +31 -1
- package/dist/standards/lint.js.map +1 -1
- package/dist/standards/log.d.ts +7 -3
- package/dist/standards/log.d.ts.map +1 -1
- package/dist/standards/log.js +7 -3
- package/dist/standards/log.js.map +1 -1
- package/dist/standards/output.d.ts +10 -8
- package/dist/standards/output.d.ts.map +1 -1
- package/dist/standards/output.js +7 -5
- package/dist/standards/output.js.map +1 -1
- package/dist/standards/registry.d.ts +2 -0
- package/dist/standards/registry.d.ts.map +1 -1
- package/dist/standards/registry.js +3 -1
- package/dist/standards/registry.js.map +1 -1
- package/dist/standards/steps.d.ts +1 -1
- package/dist/standards/steps.js +2 -2
- package/dist/standards/steps.js.map +1 -1
- package/dist/standards/vocabulary.d.ts +18 -0
- package/dist/standards/vocabulary.d.ts.map +1 -1
- package/dist/standards/vocabulary.js +579 -15
- package/dist/standards/vocabulary.js.map +1 -1
- 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 === "must_not")
|
|
169
|
+
return built({ kind: "boolean", clauses: [{ node: result.node, occur: "must_not" }], 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" : "must_not";
|
|
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
|
+
lower_inclusive: !lower || operator.kind.endsWith("="),
|
|
217
|
+
upper_inclusive: 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
|
+
lower_inclusive: opening.kind === "[",
|
|
252
|
+
upper_inclusive: 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":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
export declare const QUERY_LIMITS: {
|
|
3
|
+
readonly bytes: 8192;
|
|
4
|
+
readonly depth: 32;
|
|
5
|
+
readonly nodes: 256;
|
|
6
|
+
};
|
|
7
|
+
export type Span = {
|
|
8
|
+
start: number;
|
|
9
|
+
end: number;
|
|
10
|
+
};
|
|
11
|
+
export type Occur = "must" | "should" | "must_not";
|
|
12
|
+
export type Operator = "term" | "phrase" | "wildcard" | "regex" | "range";
|
|
13
|
+
export interface Predicate {
|
|
14
|
+
kind: "predicate";
|
|
15
|
+
field: string;
|
|
16
|
+
operator: Operator;
|
|
17
|
+
value: string;
|
|
18
|
+
upper?: string;
|
|
19
|
+
lower_inclusive?: boolean;
|
|
20
|
+
upper_inclusive?: boolean;
|
|
21
|
+
span: Span;
|
|
22
|
+
/** A bare word, under no field. */
|
|
23
|
+
implicit?: true;
|
|
24
|
+
}
|
|
25
|
+
export type QueryNode = Predicate | {
|
|
26
|
+
kind: "boolean";
|
|
27
|
+
clauses: {
|
|
28
|
+
occur: Occur;
|
|
29
|
+
node: QueryNode;
|
|
30
|
+
}[];
|
|
31
|
+
span: Span;
|
|
32
|
+
};
|
|
33
|
+
export interface QueryAst {
|
|
34
|
+
version: 1;
|
|
35
|
+
language: "lucene-v1";
|
|
36
|
+
root: QueryNode;
|
|
37
|
+
}
|
|
38
|
+
export declare const queryNodeSchema: v.GenericSchema<QueryNode>;
|
|
39
|
+
/** The parsed tree as JSON: what an MCP `ast` argument and a saved search carry. */
|
|
40
|
+
export declare const queryAstSchema: v.ObjectSchema<{
|
|
41
|
+
readonly version: v.LiteralSchema<1, undefined>;
|
|
42
|
+
readonly language: v.LiteralSchema<"lucene-v1", undefined>;
|
|
43
|
+
readonly root: v.GenericSchema<QueryNode>;
|
|
44
|
+
}, undefined>;
|
|
45
|
+
/** Who reports a query error: `chats list`, `search`. Without it the message starts with `query:`. */
|
|
46
|
+
export interface QueryContext {
|
|
47
|
+
command?: string;
|
|
48
|
+
/** Where the query language is explained. */
|
|
49
|
+
guide?: string;
|
|
50
|
+
}
|
|
51
|
+
export declare function queryError(reason: string, span: Span, alternative?: string, context?: QueryContext, details?: Record<string, unknown>): never;
|
|
52
|
+
export declare const walkQuery: (node: QueryNode) => Predicate[];
|
|
53
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAG5B,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,UAAU,CAAA;AAClD,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,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,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;AAcD,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,aAAa,CAAC,SAAS,CASrD,CAAA;AACF,oFAAoF;AACpF,eAAO,MAAM,cAAc;;;;aAIzB,CAAA;AAEF,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,44 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { CliError } from "../errors.js";
|
|
3
|
+
export const QUERY_LIMITS = {
|
|
4
|
+
bytes: 8192,
|
|
5
|
+
depth: 32,
|
|
6
|
+
nodes: 256,
|
|
7
|
+
};
|
|
8
|
+
const spanSchema = v.object({ start: v.number(), end: v.number() });
|
|
9
|
+
const predicateSchema = v.object({
|
|
10
|
+
kind: v.literal("predicate"),
|
|
11
|
+
field: v.string(),
|
|
12
|
+
operator: v.picklist(["term", "phrase", "wildcard", "regex", "range"]),
|
|
13
|
+
value: v.string(),
|
|
14
|
+
upper: v.optional(v.string()),
|
|
15
|
+
lower_inclusive: v.optional(v.boolean()),
|
|
16
|
+
upper_inclusive: v.optional(v.boolean()),
|
|
17
|
+
span: spanSchema,
|
|
18
|
+
implicit: v.optional(v.literal(true)),
|
|
19
|
+
});
|
|
20
|
+
export const queryNodeSchema = v.variant("kind", [
|
|
21
|
+
predicateSchema,
|
|
22
|
+
v.object({
|
|
23
|
+
kind: v.literal("boolean"),
|
|
24
|
+
clauses: v.array(v.object({ occur: v.picklist(["must", "should", "must_not"]), node: v.lazy(() => queryNodeSchema) })),
|
|
25
|
+
span: spanSchema,
|
|
26
|
+
}),
|
|
27
|
+
]);
|
|
28
|
+
/** The parsed tree as JSON: what an MCP `ast` argument and a saved search carry. */
|
|
29
|
+
export const queryAstSchema = v.object({
|
|
30
|
+
version: v.literal(1),
|
|
31
|
+
language: v.literal("lucene-v1"),
|
|
32
|
+
root: queryNodeSchema,
|
|
33
|
+
});
|
|
34
|
+
export function queryError(reason, span, alternative, context = {}, details = {}) {
|
|
35
|
+
throw new CliError("validation_error", `${context.command ?? "query"}: ${reason} at position ${span.start + 1}${alternative ? ` — ${alternative}` : ""}`, {
|
|
36
|
+
reason,
|
|
37
|
+
span,
|
|
38
|
+
...(alternative ? { alternative } : {}),
|
|
39
|
+
...(context.guide ? { guide: context.guide } : {}),
|
|
40
|
+
...details,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
export const walkQuery = (node) => node.kind === "predicate" ? [node] : node.clauses.flatMap(({ node }) => walkQuery(node));
|
|
44
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|