@surrealdb/lezer 1.0.0-beta.1

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/src/tokens.js ADDED
@@ -0,0 +1,516 @@
1
+ import {ExternalTokenizer} from "@lezer/lr";
2
+
3
+ import {
4
+ _break,
5
+ _continue,
6
+ _default,
7
+ _delete,
8
+ _else,
9
+ _for,
10
+ _if,
11
+ _in,
12
+ _let,
13
+ _return,
14
+ _throw,
15
+ _with,
16
+ alter,
17
+ analyzer,
18
+ any,
19
+ as,
20
+ asc,
21
+ assert,
22
+ at,
23
+ begin,
24
+ bm25,
25
+ by,
26
+ cancel,
27
+ capacity,
28
+ changefeed,
29
+ changes,
30
+ columns,
31
+ comment,
32
+ commit,
33
+ content,
34
+ create,
35
+ database,
36
+ db,
37
+ define,
38
+ desc,
39
+ dimension,
40
+ dist,
41
+ doc_ids_cache,
42
+ doc_ids_order,
43
+ doc_lengths_cache,
44
+ doc_lengths_order,
45
+ drop,
46
+ duplicate,
47
+ efc,
48
+ end,
49
+ event,
50
+ exists,
51
+ explain,
52
+ extend_candidates,
53
+ fetch,
54
+ field,
55
+ fields,
56
+ filters,
57
+ flexible,
58
+ from,
59
+ group,
60
+ highlights,
61
+ hnsw,
62
+ ignore,
63
+ index,
64
+ info,
65
+ insert,
66
+ into,
67
+ keep_pruned_connections,
68
+ key,
69
+ kill,
70
+ limit,
71
+ live,
72
+ lm,
73
+ m,
74
+ m0,
75
+ merge,
76
+ mtree_cache,
77
+ mtree,
78
+ namespace,
79
+ noindex,
80
+ normal,
81
+ not,
82
+ ns,
83
+ on,
84
+ only,
85
+ option,
86
+ order,
87
+ out,
88
+ overwrite,
89
+ parallel,
90
+ param,
91
+ passhash,
92
+ password,
93
+ patch,
94
+ permissions,
95
+ postings_cache,
96
+ postings_order,
97
+ readonly,
98
+ rebuild,
99
+ relate,
100
+ relation,
101
+ remove,
102
+ roles,
103
+ root,
104
+ sc,
105
+ schemafull,
106
+ schemaless,
107
+ scope,
108
+ search,
109
+ select,
110
+ session,
111
+ set,
112
+ show,
113
+ signin,
114
+ signup,
115
+ since,
116
+ sleep,
117
+ split,
118
+ start,
119
+ structure,
120
+ table,
121
+ tb,
122
+ tempfiles,
123
+ terms_cache,
124
+ terms_order,
125
+ then,
126
+ timeout,
127
+ to,
128
+ token,
129
+ tokenizers,
130
+ transaction,
131
+ typeKeyword,
132
+ unique,
133
+ unset,
134
+ update,
135
+ upsert,
136
+ use,
137
+ user,
138
+ valueKeyword,
139
+ values,
140
+ when,
141
+ where,
142
+
143
+ // Literals
144
+ _false,
145
+ _null,
146
+ _true,
147
+ after,
148
+ before,
149
+ diff,
150
+ full,
151
+ none,
152
+
153
+ f32,
154
+ f64,
155
+ i16,
156
+ i32,
157
+ i64,
158
+
159
+ createPermissions,
160
+ deletePermissions,
161
+ selectPermissions,
162
+ updatePermissions,
163
+
164
+ jwks,
165
+ eddsa,
166
+ es256,
167
+ es384,
168
+ es512,
169
+ ps256,
170
+ ps384,
171
+ ps512,
172
+ rs256,
173
+ rs384,
174
+ rs512,
175
+
176
+ allinside,
177
+ and,
178
+ anyinside,
179
+ contains,
180
+ containsall,
181
+ containsany,
182
+ containsnone,
183
+ containsnot,
184
+ inside,
185
+ intersects,
186
+ is,
187
+ noneinside,
188
+ notinside,
189
+ opIn,
190
+ opNot,
191
+ or,
192
+ outside,
193
+
194
+ chebyshev,
195
+ cosine,
196
+ euclidean,
197
+ hamming,
198
+ jaccard,
199
+ manhattan,
200
+ minkowski,
201
+ pearson,
202
+
203
+ ascii,
204
+ edgengram,
205
+ ngram,
206
+ snowball,
207
+ uppercase,
208
+
209
+ _class,
210
+ blank,
211
+ camel,
212
+ punct,
213
+
214
+ _function,
215
+ rand,
216
+ count,
217
+
218
+ objectOpen,
219
+ } from "./parser.terms";
220
+
221
+ const tokenMap = {
222
+ alter,
223
+ analyzer,
224
+ any,
225
+ as,
226
+ asc,
227
+ assert,
228
+ at,
229
+ begin,
230
+ bm25,
231
+ break: _break,
232
+ by,
233
+ cancel,
234
+ capacity,
235
+ changefeed,
236
+ changes,
237
+ columns,
238
+ comment,
239
+ commit,
240
+ content,
241
+ continue: _continue,
242
+ create,
243
+ database,
244
+ db,
245
+ default: _default,
246
+ define,
247
+ delete: _delete,
248
+ desc,
249
+ dimension,
250
+ dist,
251
+ doc_ids_cache,
252
+ doc_ids_order,
253
+ doc_lengths_cache,
254
+ doc_lengths_order,
255
+ drop,
256
+ duplicate,
257
+ efc,
258
+ else: _else,
259
+ end,
260
+ event,
261
+ exists,
262
+ explain,
263
+ extend_candidates,
264
+ fetch,
265
+ field,
266
+ fields,
267
+ filters,
268
+ flexible,
269
+ for: _for,
270
+ from,
271
+ group,
272
+ highlights,
273
+ hnsw,
274
+ if: _if,
275
+ ignore,
276
+ in: _in,
277
+ index,
278
+ info,
279
+ insert,
280
+ into,
281
+ keep_pruned_connections,
282
+ key,
283
+ kill,
284
+ let: _let,
285
+ limit,
286
+ live,
287
+ lm,
288
+ m,
289
+ m0,
290
+ merge,
291
+ mtree_cache,
292
+ mtree,
293
+ namespace,
294
+ noindex,
295
+ normal,
296
+ not,
297
+ ns,
298
+ on,
299
+ only,
300
+ option,
301
+ order,
302
+ out,
303
+ overwrite,
304
+ parallel,
305
+ param,
306
+ passhash,
307
+ password,
308
+ patch,
309
+ permissions,
310
+ postings_cache,
311
+ postings_order,
312
+ readonly,
313
+ rebuild,
314
+ relate,
315
+ relation,
316
+ remove,
317
+ return: _return,
318
+ roles,
319
+ root,
320
+ sc,
321
+ schemafull,
322
+ schemaless,
323
+ scope,
324
+ search,
325
+ select,
326
+ session,
327
+ set,
328
+ show,
329
+ signin,
330
+ signup,
331
+ since,
332
+ sleep,
333
+ split,
334
+ start,
335
+ structure,
336
+ table,
337
+ tb,
338
+ tempfiles,
339
+ terms_cache,
340
+ terms_order,
341
+ then,
342
+ throw: _throw,
343
+ timeout,
344
+ to,
345
+ token,
346
+ tokenizers,
347
+ transaction,
348
+ type: typeKeyword,
349
+ unique,
350
+ unset,
351
+ update,
352
+ upsert,
353
+ use,
354
+ user,
355
+ value: valueKeyword,
356
+ values,
357
+ when,
358
+ where,
359
+ with: _with,
360
+
361
+ // Literals
362
+ after,
363
+ before,
364
+ diff,
365
+ false: _false,
366
+ full,
367
+ none,
368
+ null: _null,
369
+ true: _true,
370
+
371
+ f32,
372
+ f64,
373
+ i16,
374
+ i32,
375
+ i64,
376
+
377
+ jwks,
378
+ eddsa,
379
+ es256,
380
+ es384,
381
+ es512,
382
+ ps256,
383
+ ps384,
384
+ ps512,
385
+ rs256,
386
+ rs384,
387
+ rs512,
388
+
389
+ allinside,
390
+ and,
391
+ anyinside,
392
+ contains,
393
+ containsall,
394
+ containsany,
395
+ containsnone,
396
+ containsnot,
397
+ inside,
398
+ intersects,
399
+ is,
400
+ noneinside,
401
+ notinside,
402
+ or,
403
+ outside,
404
+
405
+ chebyshev,
406
+ cosine,
407
+ euclidean,
408
+ hamming,
409
+ jaccard,
410
+ manhattan,
411
+ minkowski,
412
+ pearson,
413
+
414
+ ascii,
415
+ edgengram,
416
+ ngram,
417
+ snowball,
418
+ uppercase,
419
+
420
+ blank,
421
+ camel,
422
+ class: _class,
423
+ punct,
424
+
425
+ // Function names
426
+ function: _function,
427
+ rand,
428
+ count,
429
+ };
430
+
431
+ const tryMapped = new Map([
432
+ ["select", [selectPermissions]],
433
+ ["create", [createPermissions]],
434
+ ["update", [updatePermissions]],
435
+ ["delete", [deletePermissions]],
436
+ ["not", [opNot]],
437
+ ["in", [opIn]],
438
+ ]);
439
+
440
+ export const tokens = function(t, stack) {
441
+ for (const tk of tryMapped.get(t.toLowerCase()) ?? []) {
442
+ if (stack.canShift(tk)) return tk;
443
+ }
444
+
445
+ return tokenMap[t.toLowerCase()] ?? -1;
446
+ }
447
+
448
+ function skipSpace(input, off) {
449
+ for (;;) {
450
+ let next = input.peek(off);
451
+ if (next === 32 || next === 9 || next === 10 || next === 13) {
452
+ off++;
453
+ } else if (next === 35 /* '#' */ ||
454
+ (next === 47 /* '/' */ || next === 45 /* '-' */) && input.peek(off + 1) === next) {
455
+ off++;
456
+ for (;;) {
457
+ let next = input.peek(off);
458
+ if (next < 0 || next === 10 || next === 13) break;
459
+ off++;
460
+ }
461
+ } else {
462
+ return off;
463
+ }
464
+ }
465
+ }
466
+
467
+ function isIdentifierChar(ch) {
468
+ return ch === 95 || ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 || ch >= 48 && ch <= 57;
469
+ }
470
+
471
+ function skipObjKey(input, off) {
472
+ let first = input.peek(off);
473
+ if (isIdentifierChar(first)) {
474
+ do {
475
+ off++;
476
+ } while (isIdentifierChar(input.peek(off)));
477
+ return off;
478
+ } else if (first === 38 /* "'" */ || first === 34 /* '"' */) {
479
+ for (let escaped = false;;) {
480
+ let next = input.peek(++off);
481
+ if (next < 0) return off;
482
+ if (next === first && !escaped) return off + 1;
483
+ escaped = next === 92 /* '\\' */
484
+ }
485
+ }
486
+ }
487
+
488
+ export const objectToken = new ExternalTokenizer((input, _stack) => {
489
+ if (input.next === 123 /* '{' */) {
490
+ let off = skipSpace(input, 1);
491
+
492
+ switch (input.peek(off)) {
493
+ // Do we directly encounter another opening bracket?
494
+ case 123: {
495
+ // By not accepting the token, we indicate that the outer bracket is a block
496
+ break;
497
+ }
498
+
499
+ // Is this an empty object?
500
+ case 125: {
501
+ input.acceptToken(objectOpen, 1);
502
+ break;
503
+ }
504
+
505
+ default: {
506
+ let key = skipObjKey(input, off);
507
+ if (key !== null) {
508
+ off = skipSpace(input, key);
509
+ if (input.peek(off) === 58 /* ':' */) {
510
+ input.acceptToken(objectOpen, 1);
511
+ }
512
+ }
513
+ }
514
+ }
515
+ }
516
+ });
@@ -0,0 +1,47 @@
1
+ # Simple Select
2
+
3
+ SELECT * FROM test
4
+
5
+ ==>
6
+
7
+ SurrealQL(SelectStatement(Keyword,Any,Keyword,Ident))
8
+
9
+ # Define Function
10
+
11
+ DEFINE FUNCTION fn::greet($name: string) {
12
+ RETURN "Hello, " + $name + "!";
13
+ };
14
+
15
+ -- Returns: "Hello, Tobie!"
16
+ RETURN fn::greet("Tobie");
17
+
18
+ ==>
19
+
20
+ SurrealQL(
21
+ DefineStatement(
22
+ Keyword,Keyword,FunctionName,ParamList(VariableName,Colon,TypeName),
23
+ Block(BraceOpen,
24
+ ReturnStatement(Keyword,BinaryExpression(BinaryExpression(String,Operator,VariableName),Operator,String)),
25
+ BraceClose)),
26
+ Comment,
27
+ ReturnStatement(Keyword,FunctionCall(FunctionName,ArgumentList(String))))
28
+
29
+ # Remove Function
30
+
31
+ REMOVE FUNCTION fn::update_author;
32
+
33
+ ==>
34
+
35
+ SurrealQL(RemoveStatement(Keyword,Keyword,FunctionName))
36
+
37
+ # Live Select targets
38
+
39
+ LIVE SELECT * FROM person;
40
+ LIVE SELECT * FROM person:tobie;
41
+
42
+ ==>
43
+
44
+ SurrealQL(
45
+ LiveSelectStatement(Keyword,Keyword,Any,Keyword,Ident),
46
+ LiveSelectStatement(Keyword,Keyword,Any,Keyword,RecordId(RecordTbIdent,Colon,RecordIdIdent)),
47
+ )
@@ -0,0 +1,24 @@
1
+ import {parser} from "../dist/index.js";
2
+ import {fileTests} from "@lezer/generator/dist/test";
3
+
4
+ import * as fs from "fs";
5
+ import * as path from "path";
6
+ import {fileURLToPath} from "url";
7
+ let caseDir = path.dirname(fileURLToPath(import.meta.url));
8
+
9
+ let filter = process.argv[2];
10
+
11
+ for (let file of fs.readdirSync(caseDir)) {
12
+ if (!/\.txt$/.test(file)) continue;
13
+ console.log("File " + file + ":");
14
+ for (let {name, run} of fileTests(fs.readFileSync(path.join(caseDir, file), "utf8"), file)) {
15
+ if (!filter || name.indexOf(filter) > -1) {
16
+ try {
17
+ run(parser);
18
+ console.log(" ✔ " + name);
19
+ } catch(e) {
20
+ console.log(" ✘ " + name + "\n " + String(e.message || e).replace(/\n/g, "\n "))
21
+ }
22
+ }
23
+ }
24
+ }