@flanksource/clicky-ui 0.3.18 → 0.3.20

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 (609) hide show
  1. package/dist/components/ComboboxMenu.cjs +5 -1
  2. package/dist/components/ComboboxMenu.cjs.map +1 -1
  3. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  4. package/dist/components/ComboboxMenu.js +5 -1
  5. package/dist/components/ComboboxMenu.js.map +1 -1
  6. package/dist/components/EndpointSelector.model.cjs +96 -0
  7. package/dist/components/EndpointSelector.model.cjs.map +1 -0
  8. package/dist/components/EndpointSelector.model.d.ts +2 -0
  9. package/dist/components/EndpointSelector.model.d.ts.map +1 -1
  10. package/dist/components/EndpointSelector.model.js +96 -0
  11. package/dist/components/EndpointSelector.model.js.map +1 -0
  12. package/dist/components/ErrorWrapper.cjs +1 -1
  13. package/dist/components/ErrorWrapper.cjs.map +1 -1
  14. package/dist/components/ErrorWrapper.js +1 -1
  15. package/dist/components/ErrorWrapper.js.map +1 -1
  16. package/dist/components/FilterBar.cjs +52 -2
  17. package/dist/components/FilterBar.cjs.map +1 -1
  18. package/dist/components/FilterBar.d.ts +20 -2
  19. package/dist/components/FilterBar.d.ts.map +1 -1
  20. package/dist/components/FilterBar.js +52 -2
  21. package/dist/components/FilterBar.js.map +1 -1
  22. package/dist/components/JSONPathField.cjs +87 -66
  23. package/dist/components/JSONPathField.cjs.map +1 -1
  24. package/dist/components/JSONPathField.d.ts +26 -9
  25. package/dist/components/JSONPathField.d.ts.map +1 -1
  26. package/dist/components/JSONPathField.js +88 -67
  27. package/dist/components/JSONPathField.js.map +1 -1
  28. package/dist/components/JSONPathPlayground.cjs +225 -0
  29. package/dist/components/JSONPathPlayground.cjs.map +1 -0
  30. package/dist/components/JSONPathPlayground.d.ts +59 -0
  31. package/dist/components/JSONPathPlayground.d.ts.map +1 -0
  32. package/dist/components/JSONPathPlayground.js +225 -0
  33. package/dist/components/JSONPathPlayground.js.map +1 -0
  34. package/dist/components/OnePasswordSelector.cjs +178 -0
  35. package/dist/components/OnePasswordSelector.cjs.map +1 -0
  36. package/dist/components/OnePasswordSelector.d.ts +8 -0
  37. package/dist/components/OnePasswordSelector.d.ts.map +1 -0
  38. package/dist/components/OnePasswordSelector.js +178 -0
  39. package/dist/components/OnePasswordSelector.js.map +1 -0
  40. package/dist/components/OnePasswordSelector.model.cjs +31 -0
  41. package/dist/components/OnePasswordSelector.model.cjs.map +1 -0
  42. package/dist/components/OnePasswordSelector.model.d.ts +27 -0
  43. package/dist/components/OnePasswordSelector.model.d.ts.map +1 -0
  44. package/dist/components/OnePasswordSelector.model.js +31 -0
  45. package/dist/components/OnePasswordSelector.model.js.map +1 -0
  46. package/dist/components/SecretFormField.cjs +142 -0
  47. package/dist/components/SecretFormField.cjs.map +1 -0
  48. package/dist/components/SecretFormField.d.ts +9 -0
  49. package/dist/components/SecretFormField.d.ts.map +1 -0
  50. package/dist/components/SecretFormField.js +142 -0
  51. package/dist/components/SecretFormField.js.map +1 -0
  52. package/dist/components/SecretKeySelector.cjs +20 -14
  53. package/dist/components/SecretKeySelector.cjs.map +1 -1
  54. package/dist/components/SecretKeySelector.d.ts +4 -1
  55. package/dist/components/SecretKeySelector.d.ts.map +1 -1
  56. package/dist/components/SecretKeySelector.js +20 -14
  57. package/dist/components/SecretKeySelector.js.map +1 -1
  58. package/dist/components/TreePickerField.cjs +55 -29
  59. package/dist/components/TreePickerField.cjs.map +1 -1
  60. package/dist/components/TreePickerField.d.ts +10 -1
  61. package/dist/components/TreePickerField.d.ts.map +1 -1
  62. package/dist/components/TreePickerField.js +56 -30
  63. package/dist/components/TreePickerField.js.map +1 -1
  64. package/dist/components/UnitStepControls.cjs +55 -0
  65. package/dist/components/UnitStepControls.cjs.map +1 -0
  66. package/dist/components/UnitStepControls.d.ts +10 -0
  67. package/dist/components/UnitStepControls.d.ts.map +1 -0
  68. package/dist/components/UnitStepControls.js +55 -0
  69. package/dist/components/UnitStepControls.js.map +1 -0
  70. package/dist/components/combobox-types.d.ts +9 -0
  71. package/dist/components/combobox-types.d.ts.map +1 -1
  72. package/dist/components/filter-bar-utils.cjs +7 -0
  73. package/dist/components/filter-bar-utils.cjs.map +1 -1
  74. package/dist/components/filter-bar-utils.d.ts.map +1 -1
  75. package/dist/components/filter-bar-utils.js +7 -0
  76. package/dist/components/filter-bar-utils.js.map +1 -1
  77. package/dist/components/jotai-bindings-core.cjs.map +1 -1
  78. package/dist/components/jotai-bindings-core.d.ts +4 -1
  79. package/dist/components/jotai-bindings-core.d.ts.map +1 -1
  80. package/dist/components/jotai-bindings-core.js.map +1 -1
  81. package/dist/components/json-schema-form-accordion-array.cjs +5 -73
  82. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
  83. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
  84. package/dist/components/json-schema-form-accordion-array.js +3 -71
  85. package/dist/components/json-schema-form-accordion-array.js.map +1 -1
  86. package/dist/components/json-schema-form-array.cjs +6 -1
  87. package/dist/components/json-schema-form-array.cjs.map +1 -1
  88. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  89. package/dist/components/json-schema-form-array.js +6 -1
  90. package/dist/components/json-schema-form-array.js.map +1 -1
  91. package/dist/components/json-schema-form-cards-array.cjs +96 -0
  92. package/dist/components/json-schema-form-cards-array.cjs.map +1 -0
  93. package/dist/components/json-schema-form-cards-array.d.ts +7 -0
  94. package/dist/components/json-schema-form-cards-array.d.ts.map +1 -0
  95. package/dist/components/json-schema-form-cards-array.js +96 -0
  96. package/dist/components/json-schema-form-cards-array.js.map +1 -0
  97. package/dist/components/json-schema-form-item-row.cjs +81 -0
  98. package/dist/components/json-schema-form-item-row.cjs.map +1 -0
  99. package/dist/components/json-schema-form-item-row.d.ts +19 -0
  100. package/dist/components/json-schema-form-item-row.d.ts.map +1 -0
  101. package/dist/components/json-schema-form-item-row.js +81 -0
  102. package/dist/components/json-schema-form-item-row.js.map +1 -0
  103. package/dist/components/json-schema-form-render.cjs +4 -3
  104. package/dist/components/json-schema-form-render.cjs.map +1 -1
  105. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  106. package/dist/components/json-schema-form-render.js +4 -3
  107. package/dist/components/json-schema-form-render.js.map +1 -1
  108. package/dist/components/json-schema-form-resolve.cjs +1 -1
  109. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  110. package/dist/components/json-schema-form-resolve.js +1 -1
  111. package/dist/components/json-schema-form-resolve.js.map +1 -1
  112. package/dist/components/json-schema-form-tone.cjs +12 -0
  113. package/dist/components/json-schema-form-tone.cjs.map +1 -1
  114. package/dist/components/json-schema-form-tone.js +12 -0
  115. package/dist/components/json-schema-form-tone.js.map +1 -1
  116. package/dist/components/json-schema-form-types.d.ts +10 -1
  117. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  118. package/dist/components/jsonPathTree.cjs +189 -0
  119. package/dist/components/jsonPathTree.cjs.map +1 -0
  120. package/dist/components/jsonPathTree.d.ts +92 -0
  121. package/dist/components/jsonPathTree.d.ts.map +1 -0
  122. package/dist/components/jsonPathTree.js +189 -0
  123. package/dist/components/jsonPathTree.js.map +1 -0
  124. package/dist/components/secret-form-extension.cjs +30 -0
  125. package/dist/components/secret-form-extension.cjs.map +1 -0
  126. package/dist/components/secret-form-extension.d.ts +23 -0
  127. package/dist/components/secret-form-extension.d.ts.map +1 -0
  128. package/dist/components/secret-form-extension.js +30 -0
  129. package/dist/components/secret-form-extension.js.map +1 -0
  130. package/dist/components/unit-form-extension.cjs +126 -0
  131. package/dist/components/unit-form-extension.cjs.map +1 -0
  132. package/dist/components/unit-form-extension.d.ts +8 -0
  133. package/dist/components/unit-form-extension.d.ts.map +1 -0
  134. package/dist/components/unit-form-extension.js +126 -0
  135. package/dist/components/unit-form-extension.js.map +1 -0
  136. package/dist/components.cjs +20 -0
  137. package/dist/components.cjs.map +1 -1
  138. package/dist/components.d.ts +7 -0
  139. package/dist/components.d.ts.map +1 -1
  140. package/dist/components.js +20 -0
  141. package/dist/components.js.map +1 -1
  142. package/dist/data/TaskExecDetails.cjs +40 -0
  143. package/dist/data/TaskExecDetails.cjs.map +1 -0
  144. package/dist/data/TaskExecDetails.d.ts +5 -0
  145. package/dist/data/TaskExecDetails.d.ts.map +1 -0
  146. package/dist/data/TaskExecDetails.js +40 -0
  147. package/dist/data/TaskExecDetails.js.map +1 -0
  148. package/dist/data/TaskProgress.cjs +9 -3
  149. package/dist/data/TaskProgress.cjs.map +1 -1
  150. package/dist/data/TaskProgress.d.ts.map +1 -1
  151. package/dist/data/TaskProgress.js +9 -3
  152. package/dist/data/TaskProgress.js.map +1 -1
  153. package/dist/data/TaskSnapshot.cjs.map +1 -1
  154. package/dist/data/TaskSnapshot.d.ts +12 -1
  155. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  156. package/dist/data/TaskSnapshot.js.map +1 -1
  157. package/dist/data/TreeNode.cjs +3 -0
  158. package/dist/data/TreeNode.cjs.map +1 -1
  159. package/dist/data/TreeNode.d.ts.map +1 -1
  160. package/dist/data/TreeNode.js +3 -0
  161. package/dist/data/TreeNode.js.map +1 -1
  162. package/dist/data/data-table-filter-values.cjs +20 -0
  163. package/dist/data/data-table-filter-values.cjs.map +1 -1
  164. package/dist/data/data-table-filter-values.d.ts +16 -0
  165. package/dist/data/data-table-filter-values.d.ts.map +1 -1
  166. package/dist/data/data-table-filter-values.js +20 -0
  167. package/dist/data/data-table-filter-values.js.map +1 -1
  168. package/dist/data/data-table-server-filters.cjs +23 -29
  169. package/dist/data/data-table-server-filters.cjs.map +1 -1
  170. package/dist/data/data-table-server-filters.d.ts.map +1 -1
  171. package/dist/data/data-table-server-filters.js +21 -27
  172. package/dist/data/data-table-server-filters.js.map +1 -1
  173. package/dist/data/diagnostics/ErrorDetails.cjs +61 -8
  174. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  175. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  176. package/dist/data/diagnostics/ErrorDetails.js +61 -8
  177. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  178. package/dist/data/diagnostics/error-diagnostics.cjs +10 -4
  179. package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
  180. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
  181. package/dist/data/diagnostics/error-diagnostics.js +10 -4
  182. package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
  183. package/dist/data/query-browser/QueryBrowser.cjs +139 -161
  184. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  185. package/dist/data/query-browser/QueryBrowser.d.ts +1 -71
  186. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  187. package/dist/data/query-browser/QueryBrowser.editor.cjs +88 -0
  188. package/dist/data/query-browser/QueryBrowser.editor.cjs.map +1 -0
  189. package/dist/data/query-browser/QueryBrowser.editor.d.ts +12 -0
  190. package/dist/data/query-browser/QueryBrowser.editor.d.ts.map +1 -0
  191. package/dist/data/query-browser/QueryBrowser.editor.js +88 -0
  192. package/dist/data/query-browser/QueryBrowser.editor.js.map +1 -0
  193. package/dist/data/query-browser/QueryBrowser.js +140 -162
  194. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  195. package/dist/data/query-browser/QueryBrowser.types.cjs +12 -0
  196. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -0
  197. package/dist/data/query-browser/QueryBrowser.types.d.ts +94 -0
  198. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -0
  199. package/dist/data/query-browser/QueryBrowser.types.js +12 -0
  200. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -0
  201. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.cjs +56 -0
  202. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.cjs.map +1 -0
  203. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.d.ts +5 -0
  204. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.d.ts.map +1 -0
  205. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.js +56 -0
  206. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.js.map +1 -0
  207. package/dist/data/query-browser/QueryBrowserResults.cjs +80 -0
  208. package/dist/data/query-browser/QueryBrowserResults.cjs.map +1 -0
  209. package/dist/data/query-browser/QueryBrowserResults.d.ts +16 -0
  210. package/dist/data/query-browser/QueryBrowserResults.d.ts.map +1 -0
  211. package/dist/data/query-browser/QueryBrowserResults.js +80 -0
  212. package/dist/data/query-browser/QueryBrowserResults.js.map +1 -0
  213. package/dist/data/query-browser/index.d.ts +2 -1
  214. package/dist/data/query-browser/index.d.ts.map +1 -1
  215. package/dist/data/task-exec-details.cjs +9 -0
  216. package/dist/data/task-exec-details.cjs.map +1 -0
  217. package/dist/data/task-exec-details.d.ts +3 -0
  218. package/dist/data/task-exec-details.d.ts.map +1 -0
  219. package/dist/data/task-exec-details.js +9 -0
  220. package/dist/data/task-exec-details.js.map +1 -0
  221. package/dist/data/version-info.cjs +3 -3
  222. package/dist/data/version-info.js +3 -3
  223. package/dist/data.cjs +2 -0
  224. package/dist/data.cjs.map +1 -1
  225. package/dist/data.d.ts +1 -1
  226. package/dist/data.d.ts.map +1 -1
  227. package/dist/data.js +2 -0
  228. package/dist/data.js.map +1 -1
  229. package/dist/index.cjs +22 -0
  230. package/dist/index.cjs.map +1 -1
  231. package/dist/index.js +22 -0
  232. package/dist/index.js.map +1 -1
  233. package/dist/lib/string.cjs +8 -0
  234. package/dist/lib/string.cjs.map +1 -1
  235. package/dist/lib/string.d.ts +1 -0
  236. package/dist/lib/string.d.ts.map +1 -1
  237. package/dist/lib/string.js +8 -0
  238. package/dist/lib/string.js.map +1 -1
  239. package/dist/profiles/catalogTree.cjs +133 -0
  240. package/dist/profiles/catalogTree.cjs.map +1 -0
  241. package/dist/profiles/catalogTree.d.ts +11 -0
  242. package/dist/profiles/catalogTree.d.ts.map +1 -0
  243. package/dist/profiles/catalogTree.js +133 -0
  244. package/dist/profiles/catalogTree.js.map +1 -0
  245. package/dist/profiles/connectionBrowserModel.cjs +185 -0
  246. package/dist/profiles/connectionBrowserModel.cjs.map +1 -0
  247. package/dist/profiles/connectionBrowserModel.d.ts +169 -0
  248. package/dist/profiles/connectionBrowserModel.d.ts.map +1 -0
  249. package/dist/profiles/connectionBrowserModel.js +185 -0
  250. package/dist/profiles/connectionBrowserModel.js.map +1 -0
  251. package/dist/profiles/connectionQueryWorkspace.cjs +185 -0
  252. package/dist/profiles/connectionQueryWorkspace.cjs.map +1 -0
  253. package/dist/profiles/connectionQueryWorkspace.d.ts +63 -0
  254. package/dist/profiles/connectionQueryWorkspace.d.ts.map +1 -0
  255. package/dist/profiles/connectionQueryWorkspace.js +185 -0
  256. package/dist/profiles/connectionQueryWorkspace.js.map +1 -0
  257. package/dist/profiles/connectionQueryWorkspaceModel.cjs +28 -0
  258. package/dist/profiles/connectionQueryWorkspaceModel.cjs.map +1 -0
  259. package/dist/profiles/connectionQueryWorkspaceModel.d.ts +38 -0
  260. package/dist/profiles/connectionQueryWorkspaceModel.d.ts.map +1 -0
  261. package/dist/profiles/connectionQueryWorkspaceModel.js +28 -0
  262. package/dist/profiles/connectionQueryWorkspaceModel.js.map +1 -0
  263. package/dist/profiles/esFieldValues.cjs +64 -0
  264. package/dist/profiles/esFieldValues.cjs.map +1 -0
  265. package/dist/profiles/esFieldValues.d.ts +48 -0
  266. package/dist/profiles/esFieldValues.d.ts.map +1 -0
  267. package/dist/profiles/esFieldValues.js +64 -0
  268. package/dist/profiles/esFieldValues.js.map +1 -0
  269. package/dist/profiles/esParamMappingModel.cjs +301 -0
  270. package/dist/profiles/esParamMappingModel.cjs.map +1 -0
  271. package/dist/profiles/esParamMappingModel.d.ts +37 -0
  272. package/dist/profiles/esParamMappingModel.d.ts.map +1 -0
  273. package/dist/profiles/esParamMappingModel.js +301 -0
  274. package/dist/profiles/esParamMappingModel.js.map +1 -0
  275. package/dist/profiles/esParamMappingPill.cjs +24 -0
  276. package/dist/profiles/esParamMappingPill.cjs.map +1 -0
  277. package/dist/profiles/esParamMappingPill.d.ts +13 -0
  278. package/dist/profiles/esParamMappingPill.d.ts.map +1 -0
  279. package/dist/profiles/esParamMappingPill.js +24 -0
  280. package/dist/profiles/esParamMappingPill.js.map +1 -0
  281. package/dist/profiles/esParamOperandExtension.cjs +75 -0
  282. package/dist/profiles/esParamOperandExtension.cjs.map +1 -0
  283. package/dist/profiles/esParamOperandExtension.d.ts +11 -0
  284. package/dist/profiles/esParamOperandExtension.d.ts.map +1 -0
  285. package/dist/profiles/esParamOperandExtension.js +75 -0
  286. package/dist/profiles/esParamOperandExtension.js.map +1 -0
  287. package/dist/profiles/esQueryBuilder.cjs +205 -0
  288. package/dist/profiles/esQueryBuilder.cjs.map +1 -0
  289. package/dist/profiles/esQueryBuilder.d.ts +35 -0
  290. package/dist/profiles/esQueryBuilder.d.ts.map +1 -0
  291. package/dist/profiles/esQueryBuilder.js +205 -0
  292. package/dist/profiles/esQueryBuilder.js.map +1 -0
  293. package/dist/profiles/esQueryBuilderExtension.cjs +23 -0
  294. package/dist/profiles/esQueryBuilderExtension.cjs.map +1 -0
  295. package/dist/profiles/esQueryBuilderExtension.d.ts +5 -0
  296. package/dist/profiles/esQueryBuilderExtension.d.ts.map +1 -0
  297. package/dist/profiles/esQueryBuilderExtension.js +23 -0
  298. package/dist/profiles/esQueryBuilderExtension.js.map +1 -0
  299. package/dist/profiles/esQueryBuilderForm.cjs +26 -0
  300. package/dist/profiles/esQueryBuilderForm.cjs.map +1 -0
  301. package/dist/profiles/esQueryBuilderForm.d.ts +18 -0
  302. package/dist/profiles/esQueryBuilderForm.d.ts.map +1 -0
  303. package/dist/profiles/esQueryBuilderForm.js +26 -0
  304. package/dist/profiles/esQueryBuilderForm.js.map +1 -0
  305. package/dist/profiles/esQueryBuilderModel.cjs +131 -0
  306. package/dist/profiles/esQueryBuilderModel.cjs.map +1 -0
  307. package/dist/profiles/esQueryBuilderModel.d.ts +108 -0
  308. package/dist/profiles/esQueryBuilderModel.d.ts.map +1 -0
  309. package/dist/profiles/esQueryBuilderModel.js +131 -0
  310. package/dist/profiles/esQueryBuilderModel.js.map +1 -0
  311. package/dist/profiles/esQueryClauseGroup.cjs +144 -0
  312. package/dist/profiles/esQueryClauseGroup.cjs.map +1 -0
  313. package/dist/profiles/esQueryClauseGroup.d.ts +10 -0
  314. package/dist/profiles/esQueryClauseGroup.d.ts.map +1 -0
  315. package/dist/profiles/esQueryClauseGroup.js +144 -0
  316. package/dist/profiles/esQueryClauseGroup.js.map +1 -0
  317. package/dist/profiles/esQueryCompile.cjs +47 -0
  318. package/dist/profiles/esQueryCompile.cjs.map +1 -0
  319. package/dist/profiles/esQueryCompile.d.ts +39 -0
  320. package/dist/profiles/esQueryCompile.d.ts.map +1 -0
  321. package/dist/profiles/esQueryCompile.js +47 -0
  322. package/dist/profiles/esQueryCompile.js.map +1 -0
  323. package/dist/profiles/esQueryConditionRow.cjs +168 -0
  324. package/dist/profiles/esQueryConditionRow.cjs.map +1 -0
  325. package/dist/profiles/esQueryConditionRow.d.ts +37 -0
  326. package/dist/profiles/esQueryConditionRow.d.ts.map +1 -0
  327. package/dist/profiles/esQueryConditionRow.js +168 -0
  328. package/dist/profiles/esQueryConditionRow.js.map +1 -0
  329. package/dist/profiles/esQueryGroupModel.cjs +12 -0
  330. package/dist/profiles/esQueryGroupModel.cjs.map +1 -0
  331. package/dist/profiles/esQueryGroupModel.d.ts +9 -0
  332. package/dist/profiles/esQueryGroupModel.d.ts.map +1 -0
  333. package/dist/profiles/esQueryGroupModel.js +12 -0
  334. package/dist/profiles/esQueryGroupModel.js.map +1 -0
  335. package/dist/profiles/esQueryOccur.cjs +16 -0
  336. package/dist/profiles/esQueryOccur.cjs.map +1 -0
  337. package/dist/profiles/esQueryOccur.d.ts +11 -0
  338. package/dist/profiles/esQueryOccur.d.ts.map +1 -0
  339. package/dist/profiles/esQueryOccur.js +16 -0
  340. package/dist/profiles/esQueryOccur.js.map +1 -0
  341. package/dist/profiles/esQueryOperandEditors.cjs +279 -0
  342. package/dist/profiles/esQueryOperandEditors.cjs.map +1 -0
  343. package/dist/profiles/esQueryOperandEditors.d.ts +24 -0
  344. package/dist/profiles/esQueryOperandEditors.d.ts.map +1 -0
  345. package/dist/profiles/esQueryOperandEditors.js +279 -0
  346. package/dist/profiles/esQueryOperandEditors.js.map +1 -0
  347. package/dist/profiles/esQueryOperandModel.cjs +28 -0
  348. package/dist/profiles/esQueryOperandModel.cjs.map +1 -0
  349. package/dist/profiles/esQueryOperandModel.d.ts +17 -0
  350. package/dist/profiles/esQueryOperandModel.d.ts.map +1 -0
  351. package/dist/profiles/esQueryOperandModel.js +28 -0
  352. package/dist/profiles/esQueryOperandModel.js.map +1 -0
  353. package/dist/profiles/esQueryOperators.cjs +165 -0
  354. package/dist/profiles/esQueryOperators.cjs.map +1 -0
  355. package/dist/profiles/esQueryOperators.d.ts +83 -0
  356. package/dist/profiles/esQueryOperators.d.ts.map +1 -0
  357. package/dist/profiles/esQueryOperators.js +165 -0
  358. package/dist/profiles/esQueryOperators.js.map +1 -0
  359. package/dist/profiles/esQueryOutputEditor.cjs +138 -0
  360. package/dist/profiles/esQueryOutputEditor.cjs.map +1 -0
  361. package/dist/profiles/esQueryOutputEditor.d.ts +7 -0
  362. package/dist/profiles/esQueryOutputEditor.d.ts.map +1 -0
  363. package/dist/profiles/esQueryOutputEditor.js +138 -0
  364. package/dist/profiles/esQueryOutputEditor.js.map +1 -0
  365. package/dist/profiles/esQueryOutputModel.cjs +16 -0
  366. package/dist/profiles/esQueryOutputModel.cjs.map +1 -0
  367. package/dist/profiles/esQueryOutputModel.d.ts +14 -0
  368. package/dist/profiles/esQueryOutputModel.d.ts.map +1 -0
  369. package/dist/profiles/esQueryOutputModel.js +16 -0
  370. package/dist/profiles/esQueryOutputModel.js.map +1 -0
  371. package/dist/profiles/esQueryPreview.cjs +30 -0
  372. package/dist/profiles/esQueryPreview.cjs.map +1 -0
  373. package/dist/profiles/esQueryPreview.d.ts +6 -0
  374. package/dist/profiles/esQueryPreview.d.ts.map +1 -0
  375. package/dist/profiles/esQueryPreview.js +30 -0
  376. package/dist/profiles/esQueryPreview.js.map +1 -0
  377. package/dist/profiles/esQuerySortEditor.cjs +143 -0
  378. package/dist/profiles/esQuerySortEditor.cjs.map +1 -0
  379. package/dist/profiles/esQuerySortEditor.d.ts +9 -0
  380. package/dist/profiles/esQuerySortEditor.d.ts.map +1 -0
  381. package/dist/profiles/esQuerySortEditor.js +143 -0
  382. package/dist/profiles/esQuerySortEditor.js.map +1 -0
  383. package/dist/profiles/esQuerySortModel.cjs +13 -0
  384. package/dist/profiles/esQuerySortModel.cjs.map +1 -0
  385. package/dist/profiles/esQuerySortModel.d.ts +4 -0
  386. package/dist/profiles/esQuerySortModel.d.ts.map +1 -0
  387. package/dist/profiles/esQuerySortModel.js +13 -0
  388. package/dist/profiles/esQuerySortModel.js.map +1 -0
  389. package/dist/profiles/esValueCombobox.cjs +86 -0
  390. package/dist/profiles/esValueCombobox.cjs.map +1 -0
  391. package/dist/profiles/esValueCombobox.d.ts +15 -0
  392. package/dist/profiles/esValueCombobox.d.ts.map +1 -0
  393. package/dist/profiles/esValueCombobox.js +86 -0
  394. package/dist/profiles/esValueCombobox.js.map +1 -0
  395. package/dist/profiles/jsonPathSample.cjs +75 -0
  396. package/dist/profiles/jsonPathSample.cjs.map +1 -0
  397. package/dist/profiles/jsonPathSample.d.ts +27 -0
  398. package/dist/profiles/jsonPathSample.d.ts.map +1 -0
  399. package/dist/profiles/jsonPathSample.js +75 -0
  400. package/dist/profiles/jsonPathSample.js.map +1 -0
  401. package/dist/profiles/jsonPathSampleRow.cjs +14 -0
  402. package/dist/profiles/jsonPathSampleRow.cjs.map +1 -0
  403. package/dist/profiles/jsonPathSampleRow.d.ts +6 -0
  404. package/dist/profiles/jsonPathSampleRow.d.ts.map +1 -0
  405. package/dist/profiles/jsonPathSampleRow.js +14 -0
  406. package/dist/profiles/jsonPathSampleRow.js.map +1 -0
  407. package/dist/profiles/profileApi.cjs +37 -0
  408. package/dist/profiles/profileApi.cjs.map +1 -0
  409. package/dist/profiles/profileApi.d.ts +32 -0
  410. package/dist/profiles/profileApi.d.ts.map +1 -0
  411. package/dist/profiles/profileApi.js +37 -0
  412. package/dist/profiles/profileApi.js.map +1 -0
  413. package/dist/profiles/profileBuilder.cjs +65 -0
  414. package/dist/profiles/profileBuilder.cjs.map +1 -0
  415. package/dist/profiles/profileBuilder.d.ts +11 -0
  416. package/dist/profiles/profileBuilder.d.ts.map +1 -0
  417. package/dist/profiles/profileBuilder.js +65 -0
  418. package/dist/profiles/profileBuilder.js.map +1 -0
  419. package/dist/profiles/profileBuilderExtension.cjs +25 -0
  420. package/dist/profiles/profileBuilderExtension.cjs.map +1 -0
  421. package/dist/profiles/profileBuilderExtension.d.ts +5 -0
  422. package/dist/profiles/profileBuilderExtension.d.ts.map +1 -0
  423. package/dist/profiles/profileBuilderExtension.js +25 -0
  424. package/dist/profiles/profileBuilderExtension.js.map +1 -0
  425. package/dist/profiles/profileBuilderWorkspace.cjs +368 -0
  426. package/dist/profiles/profileBuilderWorkspace.cjs.map +1 -0
  427. package/dist/profiles/profileBuilderWorkspace.d.ts +21 -0
  428. package/dist/profiles/profileBuilderWorkspace.d.ts.map +1 -0
  429. package/dist/profiles/profileBuilderWorkspace.js +368 -0
  430. package/dist/profiles/profileBuilderWorkspace.js.map +1 -0
  431. package/dist/profiles/profileColumnModel.cjs +23 -0
  432. package/dist/profiles/profileColumnModel.cjs.map +1 -0
  433. package/dist/profiles/profileColumnModel.d.ts +8 -0
  434. package/dist/profiles/profileColumnModel.d.ts.map +1 -0
  435. package/dist/profiles/profileColumnModel.js +23 -0
  436. package/dist/profiles/profileColumnModel.js.map +1 -0
  437. package/dist/profiles/profileColumnPicker.cjs +68 -0
  438. package/dist/profiles/profileColumnPicker.cjs.map +1 -0
  439. package/dist/profiles/profileColumnPicker.d.ts +11 -0
  440. package/dist/profiles/profileColumnPicker.d.ts.map +1 -0
  441. package/dist/profiles/profileColumnPicker.js +68 -0
  442. package/dist/profiles/profileColumnPicker.js.map +1 -0
  443. package/dist/profiles/profileEditor.cjs +386 -0
  444. package/dist/profiles/profileEditor.cjs.map +1 -0
  445. package/dist/profiles/profileEditor.d.ts +19 -0
  446. package/dist/profiles/profileEditor.d.ts.map +1 -0
  447. package/dist/profiles/profileEditor.js +386 -0
  448. package/dist/profiles/profileEditor.js.map +1 -0
  449. package/dist/profiles/profileEditorModel.cjs +181 -0
  450. package/dist/profiles/profileEditorModel.cjs.map +1 -0
  451. package/dist/profiles/profileEditorModel.d.ts +74 -0
  452. package/dist/profiles/profileEditorModel.d.ts.map +1 -0
  453. package/dist/profiles/profileEditorModel.js +181 -0
  454. package/dist/profiles/profileEditorModel.js.map +1 -0
  455. package/dist/profiles/profileEditorPreview.cjs +38 -0
  456. package/dist/profiles/profileEditorPreview.cjs.map +1 -0
  457. package/dist/profiles/profileEditorPreview.d.ts +12 -0
  458. package/dist/profiles/profileEditorPreview.d.ts.map +1 -0
  459. package/dist/profiles/profileEditorPreview.js +38 -0
  460. package/dist/profiles/profileEditorPreview.js.map +1 -0
  461. package/dist/profiles/profileEditorRail.cjs +46 -0
  462. package/dist/profiles/profileEditorRail.cjs.map +1 -0
  463. package/dist/profiles/profileEditorRail.d.ts +8 -0
  464. package/dist/profiles/profileEditorRail.d.ts.map +1 -0
  465. package/dist/profiles/profileEditorRail.js +46 -0
  466. package/dist/profiles/profileEditorRail.js.map +1 -0
  467. package/dist/profiles/profileEditorRaw.cjs +118 -0
  468. package/dist/profiles/profileEditorRaw.cjs.map +1 -0
  469. package/dist/profiles/profileEditorRaw.d.ts +7 -0
  470. package/dist/profiles/profileEditorRaw.d.ts.map +1 -0
  471. package/dist/profiles/profileEditorRaw.js +118 -0
  472. package/dist/profiles/profileEditorRaw.js.map +1 -0
  473. package/dist/profiles/profileEditorRoutes.cjs +7 -0
  474. package/dist/profiles/profileEditorRoutes.cjs.map +1 -0
  475. package/dist/profiles/profileEditorRoutes.d.ts +2 -0
  476. package/dist/profiles/profileEditorRoutes.d.ts.map +1 -0
  477. package/dist/profiles/profileEditorRoutes.js +7 -0
  478. package/dist/profiles/profileEditorRoutes.js.map +1 -0
  479. package/dist/profiles/profileEditorSections.cjs +213 -0
  480. package/dist/profiles/profileEditorSections.cjs.map +1 -0
  481. package/dist/profiles/profileEditorSections.d.ts +23 -0
  482. package/dist/profiles/profileEditorSections.d.ts.map +1 -0
  483. package/dist/profiles/profileEditorSections.js +213 -0
  484. package/dist/profiles/profileEditorSections.js.map +1 -0
  485. package/dist/profiles/profileFieldEditor.cjs +200 -0
  486. package/dist/profiles/profileFieldEditor.cjs.map +1 -0
  487. package/dist/profiles/profileFieldEditor.d.ts +34 -0
  488. package/dist/profiles/profileFieldEditor.d.ts.map +1 -0
  489. package/dist/profiles/profileFieldEditor.js +200 -0
  490. package/dist/profiles/profileFieldEditor.js.map +1 -0
  491. package/dist/profiles/profileFieldGrid.cjs +250 -0
  492. package/dist/profiles/profileFieldGrid.cjs.map +1 -0
  493. package/dist/profiles/profileFieldGrid.d.ts +20 -0
  494. package/dist/profiles/profileFieldGrid.d.ts.map +1 -0
  495. package/dist/profiles/profileFieldGrid.js +250 -0
  496. package/dist/profiles/profileFieldGrid.js.map +1 -0
  497. package/dist/profiles/profileFieldManager.cjs +103 -0
  498. package/dist/profiles/profileFieldManager.cjs.map +1 -0
  499. package/dist/profiles/profileFieldManager.d.ts +9 -0
  500. package/dist/profiles/profileFieldManager.d.ts.map +1 -0
  501. package/dist/profiles/profileFieldManager.js +103 -0
  502. package/dist/profiles/profileFieldManager.js.map +1 -0
  503. package/dist/profiles/profileFieldState.cjs +136 -0
  504. package/dist/profiles/profileFieldState.cjs.map +1 -0
  505. package/dist/profiles/profileFieldState.d.ts +41 -0
  506. package/dist/profiles/profileFieldState.d.ts.map +1 -0
  507. package/dist/profiles/profileFieldState.js +136 -0
  508. package/dist/profiles/profileFieldState.js.map +1 -0
  509. package/dist/profiles/profileFieldTypes.cjs +17 -0
  510. package/dist/profiles/profileFieldTypes.cjs.map +1 -0
  511. package/dist/profiles/profileFieldTypes.d.ts +8 -0
  512. package/dist/profiles/profileFieldTypes.d.ts.map +1 -0
  513. package/dist/profiles/profileFieldTypes.js +17 -0
  514. package/dist/profiles/profileFieldTypes.js.map +1 -0
  515. package/dist/profiles/profileParamModel.cjs +78 -0
  516. package/dist/profiles/profileParamModel.cjs.map +1 -0
  517. package/dist/profiles/profileParamModel.d.ts +3 -0
  518. package/dist/profiles/profileParamModel.d.ts.map +1 -0
  519. package/dist/profiles/profileParamModel.js +78 -0
  520. package/dist/profiles/profileParamModel.js.map +1 -0
  521. package/dist/profiles/profileSamplePayload.cjs +15 -0
  522. package/dist/profiles/profileSamplePayload.cjs.map +1 -0
  523. package/dist/profiles/profileSamplePayload.d.ts +13 -0
  524. package/dist/profiles/profileSamplePayload.d.ts.map +1 -0
  525. package/dist/profiles/profileSamplePayload.js +15 -0
  526. package/dist/profiles/profileSamplePayload.js.map +1 -0
  527. package/dist/profiles/profileWizard.cjs +257 -0
  528. package/dist/profiles/profileWizard.cjs.map +1 -0
  529. package/dist/profiles/profileWizard.d.ts +12 -0
  530. package/dist/profiles/profileWizard.d.ts.map +1 -0
  531. package/dist/profiles/profileWizard.js +257 -0
  532. package/dist/profiles/profileWizard.js.map +1 -0
  533. package/dist/profiles/profileWizardHelp.cjs +10 -0
  534. package/dist/profiles/profileWizardHelp.cjs.map +1 -0
  535. package/dist/profiles/profileWizardHelp.d.ts +13 -0
  536. package/dist/profiles/profileWizardHelp.d.ts.map +1 -0
  537. package/dist/profiles/profileWizardHelp.js +10 -0
  538. package/dist/profiles/profileWizardHelp.js.map +1 -0
  539. package/dist/profiles/profileWizardModel.cjs +198 -0
  540. package/dist/profiles/profileWizardModel.cjs.map +1 -0
  541. package/dist/profiles/profileWizardModel.d.ts +255 -0
  542. package/dist/profiles/profileWizardModel.d.ts.map +1 -0
  543. package/dist/profiles/profileWizardModel.js +198 -0
  544. package/dist/profiles/profileWizardModel.js.map +1 -0
  545. package/dist/profiles/profileWizardQueryStep.cjs +215 -0
  546. package/dist/profiles/profileWizardQueryStep.cjs.map +1 -0
  547. package/dist/profiles/profileWizardQueryStep.d.ts +18 -0
  548. package/dist/profiles/profileWizardQueryStep.d.ts.map +1 -0
  549. package/dist/profiles/profileWizardQueryStep.js +215 -0
  550. package/dist/profiles/profileWizardQueryStep.js.map +1 -0
  551. package/dist/profiles/profileWizardSteps.cjs +214 -0
  552. package/dist/profiles/profileWizardSteps.cjs.map +1 -0
  553. package/dist/profiles/profileWizardSteps.d.ts +35 -0
  554. package/dist/profiles/profileWizardSteps.d.ts.map +1 -0
  555. package/dist/profiles/profileWizardSteps.js +214 -0
  556. package/dist/profiles/profileWizardSteps.js.map +1 -0
  557. package/dist/profiles/profileYaml.cjs +19 -0
  558. package/dist/profiles/profileYaml.cjs.map +1 -0
  559. package/dist/profiles/profileYaml.d.ts +4 -0
  560. package/dist/profiles/profileYaml.d.ts.map +1 -0
  561. package/dist/profiles/profileYaml.js +19 -0
  562. package/dist/profiles/profileYaml.js.map +1 -0
  563. package/dist/profiles/prometheusResults.cjs +60 -0
  564. package/dist/profiles/prometheusResults.cjs.map +1 -0
  565. package/dist/profiles/prometheusResults.d.ts +7 -0
  566. package/dist/profiles/prometheusResults.d.ts.map +1 -0
  567. package/dist/profiles/prometheusResults.js +60 -0
  568. package/dist/profiles/prometheusResults.js.map +1 -0
  569. package/dist/profiles/queryRowLimits.cjs +82 -0
  570. package/dist/profiles/queryRowLimits.cjs.map +1 -0
  571. package/dist/profiles/queryRowLimits.d.ts +9 -0
  572. package/dist/profiles/queryRowLimits.d.ts.map +1 -0
  573. package/dist/profiles/queryRowLimits.js +82 -0
  574. package/dist/profiles/queryRowLimits.js.map +1 -0
  575. package/dist/profiles/queryRowLimitsModel.cjs +10 -0
  576. package/dist/profiles/queryRowLimitsModel.cjs.map +1 -0
  577. package/dist/profiles/queryRowLimitsModel.d.ts +9 -0
  578. package/dist/profiles/queryRowLimitsModel.d.ts.map +1 -0
  579. package/dist/profiles/queryRowLimitsModel.js +10 -0
  580. package/dist/profiles/queryRowLimitsModel.js.map +1 -0
  581. package/dist/profiles/queryTargetPicker.cjs +42 -0
  582. package/dist/profiles/queryTargetPicker.cjs.map +1 -0
  583. package/dist/profiles/queryTargetPicker.d.ts +8 -0
  584. package/dist/profiles/queryTargetPicker.d.ts.map +1 -0
  585. package/dist/profiles/queryTargetPicker.js +42 -0
  586. package/dist/profiles/queryTargetPicker.js.map +1 -0
  587. package/dist/profiles/testSchema.d.ts +3 -0
  588. package/dist/profiles/testSchema.d.ts.map +1 -0
  589. package/dist/profiles.cjs +223 -0
  590. package/dist/profiles.cjs.map +1 -0
  591. package/dist/profiles.d.ts +68 -0
  592. package/dist/profiles.d.ts.map +1 -0
  593. package/dist/profiles.js +223 -0
  594. package/dist/profiles.js.map +1 -0
  595. package/dist/rpc/FilterForm.cjs +20 -0
  596. package/dist/rpc/FilterForm.cjs.map +1 -1
  597. package/dist/rpc/FilterForm.js +20 -0
  598. package/dist/rpc/FilterForm.js.map +1 -1
  599. package/dist/rpc/formMetadata.cjs +34 -0
  600. package/dist/rpc/formMetadata.cjs.map +1 -1
  601. package/dist/rpc/formMetadata.d.ts.map +1 -1
  602. package/dist/rpc/formMetadata.js +35 -1
  603. package/dist/rpc/formMetadata.js.map +1 -1
  604. package/dist/rpc/types.cjs.map +1 -1
  605. package/dist/rpc/types.d.ts +9 -1
  606. package/dist/rpc/types.d.ts.map +1 -1
  607. package/dist/rpc/types.js.map +1 -1
  608. package/dist/styles.css +1 -1
  609. package/package.json +6 -1
