@webda/ql 4.0.0-beta.7 → 4.0.0-beta.8
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 +38 -0
- package/lib/WebdaQLLexer.d.ts +10 -9
- package/lib/WebdaQLLexer.d.ts.map +1 -1
- package/lib/WebdaQLLexer.js +227 -363
- package/lib/WebdaQLLexer.js.map +1 -1
- package/lib/WebdaQLParserLexer.d.ts +10 -9
- package/lib/WebdaQLParserLexer.d.ts.map +1 -1
- package/lib/WebdaQLParserLexer.js +227 -363
- package/lib/WebdaQLParserLexer.js.map +1 -1
- package/lib/WebdaQLParserListener.d.ts +26 -2
- package/lib/WebdaQLParserListener.d.ts.map +1 -1
- package/lib/WebdaQLParserParser.d.ts +34 -9
- package/lib/WebdaQLParserParser.d.ts.map +1 -1
- package/lib/WebdaQLParserParser.js +585 -732
- package/lib/WebdaQLParserParser.js.map +1 -1
- package/lib/WebdaQLParserVisitor.d.ts +16 -1
- package/lib/WebdaQLParserVisitor.d.ts.map +1 -1
- package/lib/completion.d.ts +84 -0
- package/lib/completion.d.ts.map +1 -0
- package/lib/completion.js +467 -0
- package/lib/completion.js.map +1 -0
- package/lib/completion.spec.d.ts +25 -0
- package/lib/completion.spec.d.ts.map +1 -0
- package/lib/completion.spec.js +409 -0
- package/lib/completion.spec.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/now.spec.d.ts +2 -0
- package/lib/now.spec.d.ts.map +1 -0
- package/lib/now.spec.js +258 -0
- package/lib/now.spec.js.map +1 -0
- package/lib/query.d.ts +126 -7
- package/lib/query.d.ts.map +1 -1
- package/lib/query.js +272 -18
- package/lib/query.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kind of candidate offered by code completion
|
|
3
|
+
*/
|
|
4
|
+
export type CompletionKind = "keyword" | "operator" | "field" | "value" | "parameter" | "punctuation";
|
|
5
|
+
/**
|
|
6
|
+
* Field metadata used to provide field completions and contextual value suggestions
|
|
7
|
+
*/
|
|
8
|
+
export interface CompletionField {
|
|
9
|
+
/** Dotted path, e.g. "profile.email" */
|
|
10
|
+
name: string;
|
|
11
|
+
/** JSON schema type, used for value candidates */
|
|
12
|
+
type?: "string" | "number" | "integer" | "boolean" | "array" | "object";
|
|
13
|
+
/** Enum values from the schema */
|
|
14
|
+
enum?: (string | number | boolean)[];
|
|
15
|
+
/** Field description */
|
|
16
|
+
description?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Options configuring WebdaQL code completion
|
|
20
|
+
*/
|
|
21
|
+
export interface CompletionOptions {
|
|
22
|
+
/** Known fields; without them no field candidates are returned */
|
|
23
|
+
fields?: CompletionField[];
|
|
24
|
+
/** Only offer filter-query syntax (no SELECT / DELETE / UPDATE): for REST, GraphQL, MCP Query operations */
|
|
25
|
+
filterOnly?: boolean;
|
|
26
|
+
/** Named parameters available (offered as `:name` where a value is expected) */
|
|
27
|
+
parameters?: string[];
|
|
28
|
+
/** Max candidates, default 50 */
|
|
29
|
+
limit?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A single code completion suggestion
|
|
33
|
+
*/
|
|
34
|
+
export interface CompletionItem {
|
|
35
|
+
/** Shown text, e.g. "ORDER BY", "priority", "TRUE" */
|
|
36
|
+
label: string;
|
|
37
|
+
/** Text to insert, e.g. "ORDER BY ", "'open'" */
|
|
38
|
+
insertText: string;
|
|
39
|
+
/** Category of the completion */
|
|
40
|
+
kind: CompletionKind;
|
|
41
|
+
/** Detail information (e.g. field type or description) */
|
|
42
|
+
detail?: string;
|
|
43
|
+
/** Range of the query replaced by insertText, [start, end) char offsets */
|
|
44
|
+
range: [number, number];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Result of querying completions at a caret position
|
|
48
|
+
*/
|
|
49
|
+
export interface CompletionResult {
|
|
50
|
+
/** List of completion candidates */
|
|
51
|
+
items: CompletionItem[];
|
|
52
|
+
/** Partial word before the caret used for filtering */
|
|
53
|
+
prefix: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Minimal JSON Schema 7 subset for schema flattening without external dependencies
|
|
57
|
+
*/
|
|
58
|
+
export interface JSONSchema7Like {
|
|
59
|
+
type?: string | string[];
|
|
60
|
+
properties?: Record<string, JSONSchema7Like | boolean>;
|
|
61
|
+
enum?: (string | number | boolean)[];
|
|
62
|
+
description?: string;
|
|
63
|
+
items?: JSONSchema7Like | boolean | (JSONSchema7Like | boolean)[];
|
|
64
|
+
$ref?: string;
|
|
65
|
+
[key: string]: any;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Flatten a JSON schema into completion fields (nested objects as dotted paths, max depth 3)
|
|
69
|
+
*
|
|
70
|
+
* @param schema - JSON Schema 7 like object
|
|
71
|
+
* @param maxDepth - Maximum nesting depth (default 3)
|
|
72
|
+
* @returns Array of completion fields
|
|
73
|
+
*/
|
|
74
|
+
export declare function fieldsFromSchema(schema: JSONSchema7Like, maxDepth?: number): CompletionField[];
|
|
75
|
+
/**
|
|
76
|
+
* Get code completion items for a WebdaQL query at the specified caret offset
|
|
77
|
+
*
|
|
78
|
+
* @param query - The WebdaQL query string
|
|
79
|
+
* @param caret - 0-based character offset of the caret
|
|
80
|
+
* @param options - Completion configuration options
|
|
81
|
+
* @returns Completion results with candidates and filtering prefix
|
|
82
|
+
*/
|
|
83
|
+
export declare function getCompletions(query: string, caret: number, options?: CompletionOptions): CompletionResult;
|
|
84
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,CAAC;AAEtG;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IACxE,kCAAkC;IAClC,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IACrC,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,4GAA4G;IAC5G,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,GAAG,CAAC,eAAe,GAAG,OAAO,CAAC,EAAE,CAAC;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAgND;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,SAAI,GAAG,eAAe,EAAE,CAuDzF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,CAiO1G"}
|
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import { Token } from "antlr4ts";
|
|
2
|
+
import { CodeCompletionCore } from "antlr4-c3";
|
|
3
|
+
import { WebdaQLParserParser } from "./WebdaQLParserParser.js";
|
|
4
|
+
import { createTolerantParser } from "./query.js";
|
|
5
|
+
import { escapeValue } from "./webdaql-string.js";
|
|
6
|
+
const PREFERRED_RULES = new Set([
|
|
7
|
+
WebdaQLParserParser.RULE_identifier,
|
|
8
|
+
WebdaQLParserParser.RULE_values,
|
|
9
|
+
WebdaQLParserParser.RULE_booleanLiteral,
|
|
10
|
+
WebdaQLParserParser.RULE_stringLiteral,
|
|
11
|
+
WebdaQLParserParser.RULE_parameter
|
|
12
|
+
]);
|
|
13
|
+
const IGNORED_TOKENS = new Set([
|
|
14
|
+
WebdaQLParserParser.SPACE,
|
|
15
|
+
WebdaQLParserParser.SINGLE_QUOTE_SYMB,
|
|
16
|
+
WebdaQLParserParser.DOUBLE_QUOTE_SYMB,
|
|
17
|
+
WebdaQLParserParser.IDENTIFIER_WITH_NUMBER,
|
|
18
|
+
WebdaQLParserParser.FUNCTION_IDENTIFIER_WITH_UNDERSCORE,
|
|
19
|
+
WebdaQLParserParser.DQUOTED_STRING_LITERAL,
|
|
20
|
+
WebdaQLParserParser.SQUOTED_STRING_LITERAL,
|
|
21
|
+
WebdaQLParserParser.INTEGER_LITERAL,
|
|
22
|
+
WebdaQLParserParser.NUMBER_LITERAL,
|
|
23
|
+
Token.EOF
|
|
24
|
+
]);
|
|
25
|
+
const COMPARISON_TOKENS = new Set([
|
|
26
|
+
WebdaQLParserParser.EQUAL,
|
|
27
|
+
WebdaQLParserParser.NOT_EQUAL,
|
|
28
|
+
WebdaQLParserParser.GREATER,
|
|
29
|
+
WebdaQLParserParser.GREATER_OR_EQUAL,
|
|
30
|
+
WebdaQLParserParser.LESS,
|
|
31
|
+
WebdaQLParserParser.LESS_OR_EQUAL,
|
|
32
|
+
WebdaQLParserParser.LIKE,
|
|
33
|
+
WebdaQLParserParser.IN,
|
|
34
|
+
WebdaQLParserParser.CONTAINS
|
|
35
|
+
]);
|
|
36
|
+
const PUNCTUATION_TOKENS = new Set([
|
|
37
|
+
WebdaQLParserParser.LR_BRACKET,
|
|
38
|
+
WebdaQLParserParser.RR_BRACKET,
|
|
39
|
+
WebdaQLParserParser.COMMA,
|
|
40
|
+
WebdaQLParserParser.LR_SQ_BRACKET,
|
|
41
|
+
WebdaQLParserParser.RR_SQ_BRACKET,
|
|
42
|
+
WebdaQLParserParser.STAR
|
|
43
|
+
]);
|
|
44
|
+
const FILTER_ONLY_DROPPED = new Set([
|
|
45
|
+
"SELECT",
|
|
46
|
+
"DELETE",
|
|
47
|
+
"UPDATE",
|
|
48
|
+
"SET",
|
|
49
|
+
"WHERE",
|
|
50
|
+
"GROUP BY",
|
|
51
|
+
"AS",
|
|
52
|
+
"DISTINCT",
|
|
53
|
+
"COUNT",
|
|
54
|
+
"SUM",
|
|
55
|
+
"AVG",
|
|
56
|
+
"MIN",
|
|
57
|
+
"MAX"
|
|
58
|
+
]);
|
|
59
|
+
const KIND_RANK = {
|
|
60
|
+
field: 1,
|
|
61
|
+
value: 2,
|
|
62
|
+
operator: 3,
|
|
63
|
+
keyword: 4,
|
|
64
|
+
parameter: 5,
|
|
65
|
+
punctuation: 6
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Classify a grammar token into its CompletionKind
|
|
69
|
+
*
|
|
70
|
+
* @param type - ANTLR token type ID
|
|
71
|
+
* @returns corresponding CompletionKind
|
|
72
|
+
*/
|
|
73
|
+
function classifyToken(type) {
|
|
74
|
+
if (COMPARISON_TOKENS.has(type))
|
|
75
|
+
return "operator";
|
|
76
|
+
if (PUNCTUATION_TOKENS.has(type))
|
|
77
|
+
return "punctuation";
|
|
78
|
+
return "keyword";
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Check whether a token type is an identifier or keyword suitable for prefix matching
|
|
82
|
+
*
|
|
83
|
+
* @param type - ANTLR token type ID
|
|
84
|
+
* @returns true if token is identifier or keyword
|
|
85
|
+
*/
|
|
86
|
+
function isIdentifierOrKeyword(type) {
|
|
87
|
+
if (type === WebdaQLParserParser.IDENTIFIER || type === WebdaQLParserParser.IDENTIFIER_WITH_NUMBER)
|
|
88
|
+
return true;
|
|
89
|
+
if (type === WebdaQLParserParser.SPACE || type === Token.EOF)
|
|
90
|
+
return false;
|
|
91
|
+
return !PUNCTUATION_TOKENS.has(type) && !COMPARISON_TOKENS.has(type);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check if the caret position is located inside an unclosed or closed string literal
|
|
95
|
+
*
|
|
96
|
+
* @param query - WebdaQL query string
|
|
97
|
+
* @param caret - 0-based character offset of the caret
|
|
98
|
+
* @returns StringLiteralContext describing if and where caret is inside a string
|
|
99
|
+
*/
|
|
100
|
+
function getStringLiteralContext(query, caret) {
|
|
101
|
+
let inSingle = false;
|
|
102
|
+
let inDouble = false;
|
|
103
|
+
let quoteStart = -1;
|
|
104
|
+
for (let i = 0; i < query.length; i++) {
|
|
105
|
+
const ch = query[i];
|
|
106
|
+
if (ch === "\\" && (inSingle || inDouble)) {
|
|
107
|
+
i++;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (ch === "'" && !inDouble) {
|
|
111
|
+
if (inSingle) {
|
|
112
|
+
if (caret > quoteStart && caret <= i) {
|
|
113
|
+
return {
|
|
114
|
+
inside: true,
|
|
115
|
+
start: quoteStart,
|
|
116
|
+
end: i + 1,
|
|
117
|
+
prefix: query.slice(quoteStart + 1, caret),
|
|
118
|
+
range: [quoteStart, i + 1]
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
inSingle = false;
|
|
122
|
+
quoteStart = -1;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
inSingle = true;
|
|
126
|
+
quoteStart = i;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else if (ch === '"' && !inSingle) {
|
|
130
|
+
if (inDouble) {
|
|
131
|
+
if (caret > quoteStart && caret <= i) {
|
|
132
|
+
return {
|
|
133
|
+
inside: true,
|
|
134
|
+
start: quoteStart,
|
|
135
|
+
end: i + 1,
|
|
136
|
+
prefix: query.slice(quoteStart + 1, caret),
|
|
137
|
+
range: [quoteStart, i + 1]
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
inDouble = false;
|
|
141
|
+
quoteStart = -1;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
inDouble = true;
|
|
145
|
+
quoteStart = i;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if ((inSingle || inDouble) && caret > quoteStart) {
|
|
150
|
+
return {
|
|
151
|
+
inside: true,
|
|
152
|
+
start: quoteStart,
|
|
153
|
+
end: caret,
|
|
154
|
+
prefix: query.slice(quoteStart + 1, caret),
|
|
155
|
+
range: [quoteStart, caret]
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return { inside: false, start: -1, end: -1, prefix: "", range: [caret, caret] };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Walk back over token stream to find the identifier associated with an operator
|
|
162
|
+
*
|
|
163
|
+
* @param tokens - list of parsed tokens
|
|
164
|
+
* @param beforeIndex - token index to start walking backwards from
|
|
165
|
+
* @returns identifier name if found, undefined otherwise
|
|
166
|
+
*/
|
|
167
|
+
function findFieldBeforeOperator(tokens, beforeIndex) {
|
|
168
|
+
let operatorIndex = -1;
|
|
169
|
+
for (let i = beforeIndex - 1; i >= 0; i--) {
|
|
170
|
+
const t = tokens[i];
|
|
171
|
+
if (COMPARISON_TOKENS.has(t.type) || t.type === WebdaQLParserParser.EQUAL) {
|
|
172
|
+
operatorIndex = i;
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (operatorIndex <= 0)
|
|
177
|
+
return undefined;
|
|
178
|
+
for (let i = operatorIndex - 1; i >= 0; i--) {
|
|
179
|
+
const t = tokens[i];
|
|
180
|
+
if (t.type === WebdaQLParserParser.IDENTIFIER || t.type === WebdaQLParserParser.IDENTIFIER_WITH_NUMBER) {
|
|
181
|
+
return t.text;
|
|
182
|
+
}
|
|
183
|
+
if (t.type === WebdaQLParserParser.AND ||
|
|
184
|
+
t.type === WebdaQLParserParser.OR ||
|
|
185
|
+
t.type === WebdaQLParserParser.WHERE ||
|
|
186
|
+
t.type === WebdaQLParserParser.SELECT ||
|
|
187
|
+
t.type === WebdaQLParserParser.UPDATE ||
|
|
188
|
+
t.type === WebdaQLParserParser.DELETE) {
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Flatten a JSON schema into completion fields (nested objects as dotted paths, max depth 3)
|
|
196
|
+
*
|
|
197
|
+
* @param schema - JSON Schema 7 like object
|
|
198
|
+
* @param maxDepth - Maximum nesting depth (default 3)
|
|
199
|
+
* @returns Array of completion fields
|
|
200
|
+
*/
|
|
201
|
+
export function fieldsFromSchema(schema, maxDepth = 3) {
|
|
202
|
+
if (!schema || typeof schema !== "object" || !schema.properties) {
|
|
203
|
+
return [];
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Recursively collect fields from properties
|
|
207
|
+
*
|
|
208
|
+
* @param properties - JSON schema properties map
|
|
209
|
+
* @param prefix - dotted path prefix for nested fields
|
|
210
|
+
* @param currentDepth - current recursion depth
|
|
211
|
+
* @returns array of flattened completion fields
|
|
212
|
+
*/
|
|
213
|
+
function collect(properties, prefix, currentDepth) {
|
|
214
|
+
const result = [];
|
|
215
|
+
for (const [key, prop] of Object.entries(properties)) {
|
|
216
|
+
if (typeof prop === "boolean") {
|
|
217
|
+
if (prop) {
|
|
218
|
+
result.push({ name: prefix ? `${prefix}.${key}` : key });
|
|
219
|
+
}
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (prop.$ref) {
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
const fieldName = prefix ? `${prefix}.${key}` : key;
|
|
226
|
+
const propType = Array.isArray(prop.type) ? prop.type.find(t => t !== "null") : prop.type;
|
|
227
|
+
if (propType === "object" && prop.properties && currentDepth < maxDepth) {
|
|
228
|
+
result.push(...collect(prop.properties, fieldName, currentDepth + 1));
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
const item = { name: fieldName };
|
|
232
|
+
if (typeof propType === "string") {
|
|
233
|
+
item.type = propType;
|
|
234
|
+
}
|
|
235
|
+
if (Array.isArray(prop.enum)) {
|
|
236
|
+
item.enum = prop.enum;
|
|
237
|
+
}
|
|
238
|
+
if (typeof prop.description === "string") {
|
|
239
|
+
item.description = prop.description;
|
|
240
|
+
}
|
|
241
|
+
result.push(item);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
return collect(schema.properties, "", 1);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get code completion items for a WebdaQL query at the specified caret offset
|
|
250
|
+
*
|
|
251
|
+
* @param query - The WebdaQL query string
|
|
252
|
+
* @param caret - 0-based character offset of the caret
|
|
253
|
+
* @param options - Completion configuration options
|
|
254
|
+
* @returns Completion results with candidates and filtering prefix
|
|
255
|
+
*/
|
|
256
|
+
export function getCompletions(query, caret, options) {
|
|
257
|
+
try {
|
|
258
|
+
if (typeof query !== "string") {
|
|
259
|
+
return { items: [], prefix: "" };
|
|
260
|
+
}
|
|
261
|
+
const clampedCaret = Math.max(0, Math.min(query.length, typeof caret === "number" ? caret : 0));
|
|
262
|
+
// Handle caret inside a string literal
|
|
263
|
+
const strCtx = getStringLiteralContext(query, clampedCaret);
|
|
264
|
+
if (strCtx.inside) {
|
|
265
|
+
const { tokens } = createTolerantParser(query.slice(0, strCtx.start));
|
|
266
|
+
tokens.fill();
|
|
267
|
+
const allTokens = tokens.getTokens();
|
|
268
|
+
const fieldName = findFieldBeforeOperator(allTokens, allTokens.length);
|
|
269
|
+
const field = options?.fields?.find(f => f.name === fieldName);
|
|
270
|
+
if (!field || !field.enum) {
|
|
271
|
+
return { items: [], prefix: strCtx.prefix };
|
|
272
|
+
}
|
|
273
|
+
const items = [];
|
|
274
|
+
for (const val of field.enum) {
|
|
275
|
+
const escaped = escapeValue(val);
|
|
276
|
+
items.push({
|
|
277
|
+
label: escaped,
|
|
278
|
+
insertText: escaped,
|
|
279
|
+
kind: "value",
|
|
280
|
+
detail: field.description || field.type,
|
|
281
|
+
range: strCtx.range
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
const filtered = items.filter(it => {
|
|
285
|
+
const unquoted = it.label.replace(/^['"]|['"]$/g, "");
|
|
286
|
+
return unquoted.startsWith(strCtx.prefix) || it.label.startsWith(strCtx.prefix);
|
|
287
|
+
});
|
|
288
|
+
return { items: filtered, prefix: strCtx.prefix };
|
|
289
|
+
}
|
|
290
|
+
// Normal parsing
|
|
291
|
+
const { parser, tokens } = createTolerantParser(query);
|
|
292
|
+
tokens.fill();
|
|
293
|
+
const allTokens = tokens.getTokens();
|
|
294
|
+
let prefix = "";
|
|
295
|
+
let range = [clampedCaret, clampedCaret];
|
|
296
|
+
let caretTokenIndex = allTokens.length - 1;
|
|
297
|
+
for (let i = 0; i < allTokens.length; i++) {
|
|
298
|
+
const t = allTokens[i];
|
|
299
|
+
if (t.type === Token.EOF)
|
|
300
|
+
continue;
|
|
301
|
+
if (isIdentifierOrKeyword(t.type)) {
|
|
302
|
+
if (clampedCaret > t.startIndex && clampedCaret <= t.stopIndex + 1) {
|
|
303
|
+
prefix = query.slice(t.startIndex, clampedCaret);
|
|
304
|
+
range = [t.startIndex, t.stopIndex + 1];
|
|
305
|
+
caretTokenIndex = t.tokenIndex;
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (prefix === "") {
|
|
311
|
+
for (let i = 0; i < allTokens.length; i++) {
|
|
312
|
+
const t = allTokens[i];
|
|
313
|
+
if (t.stopIndex + 1 >= clampedCaret) {
|
|
314
|
+
caretTokenIndex = t.tokenIndex;
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
const c3 = new CodeCompletionCore(parser);
|
|
320
|
+
c3.preferredRules = PREFERRED_RULES;
|
|
321
|
+
c3.ignoredTokens = IGNORED_TOKENS;
|
|
322
|
+
const res = c3.collectCandidates(caretTokenIndex);
|
|
323
|
+
let items = [];
|
|
324
|
+
// 1. Process candidate rules
|
|
325
|
+
for (const [ruleIndex] of res.rules) {
|
|
326
|
+
if (ruleIndex === WebdaQLParserParser.RULE_identifier) {
|
|
327
|
+
if (options?.fields) {
|
|
328
|
+
for (const f of options.fields) {
|
|
329
|
+
items.push({
|
|
330
|
+
label: f.name,
|
|
331
|
+
insertText: f.name,
|
|
332
|
+
kind: "field",
|
|
333
|
+
detail: f.description || f.type,
|
|
334
|
+
range
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
else if (ruleIndex === WebdaQLParserParser.RULE_values ||
|
|
340
|
+
ruleIndex === WebdaQLParserParser.RULE_booleanLiteral ||
|
|
341
|
+
ruleIndex === WebdaQLParserParser.RULE_stringLiteral) {
|
|
342
|
+
const fieldName = findFieldBeforeOperator(allTokens, caretTokenIndex);
|
|
343
|
+
const field = options?.fields?.find(f => f.name === fieldName);
|
|
344
|
+
if (field) {
|
|
345
|
+
if (field.enum) {
|
|
346
|
+
for (const val of field.enum) {
|
|
347
|
+
const escaped = escapeValue(val);
|
|
348
|
+
items.push({
|
|
349
|
+
label: escaped,
|
|
350
|
+
insertText: escaped,
|
|
351
|
+
kind: "value",
|
|
352
|
+
detail: field.description || field.type,
|
|
353
|
+
range
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
if (field.type === "boolean") {
|
|
358
|
+
items.push({
|
|
359
|
+
label: "TRUE",
|
|
360
|
+
insertText: "TRUE",
|
|
361
|
+
kind: "value",
|
|
362
|
+
detail: field.description || field.type,
|
|
363
|
+
range
|
|
364
|
+
});
|
|
365
|
+
items.push({
|
|
366
|
+
label: "FALSE",
|
|
367
|
+
insertText: "FALSE",
|
|
368
|
+
kind: "value",
|
|
369
|
+
detail: field.description || field.type,
|
|
370
|
+
range
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
else if (ruleIndex === WebdaQLParserParser.RULE_parameter) {
|
|
376
|
+
items.push({ label: "?", insertText: "?", kind: "parameter", range });
|
|
377
|
+
if (options?.parameters) {
|
|
378
|
+
for (const p of options.parameters) {
|
|
379
|
+
const name = p.startsWith(":") ? p : `:${p}`;
|
|
380
|
+
items.push({ label: name, insertText: name, kind: "parameter", range });
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// 2. Process candidate tokens
|
|
386
|
+
for (const [tokenType, followList] of res.tokens) {
|
|
387
|
+
if (tokenType === WebdaQLParserParser.IS) {
|
|
388
|
+
items.push({ label: "IS NULL", insertText: "IS NULL ", kind: "operator", range });
|
|
389
|
+
items.push({ label: "IS NOT NULL", insertText: "IS NOT NULL ", kind: "operator", range });
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
const rawName = parser.vocabulary.getLiteralName(tokenType) || parser.vocabulary.getSymbolicName(tokenType);
|
|
393
|
+
if (!rawName)
|
|
394
|
+
continue;
|
|
395
|
+
const cleanName = rawName.replace(/^['"]|['"]$/g, "");
|
|
396
|
+
const kind = classifyToken(tokenType);
|
|
397
|
+
if (followList && followList.length > 0) {
|
|
398
|
+
const followKeywordNames = [];
|
|
399
|
+
let allKeywords = true;
|
|
400
|
+
for (const t of followList) {
|
|
401
|
+
if (classifyToken(t) === "keyword") {
|
|
402
|
+
const name = (parser.vocabulary.getLiteralName(t) || parser.vocabulary.getSymbolicName(t) || "").replace(/^['"]|['"]$/g, "");
|
|
403
|
+
if (name)
|
|
404
|
+
followKeywordNames.push(name);
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
allKeywords = false;
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
if (allKeywords && followKeywordNames.length > 0) {
|
|
412
|
+
const combined = [cleanName, ...followKeywordNames].join(" ");
|
|
413
|
+
items.push({ label: combined, insertText: `${combined} `, kind, range });
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
const insertText = kind === "punctuation" ? cleanName : `${cleanName} `;
|
|
417
|
+
items.push({ label: cleanName, insertText, kind, range });
|
|
418
|
+
}
|
|
419
|
+
// 3. Filter by prefix
|
|
420
|
+
if (prefix) {
|
|
421
|
+
items = items.filter(it => {
|
|
422
|
+
if (it.kind === "field") {
|
|
423
|
+
return it.label.startsWith(prefix);
|
|
424
|
+
}
|
|
425
|
+
else if (it.kind === "keyword" || it.kind === "operator") {
|
|
426
|
+
return it.label.toLowerCase().startsWith(prefix.toLowerCase());
|
|
427
|
+
}
|
|
428
|
+
else if (it.kind === "value") {
|
|
429
|
+
const unquoted = it.label.replace(/^['"]|['"]$/g, "");
|
|
430
|
+
return unquoted.startsWith(prefix) || it.label.startsWith(prefix);
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
return it.label.startsWith(prefix);
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
// 4. Handle filterOnly option
|
|
438
|
+
if (options?.filterOnly) {
|
|
439
|
+
items = items.filter(it => {
|
|
440
|
+
const words = it.label.split(/\s+/);
|
|
441
|
+
return !words.some(w => FILTER_ONLY_DROPPED.has(w));
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
// 5. Deduplicate items by label
|
|
445
|
+
const seen = new Set();
|
|
446
|
+
const deduped = [];
|
|
447
|
+
for (const it of items) {
|
|
448
|
+
if (!seen.has(it.label)) {
|
|
449
|
+
seen.add(it.label);
|
|
450
|
+
deduped.push(it);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// 6. Rank by kind then alphabetically
|
|
454
|
+
deduped.sort((a, b) => {
|
|
455
|
+
const diff = KIND_RANK[a.kind] - KIND_RANK[b.kind];
|
|
456
|
+
if (diff !== 0)
|
|
457
|
+
return diff;
|
|
458
|
+
return a.label.localeCompare(b.label);
|
|
459
|
+
});
|
|
460
|
+
const limit = options?.limit ?? 50;
|
|
461
|
+
return { items: deduped.slice(0, limit), prefix };
|
|
462
|
+
}
|
|
463
|
+
catch (_e) {
|
|
464
|
+
return { items: [], prefix: "" };
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare class CompletionTest {
|
|
2
|
+
caretAtStart(): void;
|
|
3
|
+
partialIdentifier(): void;
|
|
4
|
+
afterIdentifier(): void;
|
|
5
|
+
afterComparisonOnEnumField(): void;
|
|
6
|
+
afterComparisonOnBooleanField(): void;
|
|
7
|
+
afterCompleteComparison(): void;
|
|
8
|
+
afterCompleteComparisonWithPrefix(): void;
|
|
9
|
+
afterOrderByField(): void;
|
|
10
|
+
afterSelect(): void;
|
|
11
|
+
afterSelectCountStar(): void;
|
|
12
|
+
afterUpdate(): void;
|
|
13
|
+
afterUpdateSet(): void;
|
|
14
|
+
dottedPathPrefix(): void;
|
|
15
|
+
insideStringLiteral(): void;
|
|
16
|
+
insideUnclosedStringLiteral(): void;
|
|
17
|
+
afterLimit(): void;
|
|
18
|
+
syntaxErrorAndCaretBoundsNoThrow(): void;
|
|
19
|
+
noFieldsOption(): void;
|
|
20
|
+
namedParameters(): void;
|
|
21
|
+
candidateLimit(): void;
|
|
22
|
+
fieldsFromSchema(): void;
|
|
23
|
+
performanceCheck(): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=completion.spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.spec.d.ts","sourceRoot":"","sources":["../src/completion.spec.ts"],"names":[],"mappings":"AA8BA,qBACa,cAAc;IAEzB,YAAY,SAwBX;IAGD,iBAAiB,SAQhB;IAGD,eAAe,SAiBd;IAGD,0BAA0B,SAUzB;IAGD,6BAA6B,SAO5B;IAGD,uBAAuB,SAUtB;IAGD,iCAAiC,SAQhC;IAGD,iBAAiB,SAShB;IAGD,WAAW,SAYV;IAGD,oBAAoB,SAMnB;IAGD,WAAW,SAMV;IAGD,cAAc,SASb;IAGD,gBAAgB,SAQf;IAGD,mBAAmB,SAQlB;IAGD,2BAA2B,SAM1B;IAGD,UAAU,SAQT;IAGD,gCAAgC,SAkB/B;IAGD,cAAc,SASb;IAGD,eAAe,SASd;IAGD,cAAc,SAGb;IAGD,gBAAgB,SA6Df;IAGD,gBAAgB,SAef;CACF"}
|