@vuu-ui/vuu-table-extras 0.8.35 → 0.8.36

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.
Files changed (167) hide show
  1. package/README.md +0 -0
  2. package/cjs/cell-edit-validators/CaseValidator.js +24 -0
  3. package/cjs/cell-edit-validators/CaseValidator.js.map +1 -0
  4. package/cjs/cell-edit-validators/PatternValidator.js +26 -0
  5. package/cjs/cell-edit-validators/PatternValidator.js.map +1 -0
  6. package/cjs/cell-renderers/background-cell/BackgroundCell.css +105 -0
  7. package/cjs/cell-renderers/background-cell/BackgroundCell.js +64 -0
  8. package/cjs/cell-renderers/background-cell/BackgroundCell.js.map +1 -0
  9. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css +4 -0
  10. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js +58 -0
  11. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js.map +1 -0
  12. package/cjs/cell-renderers/background-cell/BackgroundKeyframes.css +169 -0
  13. package/cjs/cell-renderers/background-cell/useDirection.js +20 -0
  14. package/cjs/cell-renderers/background-cell/useDirection.js.map +1 -0
  15. package/cjs/cell-renderers/dropdown-cell/DropdownCell.css +18 -0
  16. package/cjs/cell-renderers/dropdown-cell/DropdownCell.js +56 -0
  17. package/cjs/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -0
  18. package/cjs/cell-renderers/lookup-cell/LookupCell.js +26 -0
  19. package/cjs/cell-renderers/lookup-cell/LookupCell.js.map +1 -0
  20. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.css +30 -0
  21. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.js +53 -0
  22. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.js.map +1 -0
  23. package/cjs/cell-renderers/progress-cell/ProgressCell.css +39 -0
  24. package/cjs/cell-renderers/progress-cell/ProgressCell.js +60 -0
  25. package/cjs/cell-renderers/progress-cell/ProgressCell.js.map +1 -0
  26. package/cjs/column-expression-input/ColumnExpressionInput.css +92 -0
  27. package/cjs/column-expression-input/ColumnExpressionInput.js +30 -0
  28. package/cjs/column-expression-input/ColumnExpressionInput.js.map +1 -0
  29. package/cjs/column-expression-input/column-function-descriptors.js +307 -0
  30. package/cjs/column-expression-input/column-function-descriptors.js.map +1 -0
  31. package/cjs/column-expression-input/column-language-parser/ColumnExpressionLanguage.js +29 -0
  32. package/cjs/column-expression-input/column-language-parser/ColumnExpressionLanguage.js.map +1 -0
  33. package/cjs/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js +469 -0
  34. package/cjs/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js.map +1 -0
  35. package/cjs/column-expression-input/column-language-parser/column-expression-parse-utils.js +61 -0
  36. package/cjs/column-expression-input/column-language-parser/column-expression-parse-utils.js.map +1 -0
  37. package/cjs/column-expression-input/column-language-parser/generated/column-parser.js +21 -0
  38. package/cjs/column-expression-input/column-language-parser/generated/column-parser.js.map +1 -0
  39. package/cjs/column-expression-input/functionDocInfo.js +39 -0
  40. package/cjs/column-expression-input/functionDocInfo.js.map +1 -0
  41. package/cjs/column-expression-input/highlighting.js +16 -0
  42. package/cjs/column-expression-input/highlighting.js.map +1 -0
  43. package/cjs/column-expression-input/theme.js +63 -0
  44. package/cjs/column-expression-input/theme.js.map +1 -0
  45. package/cjs/column-expression-input/useColumnAutoComplete.js +358 -0
  46. package/cjs/column-expression-input/useColumnAutoComplete.js.map +1 -0
  47. package/cjs/column-expression-input/useColumnExpressionEditor.js +131 -0
  48. package/cjs/column-expression-input/useColumnExpressionEditor.js.map +1 -0
  49. package/cjs/column-expression-input/useColumnExpressionSuggestionProvider.js +212 -0
  50. package/cjs/column-expression-input/useColumnExpressionSuggestionProvider.js.map +1 -0
  51. package/cjs/column-expression-panel/ColumnExpressionPanel.js +87 -0
  52. package/cjs/column-expression-panel/ColumnExpressionPanel.js.map +1 -0
  53. package/cjs/column-expression-panel/useColumnExpression.js +69 -0
  54. package/cjs/column-expression-panel/useColumnExpression.js.map +1 -0
  55. package/cjs/column-formatting-settings/BaseNumericFormattingSettings.js +97 -0
  56. package/cjs/column-formatting-settings/BaseNumericFormattingSettings.js.map +1 -0
  57. package/cjs/column-formatting-settings/ColumnFormattingPanel.js +107 -0
  58. package/cjs/column-formatting-settings/ColumnFormattingPanel.js.map +1 -0
  59. package/cjs/column-formatting-settings/DateTimeFormattingSettings.js +90 -0
  60. package/cjs/column-formatting-settings/DateTimeFormattingSettings.js.map +1 -0
  61. package/cjs/column-formatting-settings/LongTypeFormattingSettings.css +6 -0
  62. package/cjs/column-formatting-settings/LongTypeFormattingSettings.js +40 -0
  63. package/cjs/column-formatting-settings/LongTypeFormattingSettings.js.map +1 -0
  64. package/cjs/column-list/ColumnList.css +60 -0
  65. package/cjs/column-list/ColumnList.js +106 -0
  66. package/cjs/column-list/ColumnList.js.map +1 -0
  67. package/cjs/column-settings/ColumnNameLabel.css +13 -0
  68. package/cjs/column-settings/ColumnNameLabel.js +36 -0
  69. package/cjs/column-settings/ColumnNameLabel.js.map +1 -0
  70. package/cjs/column-settings/ColumnSettingsPanel.css +77 -0
  71. package/cjs/column-settings/ColumnSettingsPanel.js +186 -0
  72. package/cjs/column-settings/ColumnSettingsPanel.js.map +1 -0
  73. package/cjs/column-settings/useColumnSettings.js +235 -0
  74. package/cjs/column-settings/useColumnSettings.js.map +1 -0
  75. package/cjs/datasource-stats/DatasourceStats.css +11 -0
  76. package/cjs/datasource-stats/DatasourceStats.js +39 -0
  77. package/cjs/datasource-stats/DatasourceStats.js.map +1 -0
  78. package/cjs/index.js.map +1 -0
  79. package/cjs/table-settings/TableSettingsPanel.css +64 -0
  80. package/cjs/table-settings/TableSettingsPanel.js +114 -0
  81. package/cjs/table-settings/TableSettingsPanel.js.map +1 -0
  82. package/cjs/table-settings/useTableSettings.js +182 -0
  83. package/cjs/table-settings/useTableSettings.js.map +1 -0
  84. package/esm/cell-edit-validators/CaseValidator.js +22 -0
  85. package/esm/cell-edit-validators/CaseValidator.js.map +1 -0
  86. package/esm/cell-edit-validators/PatternValidator.js +24 -0
  87. package/esm/cell-edit-validators/PatternValidator.js.map +1 -0
  88. package/esm/cell-renderers/background-cell/BackgroundCell.css +105 -0
  89. package/esm/cell-renderers/background-cell/BackgroundCell.js +62 -0
  90. package/esm/cell-renderers/background-cell/BackgroundCell.js.map +1 -0
  91. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css +4 -0
  92. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js +56 -0
  93. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js.map +1 -0
  94. package/esm/cell-renderers/background-cell/BackgroundKeyframes.css +169 -0
  95. package/esm/cell-renderers/background-cell/useDirection.js +18 -0
  96. package/esm/cell-renderers/background-cell/useDirection.js.map +1 -0
  97. package/esm/cell-renderers/dropdown-cell/DropdownCell.css +18 -0
  98. package/esm/cell-renderers/dropdown-cell/DropdownCell.js +54 -0
  99. package/esm/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -0
  100. package/esm/cell-renderers/lookup-cell/LookupCell.js +24 -0
  101. package/esm/cell-renderers/lookup-cell/LookupCell.js.map +1 -0
  102. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.css +30 -0
  103. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.js +51 -0
  104. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.js.map +1 -0
  105. package/esm/cell-renderers/progress-cell/ProgressCell.css +39 -0
  106. package/esm/cell-renderers/progress-cell/ProgressCell.js +58 -0
  107. package/esm/cell-renderers/progress-cell/ProgressCell.js.map +1 -0
  108. package/esm/column-expression-input/ColumnExpressionInput.css +92 -0
  109. package/esm/column-expression-input/ColumnExpressionInput.js +28 -0
  110. package/esm/column-expression-input/ColumnExpressionInput.js.map +1 -0
  111. package/esm/column-expression-input/column-function-descriptors.js +305 -0
  112. package/esm/column-expression-input/column-function-descriptors.js.map +1 -0
  113. package/esm/column-expression-input/column-language-parser/ColumnExpressionLanguage.js +27 -0
  114. package/esm/column-expression-input/column-language-parser/ColumnExpressionLanguage.js.map +1 -0
  115. package/esm/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js +467 -0
  116. package/esm/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js.map +1 -0
  117. package/esm/column-expression-input/column-language-parser/column-expression-parse-utils.js +56 -0
  118. package/esm/column-expression-input/column-language-parser/column-expression-parse-utils.js.map +1 -0
  119. package/esm/column-expression-input/column-language-parser/generated/column-parser.js +19 -0
  120. package/esm/column-expression-input/column-language-parser/generated/column-parser.js.map +1 -0
  121. package/esm/column-expression-input/functionDocInfo.js +37 -0
  122. package/esm/column-expression-input/functionDocInfo.js.map +1 -0
  123. package/esm/column-expression-input/highlighting.js +14 -0
  124. package/esm/column-expression-input/highlighting.js.map +1 -0
  125. package/esm/column-expression-input/theme.js +61 -0
  126. package/esm/column-expression-input/theme.js.map +1 -0
  127. package/esm/column-expression-input/useColumnAutoComplete.js +356 -0
  128. package/esm/column-expression-input/useColumnAutoComplete.js.map +1 -0
  129. package/esm/column-expression-input/useColumnExpressionEditor.js +129 -0
  130. package/esm/column-expression-input/useColumnExpressionEditor.js.map +1 -0
  131. package/esm/column-expression-input/useColumnExpressionSuggestionProvider.js +210 -0
  132. package/esm/column-expression-input/useColumnExpressionSuggestionProvider.js.map +1 -0
  133. package/esm/column-expression-panel/ColumnExpressionPanel.js +85 -0
  134. package/esm/column-expression-panel/ColumnExpressionPanel.js.map +1 -0
  135. package/esm/column-expression-panel/useColumnExpression.js +67 -0
  136. package/esm/column-expression-panel/useColumnExpression.js.map +1 -0
  137. package/esm/column-formatting-settings/BaseNumericFormattingSettings.js +95 -0
  138. package/esm/column-formatting-settings/BaseNumericFormattingSettings.js.map +1 -0
  139. package/esm/column-formatting-settings/ColumnFormattingPanel.js +105 -0
  140. package/esm/column-formatting-settings/ColumnFormattingPanel.js.map +1 -0
  141. package/esm/column-formatting-settings/DateTimeFormattingSettings.js +88 -0
  142. package/esm/column-formatting-settings/DateTimeFormattingSettings.js.map +1 -0
  143. package/esm/column-formatting-settings/LongTypeFormattingSettings.css +6 -0
  144. package/esm/column-formatting-settings/LongTypeFormattingSettings.js +38 -0
  145. package/esm/column-formatting-settings/LongTypeFormattingSettings.js.map +1 -0
  146. package/esm/column-list/ColumnList.css +60 -0
  147. package/esm/column-list/ColumnList.js +104 -0
  148. package/esm/column-list/ColumnList.js.map +1 -0
  149. package/esm/column-settings/ColumnNameLabel.css +13 -0
  150. package/esm/column-settings/ColumnNameLabel.js +34 -0
  151. package/esm/column-settings/ColumnNameLabel.js.map +1 -0
  152. package/esm/column-settings/ColumnSettingsPanel.css +77 -0
  153. package/esm/column-settings/ColumnSettingsPanel.js +184 -0
  154. package/esm/column-settings/ColumnSettingsPanel.js.map +1 -0
  155. package/esm/column-settings/useColumnSettings.js +233 -0
  156. package/esm/column-settings/useColumnSettings.js.map +1 -0
  157. package/esm/datasource-stats/DatasourceStats.css +11 -0
  158. package/esm/datasource-stats/DatasourceStats.js +37 -0
  159. package/esm/datasource-stats/DatasourceStats.js.map +1 -0
  160. package/esm/index.js +24 -0
  161. package/esm/index.js.map +1 -0
  162. package/esm/table-settings/TableSettingsPanel.css +64 -0
  163. package/esm/table-settings/TableSettingsPanel.js +112 -0
  164. package/esm/table-settings/TableSettingsPanel.js.map +1 -0
  165. package/esm/table-settings/useTableSettings.js +180 -0
  166. package/esm/table-settings/useTableSettings.js.map +1 -0
  167. package/package.json +14 -12