@@ -1,96 +1,21 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
- import { history, historyKeymap } from "@codemirror/commands";
3
- import { autocompletion } from "@codemirror/autocomplete";
4
- import { json } from "@codemirror/lang-json";
5
- import { sql } from "@codemirror/lang-sql";
6
2
  import { Compartment, EditorState } from "@codemirror/state";
7
- import { EditorView, keymap } from "@codemirror/view";
3
+ import { EditorView } from "@codemirror/view";
8
4
  import { useRef, useState, useCallback, useEffect, useMemo } from "react";
9
5
  import { Button } from "../../components/button.js";
10
6
  import { JsonSchemaForm } from "../../components/JsonSchemaForm.js";
11
7
  import { cn } from "../../lib/utils.js";
12
8
  import { SplitPane } from "../../layout/SplitPane.js";
13
9
  import { Icon } from "../Icon.js";
14
- import { DataTable } from "../DataTable.js";
15
10
  import { inferColumns } from "../data-table-utils.js";
16
11
  import { serverColumnsToDataTableColumns, serverFiltersToFilterBar } from "../data-table-server-filters.js";
17
12
  import { ErrorDetails } from "../diagnostics/ErrorDetails.js";
18
- import { Properties } from "../Properties.js";
19
- import { sqlCompletionNamespace, dialectFor, openSearchJSONCompletionSource } from "./QueryBrowser.completion.js";
13
+ import { readQueryBrowserHistory, rememberQueryBrowserQuery, queryBrowserEditorExtensions, queryBrowserLanguageExtension } from "./QueryBrowser.editor.js";
14
+ import { QueryBrowserDiagnosticsPanel } from "./QueryBrowserDiagnosticsPanel.js";
15
+ import { QueryBrowserResults } from "./QueryBrowserResults.js";
16
+ import { QueryBrowserExecutionError } from "./QueryBrowser.types.js";
17
+ import { UiDebug } from "../../icons/components/UiDebug.js";
20
18
  import { UiPlay } from "../../icons/components/UiPlay.js";
