@dxos/echo-query 0.8.4-main.406dc2a → 0.8.4-main.548089c

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.
@@ -9,27 +9,27 @@ var __export = (target, all) => {
9
9
  import { LRParser } from "@lezer/lr";
10
10
  var spec_Identifier = {
11
11
  __proto__: null,
12
- type: 18,
13
- NOT: 82,
14
- not: 82,
15
- "!": 82,
16
- AND: 84,
17
- and: 84,
18
- OR: 86,
19
- or: 86
12
+ type: 26,
13
+ NOT: 86,
14
+ not: 86,
15
+ "!": 86,
16
+ AND: 88,
17
+ and: 88,
18
+ OR: 90,
19
+ or: 90
20
20
  };
21
21
  var parser = LRParser.deserialize({
22
22
  version: 14,
23
- states: "(QOVQPOOOOQO'#C_'#C_OOQO'#Ca'#CaOnQPO'#CcOsQPO'#ChO{QPO'#CnO!TQPO'#CgOOQO'#C^'#C^OOQO'#Cv'#CvOOQO'#DU'#DUOVQPO'#DUQ!YQPOOOVQPO'#DUO!jQPO,58}O!oQPO'#DOO!tQPO,59SO!|QPO'#CpOOQO,59Y,59YO#RQPO,59YO#ZQQO,59RO#oQPO,59pOOQO'#Cw'#CwOOQO'#Cx'#CxOOQO'#Cy'#CyOVQPO,59pOVQPO,59pOVQPO,59pO$jQPO,59pOOQO1G.i1G.iOOQO,59j,59jOOQO-E6|-E6|O#ZQQO,59[O$}QPO'#DPO%SQPO1G.tOOQO1G.t1G.tO%[QQO'#CsOOQO'#Cj'#CjOOQO1G.m1G.mO%cQPO1G/[O%yQPO1G/[O&aQPO1G/[OOQO1G/[1G/[OOQO1G.v1G.vOOQO,59k,59kOOQO-E6}-E6}OOQO7+$`7+$`OOQO,59_,59_O&wQPO,59_O#ZQQO'#DQO'PQPO1G.yOOQO1G.y1G.yOOQO,59l,59lOOQO-E7O-E7OOOQO7+$e7+$e",
24
- stateData: "'X~OwOS~OSPOUQOWSOXROcTOp[OyWO~OY]O~O]^OY[X~OW`OfaO~OYcO~OngOogOzeO{fO~PVOWlO~OWmO~O]^OY[a~OYoO~OepOfrO~OUtO_tO`tOatOcTOhsO~OyWOSxaUxaWxaXxacxanxaoxapxauxazxa{xaqxa~OngOogOqyOzeO{fO~PVOW`O~OepOf}O~Oi!OO~P#ZOnxioxiuxizxi{xiqxi~PVOzeOnxioxiuxi{xiqxi~PVOzeO{fOnxioxiuxiqxi~PVOe!QOi!SO~Oe!QOi!VO~O",
25
- goto: "%TyPPz!XP!XP!XPPP!X!fP!sPPP#PP#dPP#^PP#j#x$O$TPPPP$X$_$ePPP$kgXOYZ[hijkvwxgVOYZ[hijkvwxgUOYZ[hijkvwxQucQzoQ!PsR!T!QfVOYZ[hijkvwxXtcos!QQbTR{piYOYZ[dhijkvwxXhZkwxViZkxTjZkQ_SRn_QqbR|qQ!R!PR!U!RQZO^dYZdkvwxQk[QvhQwiRxj",
26
- nodeNames: "\u26A0 Query Filter TagFilter Tag TextFilter String TypeFilter Identifier TypeKeyword : PropertyFilter PropertyPath . Value Number Boolean Null ObjectLiteral { ObjectProperty , } ArrayLiteral [ ] Not And Or Relation ArrowRight ArrowLeft ( )",
27
- maxTerm: 43,
23
+ 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",
24
+ 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",
25
+ 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",
26
+ nodeNames: "\u26A0 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",
27
+ maxTerm: 45,
28
28
  skippedNodes: [
29
29
  0
30
30
  ],
31
31
  repeatNodeCount: 3,
32
- tokenData: "2w~RrX^#]pq#]rs$Qst%nwx&fxy'}yz(S|}(X}!O(^!O!P)}!Q![(g![!]*S!^!_*X!c!}*d!}#O+O#P#Q+T#R#S*d#T#Y*d#Y#Z+Y#Z#b*d#b#c.i#c#h*d#h#i1Z#i#o*d#o#p2m#q#r2r#y#z#]$f$g#]#BY#BZ#]$IS$I_#]$I|$JO#]$JT$JU#]$KV$KW#]&FU&FV#]~#bYw~X^#]pq#]#y#z#]$f$g#]#BY#BZ#]$IS$I_#]$I|$JO#]$JT$JU#]$KV$KW#]&FU&FV#]~$TVOr$Qrs$js#O$Q#O#P$o#P;'S$Q;'S;=`%h<%lO$Q~$oOU~~$rRO;'S$Q;'S;=`${;=`O$Q~%OWOr$Qrs$js#O$Q#O#P$o#P;'S$Q;'S;=`%h;=`<%l$Q<%lO$Q~%kP;=`<%l$Q~%qT}!O&Q!Q![&Q!c!}&Q#R#S&Q#T#o&Q~&VTS~}!O&Q!Q![&Q!c!}&Q#R#S&Q#T#o&Q~&iVOw&fwx$jx#O&f#O#P'O#P;'S&f;'S;=`'w<%lO&f~'RRO;'S&f;'S;=`'[;=`O&f~'_WOw&fwx$jx#O&f#O#P'O#P;'S&f;'S;=`'w;=`<%l&f<%lO&f~'zP;=`<%l&f~(SOp~~(XOq~~(^Oe~~(aQ!Q![(g!`!a)x~(lS_~!O!P(x!Q![(g!g!h)^#X#Y)^~({P!Q![)O~)TR_~!Q![)O!g!h)^#X#Y)^~)aR{|)j}!O)j!Q![)p~)mP!Q![)p~)uP_~!Q![)p~)}On~~*SO]~~*XOY~~*[P}!O*_~*dOo~P*iVWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#o*d~+TOh~~+YOi~R+_WWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#U+w#U#o*dR+|XWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#`*d#`#a,i#a#o*dR,nXWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#g*d#g#h-Z#h#o*dR-`XWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#X*d#X#Y-{#Y#o*dR.SV`QWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#o*dR.nXWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#i*d#i#j/Z#j#o*dR/`XWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#`*d#`#a/{#a#o*dR0QXWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#`*d#`#a0m#a#o*dR0tVWPaQ}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#o*dR1`XWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#f*d#f#g1{#g#o*dR2QXWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#i*d#i#j-Z#j#o*d~2rOc~~2wOf~",
32
+ 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~",
33
33
  tokenizers: [
34
34
  0,
35
35
  1
@@ -42,7 +42,7 @@ var parser = LRParser.deserialize({
42
42
  },
43
43
  specialized: [
44
44
  {
45
- term: 8,
45
+ term: 3,
46
46
  get: (value) => spec_Identifier[value] || -1
47
47
  }
48
48
  ],
@@ -56,6 +56,7 @@ __export(query_terms_exports, {
56
56
  ArrayLiteral: () => ArrayLiteral,
57
57
  ArrowLeft: () => ArrowLeft,
58
58
  ArrowRight: () => ArrowRight,
59
+ Assignment: () => Assignment,
59
60
  Boolean: () => Boolean,
60
61
  Filter: () => Filter,
61
62
  Identifier: () => Identifier,
@@ -78,29 +79,30 @@ __export(query_terms_exports, {
78
79
  Value: () => Value
79
80
  });
80
81
  var Query = 1;
81
- var Filter = 2;
82
- var TagFilter = 3;
83
- var Tag = 4;
84
- var TextFilter = 5;
85
- var String = 6;
86
- var TypeFilter = 7;
87
- var Identifier = 8;
88
- var TypeKeyword = 9;
89
- var PropertyFilter = 11;
90
- var PropertyPath = 12;
91
- var Value = 14;
92
- var Number2 = 15;
93
- var Boolean = 16;
94
- var Null = 17;
95
- var ObjectLiteral = 18;
96
- var ObjectProperty = 20;
97
- var ArrayLiteral = 23;
98
- var Not = 26;
99
- var And = 27;
100
- var Or = 28;
101
- var Relation = 29;
102
- var ArrowRight = 30;
103
- var ArrowLeft = 31;
82
+ var Assignment = 2;
83
+ var Identifier = 3;
84
+ var Filter = 7;
85
+ var TagFilter = 8;
86
+ var Tag = 9;
87
+ var TextFilter = 10;
88
+ var String = 11;
89
+ var TypeFilter = 12;
90
+ var TypeKeyword = 13;
91
+ var PropertyFilter = 15;
92
+ var PropertyPath = 16;
93
+ var Value = 18;
94
+ var Number2 = 19;
95
+ var Boolean = 20;
96
+ var Null = 21;
97
+ var ObjectLiteral = 22;
98
+ var ObjectProperty = 24;
99
+ var ArrayLiteral = 27;
100
+ var Not = 30;
101
+ var And = 31;
102
+ var Or = 32;
103
+ var Relation = 33;
104
+ var ArrowRight = 34;
105
+ var ArrowLeft = 35;
104
106
 
105
107
  // src/parser/gen/index.ts
106
108
  (function(QueryDSL2) {
@@ -118,21 +120,15 @@ var QueryDSL;
118
120
  // src/parser/query-builder.ts
119
121
  import { Filter as Filter2 } from "@dxos/echo";
120
122
  import { invariant } from "@dxos/invariant";
121
- function _define_property(obj, key, value) {
122
- if (key in obj) {
123
- Object.defineProperty(obj, key, {
124
- value,
125
- enumerable: true,
126
- configurable: true,
127
- writable: true
128
- });
129
- } else {
130
- obj[key] = value;
131
- }
132
- return obj;
133
- }
134
123
  var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo-query/src/parser/query-builder.ts";
135
124
  var QueryBuilder = class {
125
+ _tags;
126
+ _parser = QueryDSL.Parser.configure({
127
+ strict: true
128
+ });
129
+ constructor(_tags) {
130
+ this._tags = _tags;
131
+ }
136
132
  /**
137
133
  * Check valid input.
138
134
  */
@@ -152,7 +148,7 @@ var QueryBuilder = class {
152
148
  const tree = this._parser.parse(input);
153
149
  return this.buildQuery(tree, input);
154
150
  } catch {
155
- return void 0;
151
+ return {};
156
152
  }
157
153
  }
158
154
  /**
@@ -161,7 +157,7 @@ var QueryBuilder = class {
161
157
  buildQuery(tree, input) {
162
158
  const cursor = tree.cursor();
163
159
  if (cursor.node.name !== "Query") {
164
- return void 0;
160
+ return {};
165
161
  }
166
162
  const children = [];
167
163
  if (cursor.firstChild()) {
@@ -174,15 +170,60 @@ var QueryBuilder = class {
174
170
  } while (cursor.nextSibling());
175
171
  cursor.parent();
176
172
  }
173
+ const hasAssignment = children.some((child) => child.name === "Assignment");
174
+ if (hasAssignment) {
175
+ return this._parseAssignment(cursor, input);
176
+ }
177
177
  const hasOperator = children.some((child) => child.name === "And" || child.name === "Or");
178
178
  const hasMultipleExpressions = children.filter((child) => child.name === "Filter" || child.name === "Not" || child.name === "(").length > 1;
179
179
  if (hasOperator || hasMultipleExpressions) {
180
- return this._parseBinaryExpression(cursor, input);
180
+ const filter2 = this._parseBinaryExpression(cursor, input);
181
+ return {
182
+ filter: filter2
183
+ };
181
184
  }
182
185
  if (!cursor.firstChild()) {
183
- return Filter2.nothing();
186
+ return {
187
+ filter: Filter2.nothing()
188
+ };
184
189
  }
185
- return this._parseExpression(cursor, input);
190
+ const filter = this._parseExpression(cursor, input);
191
+ return {
192
+ filter
193
+ };
194
+ }
195
+ /**
196
+ * Parse an assignment node.
197
+ */
198
+ _parseAssignment(cursor, input) {
199
+ if (!cursor.firstChild()) {
200
+ return {};
201
+ }
202
+ let name;
203
+ let filter;
204
+ do {
205
+ if (cursor.node.name === "Assignment") {
206
+ const assignmentText = this._getNodeText(cursor, input);
207
+ if (cursor.firstChild()) {
208
+ name = this._getNodeText(cursor, input);
209
+ const openParenIndex = assignmentText.indexOf("(");
210
+ const closeParenIndex = assignmentText.lastIndexOf(")");
211
+ if (openParenIndex !== -1 && closeParenIndex !== -1 && closeParenIndex > openParenIndex) {
212
+ const subInput = assignmentText.slice(openParenIndex + 1, closeParenIndex).trim();
213
+ const subTree = this._parser.parse(subInput);
214
+ const subResult = this.buildQuery(subTree, subInput);
215
+ filter = subResult.filter;
216
+ }
217
+ cursor.parent();
218
+ }
219
+ break;
220
+ }
221
+ } while (cursor.nextSibling());
222
+ cursor.parent();
223
+ return {
224
+ filter,
225
+ name
226
+ };
186
227
  }
187
228
  /**
188
229
  * Parse an expression node.
@@ -280,9 +321,9 @@ var QueryBuilder = class {
280
321
  }
281
322
  const subInput = input.slice(exprStart, exprEnd);
282
323
  const subTree = this._parser.parse(subInput);
283
- const subFilter = this.buildQuery(subTree, subInput);
284
- if (subFilter) {
285
- filters.push(subFilter);
324
+ const subResult = this.buildQuery(subTree, subInput);
325
+ if (subResult.filter) {
326
+ filters.push(subResult.filter);
286
327
  }
287
328
  } else {
288
329
  const subFilter = this._parseExpression(cursor, input);
@@ -449,7 +490,7 @@ var QueryBuilder = class {
449
490
  _parseTagFilter(cursor, input) {
450
491
  invariant(this._tags, void 0, {
451
492
  F: __dxlog_file,
452
- L: 415,
493
+ L: 468,
453
494
  S: this,
454
495
  A: [
455
496
  "this._tags",
@@ -514,14 +555,6 @@ var QueryBuilder = class {
514
555
  _getNodeText(cursor, input) {
515
556
  return input.slice(cursor.from, cursor.to);
516
557
  }
517
- constructor(_tags) {
518
- _define_property(this, "_tags", void 0);
519
- _define_property(this, "_parser", void 0);
520
- this._tags = _tags;
521
- this._parser = QueryDSL.Parser.configure({
522
- strict: true
523
- });
524
- }
525
558
  };
526
559
  export {
527
560
  QueryBuilder,
@@ -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"],
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:18, NOT:82, not:82, \"!\":82, AND:84, and:84, OR:86, or:86}\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"(QOVQPOOOOQO'#C_'#C_OOQO'#Ca'#CaOnQPO'#CcOsQPO'#ChO{QPO'#CnO!TQPO'#CgOOQO'#C^'#C^OOQO'#Cv'#CvOOQO'#DU'#DUOVQPO'#DUQ!YQPOOOVQPO'#DUO!jQPO,58}O!oQPO'#DOO!tQPO,59SO!|QPO'#CpOOQO,59Y,59YO#RQPO,59YO#ZQQO,59RO#oQPO,59pOOQO'#Cw'#CwOOQO'#Cx'#CxOOQO'#Cy'#CyOVQPO,59pOVQPO,59pOVQPO,59pO$jQPO,59pOOQO1G.i1G.iOOQO,59j,59jOOQO-E6|-E6|O#ZQQO,59[O$}QPO'#DPO%SQPO1G.tOOQO1G.t1G.tO%[QQO'#CsOOQO'#Cj'#CjOOQO1G.m1G.mO%cQPO1G/[O%yQPO1G/[O&aQPO1G/[OOQO1G/[1G/[OOQO1G.v1G.vOOQO,59k,59kOOQO-E6}-E6}OOQO7+$`7+$`OOQO,59_,59_O&wQPO,59_O#ZQQO'#DQO'PQPO1G.yOOQO1G.y1G.yOOQO,59l,59lOOQO-E7O-E7OOOQO7+$e7+$e\",\n stateData: \"'X~OwOS~OSPOUQOWSOXROcTOp[OyWO~OY]O~O]^OY[X~OW`OfaO~OYcO~OngOogOzeO{fO~PVOWlO~OWmO~O]^OY[a~OYoO~OepOfrO~OUtO_tO`tOatOcTOhsO~OyWOSxaUxaWxaXxacxanxaoxapxauxazxa{xaqxa~OngOogOqyOzeO{fO~PVOW`O~OepOf}O~Oi!OO~P#ZOnxioxiuxizxi{xiqxi~PVOzeOnxioxiuxi{xiqxi~PVOzeO{fOnxioxiuxiqxi~PVOe!QOi!SO~Oe!QOi!VO~O\",\n goto: \"%TyPPz!XP!XP!XPPP!X!fP!sPPP#PP#dPP#^PP#j#x$O$TPPPP$X$_$ePPP$kgXOYZ[hijkvwxgVOYZ[hijkvwxgUOYZ[hijkvwxQucQzoQ!PsR!T!QfVOYZ[hijkvwxXtcos!QQbTR{piYOYZ[dhijkvwxXhZkwxViZkxTjZkQ_SRn_QqbR|qQ!R!PR!U!RQZO^dYZdkvwxQk[QvhQwiRxj\",\n nodeNames: \"⚠ Query Filter TagFilter Tag TextFilter String TypeFilter Identifier TypeKeyword : PropertyFilter PropertyPath . Value Number Boolean Null ObjectLiteral { ObjectProperty , } ArrayLiteral [ ] Not And Or Relation ArrowRight ArrowLeft ( )\",\n maxTerm: 43,\n skippedNodes: [0],\n repeatNodeCount: 3,\n tokenData: \"2w~RrX^#]pq#]rs$Qst%nwx&fxy'}yz(S|}(X}!O(^!O!P)}!Q![(g![!]*S!^!_*X!c!}*d!}#O+O#P#Q+T#R#S*d#T#Y*d#Y#Z+Y#Z#b*d#b#c.i#c#h*d#h#i1Z#i#o*d#o#p2m#q#r2r#y#z#]$f$g#]#BY#BZ#]$IS$I_#]$I|$JO#]$JT$JU#]$KV$KW#]&FU&FV#]~#bYw~X^#]pq#]#y#z#]$f$g#]#BY#BZ#]$IS$I_#]$I|$JO#]$JT$JU#]$KV$KW#]&FU&FV#]~$TVOr$Qrs$js#O$Q#O#P$o#P;'S$Q;'S;=`%h<%lO$Q~$oOU~~$rRO;'S$Q;'S;=`${;=`O$Q~%OWOr$Qrs$js#O$Q#O#P$o#P;'S$Q;'S;=`%h;=`<%l$Q<%lO$Q~%kP;=`<%l$Q~%qT}!O&Q!Q![&Q!c!}&Q#R#S&Q#T#o&Q~&VTS~}!O&Q!Q![&Q!c!}&Q#R#S&Q#T#o&Q~&iVOw&fwx$jx#O&f#O#P'O#P;'S&f;'S;=`'w<%lO&f~'RRO;'S&f;'S;=`'[;=`O&f~'_WOw&fwx$jx#O&f#O#P'O#P;'S&f;'S;=`'w;=`<%l&f<%lO&f~'zP;=`<%l&f~(SOp~~(XOq~~(^Oe~~(aQ!Q![(g!`!a)x~(lS_~!O!P(x!Q![(g!g!h)^#X#Y)^~({P!Q![)O~)TR_~!Q![)O!g!h)^#X#Y)^~)aR{|)j}!O)j!Q![)p~)mP!Q![)p~)uP_~!Q![)p~)}On~~*SO]~~*XOY~~*[P}!O*_~*dOo~P*iVWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#o*d~+TOh~~+YOi~R+_WWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#U+w#U#o*dR+|XWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#`*d#`#a,i#a#o*dR,nXWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#g*d#g#h-Z#h#o*dR-`XWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#X*d#X#Y-{#Y#o*dR.SV`QWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#o*dR.nXWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#i*d#i#j/Z#j#o*dR/`XWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#`*d#`#a/{#a#o*dR0QXWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#`*d#`#a0m#a#o*dR0tVWPaQ}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#o*dR1`XWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#f*d#f#g1{#g#o*dR2QXWP}!O*d!O!P*d!P!Q*d!Q![*d!c!}*d#R#S*d#T#i*d#i#j-Z#j#o*d~2rOc~~2wOf~\",\n tokenizers: [0, 1],\n topRules: {\"Query\":[0,1]},\n specialized: [{term: 8, 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 Filter = 2,\n TagFilter = 3,\n Tag = 4,\n TextFilter = 5,\n String = 6,\n TypeFilter = 7,\n Identifier = 8,\n TypeKeyword = 9,\n PropertyFilter = 11,\n PropertyPath = 12,\n Value = 14,\n Number = 15,\n Boolean = 16,\n Null = 17,\n ObjectLiteral = 18,\n ObjectProperty = 20,\n ArrayLiteral = 23,\n Not = 26,\n And = 27,\n Or = 28,\n Relation = 29,\n ArrowRight = 30,\n ArrowLeft = 31\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/**\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.TagMap) {}\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): Filter.Any | undefined {\n try {\n const tree = this._parser.parse(input);\n return this.buildQuery(tree, input);\n } catch {\n return undefined;\n }\n }\n\n /**\n * Build a query from a parsed DSL tree.\n */\n buildQuery(tree: Tree, input: string): Filter.Any | undefined {\n const cursor = tree.cursor();\n\n // Start at root (Query node).\n if (cursor.node.name !== 'Query') {\n return undefined;\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 // 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 return this._parseBinaryExpression(cursor, input);\n }\n\n // Otherwise, parse the single expression.\n if (!cursor.firstChild()) {\n return Filter.nothing();\n }\n\n return this._parseExpression(cursor, input);\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 subFilter = this.buildQuery(subTree, subInput);\n if (subFilter) {\n filters.push(subFilter);\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"],
5
- "mappings": "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",
6
- "names": ["LRParser", "spec_Identifier", "__proto__", "type", "NOT", "not", "AND", "and", "OR", "or", "parser", "LRParser", "deserialize", "version", "states", "stateData", "goto", "nodeNames", "maxTerm", "skippedNodes", "repeatNodeCount", "tokenData", "tokenizers", "topRules", "specialized", "term", "get", "value", "tokenPrec", "Number", "Query", "Filter", "TagFilter", "Tag", "TextFilter", "String", "TypeFilter", "Identifier", "TypeKeyword", "PropertyFilter", "PropertyPath", "Value", "Number", "Boolean", "Null", "ObjectLiteral", "ObjectProperty", "ArrayLiteral", "Not", "And", "Or", "Relation", "ArrowRight", "ArrowLeft", "QueryDSL", "Parser", "parser", "Node", "terms", "Tokens", "Filter", "invariant", "QueryBuilder", "validate", "input", "tree", "_parser", "parse", "cursor", "node", "name", "build", "buildQuery", "undefined", "children", "firstChild", "push", "from", "to", "nextSibling", "parent", "hasOperator", "some", "child", "hasMultipleExpressions", "filter", "length", "_parseBinaryExpression", "Filter", "nothing", "_parseExpression", "nodeName", "_parseFilter", "notFilter", "not", "parenFilter", "savedPos", "expressionCount", "result", "filters", "operator", "toLowerCase", "hasBinaryOp", "depth", "exprStart", "exprEnd", "subInput", "slice", "subTree", "subFilter", "or", "and", "filterType", "_tags", "_parseTagFilter", "_parseTextFilter", "_parseTypeFilter", "_parseObjectLiteral", "_parsePropertyFilter", "typename", "_getNodeText", "text", "props", "key", "value", "_parseObjectProperty", "eq", "_parseValue", "path", "_parsePropertyPath", "parts", "join", "invariant", "str", "Object", "entries", "find", "label", "tag", "valueType", "Number", "array", "QueryDSL", "Parser", "configure", "strict"]
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"],
5
+ "mappings": "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",
6
+ "names": ["LRParser", "spec_Identifier", "__proto__", "type", "NOT", "not", "AND", "and", "OR", "or", "parser", "LRParser", "deserialize", "version", "states", "stateData", "goto", "nodeNames", "maxTerm", "skippedNodes", "repeatNodeCount", "tokenData", "tokenizers", "topRules", "specialized", "term", "get", "value", "tokenPrec", "Number", "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", "QueryDSL", "Parser", "parser", "Node", "terms", "Tokens", "Filter", "invariant", "QueryBuilder", "_parser", "QueryDSL", "Parser", "configure", "strict", "_tags", "validate", "input", "tree", "parse", "cursor", "node", "name", "build", "buildQuery", "children", "firstChild", "push", "from", "to", "nextSibling", "parent", "hasAssignment", "some", "child", "_parseAssignment", "hasOperator", "hasMultipleExpressions", "filter", "length", "_parseBinaryExpression", "Filter", "nothing", "_parseExpression", "assignmentText", "_getNodeText", "openParenIndex", "indexOf", "closeParenIndex", "lastIndexOf", "subInput", "slice", "trim", "subTree", "subResult", "nodeName", "_parseFilter", "notFilter", "not", "undefined", "parenFilter", "savedPos", "expressionCount", "result", "filters", "operator", "toLowerCase", "hasBinaryOp", "depth", "exprStart", "exprEnd", "subFilter", "or", "and", "filterType", "_parseTagFilter", "_parseTextFilter", "_parseTypeFilter", "_parseObjectLiteral", "_parsePropertyFilter", "typename", "text", "props", "key", "value", "_parseObjectProperty", "eq", "_parseValue", "path", "_parsePropertyPath", "parts", "join", "invariant", "str", "Object", "entries", "find", "label", "tag", "valueType", "Number", "array"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"src/parser/gen/query.ts":{"bytes":9421,"imports":[{"path":"@lezer/lr","kind":"import-statement","external":true}],"format":"esm"},"src/parser/gen/query.terms.ts":{"bytes":2151,"imports":[],"format":"esm"},"src/parser/gen/index.ts":{"bytes":1305,"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":49218,"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":555,"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/index.ts":{"bytes":454,"imports":[{"path":"src/parser/index.ts","kind":"import-statement","original":"./parser"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":29070},"dist/lib/browser/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}],"exports":["QueryBuilder","QueryDSL"],"entryPoint":"src/index.ts","inputs":{"src/parser/gen/query.ts":{"bytesInOutput":3382},"src/parser/gen/query.terms.ts":{"bytesInOutput":1186},"src/parser/gen/index.ts":{"bytesInOutput":211},"src/parser/query-builder.ts":{"bytesInOutput":11408},"src/index.ts":{"bytesInOutput":0}},"bytes":16583}}}
1
+ {"inputs":{"src/parser/gen/query.ts":{"bytes":9694,"imports":[{"path":"@lezer/lr","kind":"import-statement","external":true}],"format":"esm"},"src/parser/gen/query.terms.ts":{"bytes":2235,"imports":[],"format":"esm"},"src/parser/gen/index.ts":{"bytes":1305,"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":54708,"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":555,"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/index.ts":{"bytes":454,"imports":[{"path":"src/parser/index.ts","kind":"import-statement","original":"./parser"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":32042},"dist/lib/browser/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}],"exports":["QueryBuilder","QueryDSL"],"entryPoint":"src/index.ts","inputs":{"src/parser/gen/query.ts":{"bytesInOutput":3499},"src/parser/gen/query.terms.ts":{"bytesInOutput":1242},"src/parser/gen/index.ts":{"bytesInOutput":211},"src/parser/query-builder.ts":{"bytesInOutput":12394},"src/index.ts":{"bytesInOutput":0}},"bytes":17742}}}