diff --git a/packages/queryLanguage/src/parser.ts b/packages/queryLanguage/src/parser.ts index 6a5bf415..7a0a698b 100644 --- a/packages/queryLanguage/src/parser.ts +++ b/packages/queryLanguage/src/parser.ts @@ -3,16 +3,16 @@ import {LRParser} from "@lezer/lr" import {negateToken} from "./tokens" export const parser = LRParser.deserialize({ version: 14, - states: "&rOVQROOO!TQQO'#CbO!TQQO'#CcO!TQQO'#CdO!TQQO'#CeO!TQQO'#CfO!TQQO'#CgO!TQQO'#ChO!TQQO'#CiO!TQQO'#CjO!TQQO'#CkOOQP'#Ca'#CaOVQRO'#ClO!]QQO'#C`OOQP'#Cm'#CmOOQP'#Cv'#CvO#QQRO'#CuO#_QQO'#CuO#jQQO'#C^OOQO'#Ct'#CtQOQQOOOOQP'#Cx'#CxOOQP,58|,58|OOQP,58},58}OOQP,59O,59OOOQP,59P,59POOQP,59Q,59QOOQP,59R,59ROOQP,59S,59SOOQP,59T,59TOOQP,59U,59UOOQP,59V,59VO#oQQO,59WOOQP,58z,58zOOQP'#Cn'#CnO#tQRO,58yOVQRO'#CoO$RQQO,58xOOQP1G.r1G.rOOQP-E6l-E6lO$^QRO'#CuOOQO'#Cu'#CuOOQO,59Z,59ZOOQO-E6m-E6m", - stateData: "$z~OgOS~Oe]OkPOm^On^OoQOpROqSOrTOsUOtVOuWOvXOwYOx[O~OmeOneO~OkPOoQOpROqSOrTOsUOtVOuWOvXOwYOx[O~OdhXziXyhX~PVOdhXziXyhX~OztO~OyvO~OdRazRayRa~PVOztOdQayQa~OdiXziXyiX~PVOmkopqrstuvwzns~", - goto: "#}mPPnry!R!^!^!^!^!^!^!^!^!^!^!Ry!g!nPPPP!t!z#RP#_TcO[SaO[Ryt]_O[`stx[_O[`stxRq]_ZO[]`stxSs`xRwsQubR{uQdORp[SbO[RztS`O[Ur`sxRxtQfPQgQQhRQiSQjTQkUQlVQmWQnXRoY", + states: "'OOVQROOO!TQQO'#CcO!TQQO'#CdO!TQQO'#CeO!]QSO'#CfO!hQSO'#CgO!TQQO'#ChO!TQQO'#CiO!TQQO'#CjO!TQQO'#CkOOQP'#Ca'#CaOVQRO'#ClO!sQQO'#C`OOQP'#Cm'#CmOOQP'#Cv'#CvO#hQRO'#CuO#uQQO'#CuO$QQQO'#C^OOQO'#Ct'#CtQOQQOOO!]QSO'#CbOOQP'#C|'#C|OOQP,58},58}OOQP,59O,59OOOQP,59P,59POOQP'#DS'#DSOOQP,59Q,59QOOQP'#DU'#DUOOQP,59R,59ROOQP,59S,59SOOQP,59T,59TOOQP,59U,59UOOQP,59V,59VO$VQQO,59WOOQP,58z,58zOOQP'#Cn'#CnO$[QRO,58yOVQRO'#CoO$iQQO,58xOOQP,58|,58|OOQP1G.r1G.rOOQP-E6l-E6lO$tQRO'#CuOOQO'#Cu'#CuOOQO,59Z,59ZOOQO-E6m-E6m", + stateData: "%b~OgOS~Oe[OkdOoPOq]Or]OsQOtROuSOwTO|UO}VO!OWO!PXO!QZO~OqeOreO~OliOmiOniO~OykOzkO{kO~OkdOoPOsQOtROuSOwTO|UO}VO!OWO!PXO!QZO~OdhX!SiX!RhX~PVOdhX!SiX!RhX~O!SuO~O!RxO~OdRa!SRa!RRa~PVO!SuOdQa!RQa~OdiX!SiX!RiX~PVOqkostuw|}!O!P!Srw~", + goto: "$ZyPPz!O!V!_!j!j!j!j!j!j!j!j!j!j!_!V!s!zPPPP#Q#W#_PPPPP#kPPPPP$QP$WTbOZS`OZR{u]^OZ_tuz[^OZ_tuzRr[_YOZ[_tuzSt_zRytQvaR}vQcORqZSaOZR|uS_OZUs_tzRzuQfPQgQQhRQmUQnVQoWRpXQjSRwdRlT", nodeNames: "⚠ Program OrExpr AndExpr NegateExpr PrefixExpr ArchivedExpr RevisionExpr ContentExpr FileExpr ForkExpr VisibilityExpr RepoExpr LangExpr SymExpr RepoSetExpr ParenExpr Term", - maxTerm: 42, + maxTerm: 50, skippedNodes: [0], repeatNodeCount: 2, - tokenData: "!0e~RlOX!yXY#wYZ#wZp!ypq#wqr!yrs$Vsx!yxy%yyz&Oz#T!y#T#U&T#U#V!y#V#W.g#W#Y!y#Y#Z5{#Z#`!y#`#a>Z#a#c!y#c#dBu#d#f!y#f#gFc#g#h!!i#h#j!y#j#k!&V#k;'S!y;'S;=`#q<%lO!y~#OZn~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!];'S!y;'S;=`#q<%lO!y~#tP;=`<%l!y~#|Rg~XY#wYZ#wpq#w~$YWOY$VZr$Vrs$rs#O$V#O#P$w#P;'S$V;'S;=`%s<%lO$V~$wOm~~$zRO;'S$V;'S;=`%T;=`O$V~%WXOY$VZr$Vrs$rs#O$V#O#P$w#P;'S$V;'S;=`%s;=`<%l$V<%lO$V~%vP;=`<%l$V~&OOx~~&TOy~~&Y]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#f!y#f#g'R#g;'S!y;'S;=`#q<%lO!y~'W]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#V!y#V#W(P#W;'S!y;'S;=`#q<%lO!y~(U]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#[!y#[#](}#];'S!y;'S;=`#q<%lO!y~)S]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#]!y#]#^){#^;'S!y;'S;=`#q<%lO!y~*Q]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#j!y#j#k*y#k;'S!y;'S;=`#q<%lO!y~+O]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#X!y#X#Y+w#Y;'S!y;'S;=`#q<%lO!y~+|]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#W!y#W#X,u#X;'S!y;'S;=`#q<%lO!y~,zZn~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]-m!];'S!y;'S;=`#q<%lO!y~-tZk~n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!];'S!y;'S;=`#q<%lO!y~.l]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]/e!]#c!y#c#d0_#d;'S!y;'S;=`#q<%lO!y~/lZp~n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!];'S!y;'S;=`#q<%lO!y~0d]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#b!y#b#c1]#c;'S!y;'S;=`#q<%lO!y~1b]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#h!y#h#i2Z#i;'S!y;'S;=`#q<%lO!y~2`]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#X!y#X#Y3X#Y;'S!y;'S;=`#q<%lO!y~3^]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#b!y#b#c4V#c;'S!y;'S;=`#q<%lO!y~4[]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#h!y#h#i5T#i;'S!y;'S;=`#q<%lO!y~5YZn~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]/e!];'S!y;'S;=`#q<%lO!y~6Q_n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]7P!]#]!y#]#^7y#^#c!y#c#d:m#d;'S!y;'S;=`#q<%lO!y~7WZq~n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!];'S!y;'S;=`#q<%lO!y~8O]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#`!y#`#a8w#a;'S!y;'S;=`#q<%lO!y~8|]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#X!y#X#Y9u#Y;'S!y;'S;=`#q<%lO!y~9zZn~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]7P!];'S!y;'S;=`#q<%lO!y~:r]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#f!y#f#g;k#g;'S!y;'S;=`#q<%lO!y~;p]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#_!y#_#``]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#T!y#T#U?X#U;'S!y;'S;=`#q<%lO!y~?^]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#b!y#b#c@V#c;'S!y;'S;=`#q<%lO!y~@[]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#Z!y#Z#[AT#[;'S!y;'S;=`#q<%lO!y~AYZn~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]A{!];'S!y;'S;=`#q<%lO!y~BSZu~n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!];'S!y;'S;=`#q<%lO!y~Bz]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#f!y#f#gCs#g;'S!y;'S;=`#q<%lO!y~Cxfn~OXE^XZFWZpE^pqFWqrE^rsFWsxE^xzFWz}E^}!OE^!O!QE^!Q![!y![!]E^!]!cE^!c!}!y!}#RE^#R#S!y#S#TE^#T#o!y#o;'SE^;'S;=`F]<%lOE^~EeZz~n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!];'S!y;'S;=`#q<%lO!y~F]Oz~~F`P;=`<%lE^~Fh]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]Ga!]#X!y#X#YHZ#Y;'S!y;'S;=`#q<%lO!y~GhZt~n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!];'S!y;'S;=`#q<%lO!y~H`_n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#d!y#d#eI_#e#j!y#j#kNw#k;'S!y;'S;=`#q<%lO!y~Id]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#c!y#c#dJ]#d;'S!y;'S;=`#q<%lO!y~Jb]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]Ga!]#g!y#g#hKZ#h;'S!y;'S;=`#q<%lO!y~K`]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#X!y#X#YLX#Y;'S!y;'S;=`#q<%lO!y~L^]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#h!y#h#iMV#i;'S!y;'S;=`#q<%lO!y~M[Zn~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]M}!];'S!y;'S;=`#q<%lO!y~NUZw~n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!];'S!y;'S;=`#q<%lO!y~N|Zn~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]! o!];'S!y;'S;=`#q<%lO!y~! vZo~n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!];'S!y;'S;=`#q<%lO!y~!!n]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#m!y#m#n!#g#n;'S!y;'S;=`#q<%lO!y~!#l]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#a!y#a#b!$e#b;'S!y;'S;=`#q<%lO!y~!$jZn~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!%]!];'S!y;'S;=`#q<%lO!y~!%dZv~n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!];'S!y;'S;=`#q<%lO!y~!&[]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#]!y#]#^!'T#^;'S!y;'S;=`#q<%lO!y~!'Y]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#g!y#g#h!(R#h;'S!y;'S;=`#q<%lO!y~!(W]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#]!y#]#^!)P#^;'S!y;'S;=`#q<%lO!y~!)U]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#U!y#U#V!)}#V;'S!y;'S;=`#q<%lO!y~!*S]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#]!y#]#^!*{#^;'S!y;'S;=`#q<%lO!y~!+Q]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#`!y#`#a!+y#a;'S!y;'S;=`#q<%lO!y~!,O]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#]!y#]#^!,w#^;'S!y;'S;=`#q<%lO!y~!,|]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#h!y#h#i!-u#i;'S!y;'S;=`#q<%lO!y~!-z]n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!]#m!y#m#n!.s#n;'S!y;'S;=`#q<%lO!y~!.xZn~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!/k!];'S!y;'S;=`#q<%lO!y~!/rZs~n~OX!yZp!yqr!ysx!yz}!y}!O!y!O![!y![!]!y!];'S!y;'S;=`#q<%lO!y", - tokenizers: [negateToken, 0], + tokenData: "!Em~RpOX#VXY$TYZ$TZp#Vpq$Tqr#Vrs$csx#Vxy&Vyz&[z#T#V#T#U&a#U#V#V#V#W0q#W#Y#V#Y#Z8V#Z#`#V#`#a@e#a#b#V#b#cEP#c#dFw#d#eMa#e#f#V#f#g!*u#g#h!4{#h#j#V#j#k!8i#k#m#V#m#n!Bw#n;'S#V;'S;=`#}<%lO#VP#[ZrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#VP$QP;=`<%l#V~$YRg~XY$TYZ$Tpq$T~$fWOY$cZr$crs%Os#O$c#O#P%T#P;'S$c;'S;=`&P<%lO$c~%TOq~~%WRO;'S$c;'S;=`%a;=`O$c~%dXOY$cZr$crs%Os#O$c#O#P%T#P;'S$c;'S;=`&P;=`<%l$c<%lO$c~&SP;=`<%l$c~&[O!Q~~&aO!R~~&f_rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c'e#c#f#V#f#g)]#g;'S#V;'S;=`#}<%lO#VR'j]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#n(c#n;'S#V;'S;=`#}<%lO#VR(jZ{QrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~)b]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#V#V#V#W*Z#W;'S#V;'S;=`#}<%lO#V~*`]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#[#V#[#]+X#];'S#V;'S;=`#}<%lO#V~+^]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^,V#^;'S#V;'S;=`#}<%lO#V~,[]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#j#V#j#k-T#k;'S#V;'S;=`#}<%lO#V~-Y]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y.R#Y;'S#V;'S;=`#}<%lO#V~.W]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#W#V#W#X/P#X;'S#V;'S;=`#}<%lO#V~/UZrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]/w!];'S#V;'S;=`#}<%lO#V~0OZk~rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~0v]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]1o!]#c#V#c#d2i#d;'S#V;'S;=`#}<%lO#V~1vZs~rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~2n]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c3g#c;'S#V;'S;=`#}<%lO#V~3l]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i4e#i;'S#V;'S;=`#}<%lO#V~4j]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y5c#Y;'S#V;'S;=`#}<%lO#V~5h]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c6a#c;'S#V;'S;=`#}<%lO#V~6f]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i7_#i;'S#V;'S;=`#}<%lO#V~7dZrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]1o!];'S#V;'S;=`#}<%lO#V~8[_rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]9Z!]#]#V#]#^:T#^#c#V#c#ds#`;'S#V;'S;=`#}<%lO#V~>xZrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]?k!];'S#V;'S;=`#}<%lO#V~?rZu~rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~@j]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#T#V#T#UAc#U;'S#V;'S;=`#}<%lO#V~Ah]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#cBa#c;'S#V;'S;=`#}<%lO#V~Bf]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#Z#V#Z#[C_#[;'S#V;'S;=`#}<%lO#V~CdZrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]DV!];'S#V;'S;=`#}<%lO#V~D^Z}~rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#VREU]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#c#V#c#dE}#d;'S#V;'S;=`#}<%lO#VRFUZmQrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~F|_rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#cG{#c#f#V#f#gJq#g;'S#V;'S;=`#}<%lO#VRHQ]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#`#V#`#aHy#a;'S#V;'S;=`#}<%lO#VRIO]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#nIw#n;'S#V;'S;=`#}<%lO#VRJOZnQrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~JvfrPOXL[XZMUZpL[pqMUqrL[rsMUsxL[xzMUz}L[}!OL[!O!QL[!Q![#V![!]L[!]!cL[!c!}#V!}#RL[#R#S#V#S#TL[#T#o#V#o;'SL[;'S;=`MZ<%lOL[~LcZ!S~rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~MZO!S~~M^P;=`<%lL[RMf_rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#f#V#f#gNe#g#i#V#i#j!&T#j;'S#V;'S;=`#}<%lO#VRNj]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^! c#^;'S#V;'S;=`#}<%lO#VR! h]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#j#V#j#k!!a#k;'S#V;'S;=`#}<%lO#VR!!f]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#T#V#T#U!#_#U;'S#V;'S;=`#}<%lO#VR!#d]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i!$]#i;'S#V;'S;=`#}<%lO#VR!$b]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y!%Z#Y;'S#V;'S;=`#}<%lO#VR!%bZzQrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#VR!&Y]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#U#V#U#V!'R#V;'S#V;'S;=`#}<%lO#VR!'W]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#`#V#`#a!(P#a;'S#V;'S;=`#}<%lO#VR!(U]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!(}#^;'S#V;'S;=`#}<%lO#VR!)S]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#V#V#V#W!){#W;'S#V;'S;=`#}<%lO#VR!*SZyQrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~!*z]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!+s!]#X#V#X#Y!,m#Y;'S#V;'S;=`#}<%lO#V~!+zZ|~rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~!,r_rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#d#V#d#e!-q#e#j#V#j#k!3Z#k;'S#V;'S;=`#}<%lO#V~!-v]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#c#V#c#d!.o#d;'S#V;'S;=`#}<%lO#V~!.t]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!+s!]#g#V#g#h!/m#h;'S#V;'S;=`#}<%lO#V~!/r]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y!0k#Y;'S#V;'S;=`#}<%lO#V~!0p]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i!1i#i;'S#V;'S;=`#}<%lO#V~!1nZrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!2a!];'S#V;'S;=`#}<%lO#V~!2hZ!P~rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~!3`ZrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!4R!];'S#V;'S;=`#}<%lO#V~!4YZo~rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~!5Q]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#n!5y#n;'S#V;'S;=`#}<%lO#V~!6O]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#a#V#a#b!6w#b;'S#V;'S;=`#}<%lO#V~!6|ZrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!7o!];'S#V;'S;=`#}<%lO#V~!7vZ!O~rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~!8n]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!9g#^;'S#V;'S;=`#}<%lO#V~!9l]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#g#V#g#h!:e#h;'S#V;'S;=`#}<%lO#V~!:j]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!;c#^;'S#V;'S;=`#}<%lO#V~!;h]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#U#V#U#V!]#a;'S#V;'S;=`#}<%lO#V~!>b]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!?Z#^;'S#V;'S;=`#}<%lO#V~!?`]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i!@X#i;'S#V;'S;=`#}<%lO#V~!@^]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#n!AV#n;'S#V;'S;=`#}<%lO#V~!A[ZrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!A}!];'S#V;'S;=`#}<%lO#V~!BUZw~rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#VR!B|]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y!Cu#Y;'S#V;'S;=`#}<%lO#VR!Cz]rPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#g#V#g#h!Ds#h;'S#V;'S;=`#}<%lO#VR!DzZlQrPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V", + tokenizers: [negateToken, 0, 1], topRules: {"Program":[0,1]}, - tokenPrec: 165, - termNames: {"0":"⚠","1":"@top","2":"OrExpr","3":"AndExpr","4":"NegateExpr","5":"PrefixExpr","6":"ArchivedExpr","7":"RevisionExpr","8":"ContentExpr","9":"FileExpr","10":"ForkExpr","11":"VisibilityExpr","12":"RepoExpr","13":"LangExpr","14":"SymExpr","15":"RepoSetExpr","16":"ParenExpr","17":"Term","18":"expr+","19":"(or andExpr)+","20":"␄","21":"negate","22":"%mainskip","23":"space","24":"query","25":"andExpr","26":"expr","27":"archivedKw","28":"value","29":"quotedString","30":"word","31":"revisionKw","32":"contentKw","33":"fileKw","34":"forkKw","35":"visibilityKw","36":"repoKw","37":"langKw","38":"symKw","39":"reposetKw","40":"\"(\"","41":"\")\"","42":"or"} + tokenPrec: 187, + termNames: {"0":"⚠","1":"@top","2":"OrExpr","3":"AndExpr","4":"NegateExpr","5":"PrefixExpr","6":"ArchivedExpr","7":"RevisionExpr","8":"ContentExpr","9":"FileExpr","10":"ForkExpr","11":"VisibilityExpr","12":"RepoExpr","13":"LangExpr","14":"SymExpr","15":"RepoSetExpr","16":"ParenExpr","17":"Term","18":"expr+","19":"(or andExpr)+","20":"␄","21":"negate","22":"%mainskip","23":"space","24":"query","25":"andExpr","26":"expr","27":"archivedKw","28":"\"yes\"","29":"\"no\"","30":"\"only\"","31":"revisionKw","32":"value","33":"quotedString","34":"word","35":"contentKw","36":"fileKw","37":"forkKw","38":"forkValue","39":"visibilityKw","40":"visibilityValue","41":"\"public\"","42":"\"private\"","43":"\"any\"","44":"repoKw","45":"langKw","46":"symKw","47":"reposetKw","48":"\"(\"","49":"\")\"","50":"or"} }) diff --git a/packages/queryLanguage/src/query.grammar b/packages/queryLanguage/src/query.grammar index 76ab2e6f..4058d543 100644 --- a/packages/queryLanguage/src/query.grammar +++ b/packages/queryLanguage/src/query.grammar @@ -53,10 +53,13 @@ SymExpr { symKw value } RepoSetExpr { reposetKw value } // Modifiers -ArchivedExpr { archivedKw value } -ForkExpr { forkKw value } -VisibilityExpr { visibilityKw value } +ArchivedExpr { archivedKw archivedValue } +ForkExpr { forkKw forkValue } +VisibilityExpr { visibilityKw visibilityValue } +archivedValue { "yes" | "no" | "only" } +forkValue { "yes" | "no" | "only" } +visibilityValue { "public" | "private" | "any" } Term { quotedString | word } diff --git a/packages/queryLanguage/test/prefixes.txt b/packages/queryLanguage/test/prefixes.txt index 5c350053..06e43528 100644 --- a/packages/queryLanguage/test/prefixes.txt +++ b/packages/queryLanguage/test/prefixes.txt @@ -62,7 +62,7 @@ lang:typescript Program(PrefixExpr(LangExpr)) -# Archived prefix +# Archived prefix - no archived:no @@ -70,7 +70,15 @@ archived:no Program(PrefixExpr(ArchivedExpr)) -# Fork prefix +# Archived prefix - only + +archived:only + +==> + +Program(PrefixExpr(ArchivedExpr)) + +# Fork prefix - yes fork:yes @@ -78,6 +86,14 @@ fork:yes Program(PrefixExpr(ForkExpr)) +# Fork prefix - only + +fork:only + +==> + +Program(PrefixExpr(ForkExpr)) + # Visibility prefix - public visibility:public @@ -206,7 +222,7 @@ lang:python Program(PrefixExpr(LangExpr)) -# Archived values +# Archived prefix - yes archived:yes @@ -214,7 +230,15 @@ archived:yes Program(PrefixExpr(ArchivedExpr)) -# Fork values +# Archived prefix - invalid value (error case) + +archived:invalid + +==> + +Program(AndExpr(PrefixExpr(ArchivedExpr(⚠)),Term)) + +# Fork prefix - no fork:no @@ -222,6 +246,14 @@ fork:no Program(PrefixExpr(ForkExpr)) +# Fork prefix - invalid value (error case) + +fork:invalid + +==> + +Program(AndExpr(PrefixExpr(ForkExpr(⚠)),Term)) + # Visibility prefix - private visibility:private @@ -230,6 +262,22 @@ visibility:private Program(PrefixExpr(VisibilityExpr)) +# Visibility prefix - any + +visibility:any + +==> + +Program(PrefixExpr(VisibilityExpr)) + +# Visibility prefix - invalid value (error case) + +visibility:invalid + +==> + +Program(AndExpr(PrefixExpr(VisibilityExpr(⚠)),Term)) + # File with dashes file:my-component.tsx diff --git a/packages/web/src/app/[domain]/components/searchBar/constants.ts b/packages/web/src/app/[domain]/components/searchBar/constants.ts index c637bee9..ea93cee8 100644 --- a/packages/web/src/app/[domain]/components/searchBar/constants.ts +++ b/packages/web/src/app/[domain]/components/searchBar/constants.ts @@ -16,57 +16,53 @@ export enum SearchPrefix { sym = "sym:", content = "content:", archived = "archived:", - case = "case:", fork = "fork:", - public = "public:", + visibility = "visibility:", context = "context:", } -export const publicModeSuggestions: Suggestion[] = [ +export const visibilityModeSuggestions: Suggestion[] = [ { - value: "yes", + value: "public", description: "Only include results from public repositories." }, { - value: "no", + value: "private", description: "Only include results from private repositories." }, + { + value: "any", + description: "Include results from both public and private repositories (default)." + }, ]; export const forkModeSuggestions: Suggestion[] = [ { value: "yes", + description: "Include results from forked repositories (default)." + }, + { + value: "no", + description: "Exclude results from forked repositories." + }, + { + value: "only", description: "Only include results from forked repositories." - }, - { - value: "no", - description: "Only include results from non-forked repositories." - }, -]; - -export const caseModeSuggestions: Suggestion[] = [ - { - value: "auto", - description: "Search patterns are case-insensitive if all characters are lowercase, and case sensitive otherwise (default)." - }, - { - value: "yes", - description: "Case sensitive search." - }, - { - value: "no", - description: "Case insensitive search." - }, + } ]; export const archivedModeSuggestions: Suggestion[] = [ { value: "yes", - description: "Only include results in archived repositories." + description: "Include results from archived repositories (default)." }, { value: "no", - description: "Only include results in non-archived repositories." + description: "Exclude results from archived repositories." }, + { + value: "only", + description: "Only include results from archived repositories." + } ]; diff --git a/packages/web/src/app/[domain]/components/searchBar/searchSuggestionsBox.tsx b/packages/web/src/app/[domain]/components/searchBar/searchSuggestionsBox.tsx index 3d694ab2..e5fb1b12 100644 --- a/packages/web/src/app/[domain]/components/searchBar/searchSuggestionsBox.tsx +++ b/packages/web/src/app/[domain]/components/searchBar/searchSuggestionsBox.tsx @@ -7,9 +7,8 @@ import Fuse from "fuse.js"; import { forwardRef, Ref, useEffect, useMemo, useState } from "react"; import { archivedModeSuggestions, - caseModeSuggestions, forkModeSuggestions, - publicModeSuggestions, + visibilityModeSuggestions, } from "./constants"; import { IconType } from "react-icons/lib"; import { VscFile, VscFilter, VscRepo, VscSymbolMisc } from "react-icons/vsc"; @@ -32,9 +31,8 @@ export type SuggestionMode = "archived" | "file" | "language" | - "case" | "fork" | - "public" | + "visibility" | "revision" | "symbol" | "content" | @@ -137,9 +135,9 @@ const SearchSuggestionsBox = forwardRef(({ DefaultIcon?: IconType } => { switch (suggestionMode) { - case "public": + case "visibility": return { - list: publicModeSuggestions, + list: visibilityModeSuggestions, onSuggestionClicked: createOnSuggestionClickedHandler(), } case "fork": @@ -147,11 +145,6 @@ const SearchSuggestionsBox = forwardRef(({ list: forkModeSuggestions, onSuggestionClicked: createOnSuggestionClickedHandler(), } - case "case": - return { - list: caseModeSuggestions, - onSuggestionClicked: createOnSuggestionClickedHandler(), - } case "archived": return { list: archivedModeSuggestions, diff --git a/packages/web/src/app/[domain]/components/searchBar/useRefineModeSuggestions.ts b/packages/web/src/app/[domain]/components/searchBar/useRefineModeSuggestions.ts index fdc16d50..1c8df2a8 100644 --- a/packages/web/src/app/[domain]/components/searchBar/useRefineModeSuggestions.ts +++ b/packages/web/src/app/[domain]/components/searchBar/useRefineModeSuggestions.ts @@ -26,7 +26,7 @@ export const useRefineModeSuggestions = () => { }, ] : []), { - value: SearchPrefix.public, + value: SearchPrefix.visibility, description: "Filter on repository visibility." }, { @@ -86,10 +86,6 @@ export const useRefineModeSuggestions = () => { value: SearchPrefix.archived, description: "Include results from archived repositories.", }, - { - value: SearchPrefix.case, - description: "Control case-sensitivity of search patterns." - }, { value: SearchPrefix.fork, description: "Include only results from forked repositories." diff --git a/packages/web/src/app/[domain]/components/searchBar/useSuggestionModeMappings.ts b/packages/web/src/app/[domain]/components/searchBar/useSuggestionModeMappings.ts index da03fd6b..64e4acfb 100644 --- a/packages/web/src/app/[domain]/components/searchBar/useSuggestionModeMappings.ts +++ b/packages/web/src/app/[domain]/components/searchBar/useSuggestionModeMappings.ts @@ -70,12 +70,6 @@ export const useSuggestionModeMappings = () => { SearchPrefix.archived ] }, - { - suggestionMode: "case", - prefixes: [ - SearchPrefix.case - ] - }, { suggestionMode: "fork", prefixes: [ @@ -83,9 +77,9 @@ export const useSuggestionModeMappings = () => { ] }, { - suggestionMode: "public", + suggestionMode: "visibility", prefixes: [ - SearchPrefix.public + SearchPrefix.visibility ] }, ...(isSearchContextsEnabled ? [ diff --git a/packages/web/src/app/[domain]/components/searchBar/zoektLanguageExtension.ts b/packages/web/src/app/[domain]/components/searchBar/zoektLanguageExtension.ts index 1dad70bc..6d86a710 100644 --- a/packages/web/src/app/[domain]/components/searchBar/zoektLanguageExtension.ts +++ b/packages/web/src/app/[domain]/components/searchBar/zoektLanguageExtension.ts @@ -47,7 +47,7 @@ export const zoekt = () => { // Check for prefixes first // If these match, we return 'keyword' - if (stream.match(/(archived:|branch:|b:|rev:|c:|case:|content:|f:|file:|fork:|public:|r:|repo:|regex:|lang:|sym:|t:|type:|context:)/)) { + if (stream.match(/(archived:|rev:|content:|f:|file:|fork:|visibility:|r:|repo:|regex:|lang:|sym:|t:|type:|context:)/)) { return t.keyword.toString(); } diff --git a/packages/web/src/app/api/(server)/stream_search/route.ts b/packages/web/src/app/api/(server)/stream_search/route.ts index 6e97f6d3..96846fa5 100644 --- a/packages/web/src/app/api/(server)/stream_search/route.ts +++ b/packages/web/src/app/api/(server)/stream_search/route.ts @@ -91,34 +91,7 @@ export const POST = async (request: NextRequest) => { console.log(JSON.stringify(zoektQuery, null, 2)); const searchRequest: SearchRequest = { - query: { - and: { - children: [ - zoektQuery, - // { - // raw_config: { - // flags: [ - // 'FLAG_NO_FORKS', - // ] - // } - // } - ] - } - }, - // query: { - // and: { - // // @todo: we should use repo_ids to filter out repositories that the user - // // has access to (if permission syncing is enabled!). - // children: [ - // { - // regexp: { - // regexp: query, - // case_sensitive: true, - // } - // } - // ] - // } - // }, + query: zoektQuery, opts: { chunk_matches: true, max_match_display_count: matches, diff --git a/packages/web/src/app/api/(server)/stream_search/transformer.ts b/packages/web/src/app/api/(server)/stream_search/transformer.ts index f0b5ed99..2fa35edf 100644 --- a/packages/web/src/app/api/(server)/stream_search/transformer.ts +++ b/packages/web/src/app/api/(server)/stream_search/transformer.ts @@ -17,9 +17,25 @@ import { ArchivedExpr, ForkExpr, VisibilityExpr, - RepoSetExpr + RepoSetExpr, } from '@sourcebot/query-language'; +type ArchivedValue = 'yes' | 'no' | 'only'; +type VisibilityValue = 'public' | 'private' | 'any'; +type ForkValue = 'yes' | 'no' | 'only'; + +const isArchivedValue = (value: string): value is ArchivedValue => { + return value === 'yes' || value === 'no' || value === 'only'; +} + +const isVisibilityValue = (value: string): value is VisibilityValue => { + return value === 'public' || value === 'private' || value === 'any'; +} + +const isForkValue = (value: string): value is ForkValue => { + return value === 'yes' || value === 'no' || value === 'only'; +} + /** * Transform a Lezer parse tree into a Zoekt gRPC query */ @@ -199,12 +215,17 @@ export const transformToZoektQuery = ({ }; case VisibilityExpr: { - const visibilityValue = value.toLowerCase(); + const rawValue = value.toLowerCase(); + + if (!isVisibilityValue(rawValue)) { + throw new Error(`Invalid visibility value: ${rawValue}. Expected 'public', 'private', or 'any'`); + } + const flags: ('FLAG_ONLY_PUBLIC' | 'FLAG_ONLY_PRIVATE')[] = []; - if (visibilityValue === 'public') { + if (rawValue === 'public') { flags.push('FLAG_ONLY_PUBLIC'); - } else if (visibilityValue === 'private') { + } else if (rawValue === 'private') { flags.push('FLAG_ONLY_PRIVATE'); } // 'any' means no filter @@ -217,16 +238,20 @@ export const transformToZoektQuery = ({ }; } - // @todo: handle this case ArchivedExpr: { - const archivedValue = value.toLowerCase(); + const rawValue = value.toLowerCase(); + + if (!isArchivedValue(rawValue)) { + throw new Error(`Invalid archived value: ${rawValue}. Expected 'yes', 'no', or 'only'`); + } + const flags: ('FLAG_ONLY_ARCHIVED' | 'FLAG_NO_ARCHIVED')[] = []; - if (archivedValue === 'yes') { + if (rawValue === 'yes') { // 'yes' means include archived repositories (default) - } else if (archivedValue === 'no') { + } else if (rawValue === 'no') { flags.push('FLAG_NO_ARCHIVED'); - } else if (archivedValue === 'only') { + } else if (rawValue === 'only') { flags.push('FLAG_ONLY_ARCHIVED'); } @@ -237,12 +262,30 @@ export const transformToZoektQuery = ({ query: "raw_config" }; } - case ForkExpr: - // These are repo metadata filters - // They need to be handled via repo filters in Zoekt - // For now, return a const query (you might need custom handling) - console.warn(`${prefixNode.type.name} not yet implemented`); - return { const: true, query: "const" }; + case ForkExpr: { + const rawValue = value.toLowerCase(); + + if (!isForkValue(rawValue)) { + throw new Error(`Invalid fork value: ${rawValue}. Expected 'yes', 'no', or 'only'`); + } + + const flags: ('FLAG_ONLY_FORKS' | 'FLAG_NO_FORKS')[] = []; + + if (rawValue === 'yes') { + // 'yes' means include forks (default) + } else if (rawValue === 'no') { + flags.push('FLAG_NO_FORKS'); + } else if (rawValue === 'only') { + flags.push('FLAG_ONLY_FORKS'); + } + + return { + raw_config: { + flags + }, + query: "raw_config" + }; + } case RepoSetExpr: { return {