21
- const MAX_HISTORY = 50;
22
- function historyKey(id) {
23
- return `clicky-ui:query-browser:${id}:history`;
24
- }
25
- function readHistory(id) {
26
- if (typeof window === "undefined") return [];
27
- try {
28
- const value = JSON.parse(
29
- window.localStorage.getItem(historyKey(id)) ?? "[]"
30
- );
31
- return Array.isArray(value) ? value.slice(0, MAX_HISTORY) : [];
32
- } catch {
33
- return [];
34
- }
35
- }
36
- function rememberQuery(id, query) {
37
- const entries = readHistory(id).filter((entry) => entry.query !== query);
38
- const next = [{ query, at: Date.now() }, ...entries].slice(0, MAX_HISTORY);
39
- if (typeof window !== "undefined") {
40
- window.localStorage.setItem(historyKey(id), JSON.stringify(next));
41
- }
42
- return next;
43
- }
44
- function editorExtensions(execute, onQueryChange, languageExtension2) {
45
- return [
46
- history(),
47
- keymap.of([
48
- {
49
- key: "Mod-Enter",
50
- run: () => {
51
- execute();
52
- return true;
53
- }
54
- },
55
- ...historyKeymap
56
- ]),
57
- EditorView.lineWrapping,
58
- EditorView.updateListener.of((update) => {
59
- if (update.docChanged) onQueryChange(update.state.doc.toString());
60
- }),
61
- EditorView.theme({
62
- "&": { height: "100%", fontSize: "13px", background: "transparent" },
63
- ".cm-scroller": {
64
- fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace"
65
- },
66
- ".cm-content": { padding: "12px 0" },
67
- ".cm-gutters": { background: "transparent", border: "none" },
68
- "&.cm-focused": { outline: "none" }
69
- }),
70
- languageExtension2
71
- ];
72
- }
73
- function languageExtension(language, completion) {
74
- if (language === "sql") {
75
- if ((completion == null ? void 0 : completion.kind) !== "sql") return sql();
76
- return sql({
77
- dialect: dialectFor(completion.dialect),
78
- schema: sqlCompletionNamespace(completion.schemas),
79
- upperCaseKeywords: true,
80
- ...completion.defaultSchema ? { defaultSchema: completion.defaultSchema } : {}
81
- });
82
- }
83
- if (language === "json") {
84
- if ((completion == null ? void 0 : completion.kind) !== "json-fields") return json();
85
- return [
86
- json(),
87
- autocompletion({
88
- override: [openSearchJSONCompletionSource(completion.fields)]
89
- })
90
- ];
91
- }
92
- return [];
93
- }
94
19
  function QueryBrowser({
95
20
  id,
96
21
  title,
@@ -108,6 +33,7 @@ function QueryBrowser({
108
33
  renderResults,
109
34
  className
110
35
  }) {
36
+ var _a;
111
37
  const editorHost = useRef(null);
112
38
  const editor = useRef(null);
113
39
  const languageConfig = useRef(new Compartment());
@@ -119,7 +45,10 @@ function QueryBrowser({
119
45
  const [result, setResult] = useState(null);
120
46
  const [error, setError] = useState(null);
121
47
  const [pending, setPending] = useState(false);
122
- const [entries, setEntries] = useState(() => readHistory(id));
48
+ const [debug, setDebug] = useState(false);
49
+ const [entries, setEntries] = useState(
50
+ () => readQueryBrowserHistory(id)
51
+ );
123
52
  const [filters, setFilters] = useState({});
124
53
  const lastRun = useRef(null);
125
54
  const executedFilters = useRef({});
@@ -137,10 +66,16 @@ function QueryBrowser({
137
66
  lastRun.current = {
138
67
  query: request.query,
139
68
  options: request.options,
69
+ ...request.filters ? { filters: request.filters } : {},
140
70
  ...next.columns ? { columns: next.columns } : {}
141
71
  };
142
72
  } catch (err) {
143
- setError(err instanceof Error ? err.message : String(err));
73
+ setError({
74
+ message: err instanceof Error ? err.message : String(err),
75
+ query: request.query,
76
+ ...err instanceof QueryBrowserExecutionError && err.diagnostics ? { diagnostics: err.diagnostics } : {},
77
+ ...err instanceof QueryBrowserExecutionError && err.errorDetails ? { errorDetails: err.errorDetails } : {}
78
+ });
144
79
  } finally {
145
80
  setPending(false);
146
81
  }
@@ -156,11 +91,11 @@ function QueryBrowser({
156
91
  return view.state.doc.toString();
157
92
  }, [initialQuery]);
158
93
  const run = useCallback(async () => {
159
- var _a;
94
+ var _a2;
160
95
  const query = currentQuery().trim();
161
96
  if (!query || pending) return;
162
- setEntries(rememberQuery(id, query));
163
- const repeat = ((_a = lastRun.current) == null ? void 0 : _a.query) === query ? lastRun.current : null;
97
+ setEntries(rememberQueryBrowserQuery(id, query));
98
+ const repeat = ((_a2 = lastRun.current) == null ? void 0 : _a2.query) === query ? lastRun.current : null;
164
99
  const carried = repeat ? filters : {};
165
100
  if (carried !== filters) setFilters(carried);
166
101
  lastRun.current = { query, options };
@@ -169,18 +104,42 @@ function QueryBrowser({
169
104
  query,
170
105
  options,
171
106
  ...Object.keys(carried).length > 0 ? { filters: carried } : {},
172
- ...(repeat == null ? void 0 : repeat.columns) ? { columns: repeat.columns } : {}
107
+ ...(repeat == null ? void 0 : repeat.columns) ? { columns: repeat.columns } : {},
108
+ ...debug ? { debug: true } : {}
173
109
  });
174
- }, [currentQuery, filters, id, options, pending, runRequest]);
110
+ }, [currentQuery, debug, filters, id, options, pending, runRequest]);
175
111
  const rerunWithFilters = useCallback(
176
112
  async (selection) => {
177
113
  const previous = lastRun.current;
178
114
  if (!previous) {
179
- throw new Error("QueryBrowser: a filter changed before any query had run");
115
+ throw new Error(
116
+ "QueryBrowser: a filter changed before any query had run"
117
+ );
118
+ }
119
+ await runRequest({
120
+ ...previous,
121
+ filters: selection,
122
+ ...(result == null ? void 0 : result.pagination) ? { pagination: { limit: result.pagination.limit } } : {},
123
+ ...debug ? { debug: true } : {}
124
+ });
125
+ },
126
+ [debug, result == null ? void 0 : result.pagination, runRequest]
127
+ );
128
+ const rerunAt = useCallback(
129
+ async (pagination) => {
130
+ const previous = lastRun.current;
131
+ if (!previous) {
132
+ throw new Error(
133
+ "QueryBrowser: pagination changed before any query had run"
134
+ );
180
135
  }
181
- await runRequest({ ...previous, filters: selection });
136
+ await runRequest({
137
+ ...previous,
138
+ pagination,
139
+ ...debug ? { debug: true } : {}
140
+ });
182
141
  },
183
- [runRequest]
142
+ [debug, runRequest]
184
143
  );
185
144
  useEffect(() => {
186
145
  if (!lastRun.current) return;
@@ -196,13 +155,15 @@ function QueryBrowser({
196
155
  parent: editorHost.current,
197
156
  state: EditorState.create({
198
157
  doc: initialQuery,
199
- extensions: editorExtensions(
158
+ extensions: queryBrowserEditorExtensions(
200
159
  () => executeRef.current(),
201
160
  (query) => {
202
- var _a;
203
- return (_a = onQueryChangeRef.current) == null ? void 0 : _a.call(onQueryChangeRef, query);
161
+ var _a2;
162
+ return (_a2 = onQueryChangeRef.current) == null ? void 0 : _a2.call(onQueryChangeRef, query);
204
163
  },
205
- languageConfig.current.of(languageExtension(language, completion))
164
+ languageConfig.current.of(
165
+ queryBrowserLanguageExtension(language, completion)
166
+ )
206
167
  )
207
168
  })
208
169
  });
@@ -217,7 +178,7 @@ function QueryBrowser({
217
178
  if (!view) return;
218
179
  view.dispatch({
219
180
  effects: languageConfig.current.reconfigure(
220
- languageExtension(language, completion)
181
+ queryBrowserLanguageExtension(language, completion)
221
182
  )
222
183
  });
223
184
  }, [completion, language]);
@@ -239,10 +200,11 @@ function QueryBrowser({
239
200
  [onOptionsChange]
240
201
  );
241
202
  useEffect(() => {
242
- setEntries(readHistory(id));
203
+ setEntries(readQueryBrowserHistory(id));
243
204
  setResult(null);
244
205
  setError(null);
245
206
  setFilters({});
207
+ setDebug(false);
246
208
  lastRun.current = null;
247
209
  executedFilters.current = {};
248
210
  }, [id]);
@@ -257,7 +219,9 @@ function QueryBrowser({
257
219
  return (request) => {
258
220
  const previous = lastRun.current;
259
221
  if (!previous) {
260
- throw new Error("QueryBrowser: a filter lookup ran before any query had");
222
+ throw new Error(
223
+ "QueryBrowser: a filter lookup ran before any query had"
224
+ );
261
225
  }
262
226
  return lookupFilterValues({ ...request, ...previous, filters });
263
227
  };
@@ -272,59 +236,53 @@ function QueryBrowser({
272
236
  [described, filters, lookupValues]
273
237
  );
274
238
  const serverFiltered = filterConfig.filters.length > 0 || filterConfig.timeRange !== void 0;
275
- const defaultResults = result ? /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-2", children: [
276
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3 text-xs text-muted-foreground", children: [
277
- /* @__PURE__ */ jsxs("span", { children: [
278
- rows.length.toLocaleString(),
279
- " rows",
280
- result.truncated ? "+" : ""
281
- ] }),
282
- result.truncated && /* @__PURE__ */ jsxs("span", { className: "text-amber-600 [[data-theme=dark]_&]:text-amber-400", children: [
283
- "stopped at the console's ",
284
- (result.limit ?? rows.length).toLocaleString(),
285
- "-row bound; narrow the query to see the rest"
286
- ] }),
287
- result.affectedRows !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
288
- result.affectedRows.toLocaleString(),
289
- " affected"
290
- ] }),
291
- result.durationMs !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
292
- Math.round(result.durationMs),
293
- " ms"
294
- ] }),
295
- result.message && /* @__PURE__ */ jsx("span", { children: result.message })
296
- ] }),
297
- rows.length > 0 || described.length > 0 ? /* @__PURE__ */ jsx(
298
- DataTable,
299
- {
300
- data: rows,
301
- columns,
302
- loading: pending,
303
- autoFilter: false,
304
- ...serverFiltered ? {
305
- manualFilter: true,
306
- externalFilters: filterConfig.filters,
307
- ...filterConfig.timeRange ? { externalTimeRange: filterConfig.timeRange } : {}
308
- } : { showGlobalFilter: true },
309
- showFullscreenControl: true,
310
- fullscreenTitle: title ?? queryLabel,
311
- detailStyle: "dialog",
312
- detailDialogTitle: "Row details",
313
- renderExpandedRow: (row) => /* @__PURE__ */ jsx(
314
- Properties,
315
- {
316
- items: Object.entries(row).map(([key, value]) => ({
317
- key,
318
- value
319
- })),
320
- renderLabel: (key) => key,
321
- density: "compact"
322
- }
323
- ),
324
- className: "min-h-0 flex-1"
325
- }
326
- ) : /* @__PURE__ */ jsx("div", { className: "rounded-md border border-dashed p-6 text-sm text-muted-foreground", children: result.message ?? "Statement completed with no rows." })
327
- ] }) : /* @__PURE__ */ jsx("div", { className: "grid min-h-40 place-items-center text-sm text-muted-foreground", children: "Run a query to see results." });
239
+ const tablePagination = useMemo(() => {
240
+ const pagination = result == null ? void 0 : result.pagination;
241
+ if (!pagination) return void 0;
242
+ const shared = {
243
+ pageSize: pagination.limit,
244
+ ...pagination.total !== void 0 ? { total: pagination.total } : {},
245
+ ...pagination.totalRelation === "eq" || pagination.totalRelation === "gte" ? { totalRelation: pagination.totalRelation } : {},
246
+ hasMore: pagination.hasMore,
247
+ onPageSizeChange: (limit) => void rerunAt({ limit })
248
+ };
249
+ if (pagination.mode === "cursor") {
250
+ return {
251
+ ...shared,
252
+ page: 0,
253
+ cursor: {
254
+ ...pagination.cursor ? { current: pagination.cursor } : {},
255
+ ...pagination.nextCursor ? { next: pagination.nextCursor } : {},
256
+ onCursorChange: (cursor) => void rerunAt({
257
+ limit: pagination.limit,
258
+ ...cursor ? { cursor } : {}
259
+ })
260
+ }
261
+ };
262
+ }
263
+ const page = Math.floor((pagination.offset ?? 0) / pagination.limit);
264
+ return {
265
+ ...shared,
266
+ page,
267
+ onPageChange: (nextPage) => void rerunAt({
268
+ limit: pagination.limit,
269
+ offset: nextPage * pagination.limit
270
+ })
271
+ };
272
+ }, [rerunAt, result == null ? void 0 : result.pagination]);
273
+ const defaultResults = /* @__PURE__ */ jsx(
274
+ QueryBrowserResults,
275
+ {
276
+ result,
277
+ pending,
278
+ ...title ? { title } : {},
279
+ queryLabel,
280
+ columns,
281
+ filterConfig,
282
+ serverFiltered,
283
+ ...tablePagination ? { pagination: tablePagination } : {}
284
+ }
285
+ );
328
286
  const workspace = /* @__PURE__ */ jsxs("div", { className: "flex h-full min-h-0 flex-col overflow-hidden rounded-xl border bg-card", children: [
329
287
  /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2 border-b px-3 py-2", children: [
330
288
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
@@ -352,6 +310,19 @@ function QueryBrowser({
352
310
  ]
353
311
  }
354
312
  ),
313
+ /* @__PURE__ */ jsxs(
314
+ Button,
315
+ {
316
+ size: "sm",
317
+ variant: debug ? "secondary" : "outline",
318
+ "aria-pressed": debug,
319
+ onClick: () => setDebug((enabled) => !enabled),
320
+ children: [
321
+ /* @__PURE__ */ jsx(Icon, { icon: UiDebug, className: "size-4" }),
322
+ "Debug"
323
+ ]
324
+ }
325
+ ),
355
326
  /* @__PURE__ */ jsxs(
356
327
  Button,
357
328
  {
@@ -379,18 +350,25 @@ function QueryBrowser({
379
350
  }
380
351
  ) }),
381
352
  /* @__PURE__ */ jsx("div", { ref: editorHost, className: "h-[34%] min-h-44 border-b" }),
382
- /* @__PURE__ */ jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-auto p-3", children: error ? /* @__PURE__ */ jsx(
383
- ErrorDetails,
384
- {
385
- diagnostics: {
386
- message: error,
387
- context: [
388
- ["Query", currentQuery()],
389
- ["Language", language]
390
- ]
353
+ /* @__PURE__ */ jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-auto p-3", children: error ? /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
354
+ /* @__PURE__ */ jsx(
355
+ ErrorDetails,
356
+ {
357
+ diagnostics: {
358
+ ...error.errorDetails ?? {
359
+ message: error.message,
360
+ context: []
361
+ },
362
+ context: [
363
+ ...((_a = error.errorDetails) == null ? void 0 : _a.context) ?? [],
364
+ ["Query", error.query],
365
+ ["Language", language]
366
+ ]
367
+ }
391
368
  }
392
- }
393
- ) : result && renderResults ? renderResults({ result, defaultView: defaultResults }) : defaultResults })
369
+ ),
370
+ error.diagnostics && /* @__PURE__ */ jsx(QueryBrowserDiagnosticsPanel, { diagnostics: error.diagnostics })
371
+ ] }) : result && renderResults ? renderResults({ result, defaultView: defaultResults }) : defaultResults })
394
372
  ] });