@@ -0,0 +1,37 @@
1
+ import { createEl } from '@vuu-ui/vuu-utils';
2
+
3
+ const functionDocInfo = ({
4
+ name,
5
+ description,
6
+ example,
7
+ params,
8
+ type
9
+ }) => {
10
+ const rootElement = createEl("div", "vuuFunctionDoc");
11
+ const headingElement = createEl("div", "function-heading");
12
+ const nameElement = createEl("span", "function-name", name);
13
+ const paramElement = createEl("span", "param-list", params.description);
14
+ const typeElement = createEl("span", "function-type", type);
15
+ headingElement.appendChild(nameElement);
16
+ headingElement.appendChild(paramElement);
17
+ headingElement.appendChild(typeElement);
18
+ const child2 = createEl("p", void 0, description);
19
+ rootElement.appendChild(headingElement);
20
+ rootElement.appendChild(child2);
21
+ if (example) {
22
+ const exampleElement = createEl("div", "example-container");
23
+ const expressionElement = createEl(
24
+ "div",
25
+ "example-expression",
26
+ example.expression
27
+ );
28
+ const resultElement = createEl("div", "example-result", example.result);
29
+ exampleElement.appendChild(expressionElement);
30
+ rootElement.appendChild(exampleElement);
31
+ rootElement.appendChild(resultElement);
32
+ }
33
+ return rootElement;
34
+ };
35
+
36
+ export { functionDocInfo };
37
+ //# sourceMappingURL=functionDocInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functionDocInfo.js","sources":["../../src/column-expression-input/functionDocInfo.ts"],"sourcesContent":["import { createEl } from \"@vuu-ui/vuu-utils\";\nimport { ColumnFunctionDescriptor } from \"./column-function-descriptors\";\n\nexport const functionDocInfo = ({\n name,\n description,\n example,\n params,\n type,\n}: ColumnFunctionDescriptor) => {\n const rootElement = createEl(\"div\", \"vuuFunctionDoc\");\n const headingElement = createEl(\"div\", \"function-heading\");\n\n const nameElement = createEl(\"span\", \"function-name\", name);\n const paramElement = createEl(\"span\", \"param-list\", params.description);\n const typeElement = createEl(\"span\", \"function-type\", type);\n\n headingElement.appendChild(nameElement);\n headingElement.appendChild(paramElement);\n headingElement.appendChild(typeElement);\n\n const child2 = createEl(\"p\", undefined, description);\n\n rootElement.appendChild(headingElement);\n rootElement.appendChild(child2);\n\n if (example) {\n const exampleElement = createEl(\"div\", \"example-container\");\n const expressionElement = createEl(\n \"div\",\n \"example-expression\",\n example.expression\n );\n const resultElement = createEl(\"div\", \"example-result\", example.result);\n\n exampleElement.appendChild(expressionElement);\n\n rootElement.appendChild(exampleElement);\n rootElement.appendChild(resultElement);\n }\n\n return rootElement;\n};\n"],"names":[],"mappings":";;AAGO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,IAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AACF,CAAgC,KAAA;AAC9B,EAAM,MAAA,WAAA,GAAc,QAAS,CAAA,KAAA,EAAO,gBAAgB,CAAA,CAAA;AACpD,EAAM,MAAA,cAAA,GAAiB,QAAS,CAAA,KAAA,EAAO,kBAAkB,CAAA,CAAA;AAEzD,EAAA,MAAM,WAAc,GAAA,QAAA,CAAS,MAAQ,EAAA,eAAA,EAAiB,IAAI,CAAA,CAAA;AAC1D,EAAA,MAAM,YAAe,GAAA,QAAA,CAAS,MAAQ,EAAA,YAAA,EAAc,OAAO,WAAW,CAAA,CAAA;AACtE,EAAA,MAAM,WAAc,GAAA,QAAA,CAAS,MAAQ,EAAA,eAAA,EAAiB,IAAI,CAAA,CAAA;AAE1D,EAAA,cAAA,CAAe,YAAY,WAAW,CAAA,CAAA;AACtC,EAAA,cAAA,CAAe,YAAY,YAAY,CAAA,CAAA;AACvC,EAAA,cAAA,CAAe,YAAY,WAAW,CAAA,CAAA;AAEtC,EAAA,MAAM,MAAS,GAAA,QAAA,CAAS,GAAK,EAAA,KAAA,CAAA,EAAW,WAAW,CAAA,CAAA;AAEnD,EAAA,WAAA,CAAY,YAAY,cAAc,CAAA,CAAA;AACtC,EAAA,WAAA,CAAY,YAAY,MAAM,CAAA,CAAA;AAE9B,EAAA,IAAI,OAAS,EAAA;AACX,IAAM,MAAA,cAAA,GAAiB,QAAS,CAAA,KAAA,EAAO,mBAAmB,CAAA,CAAA;AAC1D,IAAA,MAAM,iBAAoB,GAAA,QAAA;AAAA,MACxB,KAAA;AAAA,MACA,oBAAA;AAAA,MACA,OAAQ,CAAA,UAAA;AAAA,KACV,CAAA;AACA,IAAA,MAAM,aAAgB,GAAA,QAAA,CAAS,KAAO,EAAA,gBAAA,EAAkB,QAAQ,MAAM,CAAA,CAAA;AAEtE,IAAA,cAAA,CAAe,YAAY,iBAAiB,CAAA,CAAA;AAE5C,IAAA,WAAA,CAAY,YAAY,cAAc,CAAA,CAAA;AACtC,IAAA,WAAA,CAAY,YAAY,aAAa,CAAA,CAAA;AAAA,GACvC;AAEA,EAAO,OAAA,WAAA,CAAA;AACT;;;;"}
@@ -0,0 +1,14 @@
1
+ import { HighlightStyle, tags, syntaxHighlighting } from '@vuu-ui/vuu-codemirror';
2
+
3
+ const myHighlightStyle = HighlightStyle.define([
4
+ {
5
+ tag: tags.attributeValue,
6
+ color: "var(--vuuFilterEditor-variableColor);font-weight: bold"
7
+ },
8
+ { tag: tags.variableName, color: "var(--vuuFilterEditor-variableColor)" },
9
+ { tag: tags.comment, color: "green", fontStyle: "italic" }
10
+ ]);
11
+ const vuuHighlighting = syntaxHighlighting(myHighlightStyle);
12
+
13
+ export { vuuHighlighting };
14
+ //# sourceMappingURL=highlighting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlighting.js","sources":["../../src/column-expression-input/highlighting.ts"],"sourcesContent":["import {\n HighlightStyle,\n syntaxHighlighting,\n tags,\n} from \"@vuu-ui/vuu-codemirror\";\n\nconst myHighlightStyle = HighlightStyle.define([\n {\n tag: tags.attributeValue,\n color: \"var(--vuuFilterEditor-variableColor);font-weight: bold\",\n },\n { tag: tags.variableName, color: \"var(--vuuFilterEditor-variableColor)\" },\n { tag: tags.comment, color: \"green\", fontStyle: \"italic\" },\n]);\n\nexport const vuuHighlighting = syntaxHighlighting(myHighlightStyle);\n"],"names":[],"mappings":";;AAMA,MAAM,gBAAA,GAAmB,eAAe,MAAO,CAAA;AAAA,EAC7C;AAAA,IACE,KAAK,IAAK,CAAA,cAAA;AAAA,IACV,KAAO,EAAA,wDAAA;AAAA,GACT;AAAA,EACA,EAAE,GAAA,EAAK,IAAK,CAAA,YAAA,EAAc,OAAO,sCAAuC,EAAA;AAAA,EACxE,EAAE,GAAK,EAAA,IAAA,CAAK,SAAS,KAAO,EAAA,OAAA,EAAS,WAAW,QAAS,EAAA;AAC3D,CAAC,CAAA,CAAA;AAEY,MAAA,eAAA,GAAkB,mBAAmB,gBAAgB;;;;"}
@@ -0,0 +1,61 @@
1
+ import { EditorView } from '@vuu-ui/vuu-codemirror';
2
+
3
+ const vuuTheme = EditorView.theme(
4
+ {
5
+ "&": {
6
+ border: "solid 1px var(--salt-container-primary-borderColor)",
7
+ color: "var(--vuuFilterEditor-color)",
8
+ backgroundColor: "var(--vuuFilterEditor-background)"
9
+ },
10
+ ".cm-content": {
11
+ caretColor: "var(--vuuFilterEditor-cursorColor)"
12
+ },
13
+ "&.cm-focused .cm-cursor": {
14
+ borderLeftColor: "var(--vuuFilterEditor-cursorColor)"
15
+ },
16
+ "&.cm-focused .cm-selectionBackground, ::selection": {
17
+ backgroundColor: "var(--vuuFilterEditor-selectionBackground)"
18
+ },
19
+ ".cm-selectionBackground, ::selection": {
20
+ backgroundColor: "var(--vuuFilterEditor-selectionBackground)"
21
+ },
22
+ ".cm-scroller": {
23
+ fontFamily: "var(--vuuFilterEditor-fontFamily)"
24
+ },
25
+ ".cm-completionLabel": {
26
+ color: "var(--vuu-color-gray-50)"
27
+ },
28
+ ".cm-completionMatchedText": {
29
+ color: "var(--vuu-color-gray-80)",
30
+ fontWeight: 700,
31
+ textDecoration: "none"
32
+ },
33
+ ".cm-tooltip": {
34
+ background: "var(--vuuFilterEditor-tooltipBackground)",
35
+ border: "var(--vuuFilterEditor-tooltipBorder)",
36
+ borderRadius: "4px",
37
+ boxShadow: "var(--vuuFilterEditor-tooltipElevation)",
38
+ "&.cm-tooltip-autocomplete > ul": {
39
+ fontFamily: "var(--vuuFilterEditor-fontFamily)",
40
+ fontSize: "var(--vuuFilterEditor-fontSize)",
41
+ maxHeight: "240px"
42
+ },
43
+ "&.cm-tooltip-autocomplete > ul > li": {
44
+ height: "var(--vuuFilterEditor-suggestion-height)",
45
+ padding: "0 3px",
46
+ lineHeight: "var(--vuuFilterEditor-suggestion-height)"
47
+ },
48
+ "&.cm-tooltip-autocomplete li[aria-selected]": {
49
+ background: "var(--vuuFilterEditor-suggestion-selectedBackground)",
50
+ color: "var(--vuuFilterEditor-suggestion-selectedColor)"
51
+ },
52
+ "&.cm-tooltip-autocomplete li .cm-completionDetail": {
53
+ color: "var(--vuuFilterEditor-suggestion-detailColor)"
54
+ }
55
+ }
56
+ },
57
+ { dark: false }
58
+ );
59
+
60
+ export { vuuTheme };
61
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sources":["../../src/column-expression-input/theme.ts"],"sourcesContent":["import { EditorView } from \"@vuu-ui/vuu-codemirror\";\n\nexport const vuuTheme = EditorView.theme(\n {\n \"&\": {\n border: \"solid 1px var(--salt-container-primary-borderColor)\",\n color: \"var(--vuuFilterEditor-color)\",\n backgroundColor: \"var(--vuuFilterEditor-background)\",\n },\n \".cm-content\": {\n caretColor: \"var(--vuuFilterEditor-cursorColor)\",\n },\n \"&.cm-focused .cm-cursor\": {\n borderLeftColor: \"var(--vuuFilterEditor-cursorColor)\",\n },\n \"&.cm-focused .cm-selectionBackground, ::selection\": {\n backgroundColor: \"var(--vuuFilterEditor-selectionBackground)\",\n },\n \".cm-selectionBackground, ::selection\": {\n backgroundColor: \"var(--vuuFilterEditor-selectionBackground)\",\n },\n \".cm-scroller\": {\n fontFamily: \"var(--vuuFilterEditor-fontFamily)\",\n },\n \".cm-completionLabel\": {\n color: \"var(--vuu-color-gray-50)\",\n },\n \".cm-completionMatchedText\": {\n color: \"var(--vuu-color-gray-80)\",\n fontWeight: 700,\n textDecoration: \"none\",\n },\n \".cm-tooltip\": {\n background: \"var(--vuuFilterEditor-tooltipBackground)\",\n border: \"var(--vuuFilterEditor-tooltipBorder)\",\n borderRadius: \"4px\",\n boxShadow: \"var(--vuuFilterEditor-tooltipElevation)\",\n \"&.cm-tooltip-autocomplete > ul\": {\n fontFamily: \"var(--vuuFilterEditor-fontFamily)\",\n fontSize: \"var(--vuuFilterEditor-fontSize)\",\n maxHeight: \"240px\",\n },\n \"&.cm-tooltip-autocomplete > ul > li\": {\n height: \"var(--vuuFilterEditor-suggestion-height)\",\n padding: \"0 3px\",\n lineHeight: \"var(--vuuFilterEditor-suggestion-height)\",\n },\n \"&.cm-tooltip-autocomplete li[aria-selected]\": {\n background: \"var(--vuuFilterEditor-suggestion-selectedBackground)\",\n color: \"var(--vuuFilterEditor-suggestion-selectedColor)\",\n },\n \"&.cm-tooltip-autocomplete li .cm-completionDetail\": {\n color: \"var(--vuuFilterEditor-suggestion-detailColor)\",\n },\n },\n },\n { dark: false }\n);\n"],"names":[],"mappings":";;AAEO,MAAM,WAAW,UAAW,CAAA,KAAA;AAAA,EACjC;AAAA,IACE,GAAK,EAAA;AAAA,MACH,MAAQ,EAAA,qDAAA;AAAA,MACR,KAAO,EAAA,8BAAA;AAAA,MACP,eAAiB,EAAA,mCAAA;AAAA,KACnB;AAAA,IACA,aAAe,EAAA;AAAA,MACb,UAAY,EAAA,oCAAA;AAAA,KACd;AAAA,IACA,yBAA2B,EAAA;AAAA,MACzB,eAAiB,EAAA,oCAAA;AAAA,KACnB;AAAA,IACA,mDAAqD,EAAA;AAAA,MACnD,eAAiB,EAAA,4CAAA;AAAA,KACnB;AAAA,IACA,sCAAwC,EAAA;AAAA,MACtC,eAAiB,EAAA,4CAAA;AAAA,KACnB;AAAA,IACA,cAAgB,EAAA;AAAA,MACd,UAAY,EAAA,mCAAA;AAAA,KACd;AAAA,IACA,qBAAuB,EAAA;AAAA,MACrB,KAAO,EAAA,0BAAA;AAAA,KACT;AAAA,IACA,2BAA6B,EAAA;AAAA,MAC3B,KAAO,EAAA,0BAAA;AAAA,MACP,UAAY,EAAA,GAAA;AAAA,MACZ,cAAgB,EAAA,MAAA;AAAA,KAClB;AAAA,IACA,aAAe,EAAA;AAAA,MACb,UAAY,EAAA,0CAAA;AAAA,MACZ,MAAQ,EAAA,sCAAA;AAAA,MACR,YAAc,EAAA,KAAA;AAAA,MACd,SAAW,EAAA,yCAAA;AAAA,MACX,gCAAkC,EAAA;AAAA,QAChC,UAAY,EAAA,mCAAA;AAAA,QACZ,QAAU,EAAA,iCAAA;AAAA,QACV,SAAW,EAAA,OAAA;AAAA,OACb;AAAA,MACA,qCAAuC,EAAA;AAAA,QACrC,MAAQ,EAAA,0CAAA;AAAA,QACR,OAAS,EAAA,OAAA;AAAA,QACT,UAAY,EAAA,0CAAA;AAAA,OACd;AAAA,MACA,6CAA+C,EAAA;AAAA,QAC7C,UAAY,EAAA,sDAAA;AAAA,QACZ,KAAO,EAAA,iDAAA;AAAA,OACT;AAAA,MACA,mDAAqD,EAAA;AAAA,QACnD,KAAO,EAAA,+CAAA;AAAA,OACT;AAAA,KACF;AAAA,GACF;AAAA,EACA,EAAE,MAAM,KAAM,EAAA;AAChB;;;;"}
@@ -0,0 +1,356 @@
1
+ import { syntaxTree, getNamedParentNode, getValue, booleanJoinSuggestions, getPreviousNode } from '@vuu-ui/vuu-codemirror';
2
+ import { useCallback } from 'react';
3
+ import './column-language-parser/ColumnExpressionLanguage.js';
4
+ import './column-language-parser/ColumnExpressionTreeWalker.js';
5
+ import { isCompleteExpression, isCompleteRelationalExpression, ColumnNamedTerms, lastNamedChild } from './column-language-parser/column-expression-parse-utils.js';
6
+
7
+ const applyPrefix = (completions, prefix) => prefix ? completions.map((completion) => ({
8
+ ...completion,
9
+ apply: typeof completion.apply === "function" ? completion.apply : `${prefix}${completion.apply ?? completion.label}`
10
+ })) : completions;
11
+ const isOperator = (node) => node === void 0 ? false : ["Times", "Divide", "Plus", "Minus"].includes(node.name);
12
+ const completionDone = (onSubmit) => ({
13
+ apply: () => {
14
+ onSubmit?.();
15
+ },
16
+ label: "Done",
17
+ boost: 10
18
+ });
19
+ const getLastChild = (node, context) => {
20
+ let { lastChild: childNode } = node;
21
+ const { pos } = context;
22
+ while (childNode) {
23
+ const isBeforeCursor = childNode.from < pos;
24
+ if (isBeforeCursor && ColumnNamedTerms.includes(childNode.name)) {
25
+ if (childNode.name === "ParenthesizedExpression") {
26
+ const expression = childNode.firstChild?.nextSibling;
27
+ if (expression) {
28
+ childNode = expression;
29
+ }
30
+ }
31
+ return childNode;
32
+ } else {
33
+ childNode = childNode.prevSibling;
34
+ }
35
+ }
36
+ };
37
+ const getFunctionName = (node, state) => {
38
+ if (node.name === "ArgList") {
39
+ const functionNode = node.prevSibling;
40
+ if (functionNode) {
41
+ return getValue(functionNode, state);
42
+ }
43
+ } else if (node.name === "OpenBrace") {
44
+ const maybeFunction = node.parent?.prevSibling;
45
+ if (maybeFunction?.name === "Function") {
46
+ return getValue(maybeFunction, state);
47
+ }
48
+ }
49
+ };
50
+ const getRelationalOperator = (node, state) => {
51
+ if (node.name === "RelationalExpression") {
52
+ const lastNode = lastNamedChild(node);
53
+ if (lastNode?.name === "RelationalOperator") {
54
+ return getValue(lastNode, state);
55
+ }
56
+ } else {
57
+ const prevNode = node.prevSibling;
58
+ if (prevNode?.name === "RelationalOperator") {
59
+ return getValue(prevNode, state);
60
+ }
61
+ }
62
+ };
63
+ const getColumnName = (node, state) => {
64
+ if (node.name === "RelationalExpression") {
65
+ if (node.firstChild?.name === "Column") {
66
+ return getValue(node.firstChild, state);
67
+ }
68
+ } else {
69
+ const prevNode = node.prevSibling;
70
+ if (prevNode?.name === "Column") {
71
+ return getValue(prevNode, state);
72
+ } else if (prevNode?.name === "RelationalOperator") {
73
+ return getColumnName(prevNode, state);
74
+ }
75
+ }
76
+ };
77
+ const makeSuggestions = async (context, suggestionProvider, suggestionType, optionalArgs = {}) => {
78
+ const options = await suggestionProvider.getSuggestions(
79
+ suggestionType,
80
+ optionalArgs
81
+ );
82
+ const { startsWith = "" } = optionalArgs;
83
+ return { from: context.pos - startsWith.length, options };
84
+ };
85
+ const handleConditionalExpression = (node, context, suggestionProvider, maybeComplete, onSubmit) => {
86
+ const lastChild = getLastChild(node, context);
87
+ switch (lastChild?.name) {
88
+ case "If":
89
+ return makeSuggestions(context, suggestionProvider, "expression", {
90
+ prefix: "( "
91
+ });
92
+ case "OpenBrace":
93
+ return makeSuggestions(context, suggestionProvider, "expression");
94
+ case "Condition":
95
+ return makeSuggestions(context, suggestionProvider, "expression", {
96
+ prefix: ", "
97
+ });
98
+ case "CloseBrace":
99
+ if (maybeComplete) {
100
+ const options = [completionDone(onSubmit)];
101
+ return { from: context.pos, options };
102
+ }
103
+ }
104
+ };
105
+ const promptToSave = (context, onSubmit) => {
106
+ const options = [completionDone(onSubmit)];
107
+ return { from: context.pos, options };
108
+ };
109
+ const useColumnAutoComplete = (suggestionProvider, onSubmit) => {
110
+ const makeSuggestions2 = useCallback(
111
+ async (context, suggestionType, optionalArgs = {}) => {
112
+ const options = await suggestionProvider.getSuggestions(
113
+ suggestionType,
114
+ optionalArgs
115
+ );
116
+ const { startsWith = "" } = optionalArgs;
117
+ return { from: context.pos - startsWith.length, options };
118
+ },
119
+ [suggestionProvider]
120
+ );
121
+ return useCallback(
122
+ async (context) => {
123
+ const { state, pos } = context;
124
+ const word = context.matchBefore(/\w*/) ?? {
125
+ from: 0,
126
+ to: 0,
127
+ text: void 0
128
+ };
129
+ const tree = syntaxTree(state);
130
+ const nodeBefore = tree.resolveInner(pos, -1);
131
+ const text = state.doc.toString();
132
+ const maybeComplete = isCompleteExpression(text);
133
+ switch (nodeBefore.name) {
134
+ case "If": {
135
+ return makeSuggestions2(context, "expression", { prefix: "( " });
136
+ }
137
+ case "Condition":
138
+ {
139
+ const lastChild = getLastChild(nodeBefore, context);
140
+ if (lastChild?.name === "Column") {
141
+ const prevChild = getPreviousNode(lastChild);
142
+ if (prevChild?.name !== "RelationalOperator") {
143
+ return makeSuggestions2(context, "condition-operator", {
144
+ columnName: getValue(lastChild, state)
145
+ });
146
+ }
147
+ } else if (lastChild?.name === "RelationalOperator") {
148
+ return makeSuggestions2(context, "expression");
149
+ }
150
+ }
151
+ break;
152
+ case "ConditionalExpression":
153
+ return handleConditionalExpression(
154
+ nodeBefore,
155
+ context,
156
+ suggestionProvider
157
+ );
158
+ case "RelationalExpression":
159
+ {
160
+ if (isCompleteRelationalExpression(nodeBefore)) {
161
+ return {
162
+ from: context.pos,
163
+ options: booleanJoinSuggestions.concat({
164
+ label: ", <truthy expression>, <falsy expression>",
165
+ apply: ", "
166
+ })
167
+ };
168
+ } else {
169
+ const operator = getRelationalOperator(nodeBefore, state);
170
+ const columnName = getColumnName(nodeBefore, state);
171
+ if (!operator) {
172
+ const options = await suggestionProvider.getSuggestions(
173
+ "condition-operator",
174
+ {
175
+ columnName
176
+ }
177
+ );
178
+ return { from: context.pos, options };
179
+ } else {
180
+ return makeSuggestions2(context, "expression");
181
+ }
182
+ }
183
+ }
184
+ case "RelationalOperator":
185
+ return makeSuggestions2(context, "expression");
186
+ case "String":
187
+ {
188
+ const operator = getRelationalOperator(
189
+ nodeBefore,
190
+ state
191
+ );
192
+ const columnName = getColumnName(nodeBefore, state);
193
+ const { from, to } = nodeBefore;
194
+ if (to - from === 2 && context.pos === from + 1) {
195
+ if (columnName && operator) {
196
+ return makeSuggestions2(context, "columnValue", {
197
+ columnName,
198
+ operator,
199
+ startsWith: word.text
200
+ });
201
+ }
202
+ } else if (to - from > 2 && context.pos === to) {
203
+ return makeSuggestions2(context, "expression", {
204
+ prefix: ", "
205
+ });
206
+ }
207
+ }
208
+ break;
209
+ case "ArithmeticExpression":
210
+ {
211
+ const lastChild = getLastChild(nodeBefore, context);
212
+ if (lastChild?.name === "Column") {
213
+ return makeSuggestions2(context, "expression");
214
+ } else if (isOperator(lastChild)) {
215
+ const operator = lastChild.name;
216
+ return makeSuggestions2(context, "column", { operator });
217
+ }
218
+ }
219
+ break;
220
+ case "OpenBrace":
221
+ {
222
+ const functionName = getFunctionName(nodeBefore, state);
223
+ return makeSuggestions2(context, "expression", { functionName });
224
+ }
225
+ case "ArgList": {
226
+ const functionName = getFunctionName(nodeBefore, state);
227
+ const lastArgument = getLastChild(nodeBefore, context);
228
+ const prefix = lastArgument?.name === "OpenBrace" || lastArgument?.name === "Comma" ? void 0 : ",";
229
+ let options = await suggestionProvider.getSuggestions("expression", {
230
+ functionName
231
+ });
232
+ options = prefix ? applyPrefix(options, ", ") : options;
233
+ if (lastArgument?.name !== "OpenBrace" && lastArgument?.name !== "Comma") {
234
+ options = [
235
+ {
236
+ apply: ") ",
237
+ boost: 10,
238
+ label: "Done - no more arguments"
239
+ }
240
+ ].concat(options);
241
+ }
242
+ return { from: context.pos, options };
243
+ }
244
+ case "Equal":
245
+ if (text.trim() === "=") {
246
+ return makeSuggestions2(context, "expression");
247
+ }
248
+ break;
249
+ case "ParenthesizedExpression":
250
+ case "ColumnDefinitionExpression":
251
+ if (context.pos === 0) {
252
+ return makeSuggestions2(context, "expression");
253
+ } else {
254
+ const lastChild = getLastChild(nodeBefore, context);
255
+ if (lastChild?.name === "Column") {
256
+ if (maybeComplete) {
257
+ const options = [
258
+ completionDone(onSubmit.current)
259
+ ];
260
+ const columnName = getValue(lastChild, state);
261
+ const columnOptions = await suggestionProvider.getSuggestions("operator", {
262
+ columnName
263
+ });
264
+ return {
265
+ from: context.pos,
266
+ options: options.concat(columnOptions)
267
+ };
268
+ }
269
+ } else if (lastChild?.name === "CallExpression") {
270
+ if (maybeComplete) {
271
+ return {
272
+ from: context.pos,
273
+ options: [completionDone(onSubmit.current)]
274
+ };
275
+ }
276
+ } else if (lastChild?.name === "ArithmeticExpression") {
277
+ if (maybeComplete) {
278
+ let options = [completionDone(onSubmit.current)];
279
+ const lastExpressionChild = getLastChild(lastChild, context);
280
+ if (lastExpressionChild?.name === "Column") {
281
+ const columnName = getValue(lastExpressionChild, state);
282
+ const suggestions = await suggestionProvider.getSuggestions(
283
+ "operator",
284
+ { columnName }
285
+ );
286
+ options = options.concat(suggestions);
287
+ }
288
+ return {
289
+ from: context.pos,
290
+ options
291
+ };
292
+ }
293
+ } else if (lastChild?.name === "ConditionalExpression") {
294
+ return handleConditionalExpression(
295
+ lastChild,
296
+ context,
297
+ suggestionProvider,
298
+ maybeComplete,
299
+ onSubmit.current
300
+ );
301
+ }
302
+ break;
303
+ }
304
+ case "Column":
305
+ {
306
+ const isPartialMatch = await suggestionProvider.isPartialMatch(
307
+ "expression",
308
+ void 0,
309
+ word.text
310
+ );
311
+ if (isPartialMatch) {
312
+ return makeSuggestions2(context, "expression", {
313
+ startsWith: word.text
314
+ });
315
+ }
316
+ }
317
+ break;
318
+ case "Comma":
319
+ {
320
+ const parentNode = getNamedParentNode(nodeBefore);
321
+ if (parentNode?.name === "ConditionalExpression") {
322
+ return makeSuggestions2(context, "expression");
323
+ }
324
+ }
325
+ break;
326
+ case "CloseBrace":
327
+ {
328
+ const parentNode = getNamedParentNode(nodeBefore);
329
+ if (parentNode?.name === "ConditionalExpression") {
330
+ return handleConditionalExpression(
331
+ parentNode,
332
+ context,
333
+ suggestionProvider,
334
+ maybeComplete,
335
+ onSubmit.current
336
+ );
337
+ } else if (parentNode?.name === "ArgList") {
338
+ if (maybeComplete) {
339
+ return promptToSave(context, onSubmit.current);
340
+ }
341
+ }
342
+ }
343
+ break;
344
+ default: {
345
+ if (nodeBefore?.prevSibling?.name === "FilterClause") {
346
+ console.log("looks like we ight be a or|and operator");
347
+ }
348
+ }
349
+ }
350
+ },
351
+ [makeSuggestions2, onSubmit, suggestionProvider]
352
+ );
353
+ };
354
+
355
+ export { useColumnAutoComplete };
356
+ //# sourceMappingURL=useColumnAutoComplete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useColumnAutoComplete.js","sources":["../../src/column-expression-input/useColumnAutoComplete.ts"],"sourcesContent":["import {\n booleanJoinSuggestions,\n Completion,\n CompletionContext,\n CompletionSource,\n EditorState,\n getNamedParentNode,\n getPreviousNode,\n getValue,\n SyntaxNode,\n syntaxTree,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { MutableRefObject, useCallback } from \"react\";\nimport {\n ColumnNamedTerms,\n isCompleteExpression,\n isCompleteRelationalExpression,\n} from \"./column-language-parser\";\nimport {\n ColumnExpressionOperator,\n ColumnExpressionSuggestionOptions,\n ColumnExpressionSuggestionType,\n IExpressionSuggestionProvider,\n} from \"./useColumnExpressionEditor\";\nimport { lastNamedChild } from \"./column-language-parser\";\n\nexport type ApplyCompletion = (mode?: \"add\" | \"replace\") => void;\n\nexport type Operator = \"\";\n\nconst applyPrefix = (completions: Completion[], prefix?: string) =>\n prefix\n ? completions.map((completion) => ({\n ...completion,\n apply:\n typeof completion.apply === \"function\"\n ? completion.apply\n : `${prefix}${completion.apply ?? completion.label}`,\n }))\n : completions;\n\nconst isOperator = (node?: SyntaxNode): node is SyntaxNode =>\n node === undefined\n ? false\n : [\"Times\", \"Divide\", \"Plus\", \"Minus\"].includes(node.name);\n\nconst completionDone = (onSubmit?: () => void): Completion => ({\n apply: () => {\n onSubmit?.();\n },\n label: \"Done\",\n boost: 10,\n});\n\nconst getLastChild = (node: SyntaxNode, context: CompletionContext) => {\n let { lastChild: childNode } = node;\n const { pos } = context;\n while (childNode) {\n const isBeforeCursor = childNode.from < pos;\n if (isBeforeCursor && ColumnNamedTerms.includes(childNode.name)) {\n if (childNode.name === \"ParenthesizedExpression\") {\n // extract the parenthesized expression\n const expression = childNode.firstChild?.nextSibling;\n if (expression) {\n childNode = expression;\n }\n }\n return childNode;\n } else {\n childNode = childNode.prevSibling;\n }\n }\n};\nconst getFunctionName = (node: SyntaxNode, state: EditorState) => {\n if (node.name === \"ArgList\") {\n const functionNode = node.prevSibling;\n if (functionNode) {\n return getValue(functionNode, state);\n }\n } else if (node.name === \"OpenBrace\") {\n const maybeFunction = node.parent?.prevSibling;\n if (maybeFunction?.name === \"Function\") {\n return getValue(maybeFunction, state);\n }\n }\n};\n\nconst getRelationalOperator = (node: SyntaxNode, state: EditorState) => {\n if (node.name === \"RelationalExpression\") {\n const lastNode = lastNamedChild(node);\n if (lastNode?.name === \"RelationalOperator\") {\n return getValue(lastNode, state);\n }\n } else {\n const prevNode = node.prevSibling;\n if (prevNode?.name === \"RelationalOperator\") {\n return getValue(prevNode, state) as ColumnExpressionOperator;\n }\n }\n};\n\nconst getColumnName = (\n node: SyntaxNode,\n state: EditorState\n): string | undefined => {\n if (node.name === \"RelationalExpression\") {\n if (node.firstChild?.name === \"Column\") {\n return getValue(node.firstChild, state);\n }\n } else {\n const prevNode = node.prevSibling;\n if (prevNode?.name === \"Column\") {\n return getValue(prevNode, state);\n } else if (prevNode?.name === \"RelationalOperator\") {\n return getColumnName(prevNode, state);\n }\n }\n};\n\nconst makeSuggestions = async (\n context: CompletionContext,\n suggestionProvider: IExpressionSuggestionProvider,\n suggestionType: ColumnExpressionSuggestionType,\n optionalArgs: ColumnExpressionSuggestionOptions = {}\n) => {\n const options = await suggestionProvider.getSuggestions(\n suggestionType,\n optionalArgs\n );\n const { startsWith = \"\" } = optionalArgs;\n return { from: context.pos - startsWith.length, options };\n};\n\nconst handleConditionalExpression = (\n node: SyntaxNode,\n context: CompletionContext,\n suggestionProvider: IExpressionSuggestionProvider,\n maybeComplete?: boolean,\n onSubmit?: () => void\n) => {\n const lastChild = getLastChild(node, context);\n switch (lastChild?.name) {\n case \"If\":\n return makeSuggestions(context, suggestionProvider, \"expression\", {\n prefix: \"( \",\n });\n case \"OpenBrace\":\n return makeSuggestions(context, suggestionProvider, \"expression\");\n case \"Condition\":\n return makeSuggestions(context, suggestionProvider, \"expression\", {\n prefix: \", \",\n });\n case \"CloseBrace\":\n if (maybeComplete) {\n const options: Completion[] = [completionDone(onSubmit)];\n return { from: context.pos, options };\n }\n }\n};\n\nconst promptToSave = (context: CompletionContext, onSubmit: () => void) => {\n const options: Completion[] = [completionDone(onSubmit)];\n return { from: context.pos, options };\n};\n\nexport const useColumnAutoComplete = (\n suggestionProvider: IExpressionSuggestionProvider,\n onSubmit: MutableRefObject<ApplyCompletion>\n) => {\n const makeSuggestions = useCallback(\n async (\n context: CompletionContext,\n suggestionType: ColumnExpressionSuggestionType,\n optionalArgs: ColumnExpressionSuggestionOptions = {}\n ) => {\n const options = await suggestionProvider.getSuggestions(\n suggestionType,\n optionalArgs\n );\n const { startsWith = \"\" } = optionalArgs;\n return { from: context.pos - startsWith.length, options };\n },\n [suggestionProvider]\n );\n\n return useCallback(\n async (context: CompletionContext) => {\n const { state, pos } = context;\n const word = context.matchBefore(/\\w*/) ?? {\n from: 0,\n to: 0,\n text: undefined,\n };\n\n const tree = syntaxTree(state);\n const nodeBefore = tree.resolveInner(pos, -1);\n const text = state.doc.toString();\n const maybeComplete = isCompleteExpression(text);\n\n switch (nodeBefore.name) {\n case \"If\": {\n return makeSuggestions(context, \"expression\", { prefix: \"( \" });\n }\n case \"Condition\":\n {\n const lastChild = getLastChild(nodeBefore, context);\n if (lastChild?.name === \"Column\") {\n // is this the first term ?\n const prevChild = getPreviousNode(lastChild);\n if (prevChild?.name !== \"RelationalOperator\") {\n return makeSuggestions(context, \"condition-operator\", {\n columnName: getValue(lastChild, state),\n });\n }\n } else if (lastChild?.name === \"RelationalOperator\") {\n // we need the type of the expression on the other side of the operator\n return makeSuggestions(context, \"expression\");\n }\n }\n break;\n case \"ConditionalExpression\":\n return handleConditionalExpression(\n nodeBefore,\n context,\n suggestionProvider\n );\n case \"RelationalExpression\":\n {\n if (isCompleteRelationalExpression(nodeBefore)) {\n return {\n from: context.pos,\n options: booleanJoinSuggestions.concat({\n label: \", <truthy expression>, <falsy expression>\",\n apply: \", \",\n }),\n };\n } else {\n const operator = getRelationalOperator(nodeBefore, state);\n const columnName = getColumnName(nodeBefore, state);\n if (!operator) {\n const options = await suggestionProvider.getSuggestions(\n \"condition-operator\",\n {\n columnName,\n }\n );\n return { from: context.pos, options };\n } else {\n return makeSuggestions(context, \"expression\");\n }\n }\n }\n break;\n\n case \"RelationalOperator\":\n // we need the type of the expression on the other side of the operator\n return makeSuggestions(context, \"expression\");\n\n case \"String\":\n {\n // we only encounter a string as the right hand operand of a conditional expression\n const operator = getRelationalOperator(\n nodeBefore,\n state\n ) as ColumnExpressionOperator;\n const columnName = getColumnName(nodeBefore, state);\n // are we inside the string or immediately after it\n const { from, to } = nodeBefore;\n if (to - from === 2 && context.pos === from + 1) {\n // We are in an empty string, i.e between two quotes\n if (columnName && operator) {\n return makeSuggestions(context, \"columnValue\", {\n columnName,\n operator,\n startsWith: word.text,\n });\n }\n } else if (to - from > 2 && context.pos === to) {\n // NOte we couls also offer AND/OR to extend the condition\n return makeSuggestions(context, \"expression\", {\n prefix: \", \",\n });\n }\n }\n break;\n\n case \"ArithmeticExpression\":\n {\n const lastChild = getLastChild(nodeBefore, context);\n if (lastChild?.name === \"Column\") {\n return makeSuggestions(context, \"expression\");\n } else if (isOperator(lastChild)) {\n const operator = lastChild.name as ColumnExpressionOperator;\n return makeSuggestions(context, \"column\", { operator });\n }\n }\n\n break;\n case \"OpenBrace\":\n {\n // Might be a function expression, might be parenthesized\n const functionName = getFunctionName(nodeBefore, state);\n // If not function, what came before - if it's an operator\n // we restrict to numerics\n return makeSuggestions(context, \"expression\", { functionName });\n }\n break;\n case \"ArgList\": {\n const functionName = getFunctionName(nodeBefore, state);\n const lastArgument = getLastChild(nodeBefore, context);\n\n const prefix =\n lastArgument?.name === \"OpenBrace\" || lastArgument?.name === \"Comma\"\n ? undefined\n : \",\";\n let options = await suggestionProvider.getSuggestions(\"expression\", {\n functionName,\n });\n options = prefix ? applyPrefix(options, \", \") : options;\n\n // TODO per function check for number of arguments expected\n if (\n lastArgument?.name !== \"OpenBrace\" &&\n lastArgument?.name !== \"Comma\"\n ) {\n options = [\n {\n apply: \") \",\n boost: 10,\n label: \"Done - no more arguments\",\n } as Completion,\n ].concat(options);\n }\n return { from: context.pos, options };\n }\n case \"Equal\":\n if (text.trim() === \"=\") {\n return makeSuggestions(context, \"expression\");\n }\n break;\n case \"ParenthesizedExpression\":\n case \"ColumnDefinitionExpression\":\n if (context.pos === 0) {\n return makeSuggestions(context, \"expression\");\n } else {\n const lastChild = getLastChild(nodeBefore, context);\n if (lastChild?.name === \"Column\") {\n if (maybeComplete) {\n // We come in here is the columns IS complete, too (ie has space after)\n const options: Completion[] = [\n completionDone(onSubmit.current),\n ];\n const columnName = getValue(lastChild, state);\n const columnOptions: Completion[] =\n await suggestionProvider.getSuggestions(\"operator\", {\n columnName,\n });\n\n return {\n from: context.pos,\n options: options.concat(columnOptions),\n };\n }\n } else if (lastChild?.name === \"CallExpression\") {\n if (maybeComplete) {\n return {\n from: context.pos,\n options: [completionDone(onSubmit.current)],\n };\n }\n } else if (lastChild?.name === \"ArithmeticExpression\") {\n if (maybeComplete) {\n let options: Completion[] = [completionDone(onSubmit.current)];\n\n const lastExpressionChild = getLastChild(lastChild, context);\n if (lastExpressionChild?.name === \"Column\") {\n const columnName = getValue(lastExpressionChild, state);\n // TODO need to exclude columns already included in expression\n\n const suggestions = await suggestionProvider.getSuggestions(\n \"operator\",\n { columnName }\n );\n options = options.concat(suggestions);\n }\n\n return {\n from: context.pos,\n options,\n };\n }\n } else if (lastChild?.name === \"ConditionalExpression\") {\n return handleConditionalExpression(\n lastChild,\n context,\n suggestionProvider,\n maybeComplete,\n onSubmit.current\n );\n }\n break;\n }\n case \"Column\":\n {\n const isPartialMatch = await suggestionProvider.isPartialMatch(\n \"expression\",\n undefined,\n word.text\n );\n\n if (isPartialMatch) {\n return makeSuggestions(context, \"expression\", {\n startsWith: word.text,\n });\n }\n }\n break;\n case \"Comma\":\n {\n const parentNode = getNamedParentNode(nodeBefore);\n if (parentNode?.name === \"ConditionalExpression\") {\n return makeSuggestions(context, \"expression\");\n }\n }\n break;\n\n case \"CloseBrace\":\n {\n const parentNode = getNamedParentNode(nodeBefore);\n if (parentNode?.name === \"ConditionalExpression\") {\n return handleConditionalExpression(\n parentNode,\n context,\n suggestionProvider,\n maybeComplete,\n onSubmit.current\n );\n } else if (parentNode?.name === \"ArgList\") {\n if (maybeComplete) {\n return promptToSave(context, onSubmit.current);\n }\n }\n }\n break;\n\n default: {\n if (nodeBefore?.prevSibling?.name === \"FilterClause\") {\n console.log(\"looks like we ight be a or|and operator\");\n }\n }\n }\n },\n [makeSuggestions, onSubmit, suggestionProvider]\n ) as CompletionSource;\n};\n"],"names":["makeSuggestions"],"mappings":";;;;;;AA8BA,MAAM,WAAA,GAAc,CAAC,WAA2B,EAAA,MAAA,KAC9C,SACI,WAAY,CAAA,GAAA,CAAI,CAAC,UAAgB,MAAA;AAAA,EAC/B,GAAG,UAAA;AAAA,EACH,KACE,EAAA,OAAO,UAAW,CAAA,KAAA,KAAU,UACxB,GAAA,UAAA,CAAW,KACX,GAAA,CAAA,EAAG,MAAM,CAAA,EAAG,UAAW,CAAA,KAAA,IAAS,WAAW,KAAK,CAAA,CAAA;AACxD,CAAA,CAAE,CACF,GAAA,WAAA,CAAA;AAEN,MAAM,UAAa,GAAA,CAAC,IAClB,KAAA,IAAA,KAAS,SACL,KACA,GAAA,CAAC,OAAS,EAAA,QAAA,EAAU,MAAQ,EAAA,OAAO,CAAE,CAAA,QAAA,CAAS,KAAK,IAAI,CAAA,CAAA;AAE7D,MAAM,cAAA,GAAiB,CAAC,QAAuC,MAAA;AAAA,EAC7D,OAAO,MAAM;AACX,IAAW,QAAA,IAAA,CAAA;AAAA,GACb;AAAA,EACA,KAAO,EAAA,MAAA;AAAA,EACP,KAAO,EAAA,EAAA;AACT,CAAA,CAAA,CAAA;AAEA,MAAM,YAAA,GAAe,CAAC,IAAA,EAAkB,OAA+B,KAAA;AACrE,EAAI,IAAA,EAAE,SAAW,EAAA,SAAA,EAAc,GAAA,IAAA,CAAA;AAC/B,EAAM,MAAA,EAAE,KAAQ,GAAA,OAAA,CAAA;AAChB,EAAA,OAAO,SAAW,EAAA;AAChB,IAAM,MAAA,cAAA,GAAiB,UAAU,IAAO,GAAA,GAAA,CAAA;AACxC,IAAA,IAAI,cAAkB,IAAA,gBAAA,CAAiB,QAAS,CAAA,SAAA,CAAU,IAAI,CAAG,EAAA;AAC/D,MAAI,IAAA,SAAA,CAAU,SAAS,yBAA2B,EAAA;AAEhD,QAAM,MAAA,UAAA,GAAa,UAAU,UAAY,EAAA,WAAA,CAAA;AACzC,QAAA,IAAI,UAAY,EAAA;AACd,UAAY,SAAA,GAAA,UAAA,CAAA;AAAA,SACd;AAAA,OACF;AACA,MAAO,OAAA,SAAA,CAAA;AAAA,KACF,MAAA;AACL,MAAA,SAAA,GAAY,SAAU,CAAA,WAAA,CAAA;AAAA,KACxB;AAAA,GACF;AACF,CAAA,CAAA;AACA,MAAM,eAAA,GAAkB,CAAC,IAAA,EAAkB,KAAuB,KAAA;AAChE,EAAI,IAAA,IAAA,CAAK,SAAS,SAAW,EAAA;AAC3B,IAAA,MAAM,eAAe,IAAK,CAAA,WAAA,CAAA;AAC1B,IAAA,IAAI,YAAc,EAAA;AAChB,MAAO,OAAA,QAAA,CAAS,cAAc,KAAK,CAAA,CAAA;AAAA,KACrC;AAAA,GACF,MAAA,IAAW,IAAK,CAAA,IAAA,KAAS,WAAa,EAAA;AACpC,IAAM,MAAA,aAAA,GAAgB,KAAK,MAAQ,EAAA,WAAA,CAAA;AACnC,IAAI,IAAA,aAAA,EAAe,SAAS,UAAY,EAAA;AACtC,MAAO,OAAA,QAAA,CAAS,eAAe,KAAK,CAAA,CAAA;AAAA,KACtC;AAAA,GACF;AACF,CAAA,CAAA;AAEA,MAAM,qBAAA,GAAwB,CAAC,IAAA,EAAkB,KAAuB,KAAA;AACtE,EAAI,IAAA,IAAA,CAAK,SAAS,sBAAwB,EAAA;AACxC,IAAM,MAAA,QAAA,GAAW,eAAe,IAAI,CAAA,CAAA;AACpC,IAAI,IAAA,QAAA,EAAU,SAAS,oBAAsB,EAAA;AAC3C,MAAO,OAAA,QAAA,CAAS,UAAU,KAAK,CAAA,CAAA;AAAA,KACjC;AAAA,GACK,MAAA;AACL,IAAA,MAAM,WAAW,IAAK,CAAA,WAAA,CAAA;AACtB,IAAI,IAAA,QAAA,EAAU,SAAS,oBAAsB,EAAA;AAC3C,MAAO,OAAA,QAAA,CAAS,UAAU,KAAK,CAAA,CAAA;AAAA,KACjC;AAAA,GACF;AACF,CAAA,CAAA;AAEA,MAAM,aAAA,GAAgB,CACpB,IAAA,EACA,KACuB,KAAA;AACvB,EAAI,IAAA,IAAA,CAAK,SAAS,sBAAwB,EAAA;AACxC,IAAI,IAAA,IAAA,CAAK,UAAY,EAAA,IAAA,KAAS,QAAU,EAAA;AACtC,MAAO,OAAA,QAAA,CAAS,IAAK,CAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AAAA,KACxC;AAAA,GACK,MAAA;AACL,IAAA,MAAM,WAAW,IAAK,CAAA,WAAA,CAAA;AACtB,IAAI,IAAA,QAAA,EAAU,SAAS,QAAU,EAAA;AAC/B,MAAO,OAAA,QAAA,CAAS,UAAU,KAAK,CAAA,CAAA;AAAA,KACjC,MAAA,IAAW,QAAU,EAAA,IAAA,KAAS,oBAAsB,EAAA;AAClD,MAAO,OAAA,aAAA,CAAc,UAAU,KAAK,CAAA,CAAA;AAAA,KACtC;AAAA,GACF;AACF,CAAA,CAAA;AAEA,MAAM,kBAAkB,OACtB,OAAA,EACA,oBACA,cACA,EAAA,YAAA,GAAkD,EAC/C,KAAA;AACH,EAAM,MAAA,OAAA,GAAU,MAAM,kBAAmB,CAAA,cAAA;AAAA,IACvC,cAAA;AAAA,IACA,YAAA;AAAA,GACF,CAAA;AACA,EAAM,MAAA,EAAE,UAAa,GAAA,EAAA,EAAO,GAAA,YAAA,CAAA;AAC5B,EAAA,OAAO,EAAE,IAAM,EAAA,OAAA,CAAQ,GAAM,GAAA,UAAA,CAAW,QAAQ,OAAQ,EAAA,CAAA;AAC1D,CAAA,CAAA;AAEA,MAAM,8BAA8B,CAClC,IAAA,EACA,OACA,EAAA,kBAAA,EACA,eACA,QACG,KAAA;AACH,EAAM,MAAA,SAAA,GAAY,YAAa,CAAA,IAAA,EAAM,OAAO,CAAA,CAAA;AAC5C,EAAA,QAAQ,WAAW,IAAM;AAAA,IACvB,KAAK,IAAA;AACH,MAAO,OAAA,eAAA,CAAgB,OAAS,EAAA,kBAAA,EAAoB,YAAc,EAAA;AAAA,QAChE,MAAQ,EAAA,IAAA;AAAA,OACT,CAAA,CAAA;AAAA,IACH,KAAK,WAAA;AACH,MAAO,OAAA,eAAA,CAAgB,OAAS,EAAA,kBAAA,EAAoB,YAAY,CAAA,CAAA;AAAA,IAClE,KAAK,WAAA;AACH,MAAO,OAAA,eAAA,CAAgB,OAAS,EAAA,kBAAA,EAAoB,YAAc,EAAA;AAAA,QAChE,MAAQ,EAAA,IAAA;AAAA,OACT,CAAA,CAAA;AAAA,IACH,KAAK,YAAA;AACH,MAAA,IAAI,aAAe,EAAA;AACjB,QAAA,MAAM,OAAwB,GAAA,CAAC,cAAe,CAAA,QAAQ,CAAC,CAAA,CAAA;AACvD,QAAA,OAAO,EAAE,IAAA,EAAM,OAAQ,CAAA,GAAA,EAAK,OAAQ,EAAA,CAAA;AAAA,OACtC;AAAA,GACJ;AACF,CAAA,CAAA;AAEA,MAAM,YAAA,GAAe,CAAC,OAAA,EAA4B,QAAyB,KAAA;AACzE,EAAA,MAAM,OAAwB,GAAA,CAAC,cAAe,CAAA,QAAQ,CAAC,CAAA,CAAA;AACvD,EAAA,OAAO,EAAE,IAAA,EAAM,OAAQ,CAAA,GAAA,EAAK,OAAQ,EAAA,CAAA;AACtC,CAAA,CAAA;AAEa,MAAA,qBAAA,GAAwB,CACnC,kBAAA,EACA,QACG,KAAA;AACH,EAAA,MAAMA,gBAAkB,GAAA,WAAA;AAAA,IACtB,OACE,OAAA,EACA,cACA,EAAA,YAAA,GAAkD,EAC/C,KAAA;AACH,MAAM,MAAA,OAAA,GAAU,MAAM,kBAAmB,CAAA,cAAA;AAAA,QACvC,cAAA;AAAA,QACA,YAAA;AAAA,OACF,CAAA;AACA,MAAM,MAAA,EAAE,UAAa,GAAA,EAAA,EAAO,GAAA,YAAA,CAAA;AAC5B,MAAA,OAAO,EAAE,IAAM,EAAA,OAAA,CAAQ,GAAM,GAAA,UAAA,CAAW,QAAQ,OAAQ,EAAA,CAAA;AAAA,KAC1D;AAAA,IACA,CAAC,kBAAkB,CAAA;AAAA,GACrB,CAAA;AAEA,EAAO,OAAA,WAAA;AAAA,IACL,OAAO,OAA+B,KAAA;AACpC,MAAM,MAAA,EAAE,KAAO,EAAA,GAAA,EAAQ,GAAA,OAAA,CAAA;AACvB,MAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,WAAY,CAAA,KAAK,CAAK,IAAA;AAAA,QACzC,IAAM,EAAA,CAAA;AAAA,QACN,EAAI,EAAA,CAAA;AAAA,QACJ,IAAM,EAAA,KAAA,CAAA;AAAA,OACR,CAAA;AAEA,MAAM,MAAA,IAAA,GAAO,WAAW,KAAK,CAAA,CAAA;AAC7B,MAAA,MAAM,UAAa,GAAA,IAAA,CAAK,YAAa,CAAA,GAAA,EAAK,CAAE,CAAA,CAAA,CAAA;AAC5C,MAAM,MAAA,IAAA,GAAO,KAAM,CAAA,GAAA,CAAI,QAAS,EAAA,CAAA;AAChC,MAAM,MAAA,aAAA,GAAgB,qBAAqB,IAAI,CAAA,CAAA;AAE/C,MAAA,QAAQ,WAAW,IAAM;AAAA,QACvB,KAAK,IAAM,EAAA;AACT,UAAA,OAAOA,iBAAgB,OAAS,EAAA,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAM,CAAA,CAAA;AAAA,SAChE;AAAA,QACA,KAAK,WAAA;AACH,UAAA;AACE,YAAM,MAAA,SAAA,GAAY,YAAa,CAAA,UAAA,EAAY,OAAO,CAAA,CAAA;AAClD,YAAI,IAAA,SAAA,EAAW,SAAS,QAAU,EAAA;AAEhC,cAAM,MAAA,SAAA,GAAY,gBAAgB,SAAS,CAAA,CAAA;AAC3C,cAAI,IAAA,SAAA,EAAW,SAAS,oBAAsB,EAAA;AAC5C,gBAAOA,OAAAA,gBAAAA,CAAgB,SAAS,oBAAsB,EAAA;AAAA,kBACpD,UAAA,EAAY,QAAS,CAAA,SAAA,EAAW,KAAK,CAAA;AAAA,iBACtC,CAAA,CAAA;AAAA,eACH;AAAA,aACF,MAAA,IAAW,SAAW,EAAA,IAAA,KAAS,oBAAsB,EAAA;AAEnD,cAAOA,OAAAA,gBAAAA,CAAgB,SAAS,YAAY,CAAA,CAAA;AAAA,aAC9C;AAAA,WACF;AACA,UAAA,MAAA;AAAA,QACF,KAAK,uBAAA;AACH,UAAO,OAAA,2BAAA;AAAA,YACL,UAAA;AAAA,YACA,OAAA;AAAA,YACA,kBAAA;AAAA,WACF,CAAA;AAAA,QACF,KAAK,sBAAA;AACH,UAAA;AACE,YAAI,IAAA,8BAAA,CAA+B,UAAU,CAAG,EAAA;AAC9C,cAAO,OAAA;AAAA,gBACL,MAAM,OAAQ,CAAA,GAAA;AAAA,gBACd,OAAA,EAAS,uBAAuB,MAAO,CAAA;AAAA,kBACrC,KAAO,EAAA,2CAAA;AAAA,kBACP,KAAO,EAAA,IAAA;AAAA,iBACR,CAAA;AAAA,eACH,CAAA;AAAA,aACK,MAAA;AACL,cAAM,MAAA,QAAA,GAAW,qBAAsB,CAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AACxD,cAAM,MAAA,UAAA,GAAa,aAAc,CAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AAClD,cAAA,IAAI,CAAC,QAAU,EAAA;AACb,gBAAM,MAAA,OAAA,GAAU,MAAM,kBAAmB,CAAA,cAAA;AAAA,kBACvC,oBAAA;AAAA,kBACA;AAAA,oBACE,UAAA;AAAA,mBACF;AAAA,iBACF,CAAA;AACA,gBAAA,OAAO,EAAE,IAAA,EAAM,OAAQ,CAAA,GAAA,EAAK,OAAQ,EAAA,CAAA;AAAA,eAC/B,MAAA;AACL,gBAAOA,OAAAA,gBAAAA,CAAgB,SAAS,YAAY,CAAA,CAAA;AAAA,eAC9C;AAAA,aACF;AAAA,WACF;AACA,QAEF,KAAK,oBAAA;AAEH,UAAOA,OAAAA,gBAAAA,CAAgB,SAAS,YAAY,CAAA,CAAA;AAAA,QAE9C,KAAK,QAAA;AACH,UAAA;AAEE,YAAA,MAAM,QAAW,GAAA,qBAAA;AAAA,cACf,UAAA;AAAA,cACA,KAAA;AAAA,aACF,CAAA;AACA,YAAM,MAAA,UAAA,GAAa,aAAc,CAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AAElD,YAAM,MAAA,EAAE,IAAM,EAAA,EAAA,EAAO,GAAA,UAAA,CAAA;AACrB,YAAA,IAAI,KAAK,IAAS,KAAA,CAAA,IAAK,OAAQ,CAAA,GAAA,KAAQ,OAAO,CAAG,EAAA;AAE/C,cAAA,IAAI,cAAc,QAAU,EAAA;AAC1B,gBAAOA,OAAAA,gBAAAA,CAAgB,SAAS,aAAe,EAAA;AAAA,kBAC7C,UAAA;AAAA,kBACA,QAAA;AAAA,kBACA,YAAY,IAAK,CAAA,IAAA;AAAA,iBAClB,CAAA,CAAA;AAAA,eACH;AAAA,uBACS,EAAK,GAAA,IAAA,GAAO,CAAK,IAAA,OAAA,CAAQ,QAAQ,EAAI,EAAA;AAE9C,cAAOA,OAAAA,gBAAAA,CAAgB,SAAS,YAAc,EAAA;AAAA,gBAC5C,MAAQ,EAAA,IAAA;AAAA,eACT,CAAA,CAAA;AAAA,aACH;AAAA,WACF;AACA,UAAA,MAAA;AAAA,QAEF,KAAK,sBAAA;AACH,UAAA;AACE,YAAM,MAAA,SAAA,GAAY,YAAa,CAAA,UAAA,EAAY,OAAO,CAAA,CAAA;AAClD,YAAI,IAAA,SAAA,EAAW,SAAS,QAAU,EAAA;AAChC,cAAOA,OAAAA,gBAAAA,CAAgB,SAAS,YAAY,CAAA,CAAA;AAAA,aAC9C,MAAA,IAAW,UAAW,CAAA,SAAS,CAAG,EAAA;AAChC,cAAA,MAAM,WAAW,SAAU,CAAA,IAAA,CAAA;AAC3B,cAAA,OAAOA,gBAAgB,CAAA,OAAA,EAAS,QAAU,EAAA,EAAE,UAAU,CAAA,CAAA;AAAA,aACxD;AAAA,WACF;AAEA,UAAA,MAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA;AAEE,YAAM,MAAA,YAAA,GAAe,eAAgB,CAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AAGtD,YAAA,OAAOA,gBAAgB,CAAA,OAAA,EAAS,YAAc,EAAA,EAAE,cAAc,CAAA,CAAA;AAAA,WAChE;AACA,QACF,KAAK,SAAW,EAAA;AACd,UAAM,MAAA,YAAA,GAAe,eAAgB,CAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AACtD,UAAM,MAAA,YAAA,GAAe,YAAa,CAAA,UAAA,EAAY,OAAO,CAAA,CAAA;AAErD,UAAA,MAAM,SACJ,YAAc,EAAA,IAAA,KAAS,eAAe,YAAc,EAAA,IAAA,KAAS,UACzD,KACA,CAAA,GAAA,GAAA,CAAA;AACN,UAAA,IAAI,OAAU,GAAA,MAAM,kBAAmB,CAAA,cAAA,CAAe,YAAc,EAAA;AAAA,YAClE,YAAA;AAAA,WACD,CAAA,CAAA;AACD,UAAA,OAAA,GAAU,MAAS,GAAA,WAAA,CAAY,OAAS,EAAA,IAAI,CAAI,GAAA,OAAA,CAAA;AAGhD,UAAA,IACE,YAAc,EAAA,IAAA,KAAS,WACvB,IAAA,YAAA,EAAc,SAAS,OACvB,EAAA;AACA,YAAU,OAAA,GAAA;AAAA,cACR;AAAA,gBACE,KAAO,EAAA,IAAA;AAAA,gBACP,KAAO,EAAA,EAAA;AAAA,gBACP,KAAO,EAAA,0BAAA;AAAA,eACT;AAAA,aACF,CAAE,OAAO,OAAO,CAAA,CAAA;AAAA,WAClB;AACA,UAAA,OAAO,EAAE,IAAA,EAAM,OAAQ,CAAA,GAAA,EAAK,OAAQ,EAAA,CAAA;AAAA,SACtC;AAAA,QACA,KAAK,OAAA;AACH,UAAI,IAAA,IAAA,CAAK,IAAK,EAAA,KAAM,GAAK,EAAA;AACvB,YAAOA,OAAAA,gBAAAA,CAAgB,SAAS,YAAY,CAAA,CAAA;AAAA,WAC9C;AACA,UAAA,MAAA;AAAA,QACF,KAAK,yBAAA,CAAA;AAAA,QACL,KAAK,4BAAA;AACH,UAAI,IAAA,OAAA,CAAQ,QAAQ,CAAG,EAAA;AACrB,YAAOA,OAAAA,gBAAAA,CAAgB,SAAS,YAAY,CAAA,CAAA;AAAA,WACvC,MAAA;AACL,YAAM,MAAA,SAAA,GAAY,YAAa,CAAA,UAAA,EAAY,OAAO,CAAA,CAAA;AAClD,YAAI,IAAA,SAAA,EAAW,SAAS,QAAU,EAAA;AAChC,cAAA,IAAI,aAAe,EAAA;AAEjB,gBAAA,MAAM,OAAwB,GAAA;AAAA,kBAC5B,cAAA,CAAe,SAAS,OAAO,CAAA;AAAA,iBACjC,CAAA;AACA,gBAAM,MAAA,UAAA,GAAa,QAAS,CAAA,SAAA,EAAW,KAAK,CAAA,CAAA;AAC5C,gBAAA,MAAM,aACJ,GAAA,MAAM,kBAAmB,CAAA,cAAA,CAAe,UAAY,EAAA;AAAA,kBAClD,UAAA;AAAA,iBACD,CAAA,CAAA;AAEH,gBAAO,OAAA;AAAA,kBACL,MAAM,OAAQ,CAAA,GAAA;AAAA,kBACd,OAAA,EAAS,OAAQ,CAAA,MAAA,CAAO,aAAa,CAAA;AAAA,iBACvC,CAAA;AAAA,eACF;AAAA,aACF,MAAA,IAAW,SAAW,EAAA,IAAA,KAAS,gBAAkB,EAAA;AAC/C,cAAA,IAAI,aAAe,EAAA;AACjB,gBAAO,OAAA;AAAA,kBACL,MAAM,OAAQ,CAAA,GAAA;AAAA,kBACd,OAAS,EAAA,CAAC,cAAe,CAAA,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA,iBAC5C,CAAA;AAAA,eACF;AAAA,aACF,MAAA,IAAW,SAAW,EAAA,IAAA,KAAS,sBAAwB,EAAA;AACrD,cAAA,IAAI,aAAe,EAAA;AACjB,gBAAA,IAAI,OAAwB,GAAA,CAAC,cAAe,CAAA,QAAA,CAAS,OAAO,CAAC,CAAA,CAAA;AAE7D,gBAAM,MAAA,mBAAA,GAAsB,YAAa,CAAA,SAAA,EAAW,OAAO,CAAA,CAAA;AAC3D,gBAAI,IAAA,mBAAA,EAAqB,SAAS,QAAU,EAAA;AAC1C,kBAAM,MAAA,UAAA,GAAa,QAAS,CAAA,mBAAA,EAAqB,KAAK,CAAA,CAAA;AAGtD,kBAAM,MAAA,WAAA,GAAc,MAAM,kBAAmB,CAAA,cAAA;AAAA,oBAC3C,UAAA;AAAA,oBACA,EAAE,UAAW,EAAA;AAAA,mBACf,CAAA;AACA,kBAAU,OAAA,GAAA,OAAA,CAAQ,OAAO,WAAW,CAAA,CAAA;AAAA,iBACtC;AAEA,gBAAO,OAAA;AAAA,kBACL,MAAM,OAAQ,CAAA,GAAA;AAAA,kBACd,OAAA;AAAA,iBACF,CAAA;AAAA,eACF;AAAA,aACF,MAAA,IAAW,SAAW,EAAA,IAAA,KAAS,uBAAyB,EAAA;AACtD,cAAO,OAAA,2BAAA;AAAA,gBACL,SAAA;AAAA,gBACA,OAAA;AAAA,gBACA,kBAAA;AAAA,gBACA,aAAA;AAAA,gBACA,QAAS,CAAA,OAAA;AAAA,eACX,CAAA;AAAA,aACF;AACA,YAAA,MAAA;AAAA,WACF;AAAA,QACF,KAAK,QAAA;AACH,UAAA;AACE,YAAM,MAAA,cAAA,GAAiB,MAAM,kBAAmB,CAAA,cAAA;AAAA,cAC9C,YAAA;AAAA,cACA,KAAA,CAAA;AAAA,cACA,IAAK,CAAA,IAAA;AAAA,aACP,CAAA;AAEA,YAAA,IAAI,cAAgB,EAAA;AAClB,cAAOA,OAAAA,gBAAAA,CAAgB,SAAS,YAAc,EAAA;AAAA,gBAC5C,YAAY,IAAK,CAAA,IAAA;AAAA,eAClB,CAAA,CAAA;AAAA,aACH;AAAA,WACF;AACA,UAAA,MAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA;AACE,YAAM,MAAA,UAAA,GAAa,mBAAmB,UAAU,CAAA,CAAA;AAChD,YAAI,IAAA,UAAA,EAAY,SAAS,uBAAyB,EAAA;AAChD,cAAOA,OAAAA,gBAAAA,CAAgB,SAAS,YAAY,CAAA,CAAA;AAAA,aAC9C;AAAA,WACF;AACA,UAAA,MAAA;AAAA,QAEF,KAAK,YAAA;AACH,UAAA;AACE,YAAM,MAAA,UAAA,GAAa,mBAAmB,UAAU,CAAA,CAAA;AAChD,YAAI,IAAA,UAAA,EAAY,SAAS,uBAAyB,EAAA;AAChD,cAAO,OAAA,2BAAA;AAAA,gBACL,UAAA;AAAA,gBACA,OAAA;AAAA,gBACA,kBAAA;AAAA,gBACA,aAAA;AAAA,gBACA,QAAS,CAAA,OAAA;AAAA,eACX,CAAA;AAAA,aACF,MAAA,IAAW,UAAY,EAAA,IAAA,KAAS,SAAW,EAAA;AACzC,cAAA,IAAI,aAAe,EAAA;AACjB,gBAAO,OAAA,YAAA,CAAa,OAAS,EAAA,QAAA,CAAS,OAAO,CAAA,CAAA;AAAA,eAC/C;AAAA,aACF;AAAA,WACF;AACA,UAAA,MAAA;AAAA,QAEF,SAAS;AACP,UAAI,IAAA,UAAA,EAAY,WAAa,EAAA,IAAA,KAAS,cAAgB,EAAA;AACpD,YAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA,CAAA;AAAA,WACvD;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAACA,gBAAiB,EAAA,QAAA,EAAU,kBAAkB,CAAA;AAAA,GAChD,CAAA;AACF;;;;"}