@dxos/echo-query 0.8.4-main.d05673bc65 → 0.8.4-main.e00bdcdb52
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/dist/lib/neutral/index.mjs +215 -17
- package/dist/lib/neutral/index.mjs.map +3 -3
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/query-lite/index.d.ts +308 -228
- package/dist/query-lite/index.d.ts.map +1 -1
- package/dist/query-lite/index.js +162 -29
- package/dist/query-lite/index.js.map +1 -1
- package/dist/types/src/parser/gen/index.d.ts.map +1 -1
- package/dist/types/src/parser/query-builder.d.ts +7 -0
- package/dist/types/src/parser/query-builder.d.ts.map +1 -1
- package/dist/types/src/query-lite/query-lite.d.ts.map +1 -1
- package/dist/types/src/sandbox/query-sandbox.d.ts.map +1 -1
- package/dist/types/src/sandbox/quickjs.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -16
- package/src/parser/query-builder.ts +269 -9
- package/src/parser/query.test.ts +116 -3
- package/src/query-lite/query-lite.ts +234 -38
- package/src/sandbox/query-sandbox.test.ts +2 -2
|
@@ -134,7 +134,7 @@ var QueryBuilder = class {
|
|
|
134
134
|
*/
|
|
135
135
|
validate(input) {
|
|
136
136
|
try {
|
|
137
|
-
const tree = this._parser.parse(input);
|
|
137
|
+
const tree = this._parser.parse(normalizeInput(input));
|
|
138
138
|
return tree.cursor().node.name === "Query";
|
|
139
139
|
} catch {
|
|
140
140
|
return false;
|
|
@@ -145,8 +145,9 @@ var QueryBuilder = class {
|
|
|
145
145
|
*/
|
|
146
146
|
build(input) {
|
|
147
147
|
try {
|
|
148
|
-
const
|
|
149
|
-
|
|
148
|
+
const normalized = normalizeInput(input);
|
|
149
|
+
const tree = this._parser.parse(normalized);
|
|
150
|
+
return this.buildQuery(tree, normalized);
|
|
150
151
|
} catch {
|
|
151
152
|
return {};
|
|
152
153
|
}
|
|
@@ -311,8 +312,9 @@ var QueryBuilder = class {
|
|
|
311
312
|
const exprStart = cursor.from;
|
|
312
313
|
let exprEnd = cursor.to;
|
|
313
314
|
while (cursor.nextSibling() && depth > 0) {
|
|
314
|
-
if (cursor.node.name === "(")
|
|
315
|
-
|
|
315
|
+
if (cursor.node.name === "(") {
|
|
316
|
+
depth++;
|
|
317
|
+
} else if (cursor.node.name === ")") {
|
|
316
318
|
depth--;
|
|
317
319
|
if (depth === 0) {
|
|
318
320
|
exprEnd = cursor.from;
|
|
@@ -401,7 +403,7 @@ var QueryBuilder = class {
|
|
|
401
403
|
cursor.firstChild();
|
|
402
404
|
const text = this._getNodeText(cursor, input);
|
|
403
405
|
cursor.parent();
|
|
404
|
-
return Filter2.text(text.slice(1, -1));
|
|
406
|
+
return Filter2.text(unescapeStringLiteral(text.slice(1, -1)));
|
|
405
407
|
}
|
|
406
408
|
/**
|
|
407
409
|
* Parse an ObjectLiteral node.
|
|
@@ -488,15 +490,7 @@ var QueryBuilder = class {
|
|
|
488
490
|
* Parse a TagFilter node (#tag).
|
|
489
491
|
*/
|
|
490
492
|
_parseTagFilter(cursor, input) {
|
|
491
|
-
invariant(this._tags, void 0, {
|
|
492
|
-
F: __dxlog_file,
|
|
493
|
-
L: 468,
|
|
494
|
-
S: this,
|
|
495
|
-
A: [
|
|
496
|
-
"this._tags",
|
|
497
|
-
""
|
|
498
|
-
]
|
|
499
|
-
});
|
|
493
|
+
invariant(this._tags, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 400, S: this, A: ["this._tags", ""] });
|
|
500
494
|
const str = this._getNodeText(cursor, input).slice(1).toLowerCase();
|
|
501
495
|
const [key] = Object.entries(this._tags).find(([, value]) => value.label.toLowerCase() === str) ?? [];
|
|
502
496
|
return key ? Filter2.tag(key) : void 0;
|
|
@@ -509,7 +503,7 @@ var QueryBuilder = class {
|
|
|
509
503
|
switch (valueType) {
|
|
510
504
|
case "String": {
|
|
511
505
|
const str = this._getNodeText(cursor, input);
|
|
512
|
-
return str.slice(1, -1);
|
|
506
|
+
return unescapeStringLiteral(str.slice(1, -1));
|
|
513
507
|
}
|
|
514
508
|
case "Number":
|
|
515
509
|
return Number(this._getNodeText(cursor, input));
|
|
@@ -556,6 +550,209 @@ var QueryBuilder = class {
|
|
|
556
550
|
return input.slice(cursor.from, cursor.to);
|
|
557
551
|
}
|
|
558
552
|
};
|
|
553
|
+
var KEYWORDS = /* @__PURE__ */ new Set([
|
|
554
|
+
"AND",
|
|
555
|
+
"OR",
|
|
556
|
+
"NOT"
|
|
557
|
+
]);
|
|
558
|
+
var VALUE_LITERALS = /* @__PURE__ */ new Set([
|
|
559
|
+
"true",
|
|
560
|
+
"false",
|
|
561
|
+
"null"
|
|
562
|
+
]);
|
|
563
|
+
var SPECIAL_CHARS = /[\s(){}\[\],"']/;
|
|
564
|
+
var PROPERTY_KEY = /^[a-zA-Z_][a-zA-Z0-9_.]*$/;
|
|
565
|
+
var NUMBER_LITERAL = /^-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
|
|
566
|
+
var URL_SCHEMES = /* @__PURE__ */ new Set([
|
|
567
|
+
"http",
|
|
568
|
+
"https",
|
|
569
|
+
"ftp",
|
|
570
|
+
"ftps",
|
|
571
|
+
"file",
|
|
572
|
+
"mailto",
|
|
573
|
+
"tel",
|
|
574
|
+
"sms",
|
|
575
|
+
"data",
|
|
576
|
+
"javascript",
|
|
577
|
+
"ws",
|
|
578
|
+
"wss",
|
|
579
|
+
"ssh",
|
|
580
|
+
"git"
|
|
581
|
+
]);
|
|
582
|
+
var normalizeInput = (input) => {
|
|
583
|
+
const out = [];
|
|
584
|
+
let pos = 0;
|
|
585
|
+
while (pos < input.length) {
|
|
586
|
+
const currentChar = input[pos];
|
|
587
|
+
if (/\s/.test(currentChar)) {
|
|
588
|
+
out.push(currentChar);
|
|
589
|
+
pos++;
|
|
590
|
+
continue;
|
|
591
|
+
}
|
|
592
|
+
const prevChar = pos > 0 ? input[pos - 1] : "";
|
|
593
|
+
const isStringOpener = currentChar === '"' || currentChar === "'" && (pos === 0 || !/[a-zA-Z0-9_]/.test(prevChar));
|
|
594
|
+
if (isStringOpener) {
|
|
595
|
+
const quoteChar = currentChar;
|
|
596
|
+
let scanIndex2 = pos + 1;
|
|
597
|
+
while (scanIndex2 < input.length && input[scanIndex2] !== quoteChar) {
|
|
598
|
+
if (input[scanIndex2] === "\\" && scanIndex2 + 1 < input.length) {
|
|
599
|
+
scanIndex2 += 2;
|
|
600
|
+
} else {
|
|
601
|
+
scanIndex2++;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
out.push(input.slice(pos, Math.min(scanIndex2 + 1, input.length)));
|
|
605
|
+
pos = scanIndex2 + 1;
|
|
606
|
+
continue;
|
|
607
|
+
}
|
|
608
|
+
if (currentChar === "{" || currentChar === "[") {
|
|
609
|
+
const closeChar = currentChar === "{" ? "}" : "]";
|
|
610
|
+
let depth = 1;
|
|
611
|
+
let scanIndex2 = pos + 1;
|
|
612
|
+
while (scanIndex2 < input.length && depth > 0) {
|
|
613
|
+
const innerChar = input[scanIndex2];
|
|
614
|
+
if (innerChar === '"' || innerChar === "'") {
|
|
615
|
+
const quoteChar = innerChar;
|
|
616
|
+
scanIndex2++;
|
|
617
|
+
while (scanIndex2 < input.length && input[scanIndex2] !== quoteChar) {
|
|
618
|
+
if (input[scanIndex2] === "\\" && scanIndex2 + 1 < input.length) {
|
|
619
|
+
scanIndex2 += 2;
|
|
620
|
+
} else {
|
|
621
|
+
scanIndex2++;
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
scanIndex2++;
|
|
625
|
+
} else if (innerChar === currentChar) {
|
|
626
|
+
depth++;
|
|
627
|
+
scanIndex2++;
|
|
628
|
+
} else if (innerChar === closeChar) {
|
|
629
|
+
depth--;
|
|
630
|
+
scanIndex2++;
|
|
631
|
+
} else {
|
|
632
|
+
scanIndex2++;
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
out.push(input.slice(pos, scanIndex2));
|
|
636
|
+
pos = scanIndex2;
|
|
637
|
+
continue;
|
|
638
|
+
}
|
|
639
|
+
if (currentChar === "(" || currentChar === ")" || currentChar === "=" || currentChar === "," || currentChar === "}" || currentChar === "]") {
|
|
640
|
+
out.push(currentChar);
|
|
641
|
+
pos++;
|
|
642
|
+
continue;
|
|
643
|
+
}
|
|
644
|
+
if (currentChar === "-" && input[pos + 1] === ">" || currentChar === "<" && input[pos + 1] === "-") {
|
|
645
|
+
out.push(input.slice(pos, pos + 2));
|
|
646
|
+
pos += 2;
|
|
647
|
+
continue;
|
|
648
|
+
}
|
|
649
|
+
if (currentChar === "!") {
|
|
650
|
+
out.push(currentChar);
|
|
651
|
+
pos++;
|
|
652
|
+
continue;
|
|
653
|
+
}
|
|
654
|
+
if (currentChar === "#") {
|
|
655
|
+
let scanIndex2 = pos + 1;
|
|
656
|
+
while (scanIndex2 < input.length && /[a-zA-Z0-9_-]/.test(input[scanIndex2])) {
|
|
657
|
+
scanIndex2++;
|
|
658
|
+
}
|
|
659
|
+
out.push(input.slice(pos, scanIndex2));
|
|
660
|
+
pos = scanIndex2;
|
|
661
|
+
continue;
|
|
662
|
+
}
|
|
663
|
+
let scanIndex = pos;
|
|
664
|
+
while (scanIndex < input.length) {
|
|
665
|
+
const innerChar = input[scanIndex];
|
|
666
|
+
if (innerChar === '"') {
|
|
667
|
+
break;
|
|
668
|
+
}
|
|
669
|
+
if (innerChar === "'" && scanIndex > pos && !/[a-zA-Z0-9_]/.test(input[scanIndex - 1])) {
|
|
670
|
+
break;
|
|
671
|
+
}
|
|
672
|
+
if (innerChar === "'" && scanIndex === pos) {
|
|
673
|
+
break;
|
|
674
|
+
}
|
|
675
|
+
if (innerChar !== "'" && SPECIAL_CHARS.test(innerChar)) {
|
|
676
|
+
break;
|
|
677
|
+
}
|
|
678
|
+
if (innerChar === "-" && input[scanIndex + 1] === ">") {
|
|
679
|
+
break;
|
|
680
|
+
}
|
|
681
|
+
if (innerChar === "<" && input[scanIndex + 1] === "-") {
|
|
682
|
+
break;
|
|
683
|
+
}
|
|
684
|
+
scanIndex++;
|
|
685
|
+
}
|
|
686
|
+
if (scanIndex === pos) {
|
|
687
|
+
out.push(currentChar);
|
|
688
|
+
pos++;
|
|
689
|
+
continue;
|
|
690
|
+
}
|
|
691
|
+
const token = input.slice(pos, scanIndex);
|
|
692
|
+
pos = scanIndex;
|
|
693
|
+
if (KEYWORDS.has(token.toUpperCase())) {
|
|
694
|
+
out.push(token);
|
|
695
|
+
continue;
|
|
696
|
+
}
|
|
697
|
+
const colonIdx = token.indexOf(":");
|
|
698
|
+
if (colonIdx > 0) {
|
|
699
|
+
const key = token.slice(0, colonIdx);
|
|
700
|
+
const rest = token.slice(colonIdx + 1);
|
|
701
|
+
if (key === "type") {
|
|
702
|
+
out.push(token);
|
|
703
|
+
continue;
|
|
704
|
+
}
|
|
705
|
+
const isUrlScheme = URL_SCHEMES.has(key.toLowerCase()) || rest.startsWith("//");
|
|
706
|
+
if (!isUrlScheme && PROPERTY_KEY.test(key)) {
|
|
707
|
+
if (rest.length === 0) {
|
|
708
|
+
out.push(token);
|
|
709
|
+
continue;
|
|
710
|
+
}
|
|
711
|
+
const firstValueChar = rest[0];
|
|
712
|
+
if (firstValueChar === '"' || firstValueChar === "'") {
|
|
713
|
+
out.push(token);
|
|
714
|
+
continue;
|
|
715
|
+
}
|
|
716
|
+
if (firstValueChar === "{" || firstValueChar === "[") {
|
|
717
|
+
out.push(token);
|
|
718
|
+
continue;
|
|
719
|
+
}
|
|
720
|
+
if (VALUE_LITERALS.has(rest) || NUMBER_LITERAL.test(rest)) {
|
|
721
|
+
out.push(token);
|
|
722
|
+
continue;
|
|
723
|
+
}
|
|
724
|
+
out.push(`${key}:"${escapeStringLiteral(rest)}"`);
|
|
725
|
+
continue;
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
if (PROPERTY_KEY.test(token)) {
|
|
729
|
+
let lookahead = pos;
|
|
730
|
+
while (lookahead < input.length && /\s/.test(input[lookahead])) {
|
|
731
|
+
lookahead++;
|
|
732
|
+
}
|
|
733
|
+
if (input[lookahead] === "=") {
|
|
734
|
+
out.push(token);
|
|
735
|
+
continue;
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
out.push(`"${escapeStringLiteral(token)}"`);
|
|
739
|
+
}
|
|
740
|
+
return out.join("");
|
|
741
|
+
};
|
|
742
|
+
var escapeStringLiteral = (value) => value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
743
|
+
var unescapeStringLiteral = (literalBody) => {
|
|
744
|
+
let out = "";
|
|
745
|
+
for (let i = 0; i < literalBody.length; i++) {
|
|
746
|
+
const ch = literalBody[i];
|
|
747
|
+
if (ch === "\\" && i + 1 < literalBody.length) {
|
|
748
|
+
out += literalBody[i + 1];
|
|
749
|
+
i++;
|
|
750
|
+
} else {
|
|
751
|
+
out += ch;
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
return out;
|
|
755
|
+
};
|
|
559
756
|
|
|
560
757
|
// src/sandbox/query-sandbox.ts
|
|
561
758
|
import { Resource } from "@dxos/context";
|
|
@@ -714,6 +911,7 @@ var QuerySandbox = class _QuerySandbox extends Resource {
|
|
|
714
911
|
export {
|
|
715
912
|
QueryBuilder,
|
|
716
913
|
QueryDSL,
|
|
717
|
-
QuerySandbox
|
|
914
|
+
QuerySandbox,
|
|
915
|
+
normalizeInput
|
|
718
916
|
};
|
|
719
917
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/parser/gen/query.ts", "../../../src/parser/gen/query.terms.ts", "../../../src/parser/gen/index.ts", "../../../src/parser/query-builder.ts", "../../../src/sandbox/query-sandbox.ts", "../../../src/sandbox/quickjs.ts"],
|
|
4
|
-
"sourcesContent": ["// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nconst spec_Identifier = {__proto__:null,type:26, NOT:86, not:86, \"!\":86, AND:88, and:88, OR:90, or:90}\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"(jOVQPOOOnQPO'#ClOOQO'#Cd'#CdOOQO'#Cf'#CfOyQPO'#ChO!OQPO'#CrO!WQPO'#CkOOQO'#Cc'#CcOOQO'#Cz'#CzOOQO'#DW'#DWOVQPO'#DWQ!]QPOOOVQPO'#DWO!mQPO,58xO!rQPO'#DQO!wQPO,59WO#PQPO,59SO#UQPO'#CtOOQO,59^,59^O#ZQPO,59^O#cQQO,59VO#wQPO,59rOOQO'#C{'#C{OOQO'#C|'#C|OOQO'#C}'#C}OVQPO,59rOVQPO,59rOVQPO,59rO$rQPO,59rOVQPO1G.dOOQO,59l,59lOOQO-E7O-E7OOOQO1G.n1G.nO#cQQO,59`O%VQPO'#DRO%[QPO1G.xOOQO1G.x1G.xO%dQQO'#CwOOQO'#Cn'#CnOOQO1G.q1G.qO%kQPO1G/^O&RQPO1G/^O&iQPO1G/^OOQO1G/^1G/^O'PQPO7+$OOOQO1G.z1G.zOOQO,59m,59mOOQO-E7P-E7POOQO7+$d7+$dOOQO,59c,59cO'dQPO,59cOOQO<<Gj<<GjO#cQQO'#DSO'lQPO1G.}OOQO1G.}1G.}OOQO,59n,59nOOQO-E7Q-E7QOOQO7+$i7+$i\",\n stateData: \"'t~OyOS~ORPOT[OXQOZRO]SOgTO{WO~OS]Oa^O^`X~O^`O~ORaOjbO~O^dO~OrhOshO|fO}gO~PVOTmO~ORnO~Oa^O^`a~ORpO~O^qO~OirOjtO~OZvOcvOdvOevOgTOluO~O{WORzaTzaXzaZza]zagzarzaszawza|za}zaUza~OU{OrhOshO|fO}gO~PVORaO~OirOj!QO~Om!RO~P#cOrzisziwzi|zi}ziUzi~PVO|fOrzisziwzi}ziUzi~PVO|fO}gOrzisziwziUzi~PVOU!TOrhOshO|fO}gO~PVOi!UOm!WO~Oi!UOm!ZO~O\",\n goto: \"%h{PP|PPPP|!]P!]P!]PP!]!lP!{PPP#XP#nPP#hPP#t$U$]$cPP$h$n$tPPP$zkXOYZ[ijklmxyz|kVOYZ[ijklmxyz|kUOYZ[ijklmxyz|QwdQ}qQ!SuR!X!UjVOYZ[ijklmxyz|Xvdqu!UQcTR!OrmYOYZ[eijklmxyz|ZiZlyz|XjZlz|VkZl|Q_PRo_QscR!PsQ!V!SR!Y!VQZO`eYZelxyz|Ql[QxiQyjQzkR|m\",\n nodeNames: \"⚠ Query Assignment Identifier = ( ) Filter TagFilter Tag TextFilter String TypeFilter TypeKeyword : PropertyFilter PropertyPath . Value Number Boolean Null ObjectLiteral { ObjectProperty , } ArrayLiteral [ ] Not And Or Relation ArrowRight ArrowLeft\",\n maxTerm: 45,\n skippedNodes: [0],\n repeatNodeCount: 3,\n tokenData: \"3P~RsX^#`pq#`rs$Tst%qwx&ixy(Qyz(V|}([}!O(a!O!P*Q!Q![(j![!]*V!^!_*[!_!`*g!c!}*l!}#O+W#P#Q+]#R#S*l#T#Y*l#Y#Z+b#Z#b*l#b#c.q#c#h*l#h#i1c#i#o*l#o#p2u#q#r2z#y#z#`$f$g#`#BY#BZ#`$IS$I_#`$I|$JO#`$JT$JU#`$KV$KW#`&FU&FV#`~#eYy~X^#`pq#`#y#z#`$f$g#`#BY#BZ#`$IS$I_#`$I|$JO#`$JT$JU#`$KV$KW#`&FU&FV#`~$WVOr$Trs$ms#O$T#O#P$r#P;'S$T;'S;=`%k<%lO$T~$rOZ~~$uRO;'S$T;'S;=`%O;=`O$T~%RWOr$Trs$ms#O$T#O#P$r#P;'S$T;'S;=`%k;=`<%l$T<%lO$T~%nP;=`<%l$T~%tT}!O&T!Q![&T!c!}&T#R#S&T#T#o&T~&YTX~}!O&T!Q![&T!c!}&T#R#S&T#T#o&T~&lVOw&iwx$mx#O&i#O#P'R#P;'S&i;'S;=`'z<%lO&i~'URO;'S&i;'S;=`'_;=`O&i~'bWOw&iwx$mx#O&i#O#P'R#P;'S&i;'S;=`'z;=`<%l&i<%lO&i~'}P;=`<%l&i~(VOT~~([OU~~(aOi~~(dQ!Q![(j!`!a){~(oSc~!O!P({!Q![(j!g!h)a#X#Y)a~)OP!Q![)R~)WRc~!Q![)R!g!h)a#X#Y)a~)dR{|)m}!O)m!Q![)s~)pP!Q![)s~)xPc~!Q![)s~*QOr~~*VOa~~*[O^~~*_P}!O*b~*gOs~~*lOS~P*qVRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#o*l~+]Ol~~+bOm~R+gWRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#U,P#U#o*lR,UXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#`*l#`#a,q#a#o*lR,vXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#g*l#g#h-c#h#o*lR-hXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#X*l#X#Y.T#Y#o*lR.[VdQRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#o*lR.vXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#i*l#i#j/c#j#o*lR/hXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#`*l#`#a0T#a#o*lR0YXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#`*l#`#a0u#a#o*lR0|VRPeQ}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#o*lR1hXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#f*l#f#g2T#g#o*lR2YXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#i*l#i#j-c#j#o*l~2zOg~~3POj~\",\n tokenizers: [0, 1],\n topRules: {\"Query\":[0,1]},\n specialized: [{term: 3, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}],\n tokenPrec: 0\n})\n", "// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n Query = 1,\n Assignment = 2,\n Identifier = 3,\n Filter = 7,\n TagFilter = 8,\n Tag = 9,\n TextFilter = 10,\n String = 11,\n TypeFilter = 12,\n TypeKeyword = 13,\n PropertyFilter = 15,\n PropertyPath = 16,\n Value = 18,\n Number = 19,\n Boolean = 20,\n Null = 21,\n ObjectLiteral = 22,\n ObjectProperty = 24,\n ArrayLiteral = 27,\n Not = 30,\n And = 31,\n Or = 32,\n Relation = 33,\n ArrowRight = 34,\n ArrowLeft = 35\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { LRParser } from '@lezer/lr';\nimport { parser } from './query';\nimport * as terms from './query.terms';\n\nexport namespace QueryDSL {\n export const Parser: LRParser = parser;\n export const Node = terms;\n export const Tokens = ['type:', 'AND', 'OR', 'NOT'];\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Parser, type Tree, type TreeCursor } from '@lezer/common';\n\nimport { Filter, type Tag } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\n\nimport { QueryDSL } from './gen';\n\n// TODO(burdon): Return Query AST.\nexport type BuildResult = { filter?: Filter.Any; name?: string };\n\n/**\n * Stateless query builder that parses DSL trees into filters.\n *\n * NOTE: QueryBuilder was largely developed using Claude Sonnet 4.5 (in Windsurf)..\n * To modify the functionality, create a minimal breaking test and direct the LLM to fix either the grammar or builder.\n */\nexport class QueryBuilder {\n private readonly _parser: Parser = QueryDSL.Parser.configure({ strict: true });\n\n constructor(private readonly _tags?: Tag.Map) {}\n\n /**\n * Check valid input.\n */\n validate(input: string): boolean {\n try {\n const tree = this._parser.parse(input);\n return tree.cursor().node.name === 'Query';\n } catch {\n return false;\n }\n }\n\n /**\n * Build a query from the input string.\n */\n build(input: string): BuildResult {\n try {\n const tree = this._parser.parse(input);\n return this.buildQuery(tree, input);\n } catch {\n return {};\n }\n }\n\n /**\n * Build a query from a parsed DSL tree.\n */\n buildQuery(tree: Tree, input: string): BuildResult {\n const cursor = tree.cursor();\n\n // Start at root (Query node).\n if (cursor.node.name !== 'Query') {\n return {};\n }\n\n // Check if Query has multiple children (binary expression).\n const children: Array<{ name: string; from: number; to: number }> = [];\n if (cursor.firstChild()) {\n do {\n children.push({ name: cursor.node.name, from: cursor.from, to: cursor.to });\n } while (cursor.nextSibling());\n cursor.parent();\n }\n\n // Check if this is an assignment.\n const hasAssignment = children.some((child) => child.name === 'Assignment');\n if (hasAssignment) {\n return this._parseAssignment(cursor, input);\n }\n\n // If we have an operator in the children, or multiple expressions (implicit AND), parse as binary expression.\n const hasOperator = children.some((child) => child.name === 'And' || child.name === 'Or');\n const hasMultipleExpressions =\n children.filter((child) => child.name === 'Filter' || child.name === 'Not' || child.name === '(').length > 1;\n if (hasOperator || hasMultipleExpressions) {\n const filter = this._parseBinaryExpression(cursor, input);\n return { filter };\n }\n\n // Otherwise, parse the single expression.\n if (!cursor.firstChild()) {\n return { filter: Filter.nothing() };\n }\n\n const filter = this._parseExpression(cursor, input);\n return { filter };\n }\n\n /**\n * Parse an assignment node.\n */\n private _parseAssignment(cursor: TreeCursor, input: string): BuildResult {\n if (!cursor.firstChild()) {\n return {};\n }\n\n let name: string | undefined;\n let filter: Filter.Any | undefined;\n\n // Find the Assignment node\n do {\n if (cursor.node.name === 'Assignment') {\n // Get the full assignment text first\n const assignmentText = this._getNodeText(cursor, input);\n\n if (cursor.firstChild()) {\n // First child should be the variable name (Identifier)\n name = this._getNodeText(cursor, input);\n\n // Find the parentheses in the assignment text and extract the content\n const openParenIndex = assignmentText.indexOf('(');\n const closeParenIndex = assignmentText.lastIndexOf(')');\n\n if (openParenIndex !== -1 && closeParenIndex !== -1 && closeParenIndex > openParenIndex) {\n const subInput = assignmentText.slice(openParenIndex + 1, closeParenIndex).trim();\n const subTree = this._parser.parse(subInput);\n const subResult = this.buildQuery(subTree, subInput);\n filter = subResult.filter;\n }\n\n cursor.parent(); // Back to Assignment\n }\n break;\n }\n } while (cursor.nextSibling());\n\n cursor.parent(); // Back to Query\n return { filter, name };\n }\n\n /**\n * Parse an expression node.\n */\n private _parseExpression(cursor: TreeCursor, input: string): Filter.Any | undefined {\n const nodeName = cursor.node.name;\n\n switch (nodeName) {\n case 'Filter':\n return this._parseFilter(cursor, input);\n\n case 'Not': {\n // Move past NOT token to the expression.\n cursor.nextSibling();\n const notFilter = this._parseExpression(cursor, input);\n return notFilter ? Filter.not(notFilter) : undefined;\n }\n\n case 'And':\n case 'Or':\n // This is the operator node, we need to handle the binary expression.\n // The cursor is positioned at the operator, we need to go back to parent.\n cursor.parent();\n return this._parseBinaryExpression(cursor, input);\n\n case '(': {\n // Skip opening paren.\n cursor.nextSibling();\n const parenFilter = this._parseExpression(cursor, input);\n // Skip closing paren.\n cursor.nextSibling();\n return parenFilter;\n }\n\n default: {\n // Check if this is a binary expression (has And/Or as a child).\n const savedPos = cursor.from;\n if (cursor.firstChild()) {\n // Look for And/Or operators or multiple expressions (implicit AND).\n let hasOperator = false;\n let expressionCount = 0;\n do {\n if (cursor.node.name === 'And' || cursor.node.name === 'Or') {\n hasOperator = true;\n break;\n }\n if (cursor.node.name === 'Filter' || cursor.node.name === 'Not' || cursor.node.name === '(') {\n expressionCount++;\n }\n } while (cursor.nextSibling());\n hasOperator = hasOperator || expressionCount > 1;\n\n // Reset cursor to the saved position.\n cursor.parent();\n cursor.firstChild();\n while (cursor.from !== savedPos && cursor.nextSibling()) {}\n\n if (hasOperator) {\n cursor.parent();\n return this._parseBinaryExpression(cursor, input);\n } else {\n const result = this._parseExpression(cursor, input);\n cursor.parent();\n return result;\n }\n }\n return Filter.nothing();\n }\n }\n }\n\n /**\n * Parse a binary expression (AND/OR).\n */\n private _parseBinaryExpression(cursor: TreeCursor, input: string): Filter.Any {\n const filters: Filter.Any[] = [];\n let operator: 'and' | 'or' | null = null;\n\n // Collect all filters and operators.\n if (cursor.firstChild()) {\n do {\n const nodeName = cursor.node.name;\n\n if (nodeName === 'And' || nodeName === 'Or') {\n operator = nodeName.toLowerCase() as 'and' | 'or';\n } else if (nodeName === '(') {\n // Handle parenthesized expression.\n // Look ahead to see if this is a binary expression.\n const savedPos = cursor.from;\n cursor.nextSibling(); // Move past '('\n\n // Check if the parentheses contain a binary expression.\n let hasBinaryOp = false;\n do {\n if (cursor.node.name === 'And' || cursor.node.name === 'Or') {\n hasBinaryOp = true;\n break;\n }\n } while (cursor.nextSibling() && cursor.node.name !== ')');\n\n // Reset cursor to start of parenthesized content.\n cursor.parent();\n cursor.firstChild();\n while (cursor.from !== savedPos && cursor.nextSibling()) {}\n cursor.nextSibling(); // Move past '(' again.\n\n if (hasBinaryOp) {\n // Find the matching closing parenthesis.\n let depth = 1;\n const exprStart = cursor.from;\n let exprEnd = cursor.to;\n\n while (cursor.nextSibling() && depth > 0) {\n if (cursor.node.name === '(') depth++;\n else if (cursor.node.name === ')') {\n depth--;\n if (depth === 0) {\n exprEnd = cursor.from;\n }\n }\n }\n\n // Parse the expression inside parentheses as a subtree.\n const subInput = input.slice(exprStart, exprEnd);\n const subTree = this._parser.parse(subInput);\n const subResult = this.buildQuery(subTree, subInput);\n if (subResult.filter) {\n filters.push(subResult.filter);\n }\n } else {\n // Simple parenthesized expression.\n const subFilter = this._parseExpression(cursor, input);\n if (subFilter) {\n filters.push(subFilter);\n }\n\n // Skip until we find the closing parenthesis.\n while (cursor.nextSibling() && cursor.node.name !== ')') {}\n }\n } else if (nodeName !== ')') {\n const subFilter = this._parseExpression(cursor, input);\n if (subFilter) {\n filters.push(subFilter);\n }\n }\n } while (cursor.nextSibling());\n\n cursor.parent();\n }\n\n if (filters.length === 0) {\n return Filter.nothing();\n }\n\n if (filters.length === 1) {\n return filters[0];\n }\n\n return operator === 'or' ? Filter.or(...filters) : Filter.and(...filters);\n }\n\n /**\n * Parse a Filter node.\n */\n private _parseFilter(cursor: TreeCursor, input: string): Filter.Any | undefined {\n if (!cursor.firstChild()) {\n return Filter.nothing();\n }\n\n let result: Filter.Any | undefined = undefined;\n const filterType = cursor.node.name;\n switch (filterType) {\n case 'TagFilter':\n if (this._tags) {\n result = this._parseTagFilter(cursor, input);\n }\n break;\n\n case 'TextFilter':\n result = this._parseTextFilter(cursor, input);\n break;\n\n case 'TypeFilter':\n result = this._parseTypeFilter(cursor, input);\n break;\n\n case 'ObjectLiteral':\n result = this._parseObjectLiteral(cursor, input);\n break;\n\n case 'PropertyFilter':\n result = this._parsePropertyFilter(cursor, input);\n break;\n\n default:\n result = Filter.nothing();\n }\n\n cursor.parent();\n return result;\n }\n\n /**\n * Parse a TypeFilter node (type:typename).\n */\n private _parseTypeFilter(cursor: TreeCursor, input: string): Filter.Any {\n // Skip TypeKeyword.\n cursor.firstChild();\n cursor.nextSibling(); // Skip ':'\n cursor.nextSibling(); // Move to Identifier\n\n const typename = this._getNodeText(cursor, input);\n cursor.parent(); // Go back to TypeFilter.\n return Filter.typename(typename);\n }\n\n /**\n * Parse a TextFilter node (quoted string).\n */\n private _parseTextFilter(cursor: TreeCursor, input: string): Filter.Any {\n cursor.firstChild(); // Move to String node.\n const text = this._getNodeText(cursor, input);\n cursor.parent(); // Go back to TextFilter.\n // Remove quotes.\n return Filter.text(text.slice(1, -1));\n }\n\n /**\n * Parse an ObjectLiteral node.\n */\n private _parseObjectLiteral(cursor: TreeCursor, input: string): Filter.Any {\n const props: Record<string, any> = {};\n\n if (cursor.firstChild()) {\n do {\n if (cursor.node.name === 'ObjectProperty') {\n const { key, value } = this._parseObjectProperty(cursor, input);\n if (key) {\n // Convert simple values to Filter.eq for compatibility with Filter.props.\n props[key] = Filter.eq(value);\n }\n }\n } while (cursor.nextSibling());\n\n cursor.parent();\n }\n\n return Filter.props(props);\n }\n\n /**\n * Parse an ObjectProperty node.\n */\n private _parseObjectProperty(cursor: TreeCursor, input: string): { key: string | null; value: any } {\n let key: string | null = null;\n let value: any = null;\n\n if (cursor.firstChild()) {\n // First child should be the property name (Identifier).\n if (cursor.node.name === 'Identifier') {\n key = this._getNodeText(cursor, input);\n }\n\n // Skip ':' and move to Value.\n cursor.nextSibling();\n cursor.nextSibling();\n\n if (cursor.node.name === 'Value' && cursor.firstChild()) {\n value = this._parseValue(cursor, input);\n cursor.parent();\n }\n\n cursor.parent();\n }\n\n return { key, value };\n }\n\n /**\n * Parse a PropertyFilter node (property:value).\n */\n private _parsePropertyFilter(cursor: TreeCursor, input: string): Filter.Any {\n let path: string | null = null;\n let value: any = null;\n\n if (cursor.firstChild()) {\n // First child is PropertyPath.\n if (cursor.node.name === 'PropertyPath') {\n path = this._parsePropertyPath(cursor, input);\n }\n\n // Skip ':' and move to Value.\n cursor.nextSibling();\n cursor.nextSibling();\n\n if (cursor.node.name === 'Value' && cursor.firstChild()) {\n value = this._parseValue(cursor, input);\n cursor.parent();\n }\n\n cursor.parent();\n }\n\n if (!path) {\n return Filter.nothing();\n }\n\n return Filter.props({ [path]: value });\n }\n\n /**\n * Parse a PropertyPath node (supports dot notation).\n */\n private _parsePropertyPath(cursor: TreeCursor, input: string): string {\n const parts: string[] = [];\n\n if (cursor.firstChild()) {\n do {\n if (cursor.node.name === 'Identifier') {\n parts.push(this._getNodeText(cursor, input));\n }\n } while (cursor.nextSibling());\n\n cursor.parent();\n }\n\n return parts.join('.');\n }\n\n /**\n * Parse a TagFilter node (#tag).\n */\n private _parseTagFilter(cursor: TreeCursor, input: string): Filter.Any | undefined {\n invariant(this._tags);\n const str = this._getNodeText(cursor, input).slice(1).toLowerCase();\n const [key] = Object.entries(this._tags!).find(([, value]) => value.label.toLowerCase() === str) ?? [];\n return key ? Filter.tag(key) : undefined;\n }\n\n /**\n * Parse a Value node.\n */\n private _parseValue(cursor: TreeCursor, input: string): any {\n const valueType = cursor.node.name;\n\n switch (valueType) {\n case 'String': {\n // Remove quotes.\n const str = this._getNodeText(cursor, input);\n return str.slice(1, -1);\n }\n\n case 'Number':\n return Number(this._getNodeText(cursor, input));\n\n case 'Boolean':\n return this._getNodeText(cursor, input) === 'true';\n\n case 'Null':\n return null;\n\n case 'ObjectLiteral': {\n // For nested objects, parse recursively.\n const props: Record<string, any> = {};\n if (cursor.firstChild()) {\n do {\n if (cursor.node.name === 'ObjectProperty') {\n const { key, value } = this._parseObjectProperty(cursor, input);\n if (key) {\n props[key] = value;\n }\n }\n } while (cursor.nextSibling());\n cursor.parent();\n }\n return props;\n }\n\n case 'ArrayLiteral': {\n // Parse array values\n const array: any[] = [];\n if (cursor.firstChild()) {\n do {\n if (cursor.node.name === 'Value' && cursor.firstChild()) {\n array.push(this._parseValue(cursor, input));\n cursor.parent();\n }\n } while (cursor.nextSibling());\n cursor.parent();\n }\n return array;\n }\n\n default:\n return null;\n }\n }\n\n /**\n * Get the text content of the current node.\n */\n private _getNodeText(cursor: TreeCursor, input: string): string {\n return input.slice(cursor.from, cursor.to);\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Resource } from '@dxos/context';\nimport { Query, type QueryAST } from '@dxos/echo';\nimport { trim } from '@dxos/util';\nimport { type QuickJSRuntime, type QuickJSWASMModule, createQuickJS } from '@dxos/vendor-quickjs';\n\nimport envCode from '#query-lite?raw';\n\nimport { unwrapResult } from './quickjs';\n\n/**\n * Evaluates queries written in JavaScript using QuickJS.\n * Queries are expected to use the echo Query API.\n * `Query`, `Filter` and `Order` are provided as globals.\n */\nexport class QuerySandbox extends Resource {\n // Caching the wasm module.\n private static quickJS: Promise<QuickJSWASMModule> | null = null;\n static getQuickJS() {\n if (!QuerySandbox.quickJS) {\n QuerySandbox.quickJS = createQuickJS();\n }\n\n return QuerySandbox.quickJS;\n }\n\n #runtime!: QuickJSRuntime;\n\n protected override async _open() {\n const quickJS = await QuerySandbox.getQuickJS();\n this.#runtime = quickJS.newRuntime({\n moduleLoader: (moduleName, _context) => {\n switch (moduleName) {\n case 'dxos:query-lite':\n return envCode;\n default:\n throw new Error(`Module not found: ${moduleName}`);\n }\n },\n });\n }\n\n protected override async _close() {\n this.#runtime.dispose();\n }\n\n /**\n * Evaluates the query code.\n * @param queryCode Example: `Query.select(Filter.typename('org.dxos.type.person'))`\n */\n eval(queryCode: string): QueryAST.Query {\n using context = this.#runtime.newContext();\n const globals = trim`\n import { Filter, Order, Query } from 'dxos:query-lite';\n globalThis.Filter = Filter;\n globalThis.Order = Order;\n globalThis.Query = Query;\n `;\n\n unwrapResult(context, context.evalCode(globals)).dispose();\n using query = unwrapResult(context, context.evalCode(queryCode));\n const result = context.dump(query);\n if ('~Filter' in result) {\n return Query.select(result).ast;\n } else {\n return result.ast;\n }\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type QuickJSContext, type QuickJSHandle, type SuccessOrFail } from '@dxos/vendor-quickjs';\n\n/**\n * Unwraps a result and throws the underlying error.\n *\n * Replacement for `QuickJScontext.unwrapResult` because that seems to cause an OOM.\n */\n// TODO(burdon): Factor out.\nexport const unwrapResult = <T>(context: QuickJSContext, result: SuccessOrFail<T, QuickJSHandle>): T => {\n if (result.error) {\n const contextError = context.dump(result.error);\n result.error.dispose();\n if (\n typeof contextError === 'object' &&\n typeof contextError.name === 'string' &&\n typeof contextError.message === 'string'\n ) {\n const error = new Error(contextError.message);\n Object.defineProperty(error, 'name', { value: contextError.name });\n const originalStack = error.stack;\n error.stack = `${contextError.name}: ${contextError.message}\\n${contextError.stack}${originalStack?.split('\\n').slice(1).join('\\n') ?? ''}`;\n throw error;\n } else {\n throw new Error(String(contextError));\n }\n }\n\n return result.value;\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["LRParser", "spec_Identifier", "__proto__", "type", "NOT", "not", "AND", "and", "OR", "or", "parser", "
|
|
4
|
+
"sourcesContent": ["// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nconst spec_Identifier = {__proto__:null,type:26, NOT:86, not:86, \"!\":86, AND:88, and:88, OR:90, or:90}\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"(jOVQPOOOnQPO'#ClOOQO'#Cd'#CdOOQO'#Cf'#CfOyQPO'#ChO!OQPO'#CrO!WQPO'#CkOOQO'#Cc'#CcOOQO'#Cz'#CzOOQO'#DW'#DWOVQPO'#DWQ!]QPOOOVQPO'#DWO!mQPO,58xO!rQPO'#DQO!wQPO,59WO#PQPO,59SO#UQPO'#CtOOQO,59^,59^O#ZQPO,59^O#cQQO,59VO#wQPO,59rOOQO'#C{'#C{OOQO'#C|'#C|OOQO'#C}'#C}OVQPO,59rOVQPO,59rOVQPO,59rO$rQPO,59rOVQPO1G.dOOQO,59l,59lOOQO-E7O-E7OOOQO1G.n1G.nO#cQQO,59`O%VQPO'#DRO%[QPO1G.xOOQO1G.x1G.xO%dQQO'#CwOOQO'#Cn'#CnOOQO1G.q1G.qO%kQPO1G/^O&RQPO1G/^O&iQPO1G/^OOQO1G/^1G/^O'PQPO7+$OOOQO1G.z1G.zOOQO,59m,59mOOQO-E7P-E7POOQO7+$d7+$dOOQO,59c,59cO'dQPO,59cOOQO<<Gj<<GjO#cQQO'#DSO'lQPO1G.}OOQO1G.}1G.}OOQO,59n,59nOOQO-E7Q-E7QOOQO7+$i7+$i\",\n stateData: \"'t~OyOS~ORPOT[OXQOZRO]SOgTO{WO~OS]Oa^O^`X~O^`O~ORaOjbO~O^dO~OrhOshO|fO}gO~PVOTmO~ORnO~Oa^O^`a~ORpO~O^qO~OirOjtO~OZvOcvOdvOevOgTOluO~O{WORzaTzaXzaZza]zagzarzaszawza|za}zaUza~OU{OrhOshO|fO}gO~PVORaO~OirOj!QO~Om!RO~P#cOrzisziwzi|zi}ziUzi~PVO|fOrzisziwzi}ziUzi~PVO|fO}gOrzisziwziUzi~PVOU!TOrhOshO|fO}gO~PVOi!UOm!WO~Oi!UOm!ZO~O\",\n goto: \"%h{PP|PPPP|!]P!]P!]PP!]!lP!{PPP#XP#nPP#hPP#t$U$]$cPP$h$n$tPPP$zkXOYZ[ijklmxyz|kVOYZ[ijklmxyz|kUOYZ[ijklmxyz|QwdQ}qQ!SuR!X!UjVOYZ[ijklmxyz|Xvdqu!UQcTR!OrmYOYZ[eijklmxyz|ZiZlyz|XjZlz|VkZl|Q_PRo_QscR!PsQ!V!SR!Y!VQZO`eYZelxyz|Ql[QxiQyjQzkR|m\",\n nodeNames: \"⚠ Query Assignment Identifier = ( ) Filter TagFilter Tag TextFilter String TypeFilter TypeKeyword : PropertyFilter PropertyPath . Value Number Boolean Null ObjectLiteral { ObjectProperty , } ArrayLiteral [ ] Not And Or Relation ArrowRight ArrowLeft\",\n maxTerm: 45,\n skippedNodes: [0],\n repeatNodeCount: 3,\n tokenData: \"3P~RsX^#`pq#`rs$Tst%qwx&ixy(Qyz(V|}([}!O(a!O!P*Q!Q![(j![!]*V!^!_*[!_!`*g!c!}*l!}#O+W#P#Q+]#R#S*l#T#Y*l#Y#Z+b#Z#b*l#b#c.q#c#h*l#h#i1c#i#o*l#o#p2u#q#r2z#y#z#`$f$g#`#BY#BZ#`$IS$I_#`$I|$JO#`$JT$JU#`$KV$KW#`&FU&FV#`~#eYy~X^#`pq#`#y#z#`$f$g#`#BY#BZ#`$IS$I_#`$I|$JO#`$JT$JU#`$KV$KW#`&FU&FV#`~$WVOr$Trs$ms#O$T#O#P$r#P;'S$T;'S;=`%k<%lO$T~$rOZ~~$uRO;'S$T;'S;=`%O;=`O$T~%RWOr$Trs$ms#O$T#O#P$r#P;'S$T;'S;=`%k;=`<%l$T<%lO$T~%nP;=`<%l$T~%tT}!O&T!Q![&T!c!}&T#R#S&T#T#o&T~&YTX~}!O&T!Q![&T!c!}&T#R#S&T#T#o&T~&lVOw&iwx$mx#O&i#O#P'R#P;'S&i;'S;=`'z<%lO&i~'URO;'S&i;'S;=`'_;=`O&i~'bWOw&iwx$mx#O&i#O#P'R#P;'S&i;'S;=`'z;=`<%l&i<%lO&i~'}P;=`<%l&i~(VOT~~([OU~~(aOi~~(dQ!Q![(j!`!a){~(oSc~!O!P({!Q![(j!g!h)a#X#Y)a~)OP!Q![)R~)WRc~!Q![)R!g!h)a#X#Y)a~)dR{|)m}!O)m!Q![)s~)pP!Q![)s~)xPc~!Q![)s~*QOr~~*VOa~~*[O^~~*_P}!O*b~*gOs~~*lOS~P*qVRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#o*l~+]Ol~~+bOm~R+gWRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#U,P#U#o*lR,UXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#`*l#`#a,q#a#o*lR,vXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#g*l#g#h-c#h#o*lR-hXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#X*l#X#Y.T#Y#o*lR.[VdQRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#o*lR.vXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#i*l#i#j/c#j#o*lR/hXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#`*l#`#a0T#a#o*lR0YXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#`*l#`#a0u#a#o*lR0|VRPeQ}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#o*lR1hXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#f*l#f#g2T#g#o*lR2YXRP}!O*l!O!P*l!P!Q*l!Q![*l!c!}*l#R#S*l#T#i*l#i#j-c#j#o*l~2zOg~~3POj~\",\n tokenizers: [0, 1],\n topRules: {\"Query\":[0,1]},\n specialized: [{term: 3, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}],\n tokenPrec: 0\n})\n", "// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n Query = 1,\n Assignment = 2,\n Identifier = 3,\n Filter = 7,\n TagFilter = 8,\n Tag = 9,\n TextFilter = 10,\n String = 11,\n TypeFilter = 12,\n TypeKeyword = 13,\n PropertyFilter = 15,\n PropertyPath = 16,\n Value = 18,\n Number = 19,\n Boolean = 20,\n Null = 21,\n ObjectLiteral = 22,\n ObjectProperty = 24,\n ArrayLiteral = 27,\n Not = 30,\n And = 31,\n Or = 32,\n Relation = 33,\n ArrowRight = 34,\n ArrowLeft = 35\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { LRParser } from '@lezer/lr';\nimport { parser } from './query';\nimport * as terms from './query.terms';\n\nexport namespace QueryDSL {\n export const Parser: LRParser = parser;\n export const Node = terms;\n export const Tokens = ['type:', 'AND', 'OR', 'NOT'];\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Parser, type Tree, type TreeCursor } from '@lezer/common';\n\nimport { Filter, type Tag } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\n\nimport { QueryDSL } from './gen';\n\n// TODO(burdon): Return Query AST.\nexport type BuildResult = { filter?: Filter.Any; name?: string };\n\n/**\n * Stateless query builder that parses DSL trees into filters.\n *\n * NOTE: QueryBuilder was largely developed using Claude Sonnet 4.5 (in Windsurf)..\n * To modify the functionality, create a minimal breaking test and direct the LLM to fix either the grammar or builder.\n */\nexport class QueryBuilder {\n private readonly _parser: Parser = QueryDSL.Parser.configure({ strict: true });\n\n constructor(private readonly _tags?: Tag.Map) {}\n\n /**\n * Check valid input.\n */\n validate(input: string): boolean {\n try {\n const tree = this._parser.parse(normalizeInput(input));\n return tree.cursor().node.name === 'Query';\n } catch {\n return false;\n }\n }\n\n /**\n * Build a query from the input string.\n */\n build(input: string): BuildResult {\n try {\n const normalized = normalizeInput(input);\n const tree = this._parser.parse(normalized);\n return this.buildQuery(tree, normalized);\n } catch {\n return {};\n }\n }\n\n /**\n * Build a query from a parsed DSL tree.\n */\n buildQuery(tree: Tree, input: string): BuildResult {\n const cursor = tree.cursor();\n\n // Start at root (Query node).\n if (cursor.node.name !== 'Query') {\n return {};\n }\n\n // Check if Query has multiple children (binary expression).\n const children: Array<{ name: string; from: number; to: number }> = [];\n if (cursor.firstChild()) {\n do {\n children.push({ name: cursor.node.name, from: cursor.from, to: cursor.to });\n } while (cursor.nextSibling());\n cursor.parent();\n }\n\n // Check if this is an assignment.\n const hasAssignment = children.some((child) => child.name === 'Assignment');\n if (hasAssignment) {\n return this._parseAssignment(cursor, input);\n }\n\n // If we have an operator in the children, or multiple expressions (implicit AND), parse as binary expression.\n const hasOperator = children.some((child) => child.name === 'And' || child.name === 'Or');\n const hasMultipleExpressions =\n children.filter((child) => child.name === 'Filter' || child.name === 'Not' || child.name === '(').length > 1;\n if (hasOperator || hasMultipleExpressions) {\n const filter = this._parseBinaryExpression(cursor, input);\n return { filter };\n }\n\n // Otherwise, parse the single expression.\n if (!cursor.firstChild()) {\n return { filter: Filter.nothing() };\n }\n\n const filter = this._parseExpression(cursor, input);\n return { filter };\n }\n\n /**\n * Parse an assignment node.\n */\n private _parseAssignment(cursor: TreeCursor, input: string): BuildResult {\n if (!cursor.firstChild()) {\n return {};\n }\n\n let name: string | undefined;\n let filter: Filter.Any | undefined;\n\n // Find the Assignment node\n do {\n if (cursor.node.name === 'Assignment') {\n // Get the full assignment text first\n const assignmentText = this._getNodeText(cursor, input);\n\n if (cursor.firstChild()) {\n // First child should be the variable name (Identifier)\n name = this._getNodeText(cursor, input);\n\n // Find the parentheses in the assignment text and extract the content\n const openParenIndex = assignmentText.indexOf('(');\n const closeParenIndex = assignmentText.lastIndexOf(')');\n\n if (openParenIndex !== -1 && closeParenIndex !== -1 && closeParenIndex > openParenIndex) {\n const subInput = assignmentText.slice(openParenIndex + 1, closeParenIndex).trim();\n const subTree = this._parser.parse(subInput);\n const subResult = this.buildQuery(subTree, subInput);\n filter = subResult.filter;\n }\n\n cursor.parent(); // Back to Assignment\n }\n break;\n }\n } while (cursor.nextSibling());\n\n cursor.parent(); // Back to Query\n return { filter, name };\n }\n\n /**\n * Parse an expression node.\n */\n private _parseExpression(cursor: TreeCursor, input: string): Filter.Any | undefined {\n const nodeName = cursor.node.name;\n\n switch (nodeName) {\n case 'Filter':\n return this._parseFilter(cursor, input);\n\n case 'Not': {\n // Move past NOT token to the expression.\n cursor.nextSibling();\n const notFilter = this._parseExpression(cursor, input);\n return notFilter ? Filter.not(notFilter) : undefined;\n }\n\n case 'And':\n case 'Or':\n // This is the operator node, we need to handle the binary expression.\n // The cursor is positioned at the operator, we need to go back to parent.\n cursor.parent();\n return this._parseBinaryExpression(cursor, input);\n\n case '(': {\n // Skip opening paren.\n cursor.nextSibling();\n const parenFilter = this._parseExpression(cursor, input);\n // Skip closing paren.\n cursor.nextSibling();\n return parenFilter;\n }\n\n default: {\n // Check if this is a binary expression (has And/Or as a child).\n const savedPos = cursor.from;\n if (cursor.firstChild()) {\n // Look for And/Or operators or multiple expressions (implicit AND).\n let hasOperator = false;\n let expressionCount = 0;\n do {\n if (cursor.node.name === 'And' || cursor.node.name === 'Or') {\n hasOperator = true;\n break;\n }\n if (cursor.node.name === 'Filter' || cursor.node.name === 'Not' || cursor.node.name === '(') {\n expressionCount++;\n }\n } while (cursor.nextSibling());\n hasOperator = hasOperator || expressionCount > 1;\n\n // Reset cursor to the saved position.\n cursor.parent();\n cursor.firstChild();\n while (cursor.from !== savedPos && cursor.nextSibling()) {}\n\n if (hasOperator) {\n cursor.parent();\n return this._parseBinaryExpression(cursor, input);\n } else {\n const result = this._parseExpression(cursor, input);\n cursor.parent();\n return result;\n }\n }\n return Filter.nothing();\n }\n }\n }\n\n /**\n * Parse a binary expression (AND/OR).\n */\n private _parseBinaryExpression(cursor: TreeCursor, input: string): Filter.Any {\n const filters: Filter.Any[] = [];\n let operator: 'and' | 'or' | null = null;\n\n // Collect all filters and operators.\n if (cursor.firstChild()) {\n do {\n const nodeName = cursor.node.name;\n\n if (nodeName === 'And' || nodeName === 'Or') {\n operator = nodeName.toLowerCase() as 'and' | 'or';\n } else if (nodeName === '(') {\n // Handle parenthesized expression.\n // Look ahead to see if this is a binary expression.\n const savedPos = cursor.from;\n cursor.nextSibling(); // Move past '('\n\n // Check if the parentheses contain a binary expression.\n let hasBinaryOp = false;\n do {\n if (cursor.node.name === 'And' || cursor.node.name === 'Or') {\n hasBinaryOp = true;\n break;\n }\n } while (cursor.nextSibling() && cursor.node.name !== ')');\n\n // Reset cursor to start of parenthesized content.\n cursor.parent();\n cursor.firstChild();\n while (cursor.from !== savedPos && cursor.nextSibling()) {}\n cursor.nextSibling(); // Move past '(' again.\n\n if (hasBinaryOp) {\n // Find the matching closing parenthesis.\n let depth = 1;\n const exprStart = cursor.from;\n let exprEnd = cursor.to;\n\n while (cursor.nextSibling() && depth > 0) {\n if (cursor.node.name === '(') {\n depth++;\n } else if (cursor.node.name === ')') {\n depth--;\n if (depth === 0) {\n exprEnd = cursor.from;\n }\n }\n }\n\n // Parse the expression inside parentheses as a subtree.\n const subInput = input.slice(exprStart, exprEnd);\n const subTree = this._parser.parse(subInput);\n const subResult = this.buildQuery(subTree, subInput);\n if (subResult.filter) {\n filters.push(subResult.filter);\n }\n } else {\n // Simple parenthesized expression.\n const subFilter = this._parseExpression(cursor, input);\n if (subFilter) {\n filters.push(subFilter);\n }\n\n // Skip until we find the closing parenthesis.\n while (cursor.nextSibling() && cursor.node.name !== ')') {}\n }\n } else if (nodeName !== ')') {\n const subFilter = this._parseExpression(cursor, input);\n if (subFilter) {\n filters.push(subFilter);\n }\n }\n } while (cursor.nextSibling());\n\n cursor.parent();\n }\n\n if (filters.length === 0) {\n return Filter.nothing();\n }\n\n if (filters.length === 1) {\n return filters[0];\n }\n\n return operator === 'or' ? Filter.or(...filters) : Filter.and(...filters);\n }\n\n /**\n * Parse a Filter node.\n */\n private _parseFilter(cursor: TreeCursor, input: string): Filter.Any | undefined {\n if (!cursor.firstChild()) {\n return Filter.nothing();\n }\n\n let result: Filter.Any | undefined = undefined;\n const filterType = cursor.node.name;\n switch (filterType) {\n case 'TagFilter':\n if (this._tags) {\n result = this._parseTagFilter(cursor, input);\n }\n break;\n\n case 'TextFilter':\n result = this._parseTextFilter(cursor, input);\n break;\n\n case 'TypeFilter':\n result = this._parseTypeFilter(cursor, input);\n break;\n\n case 'ObjectLiteral':\n result = this._parseObjectLiteral(cursor, input);\n break;\n\n case 'PropertyFilter':\n result = this._parsePropertyFilter(cursor, input);\n break;\n\n default:\n result = Filter.nothing();\n }\n\n cursor.parent();\n return result;\n }\n\n /**\n * Parse a TypeFilter node (type:typename).\n */\n private _parseTypeFilter(cursor: TreeCursor, input: string): Filter.Any {\n // Skip TypeKeyword.\n cursor.firstChild();\n cursor.nextSibling(); // Skip ':'\n cursor.nextSibling(); // Move to Identifier\n\n const typename = this._getNodeText(cursor, input);\n cursor.parent(); // Go back to TypeFilter.\n return Filter.typename(typename);\n }\n\n /**\n * Parse a TextFilter node (quoted string).\n */\n private _parseTextFilter(cursor: TreeCursor, input: string): Filter.Any {\n cursor.firstChild(); // Move to String node.\n const text = this._getNodeText(cursor, input);\n cursor.parent(); // Go back to TextFilter.\n // Remove quotes and decode escapes.\n return Filter.text(unescapeStringLiteral(text.slice(1, -1)));\n }\n\n /**\n * Parse an ObjectLiteral node.\n */\n private _parseObjectLiteral(cursor: TreeCursor, input: string): Filter.Any {\n const props: Record<string, any> = {};\n\n if (cursor.firstChild()) {\n do {\n if (cursor.node.name === 'ObjectProperty') {\n const { key, value } = this._parseObjectProperty(cursor, input);\n if (key) {\n // Convert simple values to Filter.eq for compatibility with Filter.props.\n props[key] = Filter.eq(value);\n }\n }\n } while (cursor.nextSibling());\n\n cursor.parent();\n }\n\n return Filter.props(props);\n }\n\n /**\n * Parse an ObjectProperty node.\n */\n private _parseObjectProperty(cursor: TreeCursor, input: string): { key: string | null; value: any } {\n let key: string | null = null;\n let value: any = null;\n\n if (cursor.firstChild()) {\n // First child should be the property name (Identifier).\n if (cursor.node.name === 'Identifier') {\n key = this._getNodeText(cursor, input);\n }\n\n // Skip ':' and move to Value.\n cursor.nextSibling();\n cursor.nextSibling();\n\n if (cursor.node.name === 'Value' && cursor.firstChild()) {\n value = this._parseValue(cursor, input);\n cursor.parent();\n }\n\n cursor.parent();\n }\n\n return { key, value };\n }\n\n /**\n * Parse a PropertyFilter node (property:value).\n */\n private _parsePropertyFilter(cursor: TreeCursor, input: string): Filter.Any {\n let path: string | null = null;\n let value: any = null;\n\n if (cursor.firstChild()) {\n // First child is PropertyPath.\n if (cursor.node.name === 'PropertyPath') {\n path = this._parsePropertyPath(cursor, input);\n }\n\n // Skip ':' and move to Value.\n cursor.nextSibling();\n cursor.nextSibling();\n\n if (cursor.node.name === 'Value' && cursor.firstChild()) {\n value = this._parseValue(cursor, input);\n cursor.parent();\n }\n\n cursor.parent();\n }\n\n if (!path) {\n return Filter.nothing();\n }\n\n return Filter.props({ [path]: value });\n }\n\n /**\n * Parse a PropertyPath node (supports dot notation).\n */\n private _parsePropertyPath(cursor: TreeCursor, input: string): string {\n const parts: string[] = [];\n\n if (cursor.firstChild()) {\n do {\n if (cursor.node.name === 'Identifier') {\n parts.push(this._getNodeText(cursor, input));\n }\n } while (cursor.nextSibling());\n\n cursor.parent();\n }\n\n return parts.join('.');\n }\n\n /**\n * Parse a TagFilter node (#tag).\n */\n private _parseTagFilter(cursor: TreeCursor, input: string): Filter.Any | undefined {\n invariant(this._tags);\n const str = this._getNodeText(cursor, input).slice(1).toLowerCase();\n const [key] = Object.entries(this._tags!).find(([, value]) => value.label.toLowerCase() === str) ?? [];\n return key ? Filter.tag(key) : undefined;\n }\n\n /**\n * Parse a Value node.\n */\n private _parseValue(cursor: TreeCursor, input: string): any {\n const valueType = cursor.node.name;\n\n switch (valueType) {\n case 'String': {\n // Remove quotes and decode escapes.\n const str = this._getNodeText(cursor, input);\n return unescapeStringLiteral(str.slice(1, -1));\n }\n\n case 'Number':\n return Number(this._getNodeText(cursor, input));\n\n case 'Boolean':\n return this._getNodeText(cursor, input) === 'true';\n\n case 'Null':\n return null;\n\n case 'ObjectLiteral': {\n // For nested objects, parse recursively.\n const props: Record<string, any> = {};\n if (cursor.firstChild()) {\n do {\n if (cursor.node.name === 'ObjectProperty') {\n const { key, value } = this._parseObjectProperty(cursor, input);\n if (key) {\n props[key] = value;\n }\n }\n } while (cursor.nextSibling());\n cursor.parent();\n }\n return props;\n }\n\n case 'ArrayLiteral': {\n // Parse array values\n const array: any[] = [];\n if (cursor.firstChild()) {\n do {\n if (cursor.node.name === 'Value' && cursor.firstChild()) {\n array.push(this._parseValue(cursor, input));\n cursor.parent();\n }\n } while (cursor.nextSibling());\n cursor.parent();\n }\n return array;\n }\n\n default:\n return null;\n }\n }\n\n /**\n * Get the text content of the current node.\n */\n private _getNodeText(cursor: TreeCursor, input: string): string {\n return input.slice(cursor.from, cursor.to);\n }\n}\n\nconst KEYWORDS = new Set(['AND', 'OR', 'NOT']);\nconst VALUE_LITERALS = new Set(['true', 'false', 'null']);\nconst SPECIAL_CHARS = /[\\s(){}\\[\\],\"']/;\nconst PROPERTY_KEY = /^[a-zA-Z_][a-zA-Z0-9_.]*$/;\nconst NUMBER_LITERAL = /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/;\n\n// Common URL schemes — `http://...`, `mailto:rich@...` etc. should be searched as text,\n// not auto-promoted to property filters.\nconst URL_SCHEMES = new Set([\n 'http',\n 'https',\n 'ftp',\n 'ftps',\n 'file',\n 'mailto',\n 'tel',\n 'sms',\n 'data',\n 'javascript',\n 'ws',\n 'wss',\n 'ssh',\n 'git',\n]);\n\n/**\n * Normalize raw user input into a form the lezer grammar can parse.\n * - Bare text fragments (e.g. `foo`) are wrapped in quotes so they parse as TextFilter.\n * - Property values that aren't already quoted/numeric/boolean (e.g. `from:rich@dxos.org`) are quoted.\n * - Tags, type filters, operators, parens, braces, quoted strings, and assignments pass through unchanged.\n */\nexport const normalizeInput = (input: string): string => {\n const out: string[] = [];\n let pos = 0;\n while (pos < input.length) {\n const currentChar = input[pos];\n\n // Whitespace.\n if (/\\s/.test(currentChar)) {\n out.push(currentChar);\n pos++;\n continue;\n }\n\n // Quoted string (already a valid TextFilter / Value).\n // Single-quote only opens a string if the previous char isn't a word-char,\n // so apostrophes inside barewords (e.g. `don't`, `O'Connor`) stay attached.\n const prevChar = pos > 0 ? input[pos - 1] : '';\n const isStringOpener =\n currentChar === '\"' || (currentChar === \"'\" && (pos === 0 || !/[a-zA-Z0-9_]/.test(prevChar)));\n if (isStringOpener) {\n const quoteChar = currentChar;\n let scanIndex = pos + 1;\n while (scanIndex < input.length && input[scanIndex] !== quoteChar) {\n if (input[scanIndex] === '\\\\' && scanIndex + 1 < input.length) {\n scanIndex += 2;\n } else {\n scanIndex++;\n }\n }\n out.push(input.slice(pos, Math.min(scanIndex + 1, input.length)));\n pos = scanIndex + 1;\n continue;\n }\n\n // Object/array literals: pass through (contents already structured).\n if (currentChar === '{' || currentChar === '[') {\n const closeChar = currentChar === '{' ? '}' : ']';\n let depth = 1;\n let scanIndex = pos + 1;\n while (scanIndex < input.length && depth > 0) {\n const innerChar = input[scanIndex];\n if (innerChar === '\"' || innerChar === \"'\") {\n const quoteChar = innerChar;\n scanIndex++;\n while (scanIndex < input.length && input[scanIndex] !== quoteChar) {\n if (input[scanIndex] === '\\\\' && scanIndex + 1 < input.length) {\n scanIndex += 2;\n } else {\n scanIndex++;\n }\n }\n scanIndex++;\n } else if (innerChar === currentChar) {\n depth++;\n scanIndex++;\n } else if (innerChar === closeChar) {\n depth--;\n scanIndex++;\n } else {\n scanIndex++;\n }\n }\n out.push(input.slice(pos, scanIndex));\n pos = scanIndex;\n continue;\n }\n\n // Single-char structural tokens. `}` / `]` only reach here when unmatched —\n // pass them through so the lezer parser can produce a clear error rather than spinning.\n if (\n currentChar === '(' ||\n currentChar === ')' ||\n currentChar === '=' ||\n currentChar === ',' ||\n currentChar === '}' ||\n currentChar === ']'\n ) {\n out.push(currentChar);\n pos++;\n continue;\n }\n\n // Relations.\n if ((currentChar === '-' && input[pos + 1] === '>') || (currentChar === '<' && input[pos + 1] === '-')) {\n out.push(input.slice(pos, pos + 2));\n pos += 2;\n continue;\n }\n\n // NOT prefix (`!`) — single token.\n if (currentChar === '!') {\n out.push(currentChar);\n pos++;\n continue;\n }\n\n // Tag.\n if (currentChar === '#') {\n let scanIndex = pos + 1;\n while (scanIndex < input.length && /[a-zA-Z0-9_-]/.test(input[scanIndex])) {\n scanIndex++;\n }\n out.push(input.slice(pos, scanIndex));\n pos = scanIndex;\n continue;\n }\n\n // Bareword: scan until next whitespace or special char.\n let scanIndex = pos;\n while (scanIndex < input.length) {\n const innerChar = input[scanIndex];\n if (innerChar === '\"') {\n break;\n }\n if (innerChar === \"'\" && scanIndex > pos && !/[a-zA-Z0-9_]/.test(input[scanIndex - 1])) {\n break;\n }\n if (innerChar === \"'\" && scanIndex === pos) {\n break;\n }\n if (innerChar !== \"'\" && SPECIAL_CHARS.test(innerChar)) {\n break;\n }\n if (innerChar === '-' && input[scanIndex + 1] === '>') {\n break;\n }\n if (innerChar === '<' && input[scanIndex + 1] === '-') {\n break;\n }\n scanIndex++;\n }\n // Defensive: if no characters were consumed, advance one to avoid infinite loops.\n if (scanIndex === pos) {\n out.push(currentChar);\n pos++;\n continue;\n }\n const token = input.slice(pos, scanIndex);\n pos = scanIndex;\n\n // Operators.\n if (KEYWORDS.has(token.toUpperCase())) {\n out.push(token);\n continue;\n }\n\n // Property/type filter (`key:value`).\n const colonIdx = token.indexOf(':');\n if (colonIdx > 0) {\n const key = token.slice(0, colonIdx);\n const rest = token.slice(colonIdx + 1);\n\n // type:typename — leave for grammar's TypeFilter (Identifier value).\n if (key === 'type') {\n out.push(token);\n continue;\n }\n\n // URLs (`http://...`, `mailto:rich@...`) and URL-paths starting with `//`\n // are searched as text rather than auto-promoted to property filters.\n const isUrlScheme = URL_SCHEMES.has(key.toLowerCase()) || rest.startsWith('//');\n if (!isUrlScheme && PROPERTY_KEY.test(key)) {\n if (rest.length === 0) {\n // Trailing colon while typing — pass through.\n out.push(token);\n continue;\n }\n const firstValueChar = rest[0];\n if (firstValueChar === '\"' || firstValueChar === \"'\") {\n // Already quoted.\n out.push(token);\n continue;\n }\n if (firstValueChar === '{' || firstValueChar === '[') {\n // Object/array literal value.\n out.push(token);\n continue;\n }\n if (VALUE_LITERALS.has(rest) || NUMBER_LITERAL.test(rest)) {\n // Boolean / null / number literal.\n out.push(token);\n continue;\n }\n out.push(`${key}:\"${escapeStringLiteral(rest)}\"`);\n continue;\n }\n\n // URL or unknown key shape — fall through to text.\n }\n\n // Identifier followed by `=` is the LHS of an Assignment — keep as-is.\n if (PROPERTY_KEY.test(token)) {\n let lookahead = pos;\n while (lookahead < input.length && /\\s/.test(input[lookahead])) {\n lookahead++;\n }\n if (input[lookahead] === '=') {\n out.push(token);\n continue;\n }\n }\n\n // Bare text fragment: quote so it parses as TextFilter.\n out.push(`\"${escapeStringLiteral(token)}\"`);\n }\n\n return out.join('');\n};\n\n/** Escape a raw value into a string literal body (without surrounding quotes). */\nconst escapeStringLiteral = (value: string): string => value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n\n/** Decode `\\\\` and `\\\"` escapes inside a string literal body. */\nconst unescapeStringLiteral = (literalBody: string): string => {\n let out = '';\n for (let i = 0; i < literalBody.length; i++) {\n const ch = literalBody[i];\n if (ch === '\\\\' && i + 1 < literalBody.length) {\n out += literalBody[i + 1];\n i++;\n } else {\n out += ch;\n }\n }\n return out;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Resource } from '@dxos/context';\nimport { Query, type QueryAST } from '@dxos/echo';\nimport { trim } from '@dxos/util';\nimport { type QuickJSRuntime, type QuickJSWASMModule, createQuickJS } from '@dxos/vendor-quickjs';\n\nimport envCode from '#query-lite?raw';\n\nimport { unwrapResult } from './quickjs';\n\n/**\n * Evaluates queries written in JavaScript using QuickJS.\n * Queries are expected to use the echo Query API.\n * `Query`, `Filter` and `Order` are provided as globals.\n */\nexport class QuerySandbox extends Resource {\n // Caching the wasm module.\n private static quickJS: Promise<QuickJSWASMModule> | null = null;\n static getQuickJS() {\n if (!QuerySandbox.quickJS) {\n QuerySandbox.quickJS = createQuickJS();\n }\n\n return QuerySandbox.quickJS;\n }\n\n #runtime!: QuickJSRuntime;\n\n protected override async _open() {\n const quickJS = await QuerySandbox.getQuickJS();\n this.#runtime = quickJS.newRuntime({\n moduleLoader: (moduleName, _context) => {\n switch (moduleName) {\n case 'dxos:query-lite':\n return envCode;\n default:\n throw new Error(`Module not found: ${moduleName}`);\n }\n },\n });\n }\n\n protected override async _close() {\n this.#runtime.dispose();\n }\n\n /**\n * Evaluates the query code.\n * @param queryCode Example: `Query.select(Filter.typename('org.dxos.type.person'))`\n */\n eval(queryCode: string): QueryAST.Query {\n using context = this.#runtime.newContext();\n const globals = trim`\n import { Filter, Order, Query } from 'dxos:query-lite';\n globalThis.Filter = Filter;\n globalThis.Order = Order;\n globalThis.Query = Query;\n `;\n\n unwrapResult(context, context.evalCode(globals)).dispose();\n using query = unwrapResult(context, context.evalCode(queryCode));\n const result = context.dump(query);\n if ('~Filter' in result) {\n return Query.select(result).ast;\n } else {\n return result.ast;\n }\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type QuickJSContext, type QuickJSHandle, type SuccessOrFail } from '@dxos/vendor-quickjs';\n\n/**\n * Unwraps a result and throws the underlying error.\n *\n * Replacement for `QuickJScontext.unwrapResult` because that seems to cause an OOM.\n */\n// TODO(burdon): Factor out.\nexport const unwrapResult = <T>(context: QuickJSContext, result: SuccessOrFail<T, QuickJSHandle>): T => {\n if (result.error) {\n const contextError = context.dump(result.error);\n result.error.dispose();\n if (\n typeof contextError === 'object' &&\n typeof contextError.name === 'string' &&\n typeof contextError.message === 'string'\n ) {\n const error = new Error(contextError.message);\n Object.defineProperty(error, 'name', { value: contextError.name });\n const originalStack = error.stack;\n error.stack = `${contextError.name}: ${contextError.message}\\n${contextError.stack}${originalStack?.split('\\n').slice(1).join('\\n') ?? ''}`;\n throw error;\n } else {\n throw new Error(String(contextError));\n }\n }\n\n return result.value;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["LRParser", "spec_Identifier", "__proto__", "type", "NOT", "not", "AND", "and", "OR", "or", "parser", "deserialize", "version", "states", "stateData", "goto", "nodeNames", "maxTerm", "skippedNodes", "repeatNodeCount", "tokenData", "tokenizers", "topRules", "specialized", "term", "get", "value", "tokenPrec", "Number", "String", "Query", "Assignment", "Identifier", "Filter", "TagFilter", "Tag", "TextFilter", "TypeFilter", "TypeKeyword", "PropertyFilter", "PropertyPath", "Value", "Boolean", "Null", "ObjectLiteral", "ObjectProperty", "ArrayLiteral", "Not", "And", "Or", "Relation", "ArrowRight", "ArrowLeft", "QueryDSL", "Parser", "parser", "Node", "terms", "Tokens", "Filter", "invariant", "_parser", "QueryDSL", "configure", "_tags", "tree", "normalized", "buildQuery", "cursor", "children", "from", "to", "nextSibling", "_parseAssignment", "input", "hasOperator", "hasMultipleExpressions", "_parseBinaryExpression", "filter", "nothing", "Filter", "name", "assignmentText", "_getNodeText", "openParenIndex", "indexOf", "closeParenIndex", "slice", "subInput", "subResult", "subTree", "nodeName", "notFilter", "parent", "result", "_parseExpression", "firstChild", "operator", "toLowerCase", "hasBinaryOp", "node", "exprEnd", "depth", "filters", "subFilter", "undefined", "filterType", "typename", "text", "key", "props", "value", "_parseValue", "parts", "Object", "entries", "label", "str", "valueType", "array", "NUMBER_LITERAL", "pos", "currentChar", "isStringOpener", "scanIndex", "push", "innerChar", "quoteChar", "KEYWORDS", "token", "colonIdx", "rest", "out", "firstValueChar", "VALUE_LITERALS", "lookahead", "length", "join", "ch", "literalBody", "i", "Resource", "Query", "trim", "createQuickJS", "envCode", "unwrapResult", "context", "result", "error", "contextError", "dump", "dispose", "name", "message", "Error", "Object", "defineProperty", "value", "originalStack", "stack", "split", "slice", "join", "String", "QuerySandbox", "Resource", "quickJS", "getQuickJS", "createQuickJS", "_open", "newRuntime", "moduleLoader", "moduleName", "_context", "envCode", "Error", "_close", "dispose", "eval", "queryCode", "context", "newContext", "globals", "trim", "unwrapResult", "evalCode", "query", "result", "dump", "Query", "select", "ast"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/parser/gen/query.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/parser/gen/query.ts":{"bytes":9603,"imports":[{"path":"@lezer/lr","kind":"import-statement","external":true}],"format":"esm"},"src/parser/gen/query.terms.ts":{"bytes":2134,"imports":[],"format":"esm"},"src/parser/gen/index.ts":{"bytes":1210,"imports":[{"path":"src/parser/gen/query.ts","kind":"import-statement","original":"./query"},{"path":"src/parser/gen/query.terms.ts","kind":"import-statement","original":"./query.terms"}],"format":"esm"},"src/parser/query-builder.ts":{"bytes":81679,"imports":[{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"src/parser/gen/index.ts","kind":"import-statement","original":"./gen"}],"format":"esm"},"src/parser/index.ts":{"bytes":468,"imports":[{"path":"src/parser/gen/index.ts","kind":"import-statement","original":"./gen"},{"path":"src/parser/query-builder.ts","kind":"import-statement","original":"./query-builder"}],"format":"esm"},"src/sandbox/quickjs.ts":{"bytes":3813,"imports":[],"format":"esm"},"src/sandbox/query-sandbox.ts":{"bytes":9779,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/vendor-quickjs","kind":"import-statement","external":true},{"path":"#query-lite?raw","kind":"import-statement","external":true},{"path":"src/sandbox/quickjs.ts","kind":"import-statement","original":"./quickjs"}],"format":"esm"},"src/sandbox/index.ts":{"bytes":389,"imports":[{"path":"src/sandbox/query-sandbox.ts","kind":"import-statement","original":"./query-sandbox"}],"format":"esm"},"src/index.ts":{"bytes":457,"imports":[{"path":"src/parser/index.ts","kind":"import-statement","original":"./parser"},{"path":"src/sandbox/index.ts","kind":"import-statement","original":"./sandbox"}],"format":"esm"}},"outputs":{"dist/lib/neutral/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":47712},"dist/lib/neutral/index.mjs":{"imports":[{"path":"@lezer/lr","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/vendor-quickjs","kind":"import-statement","external":true},{"path":"#query-lite?raw","kind":"import-statement","external":true}],"exports":["QueryBuilder","QueryDSL","QuerySandbox","normalizeInput"],"entryPoint":"src/index.ts","inputs":{"src/parser/gen/query.ts":{"bytesInOutput":3499},"src/parser/gen/query.terms.ts":{"bytesInOutput":1244},"src/parser/gen/index.ts":{"bytesInOutput":211},"src/parser/query-builder.ts":{"bytesInOutput":18190},"src/index.ts":{"bytesInOutput":0},"src/sandbox/query-sandbox.ts":{"bytesInOutput":4098},"src/sandbox/quickjs.ts":{"bytesInOutput":715}},"bytes":28480}}}
|