395
373
  return /* @__PURE__ */ jsx("div", { className: cn("h-[calc(100vh-15rem)] min-h-[32rem]", className), children: navigator ? /* @__PURE__ */ jsx(SplitPane, { defaultSplit: 28, left: navigator, right: workspace }) : workspace });
396
374
  }
@@ -1 +1 @@
1
- {"version":3,"file":"QueryBrowser.js","sources":["../../../src/data/query-browser/QueryBrowser.tsx"],"sourcesContent":["import { history, historyKeymap } from \"@codemirror/commands\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\nimport { json } from \"@codemirror/lang-json\";\nimport { sql } from \"@codemirror/lang-sql\";\nimport { Compartment, EditorState, type Extension } from \"@codemirror/state\";\nimport { EditorView, keymap } from \"@codemirror/view\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"../../components/button\";\nimport { JsonSchemaForm } from \"../../components/JsonSchemaForm\";\nimport type { JsonSchemaObject } from \"../../components/json-schema-form-types\";\nimport { cn } from \"../../lib/utils\";\nimport { SplitPane } from \"../../layout/SplitPane\";\nimport { Icon } from \"../Icon\";\nimport { UiPlay } from \"../../icons\";\nimport { DataTable } from \"../DataTable\";\nimport { inferColumns } from \"../data-table-utils\";\nimport type { DataTableFilterSelection } from \"../data-table-filter-values\";\nimport {\n serverColumnsToDataTableColumns,\n serverFiltersToFilterBar,\n type DataTableFilterLookup,\n type DataTableFilterLookupRequest,\n type DataTableFilterLookupResult,\n type DataTableServerColumn,\n} from \"../data-table-server-filters\";\nimport { ErrorDetails } from \"../diagnostics/ErrorDetails\";\nimport { Properties } from \"../Properties\";\nimport {\n dialectFor,\n openSearchJSONCompletionSource,\n sqlCompletionNamespace,\n type QueryBrowserCompletion,\n} from \"./QueryBrowser.completion\";\n\nexport type QueryBrowserResult = {\n rows?: Record<string, unknown>[];\n /**\n * How the source describes the columns it returned, including which of them\n * it can narrow on. Present columns replace the ones inferred from the rows,\n * so a filterable result is described rather than guessed at.\n */\n columns?: DataTableServerColumn[];\n affectedRows?: number;\n durationMs?: number;\n message?: string;\n truncated?: boolean;\n /** Where a truncated read stopped, so the bound can be named rather than\n * merely hinted at with a trailing \"+\". */\n limit?: number;\n metadata?: Record<string, unknown>;\n};\n\nexport type QueryBrowserRequest = {\n query: string;\n options: Record<string, unknown>;\n /** The filter pills the user picked, if the last result described any. */\n filters?: DataTableFilterSelection;\n /**\n * The columns the last result described, echoed back so a filter binds to\n * what the source offered rather than to whatever the narrowed result\n * describes. Sources that have a catalog of their own ignore it.\n */\n columns?: DataTableServerColumn[];\n};\n\n/**\n * A filter value type-ahead, carrying the context the source needs to scope its\n * suggestions: the last *executed* query and the rest of the selection, so a\n * value list only offers values that would still return rows.\n */\nexport type QueryBrowserFilterLookupRequest = DataTableFilterLookupRequest & {\n query: string;\n options: Record<string, unknown>;\n filters: DataTableFilterSelection;\n columns?: DataTableServerColumn[];\n};\n\nexport type QueryBrowserFilterLookup = (\n request: QueryBrowserFilterLookupRequest,\n) => Promise<DataTableFilterLookupResult>;\n\nexport type QueryBrowserResultContext = {\n result: QueryBrowserResult;\n defaultView: ReactNode;\n};\n\nexport type QueryBrowserProps = {\n id: string;\n title?: string;\n language?: \"sql\" | \"json\" | \"text\";\n initialQuery?: string;\n queryLabel?: string;\n optionsSchema?: JsonSchemaObject;\n initialOptions?: Record<string, unknown>;\n completion?: QueryBrowserCompletion;\n onQueryChange?: (query: string) => void;\n onOptionsChange?: (options: Record<string, unknown>) => void;\n navigator?: ReactNode;\n execute: (request: QueryBrowserRequest) => Promise<QueryBrowserResult>;\n /**\n * Answers a filter's value type-ahead. Absent leaves every described filter\n * showing only the options the result carried.\n */\n lookupFilterValues?: QueryBrowserFilterLookup;\n renderResults?: (context: QueryBrowserResultContext) => ReactNode;\n className?: string;\n};\n\ntype HistoryEntry = { query: string; at: number };\n\nconst MAX_HISTORY = 50;\n\nfunction historyKey(id: string) {\n return `clicky-ui:query-browser:${id}:history`;\n}\n\nfunction readHistory(id: string): HistoryEntry[] {\n if (typeof window === \"undefined\") return [];\n try {\n const value = JSON.parse(\n window.localStorage.getItem(historyKey(id)) ?? \"[]\",\n );\n return Array.isArray(value) ? value.slice(0, MAX_HISTORY) : [];\n } catch {\n return [];\n }\n}\n\nfunction rememberQuery(id: string, query: string): HistoryEntry[] {\n const entries = readHistory(id).filter((entry) => entry.query !== query);\n const next = [{ query, at: Date.now() }, ...entries].slice(0, MAX_HISTORY);\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(historyKey(id), JSON.stringify(next));\n }\n return next;\n}\n\nfunction editorExtensions(\n execute: () => void,\n onQueryChange: (query: string) => void,\n languageExtension: Extension,\n) {\n return [\n history(),\n keymap.of([\n {\n key: \"Mod-Enter\",\n run: () => {\n execute();\n return true;\n },\n },\n ...historyKeymap,\n ]),\n EditorView.lineWrapping,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) onQueryChange(update.state.doc.toString());\n }),\n EditorView.theme({\n \"&\": { height: \"100%\", fontSize: \"13px\", background: \"transparent\" },\n \".cm-scroller\": {\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, monospace\",\n },\n \".cm-content\": { padding: \"12px 0\" },\n \".cm-gutters\": { background: \"transparent\", border: \"none\" },\n \"&.cm-focused\": { outline: \"none\" },\n }),\n languageExtension,\n ];\n}\n\nfunction languageExtension(\n language: QueryBrowserProps[\"language\"],\n completion?: QueryBrowserCompletion,\n): Extension {\n if (language === \"sql\") {\n if (completion?.kind !== \"sql\") return sql();\n return sql({\n dialect: dialectFor(completion.dialect),\n schema: sqlCompletionNamespace(completion.schemas),\n upperCaseKeywords: true,\n ...(completion.defaultSchema\n ? { defaultSchema: completion.defaultSchema }\n : {}),\n });\n }\n if (language === \"json\") {\n if (completion?.kind !== \"json-fields\") return json();\n return [\n json(),\n autocompletion({\n override: [openSearchJSONCompletionSource(completion.fields)],\n }),\n ];\n }\n return [];\n}\n\nexport function QueryBrowser({\n id,\n title,\n language = \"text\",\n initialQuery = \"\",\n queryLabel = \"Query\",\n optionsSchema,\n initialOptions,\n completion,\n onQueryChange,\n onOptionsChange,\n navigator,\n execute,\n lookupFilterValues,\n renderResults,\n className,\n}: QueryBrowserProps) {\n const editorHost = useRef<HTMLDivElement | null>(null);\n const editor = useRef<EditorView | null>(null);\n const languageConfig = useRef(new Compartment());\n const executeRef = useRef<() => void>(() => undefined);\n const onQueryChangeRef = useRef(onQueryChange);\n const [options, setOptions] = useState<Record<string, unknown>>(\n initialOptions ?? {},\n );\n const [result, setResult] = useState<QueryBrowserResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [pending, setPending] = useState(false);\n const [entries, setEntries] = useState<HistoryEntry[]>(() => readHistory(id));\n const [filters, setFilters] = useState<DataTableFilterSelection>({});\n // What the displayed result came from. A filter re-runs *this*, never the\n // editor's current text — otherwise changing a pill would execute a\n // half-typed edit nobody asked to run.\n const lastRun = useRef<{\n query: string;\n options: Record<string, unknown>;\n columns?: DataTableServerColumn[];\n } | null>(null);\n const executedFilters = useRef<DataTableFilterSelection>({});\n\n // Every run goes through here so the record a filter re-runs from is refreshed\n // in one place: the query, its options, and the columns the source described,\n // which are what a subsequent selection binds to.\n const runRequest = useCallback(\n async (request: QueryBrowserRequest) => {\n setPending(true);\n setError(null);\n const started = performance.now();\n try {\n const next = await execute(request);\n setResult({\n ...next,\n durationMs: next.durationMs ?? performance.now() - started,\n });\n lastRun.current = {\n query: request.query,\n options: request.options,\n ...(next.columns ? { columns: next.columns } : {}),\n };\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setPending(false);\n }\n },\n [execute],\n );\n\n const currentQuery = useCallback(() => {\n const view = editor.current;\n if (!view) return initialQuery;\n const selection = view.state.selection.main;\n if (!selection.empty)\n return view.state.sliceDoc(selection.from, selection.to);\n return view.state.doc.toString();\n }, [initialQuery]);\n\n const run = useCallback(async () => {\n const query = currentQuery().trim();\n if (!query || pending) return;\n setEntries(rememberQuery(id, query));\n // A different statement is a different result set, so neither its filters\n // nor the columns they bind to survive: both name columns the new query may\n // not return.\n const repeat = lastRun.current?.query === query ? lastRun.current : null;\n const carried = repeat ? filters : {};\n if (carried !== filters) setFilters(carried);\n lastRun.current = { query, options };\n executedFilters.current = carried;\n await runRequest({\n query,\n options,\n ...(Object.keys(carried).length > 0 ? { filters: carried } : {}),\n ...(repeat?.columns ? { columns: repeat.columns } : {}),\n });\n }, [currentQuery, filters, id, options, pending, runRequest]);\n\n // A filter pill is not a draft the way query text is: it commits a discrete\n // value on selection, and the bar already debounces its free-text fields. So\n // a change re-runs the last executed query immediately rather than waiting\n // for Run, which is also how the profile catalog behaves.\n const rerunWithFilters = useCallback(\n async (selection: DataTableFilterSelection) => {\n const previous = lastRun.current;\n if (!previous) {\n throw new Error(\"QueryBrowser: a filter changed before any query had run\");\n }\n await runRequest({ ...previous, filters: selection });\n },\n [runRequest],\n );\n\n useEffect(() => {\n if (!lastRun.current) return;\n if (filters === executedFilters.current) return;\n executedFilters.current = filters;\n void rerunWithFilters(filters);\n }, [filters, rerunWithFilters]);\n\n executeRef.current = () => void run();\n onQueryChangeRef.current = onQueryChange;\n\n useEffect(() => {\n if (!editorHost.current) return;\n const view = new EditorView({\n parent: editorHost.current,\n state: EditorState.create({\n doc: initialQuery,\n extensions: editorExtensions(\n () => executeRef.current(),\n (query) => onQueryChangeRef.current?.(query),\n languageConfig.current.of(languageExtension(language, completion)),\n ),\n }),\n });\n editor.current = view;\n return () => {\n editor.current = null;\n view.destroy();\n };\n }, [id, language]);\n\n useEffect(() => {\n const view = editor.current;\n if (!view) return;\n view.dispatch({\n effects: languageConfig.current.reconfigure(\n languageExtension(language, completion),\n ),\n });\n }, [completion, language]);\n\n useEffect(() => {\n const view = editor.current;\n if (!view || view.state.doc.toString() === initialQuery) return;\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: initialQuery },\n });\n }, [initialQuery]);\n\n useEffect(() => {\n setOptions(initialOptions ?? {});\n }, [initialOptions]);\n\n const updateOptions = useCallback(\n (next: Record<string, unknown>) => {\n setOptions(next);\n onOptionsChange?.(next);\n },\n [onOptionsChange],\n );\n\n useEffect(() => {\n setEntries(readHistory(id));\n setResult(null);\n setError(null);\n setFilters({});\n lastRun.current = null;\n executedFilters.current = {};\n }, [id]);\n\n const rows = result?.rows ?? [];\n const described = result?.columns ?? [];\n const columns = useMemo(\n () =>\n described.length > 0\n ? serverColumnsToDataTableColumns<Record<string, unknown>>(described)\n : inferColumns(rows, { literalKeys: true }),\n [described, rows],\n );\n const lookupValues = useMemo<DataTableFilterLookup | undefined>(() => {\n if (!lookupFilterValues) return undefined;\n return (request) => {\n const previous = lastRun.current;\n if (!previous) {\n throw new Error(\"QueryBrowser: a filter lookup ran before any query had\");\n }\n return lookupFilterValues({ ...request, ...previous, filters });\n };\n }, [filters, lookupFilterValues]);\n const filterConfig = useMemo(\n () =>\n serverFiltersToFilterBar(\n described,\n filters,\n setFilters,\n lookupValues ? { lookupValues } : {},\n ),\n [described, filters, lookupValues],\n );\n const serverFiltered =\n filterConfig.filters.length > 0 || filterConfig.timeRange !== undefined;\n const defaultResults = result ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-2\">\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-muted-foreground\">\n <span>\n {rows.length.toLocaleString()} rows{result.truncated ? \"+\" : \"\"}\n </span>\n {/* A \"+\" says there is more without saying the console stopped, which\n reads as a small table rather than a bounded read. Naming the bound\n is what makes the difference visible. */}\n {result.truncated && (\n <span className=\"text-amber-600 [[data-theme=dark]_&]:text-amber-400\">\n stopped at the console's {(result.limit ?? rows.length).toLocaleString()}-row bound;\n narrow the query to see the rest\n </span>\n )}\n {result.affectedRows !== undefined && (\n <span>{result.affectedRows.toLocaleString()} affected</span>\n )}\n {result.durationMs !== undefined && (\n <span>{Math.round(result.durationMs)} ms</span>\n )}\n {result.message && <span>{result.message}</span>}\n </div>\n {/* A described result keeps its table at zero rows: a filter that\n excluded everything must not unmount the bar that would undo it. */}\n {rows.length > 0 || described.length > 0 ? (\n <DataTable\n data={rows}\n columns={columns}\n loading={pending}\n autoFilter={false}\n {...(serverFiltered\n ? {\n manualFilter: true,\n externalFilters: filterConfig.filters,\n ...(filterConfig.timeRange ? { externalTimeRange: filterConfig.timeRange } : {}),\n }\n : { showGlobalFilter: true })}\n showFullscreenControl\n fullscreenTitle={title ?? queryLabel}\n detailStyle=\"dialog\"\n detailDialogTitle=\"Row details\"\n renderExpandedRow={(row) => (\n <Properties\n items={Object.entries(row).map(([key, value]) => ({\n key,\n value,\n }))}\n renderLabel={(key) => key}\n density=\"compact\"\n />\n )}\n className=\"min-h-0 flex-1\"\n />\n ) : (\n <div className=\"rounded-md border border-dashed p-6 text-sm text-muted-foreground\">\n {result.message ?? \"Statement completed with no rows.\"}\n </div>\n )}\n </div>\n ) : (\n <div className=\"grid min-h-40 place-items-center text-sm text-muted-foreground\">\n Run a query to see results.\n </div>\n );\n\n const workspace = (\n <div className=\"flex h-full min-h-0 flex-col overflow-hidden rounded-xl border bg-card\">\n <div className=\"flex flex-wrap items-center gap-2 border-b px-3 py-2\">\n <div className=\"min-w-0 flex-1\">\n {title && <h2 className=\"truncate text-sm font-semibold\">{title}</h2>}\n <p className=\"text-xs text-muted-foreground\">{queryLabel}</p>\n </div>\n {entries.length > 0 && (\n <select\n aria-label=\"Query history\"\n defaultValue=\"\"\n onChange={(event) => {\n const query = event.target.value;\n const view = editor.current;\n if (!view || !query) return;\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: query },\n });\n event.target.value = \"\";\n }}\n className=\"h-8 max-w-52 rounded-md border bg-background px-2 text-xs\"\n >\n <option value=\"\">History</option>\n {entries.map((entry) => (\n <option key={`${entry.at}:${entry.query}`} value={entry.query}>\n {entry.query.replace(/\\s+/g, \" \").slice(0, 80)}\n </option>\n ))}\n </select>\n )}\n <Button\n size=\"sm\"\n onClick={() => void run()}\n loading={pending}\n loadingLabel={pending ? \"Running\" : undefined}\n >\n <Icon icon={UiPlay} className=\"size-4\" />\n Run\n </Button>\n </div>\n {optionsSchema &&\n Object.keys(optionsSchema.properties ?? {}).length > 0 && (\n <div className=\"border-b px-3 py-2\">\n <JsonSchemaForm\n schema={optionsSchema}\n value={options}\n onChange={updateOptions}\n size=\"sm\"\n inline\n showPreferencesMenu={false}\n persistPreferences={false}\n />\n </div>\n )}\n <div ref={editorHost} className=\"h-[34%] min-h-44 border-b\" />\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto p-3\">\n {error ? (\n <ErrorDetails\n diagnostics={{\n message: error,\n context: [\n [\"Query\", currentQuery()],\n [\"Language\", language],\n ],\n }}\n />\n ) : result && renderResults ? (\n renderResults({ result, defaultView: defaultResults })\n ) : (\n defaultResults\n )}\n </div>\n </div>\n );\n\n return (\n <div className={cn(\"h-[calc(100vh-15rem)] min-h-[32rem]\", className)}>\n {navigator ? (\n <SplitPane defaultSplit={28} left={navigator} right={workspace} />\n ) : (\n workspace\n )}\n </div>\n );\n}\n"],"names":["languageExtension"],"mappings":"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"}
1
+ {"version":3,"file":"QueryBrowser.js","sources":["../../../src/data/query-browser/QueryBrowser.tsx"],"sourcesContent":["import { Compartment, EditorState } from \"@codemirror/state\";\nimport { EditorView } from \"@codemirror/view\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { JsonSchemaForm } from \"../../components/JsonSchemaForm\";\nimport { cn } from \"../../lib/utils\";\nimport { SplitPane } from \"../../layout/SplitPane\";\nimport { Icon } from \"../Icon\";\nimport { UiDebug, UiPlay } from \"../../icons\";\nimport type { DataTablePagination } from \"../DataTable\";\nimport { inferColumns } from \"../data-table-utils\";\nimport type { DataTableFilterSelection } from \"../data-table-filter-values\";\nimport {\n serverColumnsToDataTableColumns,\n serverFiltersToFilterBar,\n type DataTableFilterLookup,\n type DataTableServerColumn,\n} from \"../data-table-server-filters\";\nimport { ErrorDetails } from \"../diagnostics/ErrorDetails\";\nimport type { ErrorDiagnostics } from \"../diagnostics/error-diagnostics\";\nimport {\n queryBrowserEditorExtensions,\n queryBrowserLanguageExtension,\n readQueryBrowserHistory,\n rememberQueryBrowserQuery,\n type QueryBrowserHistoryEntry,\n} from \"./QueryBrowser.editor\";\nimport { QueryBrowserDiagnosticsPanel } from \"./QueryBrowserDiagnosticsPanel\";\nimport { QueryBrowserResults } from \"./QueryBrowserResults\";\nimport {\n QueryBrowserExecutionError,\n type QueryBrowserDiagnostics,\n type QueryBrowserProps,\n type QueryBrowserRequest,\n type QueryBrowserResult,\n} from \"./QueryBrowser.types\";\n\nexport function QueryBrowser({\n id,\n title,\n language = \"text\",\n initialQuery = \"\",\n queryLabel = \"Query\",\n optionsSchema,\n initialOptions,\n completion,\n onQueryChange,\n onOptionsChange,\n navigator,\n execute,\n lookupFilterValues,\n renderResults,\n className,\n}: QueryBrowserProps) {\n const editorHost = useRef<HTMLDivElement | null>(null);\n const editor = useRef<EditorView | null>(null);\n const languageConfig = useRef(new Compartment());\n const executeRef = useRef<() => void>(() => undefined);\n const onQueryChangeRef = useRef(onQueryChange);\n const [options, setOptions] = useState<Record<string, unknown>>(\n initialOptions ?? {},\n );\n const [result, setResult] = useState<QueryBrowserResult | null>(null);\n const [error, setError] = useState<{\n message: string;\n query: string;\n diagnostics?: QueryBrowserDiagnostics;\n errorDetails?: ErrorDiagnostics;\n } | null>(null);\n const [pending, setPending] = useState(false);\n const [debug, setDebug] = useState(false);\n const [entries, setEntries] = useState<QueryBrowserHistoryEntry[]>(() =>\n readQueryBrowserHistory(id),\n );\n const [filters, setFilters] = useState<DataTableFilterSelection>({});\n // What the displayed result came from. A filter re-runs *this*, never the\n // editor's current text — otherwise changing a pill would execute a\n // half-typed edit nobody asked to run.\n const lastRun = useRef<{\n query: string;\n options: Record<string, unknown>;\n filters?: DataTableFilterSelection;\n columns?: DataTableServerColumn[];\n } | null>(null);\n const executedFilters = useRef<DataTableFilterSelection>({});\n\n // Every run goes through here so the record a filter re-runs from is refreshed\n // in one place: the query, its options, and the columns the source described,\n // which are what a subsequent selection binds to.\n const runRequest = useCallback(\n async (request: QueryBrowserRequest) => {\n setPending(true);\n setError(null);\n const started = performance.now();\n try {\n const next = await execute(request);\n setResult({\n ...next,\n durationMs: next.durationMs ?? performance.now() - started,\n });\n lastRun.current = {\n query: request.query,\n options: request.options,\n ...(request.filters ? { filters: request.filters } : {}),\n ...(next.columns ? { columns: next.columns } : {}),\n };\n } catch (err) {\n setError({\n message: err instanceof Error ? err.message : String(err),\n query: request.query,\n ...(err instanceof QueryBrowserExecutionError && err.diagnostics\n ? { diagnostics: err.diagnostics }\n : {}),\n ...(err instanceof QueryBrowserExecutionError && err.errorDetails\n ? { errorDetails: err.errorDetails }\n : {}),\n });\n } finally {\n setPending(false);\n }\n },\n [execute],\n );\n\n const currentQuery = useCallback(() => {\n const view = editor.current;\n if (!view) return initialQuery;\n const selection = view.state.selection.main;\n if (!selection.empty)\n return view.state.sliceDoc(selection.from, selection.to);\n return view.state.doc.toString();\n }, [initialQuery]);\n\n const run = useCallback(async () => {\n const query = currentQuery().trim();\n if (!query || pending) return;\n setEntries(rememberQueryBrowserQuery(id, query));\n // A different statement is a different result set, so neither its filters\n // nor the columns they bind to survive: both name columns the new query may\n // not return.\n const repeat = lastRun.current?.query === query ? lastRun.current : null;\n const carried = repeat ? filters : {};\n if (carried !== filters) setFilters(carried);\n lastRun.current = { query, options };\n executedFilters.current = carried;\n await runRequest({\n query,\n options,\n ...(Object.keys(carried).length > 0 ? { filters: carried } : {}),\n ...(repeat?.columns ? { columns: repeat.columns } : {}),\n ...(debug ? { debug: true } : {}),\n });\n }, [currentQuery, debug, filters, id, options, pending, runRequest]);\n\n // A filter pill is not a draft the way query text is: it commits a discrete\n // value on selection, and the bar already debounces its free-text fields. So\n // a change re-runs the last executed query immediately rather than waiting\n // for Run, which is also how the profile catalog behaves.\n const rerunWithFilters = useCallback(\n async (selection: DataTableFilterSelection) => {\n const previous = lastRun.current;\n if (!previous) {\n throw new Error(\n \"QueryBrowser: a filter changed before any query had run\",\n );\n }\n await runRequest({\n ...previous,\n filters: selection,\n ...(result?.pagination\n ? { pagination: { limit: result.pagination.limit } }\n : {}),\n ...(debug ? { debug: true } : {}),\n });\n },\n [debug, result?.pagination, runRequest],\n );\n\n const rerunAt = useCallback(\n async (pagination: NonNullable<QueryBrowserRequest[\"pagination\"]>) => {\n const previous = lastRun.current;\n if (!previous) {\n throw new Error(\n \"QueryBrowser: pagination changed before any query had run\",\n );\n }\n await runRequest({\n ...previous,\n pagination,\n ...(debug ? { debug: true } : {}),\n });\n },\n [debug, runRequest],\n );\n\n useEffect(() => {\n if (!lastRun.current) return;\n if (filters === executedFilters.current) return;\n executedFilters.current = filters;\n void rerunWithFilters(filters);\n }, [filters, rerunWithFilters]);\n\n executeRef.current = () => void run();\n onQueryChangeRef.current = onQueryChange;\n\n useEffect(() => {\n if (!editorHost.current) return;\n const view = new EditorView({\n parent: editorHost.current,\n state: EditorState.create({\n doc: initialQuery,\n extensions: queryBrowserEditorExtensions(\n () => executeRef.current(),\n (query) => onQueryChangeRef.current?.(query),\n languageConfig.current.of(\n queryBrowserLanguageExtension(language, completion),\n ),\n ),\n }),\n });\n editor.current = view;\n return () => {\n editor.current = null;\n view.destroy();\n };\n }, [id, language]);\n\n useEffect(() => {\n const view = editor.current;\n if (!view) return;\n view.dispatch({\n effects: languageConfig.current.reconfigure(\n queryBrowserLanguageExtension(language, completion),\n ),\n });\n }, [completion, language]);\n\n useEffect(() => {\n const view = editor.current;\n if (!view || view.state.doc.toString() === initialQuery) return;\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: initialQuery },\n });\n }, [initialQuery]);\n\n useEffect(() => {\n setOptions(initialOptions ?? {});\n }, [initialOptions]);\n\n const updateOptions = useCallback(\n (next: Record<string, unknown>) => {\n setOptions(next);\n onOptionsChange?.(next);\n },\n [onOptionsChange],\n );\n\n useEffect(() => {\n setEntries(readQueryBrowserHistory(id));\n setResult(null);\n setError(null);\n setFilters({});\n setDebug(false);\n lastRun.current = null;\n executedFilters.current = {};\n }, [id]);\n\n const rows = result?.rows ?? [];\n const described = result?.columns ?? [];\n const columns = useMemo(\n () =>\n described.length > 0\n ? serverColumnsToDataTableColumns<Record<string, unknown>>(described)\n : inferColumns(rows, { literalKeys: true }),\n [described, rows],\n );\n const lookupValues = useMemo<DataTableFilterLookup | undefined>(() => {\n if (!lookupFilterValues) return undefined;\n return (request) => {\n const previous = lastRun.current;\n if (!previous) {\n throw new Error(\n \"QueryBrowser: a filter lookup ran before any query had\",\n );\n }\n return lookupFilterValues({ ...request, ...previous, filters });\n };\n }, [filters, lookupFilterValues]);\n const filterConfig = useMemo(\n () =>\n serverFiltersToFilterBar(\n described,\n filters,\n setFilters,\n lookupValues ? { lookupValues } : {},\n ),\n [described, filters, lookupValues],\n );\n const serverFiltered =\n filterConfig.filters.length > 0 || filterConfig.timeRange !== undefined;\n const tablePagination = useMemo<DataTablePagination | undefined>(() => {\n const pagination = result?.pagination;\n if (!pagination) return undefined;\n const shared = {\n pageSize: pagination.limit,\n ...(pagination.total !== undefined ? { total: pagination.total } : {}),\n ...(pagination.totalRelation === \"eq\" ||\n pagination.totalRelation === \"gte\"\n ? { totalRelation: pagination.totalRelation }\n : {}),\n hasMore: pagination.hasMore,\n onPageSizeChange: (limit: number) => void rerunAt({ limit }),\n };\n if (pagination.mode === \"cursor\") {\n return {\n ...shared,\n page: 0,\n cursor: {\n ...(pagination.cursor ? { current: pagination.cursor } : {}),\n ...(pagination.nextCursor ? { next: pagination.nextCursor } : {}),\n onCursorChange: (cursor: string | undefined) =>\n void rerunAt({\n limit: pagination.limit,\n ...(cursor ? { cursor } : {}),\n }),\n },\n };\n }\n const page = Math.floor((pagination.offset ?? 0) / pagination.limit);\n return {\n ...shared,\n page,\n onPageChange: (nextPage: number) =>\n void rerunAt({\n limit: pagination.limit,\n offset: nextPage * pagination.limit,\n }),\n };\n }, [rerunAt, result?.pagination]);\n const defaultResults = (\n <QueryBrowserResults\n result={result}\n pending={pending}\n {...(title ? { title } : {})}\n queryLabel={queryLabel}\n columns={columns}\n filterConfig={filterConfig}\n serverFiltered={serverFiltered}\n {...(tablePagination ? { pagination: tablePagination } : {})}\n />\n );\n\n const workspace = (\n <div className=\"flex h-full min-h-0 flex-col overflow-hidden rounded-xl border bg-card\">\n <div className=\"flex flex-wrap items-center gap-2 border-b px-3 py-2\">\n <div className=\"min-w-0 flex-1\">\n {title && <h2 className=\"truncate text-sm font-semibold\">{title}</h2>}\n <p className=\"text-xs text-muted-foreground\">{queryLabel}</p>\n </div>\n {entries.length > 0 && (\n <select\n aria-label=\"Query history\"\n defaultValue=\"\"\n onChange={(event) => {\n const query = event.target.value;\n const view = editor.current;\n if (!view || !query) return;\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: query },\n });\n event.target.value = \"\";\n }}\n className=\"h-8 max-w-52 rounded-md border bg-background px-2 text-xs\"\n >\n <option value=\"\">History</option>\n {entries.map((entry) => (\n <option key={`${entry.at}:${entry.query}`} value={entry.query}>\n {entry.query.replace(/\\s+/g, \" \").slice(0, 80)}\n </option>\n ))}\n </select>\n )}\n <Button\n size=\"sm\"\n variant={debug ? \"secondary\" : \"outline\"}\n aria-pressed={debug}\n onClick={() => setDebug((enabled) => !enabled)}\n >\n <Icon icon={UiDebug} className=\"size-4\" />\n Debug\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void run()}\n loading={pending}\n loadingLabel={pending ? \"Running\" : undefined}\n >\n <Icon icon={UiPlay} className=\"size-4\" />\n Run\n </Button>\n </div>\n {optionsSchema &&\n Object.keys(optionsSchema.properties ?? {}).length > 0 && (\n <div className=\"border-b px-3 py-2\">\n <JsonSchemaForm\n schema={optionsSchema}\n value={options}\n onChange={updateOptions}\n size=\"sm\"\n inline\n showPreferencesMenu={false}\n persistPreferences={false}\n />\n </div>\n )}\n <div ref={editorHost} className=\"h-[34%] min-h-44 border-b\" />\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto p-3\">\n {error ? (\n <div className=\"space-y-3\">\n <ErrorDetails\n diagnostics={{\n ...(error.errorDetails ?? {\n message: error.message,\n context: [],\n }),\n context: [\n ...(error.errorDetails?.context ?? []),\n [\"Query\", error.query],\n [\"Language\", language],\n ],\n }}\n />\n {error.diagnostics && (\n <QueryBrowserDiagnosticsPanel diagnostics={error.diagnostics} />\n )}\n </div>\n ) : result && renderResults ? (\n renderResults({ result, defaultView: defaultResults })\n ) : (\n defaultResults\n )}\n </div>\n </div>\n );\n\n return (\n <div className={cn(\"h-[calc(100vh-15rem)] min-h-[32rem]\", className)}>\n {navigator ? (\n <SplitPane defaultSplit={28} left={navigator} right={workspace} />\n ) : (\n workspace\n )}\n </div>\n );\n}\n"],"names":["_a"],"mappings":";;;;;;;;;;;;;;;;;;AAqCO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,eAAe;AAAA,EACf,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;;AACpB,QAAM,aAAa,OAA8B,IAAI;AACrD,QAAM,SAAS,OAA0B,IAAI;AAC7C,QAAM,iBAAiB,OAAO,IAAI,aAAa;AAC/C,QAAM,aAAa,OAAmB,MAAM,MAAS;AACrD,QAAM,mBAAmB,OAAO,aAAa;AAC7C,QAAM,CAAC,SAAS,UAAU,IAAI;AAAA,IAC5B,kBAAkB,CAAA;AAAA,EAAC;AAErB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAoC,IAAI;AACpE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAKhB,IAAI;AACd,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK;AACxC,QAAM,CAAC,SAAS,UAAU,IAAI;AAAA,IAAqC,MACjE,wBAAwB,EAAE;AAAA,EAAA;AAE5B,QAAM,CAAC,SAAS,UAAU,IAAI,SAAmC,CAAA,CAAE;AAInE,QAAM,UAAU,OAKN,IAAI;AACd,QAAM,kBAAkB,OAAiC,EAAE;AAK3D,QAAM,aAAa;AAAA,IACjB,OAAO,YAAiC;AACtC,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,YAAM,UAAU,YAAY,IAAA;AAC5B,UAAI;AACF,cAAM,OAAO,MAAM,QAAQ,OAAO;AAClC,kBAAU;AAAA,UACR,GAAG;AAAA,UACH,YAAY,KAAK,cAAc,YAAY,QAAQ;AAAA,QAAA,CACpD;AACD,gBAAQ,UAAU;AAAA,UAChB,OAAO,QAAQ;AAAA,UACf,SAAS,QAAQ;AAAA,UACjB,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAA,IAAY,CAAA;AAAA,UACrD,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAA,IAAY,CAAA;AAAA,QAAC;AAAA,MAEpD,SAAS,KAAK;AACZ,iBAAS;AAAA,UACP,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,UACxD,OAAO,QAAQ;AAAA,UACf,GAAI,eAAe,8BAA8B,IAAI,cACjD,EAAE,aAAa,IAAI,YAAA,IACnB,CAAA;AAAA,UACJ,GAAI,eAAe,8BAA8B,IAAI,eACjD,EAAE,cAAc,IAAI,iBACpB,CAAA;AAAA,QAAC,CACN;AAAA,MACH,UAAA;AACE,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,OAAO;AAAA,EAAA;AAGV,QAAM,eAAe,YAAY,MAAM;AACrC,UAAM,OAAO,OAAO;AACpB,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,YAAY,KAAK,MAAM,UAAU;AACvC,QAAI,CAAC,UAAU;AACb,aAAO,KAAK,MAAM,SAAS,UAAU,MAAM,UAAU,EAAE;AACzD,WAAO,KAAK,MAAM,IAAI,SAAA;AAAA,EACxB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,MAAM,YAAY,YAAY;;AAClC,UAAM,QAAQ,aAAA,EAAe,KAAA;AAC7B,QAAI,CAAC,SAAS,QAAS;AACvB,eAAW,0BAA0B,IAAI,KAAK,CAAC;AAI/C,UAAM,WAASA,MAAA,QAAQ,YAAR,gBAAAA,IAAiB,WAAU,QAAQ,QAAQ,UAAU;AACpE,UAAM,UAAU,SAAS,UAAU,CAAA;AACnC,QAAI,YAAY,QAAS,YAAW,OAAO;AAC3C,YAAQ,UAAU,EAAE,OAAO,QAAA;AAC3B,oBAAgB,UAAU;AAC1B,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA,GAAI,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,EAAE,SAAS,QAAA,IAAY,CAAA;AAAA,MAC7D,IAAI,iCAAQ,WAAU,EAAE,SAAS,OAAO,QAAA,IAAY,CAAA;AAAA,MACpD,GAAI,QAAQ,EAAE,OAAO,SAAS,CAAA;AAAA,IAAC,CAChC;AAAA,EACH,GAAG,CAAC,cAAc,OAAO,SAAS,IAAI,SAAS,SAAS,UAAU,CAAC;AAMnE,QAAM,mBAAmB;AAAA,IACvB,OAAO,cAAwC;AAC7C,YAAM,WAAW,QAAQ;AACzB,UAAI,CAAC,UAAU;AACb,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AACA,YAAM,WAAW;AAAA,QACf,GAAG;AAAA,QACH,SAAS;AAAA,QACT,IAAI,iCAAQ,cACR,EAAE,YAAY,EAAE,OAAO,OAAO,WAAW,MAAA,EAAM,IAC/C,CAAA;AAAA,QACJ,GAAI,QAAQ,EAAE,OAAO,SAAS,CAAA;AAAA,MAAC,CAChC;AAAA,IACH;AAAA,IACA,CAAC,OAAO,iCAAQ,YAAY,UAAU;AAAA,EAAA;AAGxC,QAAM,UAAU;AAAA,IACd,OAAO,eAA+D;AACpE,YAAM,WAAW,QAAQ;AACzB,UAAI,CAAC,UAAU;AACb,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AACA,YAAM,WAAW;AAAA,QACf,GAAG;AAAA,QACH;AAAA,QACA,GAAI,QAAQ,EAAE,OAAO,SAAS,CAAA;AAAA,MAAC,CAChC;AAAA,IACH;AAAA,IACA,CAAC,OAAO,UAAU;AAAA,EAAA;AAGpB,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ,QAAS;AACtB,QAAI,YAAY,gBAAgB,QAAS;AACzC,oBAAgB,UAAU;AAC1B,SAAK,iBAAiB,OAAO;AAAA,EAC/B,GAAG,CAAC,SAAS,gBAAgB,CAAC;AAE9B,aAAW,UAAU,MAAM,KAAK,IAAA;AAChC,mBAAiB,UAAU;AAE3B,YAAU,MAAM;AACd,QAAI,CAAC,WAAW,QAAS;AACzB,UAAM,OAAO,IAAI,WAAW;AAAA,MAC1B,QAAQ,WAAW;AAAA,MACnB,OAAO,YAAY,OAAO;AAAA,QACxB,KAAK;AAAA,QACL,YAAY;AAAA,UACV,MAAM,WAAW,QAAA;AAAA,UACjB,CAAC,UAAA;;AAAU,oBAAAA,MAAA,iBAAiB,YAAjB,gBAAAA,IAAA,uBAA2B;AAAA;AAAA,UACtC,eAAe,QAAQ;AAAA,YACrB,8BAA8B,UAAU,UAAU;AAAA,UAAA;AAAA,QACpD;AAAA,MACF,CACD;AAAA,IAAA,CACF;AACD,WAAO,UAAU;AACjB,WAAO,MAAM;AACX,aAAO,UAAU;AACjB,WAAK,QAAA;AAAA,IACP;AAAA,EACF,GAAG,CAAC,IAAI,QAAQ,CAAC;AAEjB,YAAU,MAAM;AACd,UAAM,OAAO,OAAO;AACpB,QAAI,CAAC,KAAM;AACX,SAAK,SAAS;AAAA,MACZ,SAAS,eAAe,QAAQ;AAAA,QAC9B,8BAA8B,UAAU,UAAU;AAAA,MAAA;AAAA,IACpD,CACD;AAAA,EACH,GAAG,CAAC,YAAY,QAAQ,CAAC;AAEzB,YAAU,MAAM;AACd,UAAM,OAAO,OAAO;AACpB,QAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,SAAA,MAAe,aAAc;AACzD,SAAK,SAAS;AAAA,MACZ,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,IAAI,QAAQ,QAAQ,aAAA;AAAA,IAAa,CACrE;AAAA,EACH,GAAG,CAAC,YAAY,CAAC;AAEjB,YAAU,MAAM;AACd,eAAW,kBAAkB,EAAE;AAAA,EACjC,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,gBAAgB;AAAA,IACpB,CAAC,SAAkC;AACjC,iBAAW,IAAI;AACf,yDAAkB;AAAA,IACpB;AAAA,IACA,CAAC,eAAe;AAAA,EAAA;AAGlB,YAAU,MAAM;AACd,eAAW,wBAAwB,EAAE,CAAC;AACtC,cAAU,IAAI;AACd,aAAS,IAAI;AACb,eAAW,CAAA,CAAE;AACb,aAAS,KAAK;AACd,YAAQ,UAAU;AAClB,oBAAgB,UAAU,CAAA;AAAA,EAC5B,GAAG,CAAC,EAAE,CAAC;AAEP,QAAM,QAAO,iCAAQ,SAAQ,CAAA;AAC7B,QAAM,aAAY,iCAAQ,YAAW,CAAA;AACrC,QAAM,UAAU;AAAA,IACd,MACE,UAAU,SAAS,IACf,gCAAyD,SAAS,IAClE,aAAa,MAAM,EAAE,aAAa,KAAA,CAAM;AAAA,IAC9C,CAAC,WAAW,IAAI;AAAA,EAAA;AAElB,QAAM,eAAe,QAA2C,MAAM;AACpE,QAAI,CAAC,mBAAoB,QAAO;AAChC,WAAO,CAAC,YAAY;AAClB,YAAM,WAAW,QAAQ;AACzB,UAAI,CAAC,UAAU;AACb,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AACA,aAAO,mBAAmB,EAAE,GAAG,SAAS,GAAG,UAAU,SAAS;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,SAAS,kBAAkB,CAAC;AAChC,QAAM,eAAe;AAAA,IACnB,MACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,EAAE,iBAAiB,CAAA;AAAA,IAAC;AAAA,IAEvC,CAAC,WAAW,SAAS,YAAY;AAAA,EAAA;AAEnC,QAAM,iBACJ,aAAa,QAAQ,SAAS,KAAK,aAAa,cAAc;AAChE,QAAM,kBAAkB,QAAyC,MAAM;AACrE,UAAM,aAAa,iCAAQ;AAC3B,QAAI,CAAC,WAAY,QAAO;AACxB,UAAM,SAAS;AAAA,MACb,UAAU,WAAW;AAAA,MACrB,GAAI,WAAW,UAAU,SAAY,EAAE,OAAO,WAAW,MAAA,IAAU,CAAA;AAAA,MACnE,GAAI,WAAW,kBAAkB,QACjC,WAAW,kBAAkB,QACzB,EAAE,eAAe,WAAW,cAAA,IAC5B,CAAA;AAAA,MACJ,SAAS,WAAW;AAAA,MACpB,kBAAkB,CAAC,UAAkB,KAAK,QAAQ,EAAE,OAAO;AAAA,IAAA;AAE7D,QAAI,WAAW,SAAS,UAAU;AAChC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,GAAI,WAAW,SAAS,EAAE,SAAS,WAAW,OAAA,IAAW,CAAA;AAAA,UACzD,GAAI,WAAW,aAAa,EAAE,MAAM,WAAW,WAAA,IAAe,CAAA;AAAA,UAC9D,gBAAgB,CAAC,WACf,KAAK,QAAQ;AAAA,YACX,OAAO,WAAW;AAAA,YAClB,GAAI,SAAS,EAAE,WAAW,CAAA;AAAA,UAAC,CAC5B;AAAA,QAAA;AAAA,MACL;AAAA,IAEJ;AACA,UAAM,OAAO,KAAK,OAAO,WAAW,UAAU,KAAK,WAAW,KAAK;AACnE,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA,cAAc,CAAC,aACb,KAAK,QAAQ;AAAA,QACX,OAAO,WAAW;AAAA,QAClB,QAAQ,WAAW,WAAW;AAAA,MAAA,CAC/B;AAAA,IAAA;AAAA,EAEP,GAAG,CAAC,SAAS,iCAAQ,UAAU,CAAC;AAChC,QAAM,iBACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACC,GAAI,QAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAI,kBAAkB,EAAE,YAAY,oBAAoB,CAAA;AAAA,IAAC;AAAA,EAAA;AAI9D,QAAM,YACJ,qBAAC,OAAA,EAAI,WAAU,0EACb,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,wDACb,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAI,WAAU,kBACZ,UAAA;AAAA,QAAA,SAAS,oBAAC,MAAA,EAAG,WAAU,kCAAkC,UAAA,OAAM;AAAA,QAChE,oBAAC,KAAA,EAAE,WAAU,iCAAiC,UAAA,WAAA,CAAW;AAAA,MAAA,GAC3D;AAAA,MACC,QAAQ,SAAS,KAChB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,cAAa;AAAA,UACb,UAAU,CAAC,UAAU;AACnB,kBAAM,QAAQ,MAAM,OAAO;AAC3B,kBAAM,OAAO,OAAO;AACpB,gBAAI,CAAC,QAAQ,CAAC,MAAO;AACrB,iBAAK,SAAS;AAAA,cACZ,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,IAAI,QAAQ,QAAQ,MAAA;AAAA,YAAM,CAC9D;AACD,kBAAM,OAAO,QAAQ;AAAA,UACvB;AAAA,UACA,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,oBAAC,UAAA,EAAO,OAAM,IAAG,UAAA,WAAO;AAAA,YACvB,QAAQ,IAAI,CAAC,UACZ,oBAAC,UAAA,EAA0C,OAAO,MAAM,OACrD,UAAA,MAAM,MAAM,QAAQ,QAAQ,GAAG,EAAE,MAAM,GAAG,EAAE,EAAA,GADlC,GAAG,MAAM,EAAE,IAAI,MAAM,KAAK,EAEvC,CACD;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGL;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,QAAQ,cAAc;AAAA,UAC/B,gBAAc;AAAA,UACd,SAAS,MAAM,SAAS,CAAC,YAAY,CAAC,OAAO;AAAA,UAE7C,UAAA;AAAA,YAAA,oBAAC,MAAA,EAAK,MAAM,SAAS,WAAU,UAAS;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAG5C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,KAAK,IAAA;AAAA,UACpB,SAAS;AAAA,UACT,cAAc,UAAU,YAAY;AAAA,UAEpC,UAAA;AAAA,YAAA,oBAAC,MAAA,EAAK,MAAM,QAAQ,WAAU,UAAS;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAE3C,GACF;AAAA,IACC,iBACC,OAAO,KAAK,cAAc,cAAc,CAAA,CAAE,EAAE,SAAS,KACnD,oBAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAU;AAAA,QACV,MAAK;AAAA,QACL,QAAM;AAAA,QACN,qBAAqB;AAAA,QACrB,oBAAoB;AAAA,MAAA;AAAA,IAAA,GAExB;AAAA,IAEJ,oBAAC,OAAA,EAAI,KAAK,YAAY,WAAU,6BAA4B;AAAA,IAC5D,oBAAC,SAAI,WAAU,kDACZ,kBACC,qBAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,aAAa;AAAA,YACX,GAAI,MAAM,gBAAgB;AAAA,cACxB,SAAS,MAAM;AAAA,cACf,SAAS,CAAA;AAAA,YAAC;AAAA,YAEZ,SAAS;AAAA,cACP,KAAI,WAAM,iBAAN,mBAAoB,YAAW,CAAA;AAAA,cACnC,CAAC,SAAS,MAAM,KAAK;AAAA,cACrB,CAAC,YAAY,QAAQ;AAAA,YAAA;AAAA,UACvB;AAAA,QACF;AAAA,MAAA;AAAA,MAED,MAAM,eACL,oBAAC,8BAAA,EAA6B,aAAa,MAAM,YAAA,CAAa;AAAA,IAAA,GAElE,IACE,UAAU,gBACZ,cAAc,EAAE,QAAQ,aAAa,gBAAgB,IAErD,eAAA,CAEJ;AAAA,EAAA,GACF;AAGF,6BACG,OAAA,EAAI,WAAW,GAAG,uCAAuC,SAAS,GAChE,UAAA,YACC,oBAAC,WAAA,EAAU,cAAc,IAAI,MAAM,WAAW,OAAO,UAAA,CAAW,IAEhE,WAEJ;AAEJ;"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ class QueryBrowserExecutionError extends Error {
4
+ constructor(message, diagnostics, errorDetails) {
5
+ super(message);
6
+ this.diagnostics = diagnostics;
7
+ this.errorDetails = errorDetails;
8
+ this.name = "QueryBrowserExecutionError";
9
+ }
10
+ }
11
+ exports.QueryBrowserExecutionError = QueryBrowserExecutionError;
12
+ //# sourceMappingURL=QueryBrowser.types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryBrowser.types.cjs","sources":["../../../src/data/query-browser/QueryBrowser.types.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { JsonSchemaObject } from \"../../components/json-schema-form-types\";\nimport type { ErrorDiagnostics } from \"../diagnostics/error-diagnostics\";\nimport type { DataTableFilterSelection } from \"../data-table-filter-values\";\nimport type {\n DataTableFilterLookupRequest,\n DataTableFilterLookupResult,\n DataTableServerColumn,\n} from \"../data-table-server-filters\";\nimport type { QueryBrowserCompletion } from \"./QueryBrowser.completion\";\nimport type { QueryBrowserLanguage } from \"./QueryBrowser.editor\";\n\nexport type QueryBrowserPagination = {\n mode: \"offset\" | \"cursor\";\n limit: number;\n offset?: number;\n cursor?: string;\n nextCursor?: string;\n hasMore: boolean;\n total?: number;\n totalRelation: \"eq\" | \"gte\" | \"unknown\";\n consistency: \"live\" | \"snapshot\";\n};\n\nexport type QueryBrowserDiagnostics = {\n provider: string;\n request: {\n query?: string;\n arguments?: unknown[];\n options?: Record<string, unknown>;\n details?: Record<string, unknown>;\n };\n response?: {\n durationMs?: number;\n returnedRows?: number;\n details?: Record<string, unknown>;\n preview?: string;\n contentType?: string;\n truncated?: boolean;\n };\n error?: string;\n};\n\nexport class QueryBrowserExecutionError extends Error {\n constructor(\n message: string,\n readonly diagnostics?: QueryBrowserDiagnostics,\n readonly errorDetails?: ErrorDiagnostics,\n ) {\n super(message);\n this.name = \"QueryBrowserExecutionError\";\n }\n}\n\nexport type QueryBrowserResult = {\n rows?: Record<string, unknown>[];\n columns?: DataTableServerColumn[];\n affectedRows?: number;\n durationMs?: number;\n message?: string;\n truncated?: boolean;\n limit?: number;\n metadata?: Record<string, unknown>;\n pagination?: QueryBrowserPagination;\n diagnostics?: QueryBrowserDiagnostics;\n};\n\nexport type QueryBrowserRequest = {\n query: string;\n options: Record<string, unknown>;\n filters?: DataTableFilterSelection;\n columns?: DataTableServerColumn[];\n pagination?: { limit: number; offset?: number; cursor?: string };\n debug?: boolean;\n};\n\nexport type QueryBrowserFilterLookupRequest = DataTableFilterLookupRequest & {\n query: string;\n options: Record<string, unknown>;\n filters: DataTableFilterSelection;\n columns?: DataTableServerColumn[];\n};\n\nexport type QueryBrowserFilterLookup = (\n request: QueryBrowserFilterLookupRequest,\n) => Promise<DataTableFilterLookupResult>;\n\nexport type QueryBrowserResultContext = {\n result: QueryBrowserResult;\n defaultView: ReactNode;\n};\n\n// The optional props admit an explicit `undefined` — the same convention the\n// rest of the package follows (see data/CodeBlock.tsx). Passing a\n// possibly-absent value straight through, `className={maybe}`, is ordinary\n// React, and under exactOptionalPropertyTypes a bare `?:` rejects it.\nexport type QueryBrowserProps = {\n id: string;\n title?: string | undefined;\n language?: QueryBrowserLanguage | undefined;\n initialQuery?: string | undefined;\n queryLabel?: string | undefined;\n optionsSchema?: JsonSchemaObject | undefined;\n initialOptions?: Record<string, unknown> | undefined;\n completion?: QueryBrowserCompletion | undefined;\n onQueryChange?: ((query: string) => void) | undefined;\n onOptionsChange?: ((options: Record<string, unknown>) => void) | undefined;\n navigator?: ReactNode | undefined;\n execute: (request: QueryBrowserRequest) => Promise<QueryBrowserResult>;\n lookupFilterValues?: QueryBrowserFilterLookup | undefined;\n renderResults?: ((context: QueryBrowserResultContext) => ReactNode) | undefined;\n className?: string | undefined;\n};\n"],"names":[],"mappings":";;AA2CO,MAAM,mCAAmC,MAAM;AAAA,EACpD,YACE,SACS,aACA,cACT;AACA,UAAM,OAAO;AAHJ,SAAA,cAAA;AACA,SAAA,eAAA;AAGT,SAAK,OAAO;AAAA,EACd;AACF;;"}