@flanksource/clicky-ui 0.3.19 → 0.3.21

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 (450) hide show
  1. package/dist/components/ErrorWrapper.cjs +1 -1
  2. package/dist/components/ErrorWrapper.cjs.map +1 -1
  3. package/dist/components/ErrorWrapper.js +1 -1
  4. package/dist/components/ErrorWrapper.js.map +1 -1
  5. package/dist/components/UnitStepControls.cjs +55 -0
  6. package/dist/components/UnitStepControls.cjs.map +1 -0
  7. package/dist/components/UnitStepControls.d.ts +10 -0
  8. package/dist/components/UnitStepControls.d.ts.map +1 -0
  9. package/dist/components/UnitStepControls.js +55 -0
  10. package/dist/components/UnitStepControls.js.map +1 -0
  11. package/dist/components/json-schema-form-accordion-array.cjs +5 -73
  12. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
  13. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
  14. package/dist/components/json-schema-form-accordion-array.js +3 -71
  15. package/dist/components/json-schema-form-accordion-array.js.map +1 -1
  16. package/dist/components/json-schema-form-array.cjs +6 -1
  17. package/dist/components/json-schema-form-array.cjs.map +1 -1
  18. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  19. package/dist/components/json-schema-form-array.js +6 -1
  20. package/dist/components/json-schema-form-array.js.map +1 -1
  21. package/dist/components/json-schema-form-cards-array.cjs +96 -0
  22. package/dist/components/json-schema-form-cards-array.cjs.map +1 -0
  23. package/dist/components/json-schema-form-cards-array.d.ts +7 -0
  24. package/dist/components/json-schema-form-cards-array.d.ts.map +1 -0
  25. package/dist/components/json-schema-form-cards-array.js +96 -0
  26. package/dist/components/json-schema-form-cards-array.js.map +1 -0
  27. package/dist/components/json-schema-form-item-row.cjs +81 -0
  28. package/dist/components/json-schema-form-item-row.cjs.map +1 -0
  29. package/dist/components/json-schema-form-item-row.d.ts +19 -0
  30. package/dist/components/json-schema-form-item-row.d.ts.map +1 -0
  31. package/dist/components/json-schema-form-item-row.js +81 -0
  32. package/dist/components/json-schema-form-item-row.js.map +1 -0
  33. package/dist/components/json-schema-form-render.cjs +2 -2
  34. package/dist/components/json-schema-form-render.cjs.map +1 -1
  35. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  36. package/dist/components/json-schema-form-render.js +2 -2
  37. package/dist/components/json-schema-form-render.js.map +1 -1
  38. package/dist/components/json-schema-form-resolve.cjs +1 -1
  39. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  40. package/dist/components/json-schema-form-resolve.js +1 -1
  41. package/dist/components/json-schema-form-resolve.js.map +1 -1
  42. package/dist/components/json-schema-form-tone.cjs +12 -0
  43. package/dist/components/json-schema-form-tone.cjs.map +1 -1
  44. package/dist/components/json-schema-form-tone.js +12 -0
  45. package/dist/components/json-schema-form-tone.js.map +1 -1
  46. package/dist/components/json-schema-form-types.d.ts +1 -1
  47. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  48. package/dist/components/unit-form-extension.cjs +126 -0
  49. package/dist/components/unit-form-extension.cjs.map +1 -0
  50. package/dist/components/unit-form-extension.d.ts +8 -0
  51. package/dist/components/unit-form-extension.d.ts.map +1 -0
  52. package/dist/components/unit-form-extension.js +126 -0
  53. package/dist/components/unit-form-extension.js.map +1 -0
  54. package/dist/components.cjs +4 -0
  55. package/dist/components.cjs.map +1 -1
  56. package/dist/components.d.ts +1 -0
  57. package/dist/components.d.ts.map +1 -1
  58. package/dist/components.js +4 -0
  59. package/dist/components.js.map +1 -1
  60. package/dist/data/diagnostics/ErrorDetails.cjs +61 -8
  61. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  62. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  63. package/dist/data/diagnostics/ErrorDetails.js +61 -8
  64. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  65. package/dist/data/diagnostics/error-diagnostics.cjs +10 -4
  66. package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
  67. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
  68. package/dist/data/diagnostics/error-diagnostics.js +10 -4
  69. package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
  70. package/dist/data/query-browser/QueryBrowser.cjs +12 -6
  71. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  72. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  73. package/dist/data/query-browser/QueryBrowser.js +12 -6
  74. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  75. package/dist/data/query-browser/QueryBrowser.types.cjs +2 -1
  76. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
  77. package/dist/data/query-browser/QueryBrowser.types.d.ts +16 -14
  78. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
  79. package/dist/data/query-browser/QueryBrowser.types.js +2 -1
  80. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
  81. package/dist/data/version-info.cjs +3 -3
  82. package/dist/data/version-info.js +3 -3
  83. package/dist/index.cjs +4 -0
  84. package/dist/index.cjs.map +1 -1
  85. package/dist/index.js +4 -0
  86. package/dist/index.js.map +1 -1
  87. package/dist/lib/string.cjs +8 -0
  88. package/dist/lib/string.cjs.map +1 -1
  89. package/dist/lib/string.d.ts +1 -0
  90. package/dist/lib/string.d.ts.map +1 -1
  91. package/dist/lib/string.js +8 -0
  92. package/dist/lib/string.js.map +1 -1
  93. package/dist/profiles/catalogTree.cjs +133 -0
  94. package/dist/profiles/catalogTree.cjs.map +1 -0
  95. package/dist/profiles/catalogTree.d.ts +11 -0
  96. package/dist/profiles/catalogTree.d.ts.map +1 -0
  97. package/dist/profiles/catalogTree.js +133 -0
  98. package/dist/profiles/catalogTree.js.map +1 -0
  99. package/dist/profiles/connectionBrowserModel.cjs +185 -0
  100. package/dist/profiles/connectionBrowserModel.cjs.map +1 -0
  101. package/dist/profiles/connectionBrowserModel.d.ts +169 -0
  102. package/dist/profiles/connectionBrowserModel.d.ts.map +1 -0
  103. package/dist/profiles/connectionBrowserModel.js +185 -0
  104. package/dist/profiles/connectionBrowserModel.js.map +1 -0
  105. package/dist/profiles/connectionQueryWorkspace.cjs +185 -0
  106. package/dist/profiles/connectionQueryWorkspace.cjs.map +1 -0
  107. package/dist/profiles/connectionQueryWorkspace.d.ts +63 -0
  108. package/dist/profiles/connectionQueryWorkspace.d.ts.map +1 -0
  109. package/dist/profiles/connectionQueryWorkspace.js +185 -0
  110. package/dist/profiles/connectionQueryWorkspace.js.map +1 -0
  111. package/dist/profiles/connectionQueryWorkspaceModel.cjs +28 -0
  112. package/dist/profiles/connectionQueryWorkspaceModel.cjs.map +1 -0
  113. package/dist/profiles/connectionQueryWorkspaceModel.d.ts +38 -0
  114. package/dist/profiles/connectionQueryWorkspaceModel.d.ts.map +1 -0
  115. package/dist/profiles/connectionQueryWorkspaceModel.js +28 -0
  116. package/dist/profiles/connectionQueryWorkspaceModel.js.map +1 -0
  117. package/dist/profiles/esFieldValues.cjs +64 -0
  118. package/dist/profiles/esFieldValues.cjs.map +1 -0
  119. package/dist/profiles/esFieldValues.d.ts +48 -0
  120. package/dist/profiles/esFieldValues.d.ts.map +1 -0
  121. package/dist/profiles/esFieldValues.js +64 -0
  122. package/dist/profiles/esFieldValues.js.map +1 -0
  123. package/dist/profiles/esParamMappingModel.cjs +301 -0
  124. package/dist/profiles/esParamMappingModel.cjs.map +1 -0
  125. package/dist/profiles/esParamMappingModel.d.ts +37 -0
  126. package/dist/profiles/esParamMappingModel.d.ts.map +1 -0
  127. package/dist/profiles/esParamMappingModel.js +301 -0
  128. package/dist/profiles/esParamMappingModel.js.map +1 -0
  129. package/dist/profiles/esParamMappingPill.cjs +24 -0
  130. package/dist/profiles/esParamMappingPill.cjs.map +1 -0
  131. package/dist/profiles/esParamMappingPill.d.ts +13 -0
  132. package/dist/profiles/esParamMappingPill.d.ts.map +1 -0
  133. package/dist/profiles/esParamMappingPill.js +24 -0
  134. package/dist/profiles/esParamMappingPill.js.map +1 -0
  135. package/dist/profiles/esParamOperandExtension.cjs +75 -0
  136. package/dist/profiles/esParamOperandExtension.cjs.map +1 -0
  137. package/dist/profiles/esParamOperandExtension.d.ts +11 -0
  138. package/dist/profiles/esParamOperandExtension.d.ts.map +1 -0
  139. package/dist/profiles/esParamOperandExtension.js +75 -0
  140. package/dist/profiles/esParamOperandExtension.js.map +1 -0
  141. package/dist/profiles/esQueryBuilder.cjs +205 -0
  142. package/dist/profiles/esQueryBuilder.cjs.map +1 -0
  143. package/dist/profiles/esQueryBuilder.d.ts +35 -0
  144. package/dist/profiles/esQueryBuilder.d.ts.map +1 -0
  145. package/dist/profiles/esQueryBuilder.js +205 -0
  146. package/dist/profiles/esQueryBuilder.js.map +1 -0
  147. package/dist/profiles/esQueryBuilderExtension.cjs +23 -0
  148. package/dist/profiles/esQueryBuilderExtension.cjs.map +1 -0
  149. package/dist/profiles/esQueryBuilderExtension.d.ts +5 -0
  150. package/dist/profiles/esQueryBuilderExtension.d.ts.map +1 -0
  151. package/dist/profiles/esQueryBuilderExtension.js +23 -0
  152. package/dist/profiles/esQueryBuilderExtension.js.map +1 -0
  153. package/dist/profiles/esQueryBuilderForm.cjs +26 -0
  154. package/dist/profiles/esQueryBuilderForm.cjs.map +1 -0
  155. package/dist/profiles/esQueryBuilderForm.d.ts +18 -0
  156. package/dist/profiles/esQueryBuilderForm.d.ts.map +1 -0
  157. package/dist/profiles/esQueryBuilderForm.js +26 -0
  158. package/dist/profiles/esQueryBuilderForm.js.map +1 -0
  159. package/dist/profiles/esQueryBuilderModel.cjs +131 -0
  160. package/dist/profiles/esQueryBuilderModel.cjs.map +1 -0
  161. package/dist/profiles/esQueryBuilderModel.d.ts +108 -0
  162. package/dist/profiles/esQueryBuilderModel.d.ts.map +1 -0
  163. package/dist/profiles/esQueryBuilderModel.js +131 -0
  164. package/dist/profiles/esQueryBuilderModel.js.map +1 -0
  165. package/dist/profiles/esQueryClauseGroup.cjs +144 -0
  166. package/dist/profiles/esQueryClauseGroup.cjs.map +1 -0
  167. package/dist/profiles/esQueryClauseGroup.d.ts +10 -0
  168. package/dist/profiles/esQueryClauseGroup.d.ts.map +1 -0
  169. package/dist/profiles/esQueryClauseGroup.js +144 -0
  170. package/dist/profiles/esQueryClauseGroup.js.map +1 -0
  171. package/dist/profiles/esQueryCompile.cjs +47 -0
  172. package/dist/profiles/esQueryCompile.cjs.map +1 -0
  173. package/dist/profiles/esQueryCompile.d.ts +39 -0
  174. package/dist/profiles/esQueryCompile.d.ts.map +1 -0
  175. package/dist/profiles/esQueryCompile.js +47 -0
  176. package/dist/profiles/esQueryCompile.js.map +1 -0
  177. package/dist/profiles/esQueryConditionRow.cjs +168 -0
  178. package/dist/profiles/esQueryConditionRow.cjs.map +1 -0
  179. package/dist/profiles/esQueryConditionRow.d.ts +37 -0
  180. package/dist/profiles/esQueryConditionRow.d.ts.map +1 -0
  181. package/dist/profiles/esQueryConditionRow.js +168 -0
  182. package/dist/profiles/esQueryConditionRow.js.map +1 -0
  183. package/dist/profiles/esQueryGroupModel.cjs +12 -0
  184. package/dist/profiles/esQueryGroupModel.cjs.map +1 -0
  185. package/dist/profiles/esQueryGroupModel.d.ts +9 -0
  186. package/dist/profiles/esQueryGroupModel.d.ts.map +1 -0
  187. package/dist/profiles/esQueryGroupModel.js +12 -0
  188. package/dist/profiles/esQueryGroupModel.js.map +1 -0
  189. package/dist/profiles/esQueryOccur.cjs +16 -0
  190. package/dist/profiles/esQueryOccur.cjs.map +1 -0
  191. package/dist/profiles/esQueryOccur.d.ts +11 -0
  192. package/dist/profiles/esQueryOccur.d.ts.map +1 -0
  193. package/dist/profiles/esQueryOccur.js +16 -0
  194. package/dist/profiles/esQueryOccur.js.map +1 -0
  195. package/dist/profiles/esQueryOperandEditors.cjs +279 -0
  196. package/dist/profiles/esQueryOperandEditors.cjs.map +1 -0
  197. package/dist/profiles/esQueryOperandEditors.d.ts +24 -0
  198. package/dist/profiles/esQueryOperandEditors.d.ts.map +1 -0
  199. package/dist/profiles/esQueryOperandEditors.js +279 -0
  200. package/dist/profiles/esQueryOperandEditors.js.map +1 -0
  201. package/dist/profiles/esQueryOperandModel.cjs +28 -0
  202. package/dist/profiles/esQueryOperandModel.cjs.map +1 -0
  203. package/dist/profiles/esQueryOperandModel.d.ts +17 -0
  204. package/dist/profiles/esQueryOperandModel.d.ts.map +1 -0
  205. package/dist/profiles/esQueryOperandModel.js +28 -0
  206. package/dist/profiles/esQueryOperandModel.js.map +1 -0
  207. package/dist/profiles/esQueryOperators.cjs +165 -0
  208. package/dist/profiles/esQueryOperators.cjs.map +1 -0
  209. package/dist/profiles/esQueryOperators.d.ts +83 -0
  210. package/dist/profiles/esQueryOperators.d.ts.map +1 -0
  211. package/dist/profiles/esQueryOperators.js +165 -0
  212. package/dist/profiles/esQueryOperators.js.map +1 -0
  213. package/dist/profiles/esQueryOutputEditor.cjs +138 -0
  214. package/dist/profiles/esQueryOutputEditor.cjs.map +1 -0
  215. package/dist/profiles/esQueryOutputEditor.d.ts +7 -0
  216. package/dist/profiles/esQueryOutputEditor.d.ts.map +1 -0
  217. package/dist/profiles/esQueryOutputEditor.js +138 -0
  218. package/dist/profiles/esQueryOutputEditor.js.map +1 -0
  219. package/dist/profiles/esQueryOutputModel.cjs +16 -0
  220. package/dist/profiles/esQueryOutputModel.cjs.map +1 -0
  221. package/dist/profiles/esQueryOutputModel.d.ts +14 -0
  222. package/dist/profiles/esQueryOutputModel.d.ts.map +1 -0
  223. package/dist/profiles/esQueryOutputModel.js +16 -0
  224. package/dist/profiles/esQueryOutputModel.js.map +1 -0
  225. package/dist/profiles/esQueryPreview.cjs +30 -0
  226. package/dist/profiles/esQueryPreview.cjs.map +1 -0
  227. package/dist/profiles/esQueryPreview.d.ts +6 -0
  228. package/dist/profiles/esQueryPreview.d.ts.map +1 -0
  229. package/dist/profiles/esQueryPreview.js +30 -0
  230. package/dist/profiles/esQueryPreview.js.map +1 -0
  231. package/dist/profiles/esQuerySortEditor.cjs +143 -0
  232. package/dist/profiles/esQuerySortEditor.cjs.map +1 -0
  233. package/dist/profiles/esQuerySortEditor.d.ts +9 -0
  234. package/dist/profiles/esQuerySortEditor.d.ts.map +1 -0
  235. package/dist/profiles/esQuerySortEditor.js +143 -0
  236. package/dist/profiles/esQuerySortEditor.js.map +1 -0
  237. package/dist/profiles/esQuerySortModel.cjs +13 -0
  238. package/dist/profiles/esQuerySortModel.cjs.map +1 -0
  239. package/dist/profiles/esQuerySortModel.d.ts +4 -0
  240. package/dist/profiles/esQuerySortModel.d.ts.map +1 -0
  241. package/dist/profiles/esQuerySortModel.js +13 -0
  242. package/dist/profiles/esQuerySortModel.js.map +1 -0
  243. package/dist/profiles/esValueCombobox.cjs +86 -0
  244. package/dist/profiles/esValueCombobox.cjs.map +1 -0
  245. package/dist/profiles/esValueCombobox.d.ts +15 -0
  246. package/dist/profiles/esValueCombobox.d.ts.map +1 -0
  247. package/dist/profiles/esValueCombobox.js +86 -0
  248. package/dist/profiles/esValueCombobox.js.map +1 -0
  249. package/dist/profiles/jsonPathSample.cjs +75 -0
  250. package/dist/profiles/jsonPathSample.cjs.map +1 -0
  251. package/dist/profiles/jsonPathSample.d.ts +27 -0
  252. package/dist/profiles/jsonPathSample.d.ts.map +1 -0
  253. package/dist/profiles/jsonPathSample.js +75 -0
  254. package/dist/profiles/jsonPathSample.js.map +1 -0
  255. package/dist/profiles/jsonPathSampleRow.cjs +14 -0
  256. package/dist/profiles/jsonPathSampleRow.cjs.map +1 -0
  257. package/dist/profiles/jsonPathSampleRow.d.ts +6 -0
  258. package/dist/profiles/jsonPathSampleRow.d.ts.map +1 -0
  259. package/dist/profiles/jsonPathSampleRow.js +14 -0
  260. package/dist/profiles/jsonPathSampleRow.js.map +1 -0
  261. package/dist/profiles/profileApi.cjs +37 -0
  262. package/dist/profiles/profileApi.cjs.map +1 -0
  263. package/dist/profiles/profileApi.d.ts +32 -0
  264. package/dist/profiles/profileApi.d.ts.map +1 -0
  265. package/dist/profiles/profileApi.js +37 -0
  266. package/dist/profiles/profileApi.js.map +1 -0
  267. package/dist/profiles/profileBuilder.cjs +65 -0
  268. package/dist/profiles/profileBuilder.cjs.map +1 -0
  269. package/dist/profiles/profileBuilder.d.ts +11 -0
  270. package/dist/profiles/profileBuilder.d.ts.map +1 -0
  271. package/dist/profiles/profileBuilder.js +65 -0
  272. package/dist/profiles/profileBuilder.js.map +1 -0
  273. package/dist/profiles/profileBuilderExtension.cjs +25 -0
  274. package/dist/profiles/profileBuilderExtension.cjs.map +1 -0
  275. package/dist/profiles/profileBuilderExtension.d.ts +5 -0
  276. package/dist/profiles/profileBuilderExtension.d.ts.map +1 -0
  277. package/dist/profiles/profileBuilderExtension.js +25 -0
  278. package/dist/profiles/profileBuilderExtension.js.map +1 -0
  279. package/dist/profiles/profileBuilderWorkspace.cjs +368 -0
  280. package/dist/profiles/profileBuilderWorkspace.cjs.map +1 -0
  281. package/dist/profiles/profileBuilderWorkspace.d.ts +21 -0
  282. package/dist/profiles/profileBuilderWorkspace.d.ts.map +1 -0
  283. package/dist/profiles/profileBuilderWorkspace.js +368 -0
  284. package/dist/profiles/profileBuilderWorkspace.js.map +1 -0
  285. package/dist/profiles/profileColumnModel.cjs +23 -0
  286. package/dist/profiles/profileColumnModel.cjs.map +1 -0
  287. package/dist/profiles/profileColumnModel.d.ts +8 -0
  288. package/dist/profiles/profileColumnModel.d.ts.map +1 -0
  289. package/dist/profiles/profileColumnModel.js +23 -0
  290. package/dist/profiles/profileColumnModel.js.map +1 -0
  291. package/dist/profiles/profileColumnPicker.cjs +68 -0
  292. package/dist/profiles/profileColumnPicker.cjs.map +1 -0
  293. package/dist/profiles/profileColumnPicker.d.ts +11 -0
  294. package/dist/profiles/profileColumnPicker.d.ts.map +1 -0
  295. package/dist/profiles/profileColumnPicker.js +68 -0
  296. package/dist/profiles/profileColumnPicker.js.map +1 -0
  297. package/dist/profiles/profileEditor.cjs +386 -0
  298. package/dist/profiles/profileEditor.cjs.map +1 -0
  299. package/dist/profiles/profileEditor.d.ts +19 -0
  300. package/dist/profiles/profileEditor.d.ts.map +1 -0
  301. package/dist/profiles/profileEditor.js +386 -0
  302. package/dist/profiles/profileEditor.js.map +1 -0
  303. package/dist/profiles/profileEditorModel.cjs +181 -0
  304. package/dist/profiles/profileEditorModel.cjs.map +1 -0
  305. package/dist/profiles/profileEditorModel.d.ts +74 -0
  306. package/dist/profiles/profileEditorModel.d.ts.map +1 -0
  307. package/dist/profiles/profileEditorModel.js +181 -0
  308. package/dist/profiles/profileEditorModel.js.map +1 -0
  309. package/dist/profiles/profileEditorPreview.cjs +38 -0
  310. package/dist/profiles/profileEditorPreview.cjs.map +1 -0
  311. package/dist/profiles/profileEditorPreview.d.ts +12 -0
  312. package/dist/profiles/profileEditorPreview.d.ts.map +1 -0
  313. package/dist/profiles/profileEditorPreview.js +38 -0
  314. package/dist/profiles/profileEditorPreview.js.map +1 -0
  315. package/dist/profiles/profileEditorRail.cjs +46 -0
  316. package/dist/profiles/profileEditorRail.cjs.map +1 -0
  317. package/dist/profiles/profileEditorRail.d.ts +8 -0
  318. package/dist/profiles/profileEditorRail.d.ts.map +1 -0
  319. package/dist/profiles/profileEditorRail.js +46 -0
  320. package/dist/profiles/profileEditorRail.js.map +1 -0
  321. package/dist/profiles/profileEditorRaw.cjs +118 -0
  322. package/dist/profiles/profileEditorRaw.cjs.map +1 -0
  323. package/dist/profiles/profileEditorRaw.d.ts +7 -0
  324. package/dist/profiles/profileEditorRaw.d.ts.map +1 -0
  325. package/dist/profiles/profileEditorRaw.js +118 -0
  326. package/dist/profiles/profileEditorRaw.js.map +1 -0
  327. package/dist/profiles/profileEditorRoutes.cjs +7 -0
  328. package/dist/profiles/profileEditorRoutes.cjs.map +1 -0
  329. package/dist/profiles/profileEditorRoutes.d.ts +2 -0
  330. package/dist/profiles/profileEditorRoutes.d.ts.map +1 -0
  331. package/dist/profiles/profileEditorRoutes.js +7 -0
  332. package/dist/profiles/profileEditorRoutes.js.map +1 -0
  333. package/dist/profiles/profileEditorSections.cjs +213 -0
  334. package/dist/profiles/profileEditorSections.cjs.map +1 -0
  335. package/dist/profiles/profileEditorSections.d.ts +23 -0
  336. package/dist/profiles/profileEditorSections.d.ts.map +1 -0
  337. package/dist/profiles/profileEditorSections.js +213 -0
  338. package/dist/profiles/profileEditorSections.js.map +1 -0
  339. package/dist/profiles/profileFieldEditor.cjs +200 -0
  340. package/dist/profiles/profileFieldEditor.cjs.map +1 -0
  341. package/dist/profiles/profileFieldEditor.d.ts +34 -0
  342. package/dist/profiles/profileFieldEditor.d.ts.map +1 -0
  343. package/dist/profiles/profileFieldEditor.js +200 -0
  344. package/dist/profiles/profileFieldEditor.js.map +1 -0
  345. package/dist/profiles/profileFieldGrid.cjs +250 -0
  346. package/dist/profiles/profileFieldGrid.cjs.map +1 -0
  347. package/dist/profiles/profileFieldGrid.d.ts +20 -0
  348. package/dist/profiles/profileFieldGrid.d.ts.map +1 -0
  349. package/dist/profiles/profileFieldGrid.js +250 -0
  350. package/dist/profiles/profileFieldGrid.js.map +1 -0
  351. package/dist/profiles/profileFieldManager.cjs +103 -0
  352. package/dist/profiles/profileFieldManager.cjs.map +1 -0
  353. package/dist/profiles/profileFieldManager.d.ts +9 -0
  354. package/dist/profiles/profileFieldManager.d.ts.map +1 -0
  355. package/dist/profiles/profileFieldManager.js +103 -0
  356. package/dist/profiles/profileFieldManager.js.map +1 -0
  357. package/dist/profiles/profileFieldState.cjs +136 -0
  358. package/dist/profiles/profileFieldState.cjs.map +1 -0
  359. package/dist/profiles/profileFieldState.d.ts +41 -0
  360. package/dist/profiles/profileFieldState.d.ts.map +1 -0
  361. package/dist/profiles/profileFieldState.js +136 -0
  362. package/dist/profiles/profileFieldState.js.map +1 -0
  363. package/dist/profiles/profileFieldTypes.cjs +17 -0
  364. package/dist/profiles/profileFieldTypes.cjs.map +1 -0
  365. package/dist/profiles/profileFieldTypes.d.ts +8 -0
  366. package/dist/profiles/profileFieldTypes.d.ts.map +1 -0
  367. package/dist/profiles/profileFieldTypes.js +17 -0
  368. package/dist/profiles/profileFieldTypes.js.map +1 -0
  369. package/dist/profiles/profileParamModel.cjs +78 -0
  370. package/dist/profiles/profileParamModel.cjs.map +1 -0
  371. package/dist/profiles/profileParamModel.d.ts +3 -0
  372. package/dist/profiles/profileParamModel.d.ts.map +1 -0
  373. package/dist/profiles/profileParamModel.js +78 -0
  374. package/dist/profiles/profileParamModel.js.map +1 -0
  375. package/dist/profiles/profileSamplePayload.cjs +15 -0
  376. package/dist/profiles/profileSamplePayload.cjs.map +1 -0
  377. package/dist/profiles/profileSamplePayload.d.ts +13 -0
  378. package/dist/profiles/profileSamplePayload.d.ts.map +1 -0
  379. package/dist/profiles/profileSamplePayload.js +15 -0
  380. package/dist/profiles/profileSamplePayload.js.map +1 -0
  381. package/dist/profiles/profileWizard.cjs +257 -0
  382. package/dist/profiles/profileWizard.cjs.map +1 -0
  383. package/dist/profiles/profileWizard.d.ts +12 -0
  384. package/dist/profiles/profileWizard.d.ts.map +1 -0
  385. package/dist/profiles/profileWizard.js +257 -0
  386. package/dist/profiles/profileWizard.js.map +1 -0
  387. package/dist/profiles/profileWizardHelp.cjs +10 -0
  388. package/dist/profiles/profileWizardHelp.cjs.map +1 -0
  389. package/dist/profiles/profileWizardHelp.d.ts +13 -0
  390. package/dist/profiles/profileWizardHelp.d.ts.map +1 -0
  391. package/dist/profiles/profileWizardHelp.js +10 -0
  392. package/dist/profiles/profileWizardHelp.js.map +1 -0
  393. package/dist/profiles/profileWizardModel.cjs +198 -0
  394. package/dist/profiles/profileWizardModel.cjs.map +1 -0
  395. package/dist/profiles/profileWizardModel.d.ts +255 -0
  396. package/dist/profiles/profileWizardModel.d.ts.map +1 -0
  397. package/dist/profiles/profileWizardModel.js +198 -0
  398. package/dist/profiles/profileWizardModel.js.map +1 -0
  399. package/dist/profiles/profileWizardQueryStep.cjs +215 -0
  400. package/dist/profiles/profileWizardQueryStep.cjs.map +1 -0
  401. package/dist/profiles/profileWizardQueryStep.d.ts +18 -0
  402. package/dist/profiles/profileWizardQueryStep.d.ts.map +1 -0
  403. package/dist/profiles/profileWizardQueryStep.js +215 -0
  404. package/dist/profiles/profileWizardQueryStep.js.map +1 -0
  405. package/dist/profiles/profileWizardSteps.cjs +214 -0
  406. package/dist/profiles/profileWizardSteps.cjs.map +1 -0
  407. package/dist/profiles/profileWizardSteps.d.ts +35 -0
  408. package/dist/profiles/profileWizardSteps.d.ts.map +1 -0
  409. package/dist/profiles/profileWizardSteps.js +214 -0
  410. package/dist/profiles/profileWizardSteps.js.map +1 -0
  411. package/dist/profiles/profileYaml.cjs +19 -0
  412. package/dist/profiles/profileYaml.cjs.map +1 -0
  413. package/dist/profiles/profileYaml.d.ts +4 -0
  414. package/dist/profiles/profileYaml.d.ts.map +1 -0
  415. package/dist/profiles/profileYaml.js +19 -0
  416. package/dist/profiles/profileYaml.js.map +1 -0
  417. package/dist/profiles/prometheusResults.cjs +60 -0
  418. package/dist/profiles/prometheusResults.cjs.map +1 -0
  419. package/dist/profiles/prometheusResults.d.ts +7 -0
  420. package/dist/profiles/prometheusResults.d.ts.map +1 -0
  421. package/dist/profiles/prometheusResults.js +60 -0
  422. package/dist/profiles/prometheusResults.js.map +1 -0
  423. package/dist/profiles/queryRowLimits.cjs +82 -0
  424. package/dist/profiles/queryRowLimits.cjs.map +1 -0
  425. package/dist/profiles/queryRowLimits.d.ts +9 -0
  426. package/dist/profiles/queryRowLimits.d.ts.map +1 -0
  427. package/dist/profiles/queryRowLimits.js +82 -0
  428. package/dist/profiles/queryRowLimits.js.map +1 -0
  429. package/dist/profiles/queryRowLimitsModel.cjs +10 -0
  430. package/dist/profiles/queryRowLimitsModel.cjs.map +1 -0
  431. package/dist/profiles/queryRowLimitsModel.d.ts +9 -0
  432. package/dist/profiles/queryRowLimitsModel.d.ts.map +1 -0
  433. package/dist/profiles/queryRowLimitsModel.js +10 -0
  434. package/dist/profiles/queryRowLimitsModel.js.map +1 -0
  435. package/dist/profiles/queryTargetPicker.cjs +42 -0
  436. package/dist/profiles/queryTargetPicker.cjs.map +1 -0
  437. package/dist/profiles/queryTargetPicker.d.ts +8 -0
  438. package/dist/profiles/queryTargetPicker.d.ts.map +1 -0
  439. package/dist/profiles/queryTargetPicker.js +42 -0
  440. package/dist/profiles/queryTargetPicker.js.map +1 -0
  441. package/dist/profiles/testSchema.d.ts +3 -0
  442. package/dist/profiles/testSchema.d.ts.map +1 -0
  443. package/dist/profiles.cjs +223 -0
  444. package/dist/profiles.cjs.map +1 -0
  445. package/dist/profiles.d.ts +68 -0
  446. package/dist/profiles.d.ts.map +1 -0
  447. package/dist/profiles.js +223 -0
  448. package/dist/profiles.js.map +1 -0
  449. package/dist/styles.css +1 -1
  450. package/package.json +6 -1
@@ -0,0 +1,185 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { LogsTable } from "../data/LogsTable.js";
3
+ import { QueryBrowser } from "../data/query-browser/QueryBrowser.js";
4
+ import { Tabs } from "../layout/Tabs.js";
5
+ import { useState, useRef, useEffect } from "react";
6
+ import { CatalogTree } from "./catalogTree.js";
7
+ import { withTarget } from "./connectionBrowserModel.js";
8
+ import { makeFieldValueLookup } from "./esFieldValues.js";
9
+ import { EsQueryBuilder } from "./esQueryBuilder.js";
10
+ import { toBuilderMode, toRawMode } from "./esQueryBuilderModel.js";
11
+ import { esBuilderVocabulary } from "./esQueryOperators.js";
12
+ import { PrometheusResults } from "./prometheusResults.js";
13
+ import { QueryRowLimits } from "./queryRowLimits.js";
14
+ import { QueryTargetPicker } from "./queryTargetPicker.js";
15
+ import { supportsQueryBuilder, navigatorTabs, initialNavigatorTab } from "./connectionQueryWorkspaceModel.js";
16
+ import { esQueryFields } from "./esQueryBuilderForm.js";
17
+ import { useCompiledSearch } from "./esQueryCompile.js";
18
+ function ConnectionQueryWorkspace({
19
+ id,
20
+ title,
21
+ descriptor,
22
+ inspection,
23
+ onDatabaseChange,
24
+ query,
25
+ onQueryChange,
26
+ options,
27
+ onOptionsChange,
28
+ onCatalogSelect,
29
+ optionsSchema,
30
+ search,
31
+ onSearchChange,
32
+ limits,
33
+ onLimitsChange,
34
+ params,
35
+ onParamMappingChange,
36
+ paramValues,
37
+ paramRoles,
38
+ compileBaseUrl = "",
39
+ execute,
40
+ lookupFilterValues,
41
+ renderResults,
42
+ className
43
+ }) {
44
+ var _a;
45
+ const builder = Boolean(onSearchChange) && supportsQueryBuilder(descriptor);
46
+ const tabs = navigatorTabs({ descriptor, builder });
47
+ const [tab, setTab] = useState(
48
+ () => initialNavigatorTab({
49
+ tabs,
50
+ search,
51
+ query,
52
+ ...descriptor.defaultQuery ? { defaultQuery: descriptor.defaultQuery } : {}
53
+ })
54
+ );
55
+ const [picked, setPicked] = useState();
56
+ const edited = useRef(options);
57
+ const seed = useRef(options);
58
+ if (seed.current !== options) {
59
+ seed.current = options;
60
+ edited.current = options;
61
+ if (picked) setPicked(void 0);
62
+ }
63
+ const browserOptions = picked ?? options;
64
+ const applyOptions = (next) => {
65
+ edited.current = next;
66
+ setPicked(next);
67
+ onOptionsChange(next);
68
+ };
69
+ const compilation = useCompiledSearch({
70
+ baseUrl: compileBaseUrl,
71
+ search: search ?? {},
72
+ ...paramValues ? { params: paramValues } : {},
73
+ ...paramRoles ? { roles: paramRoles } : {},
74
+ enabled: Boolean(search) && compileBaseUrl !== ""
75
+ });
76
+ const values = makeFieldValueLookup({
77
+ baseUrl: compileBaseUrl,
78
+ index: String(browserOptions.index ?? ""),
79
+ ...paramValues ? { params: paramValues } : {},
80
+ ...paramRoles ? { roles: paramRoles } : {}
81
+ });
82
+ const specMode = search !== void 0;
83
+ const active = tabs.some((entry) => entry.id === tab) ? tab : (_a = tabs[0]) == null ? void 0 : _a.id;
84
+ useEffect(() => {
85
+ if (active === "form" && onSearchChange && search === void 0) {
86
+ onSearchChange(toBuilderMode());
87
+ }
88
+ }, [active, onSearchChange, search]);
89
+ const selectTab = (next) => {
90
+ if (next === "json" && search && onSearchChange) {
91
+ onSearchChange(toRawMode(search, compilation.query, query));
92
+ }
93
+ setTab(next);
94
+ };
95
+ return /* @__PURE__ */ jsx(
96
+ QueryBrowser,
97
+ {
98
+ id,
99
+ title,
100
+ language: descriptor.language ?? "text",
101
+ queryLabel: descriptor.queryLabel ?? "Query",
102
+ initialQuery: specMode ? compilation.query : query,
103
+ optionsSchema,
104
+ initialOptions: browserOptions,
105
+ completion: inspection.completion,
106
+ ...specMode ? {} : onQueryChange ? { onQueryChange } : {},
107
+ onOptionsChange: (next) => {
108
+ edited.current = next;
109
+ onOptionsChange(next);
110
+ },
111
+ className,
112
+ navigator: tabs.length === 0 && !descriptor.targetLabel ? void 0 : /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-col gap-2", children: [
113
+ descriptor.targetLabel ? /* @__PURE__ */ jsx(
114
+ QueryTargetPicker,
115
+ {
116
+ label: descriptor.targetLabel,
117
+ inspection,
118
+ value: String(browserOptions.index ?? ""),
119
+ onChange: (index, targetKind) => applyOptions(withTarget(edited.current, { index, targetKind }))
120
+ }
121
+ ) : null,
122
+ builder ? /* @__PURE__ */ jsx(
123
+ QueryRowLimits,
124
+ {
125
+ value: String(browserOptions.limit ?? ""),
126
+ onChange: (limit) => applyOptions({ ...edited.current, limit }),
127
+ ...descriptor.rowLimits ? { defaults: descriptor.rowLimits } : {},
128
+ ...limits ? { limits } : {},
129
+ ...onLimitsChange ? { onLimitsChange } : {}
130
+ }
131
+ ) : null,
132
+ tabs.length > 1 ? /* @__PURE__ */ jsx(Tabs, { tabs, value: active ?? "", onChange: selectTab }) : null,
133
+ active === "form" && onSearchChange && search ? /* @__PURE__ */ jsx(
134
+ EsQueryBuilder,
135
+ {
136
+ search,
137
+ onChange: (next) => onSearchChange({ search: next, query: "" }),
138
+ fields: esQueryFields(inspection.completion),
139
+ vocabulary: esBuilderVocabulary(descriptor.optionsSchema),
140
+ ...params ? { params } : {},
141
+ ...onParamMappingChange ? { onMappingChange: onParamMappingChange } : {},
142
+ ...values ? { values } : {},
143
+ compilation
144
+ }
145
+ ) : active === "json" ? /* @__PURE__ */ jsxs("p", { className: "rounded-md border border-dashed p-3 text-xs text-muted-foreground", children: [
146
+ "The ",
147
+ descriptor.queryLabel ?? "query",
148
+ " editor holds the query. Switch back to Form to build it from filters — the raw query is dropped then, since only one of the two is stored."
149
+ ] }) : active === "catalog" ? /* @__PURE__ */ jsx(
150
+ CatalogTree,
151
+ {
152
+ nodes: inspection.nodes,
153
+ loading: inspection.loading,
154
+ error: inspection.error,
155
+ databases: inspection.databases,
156
+ database: inspection.activeDatabase,
157
+ onDatabaseChange,
158
+ onSelect: onCatalogSelect
159
+ }
160
+ ) : null
161
+ ] }),
162
+ execute: (request) => execute(
163
+ specMode ? { ...request, query: "", options: { ...request.options, search } } : request
164
+ ),
165
+ ...lookupFilterValues ? { lookupFilterValues } : {},
166
+ renderResults: renderResults ?? descriptorResultView(descriptor)
167
+ }
168
+ );
169
+ }
170
+ function descriptorResultView(descriptor) {
171
+ if (descriptor.resultView === "logs") {
172
+ return ({ result, defaultView }) => {
173
+ var _a;
174
+ return ((_a = result.rows) == null ? void 0 : _a.length) ? /* @__PURE__ */ jsx(LogsTable, { logs: result.rows, autoFilter: false, fullscreenTitle: "Logs" }) : defaultView;
175
+ };
176
+ }
177
+ if (descriptor.resultView === "timeseries") {
178
+ return ({ result, defaultView }) => /* @__PURE__ */ jsx(PrometheusResults, { result, fallback: defaultView });
179
+ }
180
+ return void 0;
181
+ }
182
+ export {
183
+ ConnectionQueryWorkspace
184
+ };
185
+ //# sourceMappingURL=connectionQueryWorkspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectionQueryWorkspace.js","sources":["../../src/profiles/connectionQueryWorkspace.tsx"],"sourcesContent":["/**\n * The single query-browser host. The connection browser, the profile wizard and\n * the profile-edit builder all render this: they own where the query and the\n * options are stored and what a run means, and this owns the browser itself —\n * the catalog navigator, the structured filter builder, the completion, and the\n * descriptor's result view.\n */\n\nimport type { JsonSchemaObject } from \"../components/json-schema-form-types\";\nimport { LogsTable } from \"../data/LogsTable\";\nimport { QueryBrowser } from \"../data/query-browser/QueryBrowser\";\nimport type { QueryBrowserFilterLookup, QueryBrowserRequest, QueryBrowserResult, QueryBrowserResultContext } from \"../data/query-browser/QueryBrowser.types\";\nimport { Tabs } from \"../layout/Tabs\";\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { CatalogTree } from \"./catalogTree\";\nimport {\n withTarget,\n type BrowserDescriptor,\n type CatalogNode,\n type Inspection,\n type ProfileRowLimits\n} from \"./connectionBrowserModel\";\nimport { makeFieldValueLookup } from \"./esFieldValues\";\nimport { EsQueryBuilder } from \"./esQueryBuilder\";\nimport {\n toBuilderMode,\n toRawMode,\n type EsSearch,\n type QueryModeTransition\n} from \"./esQueryBuilderModel\";\nimport {\n esBuilderVocabulary\n } from \"./esQueryOperators\";\nimport { PrometheusResults } from \"./prometheusResults\";\nimport { QueryRowLimits } from \"./queryRowLimits\";\nimport { QueryTargetPicker } from \"./queryTargetPicker\";\nimport type { ParamMappingEdit } from \"./esParamMappingModel\";\nimport type { ParamDraft } from \"./profileWizardModel\";\nimport { initialNavigatorTab, navigatorTabs, supportsQueryBuilder } from \"./connectionQueryWorkspaceModel\";\nimport { esQueryFields } from \"./esQueryBuilderForm\";\nimport { useCompiledSearch } from \"./esQueryCompile\";\n\n\nexport type ConnectionQueryWorkspaceProps = {\n id: string;\n title: string;\n descriptor: BrowserDescriptor;\n inspection: Inspection;\n onDatabaseChange: (database: string) => void;\n query: string;\n onQueryChange?: (query: string) => void | undefined;\n options: Record<string, unknown>;\n onOptionsChange: (options: Record<string, unknown>) => void;\n onCatalogSelect: (node: CatalogNode) => void;\n optionsSchema?: JsonSchemaObject | undefined;\n /**\n * The structured specification this host stores, when it stores one.\n * `undefined` means the raw query is the artifact.\n */\n search?: EsSearch | undefined;\n /**\n * Every change reports the specification and the raw query together, and one\n * of the two is always empty. The host stores both in one write, so it can\n * never end up holding a specification and a query at once — a state the\n * server rejects.\n */\n onSearchChange?: (transition: QueryModeTransition) => void | undefined;\n /**\n * The row caps the edited profile sets for itself. They are profile settings,\n * not provider options, so they are stored beside the query rather than\n * through `onOptionsChange`. A host that edits no profile — the connection\n * browser — passes neither, and the caps are then not offered at all.\n */\n limits?: ProfileRowLimits | undefined;\n onLimitsChange?: (limits: ProfileRowLimits | undefined) => void;\n /** Declared profile parameters an operand can bind to. */\n params?: ParamDraft[] | undefined;\n onParamMappingChange?: (edit: ParamMappingEdit) => void | undefined;\n /**\n * What those parameters currently resolve to. The server binds a {param:…}\n * operand from them and interpolates a {{.params.…}} one, so without values\n * the preview shows template text — or the compiler's refusal to guess.\n */\n paramValues?: Record<string, unknown> | undefined;\n /** Those parameters' roles, so the compiled preview folds them as a run would. */\n paramRoles?: Record<string, string> | undefined;\n /** Where POST /compile lives. Empty leaves the preview unresolved. */\n compileBaseUrl?: string | undefined;\n execute: (request: QueryBrowserRequest) => Promise<QueryBrowserResult>;\n /**\n * Answers a filter's value type-ahead. Absent leaves every filter the source\n * described showing only the values the result itself carried.\n */\n lookupFilterValues?: QueryBrowserFilterLookup | undefined;\n renderResults?: (context: QueryBrowserResultContext) => ReactNode | undefined;\n className?: string | undefined;\n};\n\nexport function ConnectionQueryWorkspace({\n id,\n title,\n descriptor,\n inspection,\n onDatabaseChange,\n query,\n onQueryChange,\n options,\n onOptionsChange,\n onCatalogSelect,\n optionsSchema,\n search,\n onSearchChange,\n limits,\n onLimitsChange,\n params,\n onParamMappingChange,\n paramValues,\n paramRoles,\n compileBaseUrl = \"\",\n execute,\n lookupFilterValues,\n renderResults,\n className\n}: ConnectionQueryWorkspaceProps) {\n const builder = Boolean(onSearchChange) && supportsQueryBuilder(descriptor);\n const tabs = navigatorTabs({ descriptor, builder });\n const [tab, setTab] = useState<string | undefined>(() =>\n initialNavigatorTab({\n tabs,\n search,\n query,\n ...(descriptor.defaultQuery ? { defaultQuery: descriptor.defaultQuery } : {})\n }),\n );\n // Picking a target has to reach the browser, which only resyncs its options\n // when `initialOptions` changes identity. The pick is layered here rather than\n // round-tripped through the host, so an options-form keystroke — which the\n // host also stores — cannot resync the browser out from under the author.\n const [picked, setPicked] = useState<Record<string, unknown>>();\n // What the browser last reported, so a pick keeps the author's other edits.\n const edited = useRef(options);\n const seed = useRef(options);\n if (seed.current !== options) {\n seed.current = options;\n edited.current = options;\n if (picked) setPicked(undefined);\n }\n const browserOptions = picked ?? options;\n const applyOptions = (next: Record<string, unknown>) => {\n edited.current = next;\n setPicked(next);\n onOptionsChange(next);\n };\n const compilation = useCompiledSearch({\n baseUrl: compileBaseUrl,\n search: search ?? {},\n ...(paramValues ? { params: paramValues } : {}),\n ...(paramRoles ? { roles: paramRoles } : {}),\n enabled: Boolean(search) && compileBaseUrl !== \"\"\n });\n const values = makeFieldValueLookup({\n baseUrl: compileBaseUrl,\n index: String(browserOptions.index ?? \"\"),\n ...(paramValues ? { params: paramValues } : {}),\n ...(paramRoles ? { roles: paramRoles } : {})\n });\n\n // While a specification is active the editor mirrors what it compiles to. It\n // is a preview, not an input: the query is not stored alongside the spec, so\n // there is no keystroke for a compile to overwrite.\n const specMode = search !== undefined;\n const active = tabs.some((entry) => entry.id === tab) ? tab : tabs[0]?.id;\n\n // The form tab is the specification, so being on it means holding one. A tab\n // that stores nothing would leave the builder rendering a query it cannot\n // edit, and this is also what makes filters the default rather than an opt-in.\n useEffect(() => {\n if (active === \"form\" && onSearchChange && search === undefined) {\n onSearchChange(toBuilderMode());\n }\n }, [active, onSearchChange, search]);\n\n // Switching tabs is the mode switch. Each mode stores its own artifact and the\n // server rejects holding both, so leaving the form hands the raw editor the\n // DSL the specification last compiled to and drops the specification.\n const selectTab = (next: string) => {\n if (next === \"json\" && search && onSearchChange) {\n onSearchChange(toRawMode(search, compilation.query, query));\n }\n setTab(next);\n };\n\n return (\n <QueryBrowser\n id={id}\n title={title}\n language={descriptor.language ?? \"text\"}\n queryLabel={descriptor.queryLabel ?? \"Query\"}\n initialQuery={specMode ? compilation.query : query}\n optionsSchema={optionsSchema}\n initialOptions={browserOptions}\n completion={inspection.completion}\n {...(specMode ? {} : onQueryChange ? { onQueryChange } : {})}\n onOptionsChange={(next) => {\n edited.current = next;\n onOptionsChange(next);\n }}\n className={className}\n navigator={\n tabs.length === 0 && !descriptor.targetLabel ? undefined : (\n <div className=\"flex min-h-0 flex-col gap-2\">\n {descriptor.targetLabel ? (\n <QueryTargetPicker\n label={descriptor.targetLabel}\n inspection={inspection}\n value={String(browserOptions.index ?? \"\")}\n onChange={(index, targetKind) =>\n applyOptions(withTarget(edited.current, { index, targetKind }))\n }\n />\n ) : null}\n {builder ? (\n <QueryRowLimits\n value={String(browserOptions.limit ?? \"\")}\n onChange={(limit) =>\n applyOptions({ ...edited.current, limit })\n }\n {...(descriptor.rowLimits\n ? { defaults: descriptor.rowLimits }\n : {})}\n {...(limits ? { limits } : {})}\n {...(onLimitsChange ? { onLimitsChange } : {})}\n />\n ) : null}\n {tabs.length > 1 ? (\n <Tabs tabs={tabs} value={active ?? \"\"} onChange={selectTab} />\n ) : null}\n {active === \"form\" && onSearchChange && search ? (\n <EsQueryBuilder\n search={search}\n onChange={(next) => onSearchChange({ search: next, query: \"\" })}\n fields={esQueryFields(inspection.completion)}\n vocabulary={esBuilderVocabulary(descriptor.optionsSchema)}\n {...(params ? { params } : {})}\n {...(onParamMappingChange\n ? { onMappingChange: onParamMappingChange }\n : {})}\n {...(values ? { values } : {})}\n compilation={compilation}\n />\n ) : active === \"json\" ? (\n <p className=\"rounded-md border border-dashed p-3 text-xs text-muted-foreground\">\n The {descriptor.queryLabel ?? \"query\"} editor holds the query.\n Switch back to Form to build it from filters — the raw query is\n dropped then, since only one of the two is stored.\n </p>\n ) : active === \"catalog\" ? (\n <CatalogTree\n nodes={inspection.nodes}\n loading={inspection.loading}\n error={inspection.error}\n databases={inspection.databases}\n database={inspection.activeDatabase}\n onDatabaseChange={onDatabaseChange}\n onSelect={onCatalogSelect}\n />\n ) : null}\n </div>\n )\n }\n execute={(request) =>\n execute(\n specMode\n ? { ...request, query: \"\", options: { ...request.options, search } }\n : request,\n )\n }\n {...(lookupFilterValues ? { lookupFilterValues } : {})}\n renderResults={renderResults ?? descriptorResultView(descriptor)}\n />\n );\n}\n\n/**\n * descriptorResultView honours the view the server nominated for this provider.\n * A host that renders its own results (the profile builder's column picker)\n * passes renderResults and takes over entirely.\n */\nfunction descriptorResultView(\n descriptor: BrowserDescriptor,\n): ((context: QueryBrowserResultContext) => ReactNode) | undefined {\n if (descriptor.resultView === \"logs\") {\n return ({ result, defaultView }) =>\n result.rows?.length ? (\n <LogsTable logs={result.rows} autoFilter={false} fullscreenTitle=\"Logs\" />\n ) : (\n defaultView\n );\n }\n if (descriptor.resultView === \"timeseries\") {\n return ({ result, defaultView }) => (\n <PrometheusResults result={result} fallback={defaultView} />\n );\n }\n return undefined;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const esQueryOperators = require("./esQueryOperators.cjs");
4
+ function supportsQueryBuilder(descriptor) {
5
+ return esQueryOperators.operatorCatalogFromSchema(descriptor.optionsSchema).length > 0;
6
+ }
7
+ function navigatorTabs(input) {
8
+ const tabs = [];
9
+ if (input.descriptor.catalog && !input.descriptor.targetLabel) {
10
+ tabs.push({ id: "catalog", label: "Catalog" });
11
+ }
12
+ if (input.builder) {
13
+ tabs.push({ id: "form", label: "Form" }, { id: "json", label: "JSON" });
14
+ }
15
+ return tabs;
16
+ }
17
+ function initialNavigatorTab(input) {
18
+ var _a;
19
+ const has = (id) => input.tabs.some((tab) => tab.id === id);
20
+ if (!has("form")) return (_a = input.tabs[0]) == null ? void 0 : _a.id;
21
+ if (input.search) return "form";
22
+ const authored = input.query.trim();
23
+ return authored && authored !== (input.defaultQuery ?? "").trim() ? "json" : "form";
24
+ }
25
+ exports.initialNavigatorTab = initialNavigatorTab;
26
+ exports.navigatorTabs = navigatorTabs;
27
+ exports.supportsQueryBuilder = supportsQueryBuilder;
28
+ //# sourceMappingURL=connectionQueryWorkspaceModel.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectionQueryWorkspaceModel.cjs","sources":["../../src/profiles/connectionQueryWorkspaceModel.ts"],"sourcesContent":["/**\n * Which navigator tabs the query workspace offers, and which one it opens on.\n *\n * Kept apart from the workspace component so that module exports only\n * components (react/only-export-components).\n */\n\nimport type { BrowserDescriptor } from \"./connectionBrowserModel\";\nimport type { EsSearch } from \"./esQueryBuilderModel\";\nimport { operatorCatalogFromSchema } from \"./esQueryOperators\";\n\nexport type NavigatorTab = { id: \"catalog\" | \"form\" | \"json\"; label: string };\n\n/**\n * A source supports the builder when the server described a structured search on\n * it. The operator catalog travels with the schema, so no provider name is\n * hardcoded here — adding a structured provider in Go reaches the editor on its\n * own.\n */\nexport function supportsQueryBuilder(descriptor: BrowserDescriptor): boolean {\n return operatorCatalogFromSchema(descriptor.optionsSchema).length > 0;\n}\n\n/**\n * navigatorTabs is what the left pane offers. Where the source has a structured\n * search, the two ways of authoring one — the form and the raw DSL — are tabs\n * rather than a one-way door: they are the same query, and the tab says which\n * of the two is stored. A source that picks one flat target has a combobox\n * pinned above the tabs instead of a catalog tree — its targets are a list of\n * index names, and a list is not worth navigating.\n */\nexport function navigatorTabs(input: {\n descriptor: BrowserDescriptor;\n builder: boolean;\n}): NavigatorTab[] {\n const tabs: NavigatorTab[] = [];\n if (input.descriptor.catalog && !input.descriptor.targetLabel) {\n tabs.push({ id: \"catalog\", label: \"Catalog\" });\n }\n if (input.builder) {\n tabs.push({ id: \"form\", label: \"Form\" }, { id: \"json\", label: \"JSON\" });\n }\n return tabs;\n}\n\n/**\n * initialNavigatorTab opens on the form: filters are what the builder is for,\n * so it is where authoring starts rather than something to opt into. The one\n * thing that overrides it is a raw query already worth preserving — and the\n * starter query the descriptor supplies is not one, since nobody wrote it.\n */\nexport function initialNavigatorTab(input: {\n tabs: NavigatorTab[];\n search: EsSearch | undefined;\n query: string;\n defaultQuery?: string;\n}): string | undefined {\n const has = (id: NavigatorTab[\"id\"]) =>\n input.tabs.some((tab) => tab.id === id);\n if (!has(\"form\")) return input.tabs[0]?.id;\n if (input.search) return \"form\";\n const authored = input.query.trim();\n return authored && authored !== (input.defaultQuery ?? \"\").trim()\n ? \"json\"\n : \"form\";\n}\n"],"names":["operatorCatalogFromSchema"],"mappings":";;;AAmBO,SAAS,qBAAqB,YAAwC;AAC3E,SAAOA,iBAAAA,0BAA0B,WAAW,aAAa,EAAE,SAAS;AACtE;AAUO,SAAS,cAAc,OAGX;AACjB,QAAM,OAAuB,CAAA;AAC7B,MAAI,MAAM,WAAW,WAAW,CAAC,MAAM,WAAW,aAAa;AAC7D,SAAK,KAAK,EAAE,IAAI,WAAW,OAAO,WAAW;AAAA,EAC/C;AACA,MAAI,MAAM,SAAS;AACjB,SAAK,KAAK,EAAE,IAAI,QAAQ,OAAO,OAAA,GAAU,EAAE,IAAI,QAAQ,OAAO,OAAA,CAAQ;AAAA,EACxE;AACA,SAAO;AACT;AAQO,SAAS,oBAAoB,OAKb;;AACrB,QAAM,MAAM,CAAC,OACX,MAAM,KAAK,KAAK,CAAC,QAAQ,IAAI,OAAO,EAAE;AACxC,MAAI,CAAC,IAAI,MAAM,WAAU,WAAM,KAAK,CAAC,MAAZ,mBAAe;AACxC,MAAI,MAAM,OAAQ,QAAO;AACzB,QAAM,WAAW,MAAM,MAAM,KAAA;AAC7B,SAAO,YAAY,cAAc,MAAM,gBAAgB,IAAI,SACvD,SACA;AACN;;;;"}
@@ -0,0 +1,38 @@
1
+ import { BrowserDescriptor } from './connectionBrowserModel';
2
+ import { EsSearch } from './esQueryBuilderModel';
3
+ export type NavigatorTab = {
4
+ id: "catalog" | "form" | "json";
5
+ label: string;
6
+ };
7
+ /**
8
+ * A source supports the builder when the server described a structured search on
9
+ * it. The operator catalog travels with the schema, so no provider name is
10
+ * hardcoded here — adding a structured provider in Go reaches the editor on its
11
+ * own.
12
+ */
13
+ export declare function supportsQueryBuilder(descriptor: BrowserDescriptor): boolean;
14
+ /**
15
+ * navigatorTabs is what the left pane offers. Where the source has a structured
16
+ * search, the two ways of authoring one — the form and the raw DSL — are tabs
17
+ * rather than a one-way door: they are the same query, and the tab says which
18
+ * of the two is stored. A source that picks one flat target has a combobox
19
+ * pinned above the tabs instead of a catalog tree — its targets are a list of
20
+ * index names, and a list is not worth navigating.
21
+ */
22
+ export declare function navigatorTabs(input: {
23
+ descriptor: BrowserDescriptor;
24
+ builder: boolean;
25
+ }): NavigatorTab[];
26
+ /**
27
+ * initialNavigatorTab opens on the form: filters are what the builder is for,
28
+ * so it is where authoring starts rather than something to opt into. The one
29
+ * thing that overrides it is a raw query already worth preserving — and the
30
+ * starter query the descriptor supplies is not one, since nobody wrote it.
31
+ */
32
+ export declare function initialNavigatorTab(input: {
33
+ tabs: NavigatorTab[];
34
+ search: EsSearch | undefined;
35
+ query: string;
36
+ defaultQuery?: string;
37
+ }): string | undefined;
38
+ //# sourceMappingURL=connectionQueryWorkspaceModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectionQueryWorkspaceModel.d.ts","sourceRoot":"","sources":["../../src/profiles/connectionQueryWorkspaceModel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9E;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAE3E;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,YAAY,EAAE,CASjB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,GAAG,SAAS,CASrB"}
@@ -0,0 +1,28 @@
1
+ import { operatorCatalogFromSchema } from "./esQueryOperators.js";
2
+ function supportsQueryBuilder(descriptor) {
3
+ return operatorCatalogFromSchema(descriptor.optionsSchema).length > 0;
4
+ }
5
+ function navigatorTabs(input) {
6
+ const tabs = [];
7
+ if (input.descriptor.catalog && !input.descriptor.targetLabel) {
8
+ tabs.push({ id: "catalog", label: "Catalog" });
9
+ }
10
+ if (input.builder) {
11
+ tabs.push({ id: "form", label: "Form" }, { id: "json", label: "JSON" });
12
+ }
13
+ return tabs;
14
+ }
15
+ function initialNavigatorTab(input) {
16
+ var _a;
17
+ const has = (id) => input.tabs.some((tab) => tab.id === id);
18
+ if (!has("form")) return (_a = input.tabs[0]) == null ? void 0 : _a.id;
19
+ if (input.search) return "form";
20
+ const authored = input.query.trim();
21
+ return authored && authored !== (input.defaultQuery ?? "").trim() ? "json" : "form";
22
+ }
23
+ export {
24
+ initialNavigatorTab,
25
+ navigatorTabs,
26
+ supportsQueryBuilder
27
+ };
28
+ //# sourceMappingURL=connectionQueryWorkspaceModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectionQueryWorkspaceModel.js","sources":["../../src/profiles/connectionQueryWorkspaceModel.ts"],"sourcesContent":["/**\n * Which navigator tabs the query workspace offers, and which one it opens on.\n *\n * Kept apart from the workspace component so that module exports only\n * components (react/only-export-components).\n */\n\nimport type { BrowserDescriptor } from \"./connectionBrowserModel\";\nimport type { EsSearch } from \"./esQueryBuilderModel\";\nimport { operatorCatalogFromSchema } from \"./esQueryOperators\";\n\nexport type NavigatorTab = { id: \"catalog\" | \"form\" | \"json\"; label: string };\n\n/**\n * A source supports the builder when the server described a structured search on\n * it. The operator catalog travels with the schema, so no provider name is\n * hardcoded here — adding a structured provider in Go reaches the editor on its\n * own.\n */\nexport function supportsQueryBuilder(descriptor: BrowserDescriptor): boolean {\n return operatorCatalogFromSchema(descriptor.optionsSchema).length > 0;\n}\n\n/**\n * navigatorTabs is what the left pane offers. Where the source has a structured\n * search, the two ways of authoring one — the form and the raw DSL — are tabs\n * rather than a one-way door: they are the same query, and the tab says which\n * of the two is stored. A source that picks one flat target has a combobox\n * pinned above the tabs instead of a catalog tree — its targets are a list of\n * index names, and a list is not worth navigating.\n */\nexport function navigatorTabs(input: {\n descriptor: BrowserDescriptor;\n builder: boolean;\n}): NavigatorTab[] {\n const tabs: NavigatorTab[] = [];\n if (input.descriptor.catalog && !input.descriptor.targetLabel) {\n tabs.push({ id: \"catalog\", label: \"Catalog\" });\n }\n if (input.builder) {\n tabs.push({ id: \"form\", label: \"Form\" }, { id: \"json\", label: \"JSON\" });\n }\n return tabs;\n}\n\n/**\n * initialNavigatorTab opens on the form: filters are what the builder is for,\n * so it is where authoring starts rather than something to opt into. The one\n * thing that overrides it is a raw query already worth preserving — and the\n * starter query the descriptor supplies is not one, since nobody wrote it.\n */\nexport function initialNavigatorTab(input: {\n tabs: NavigatorTab[];\n search: EsSearch | undefined;\n query: string;\n defaultQuery?: string;\n}): string | undefined {\n const has = (id: NavigatorTab[\"id\"]) =>\n input.tabs.some((tab) => tab.id === id);\n if (!has(\"form\")) return input.tabs[0]?.id;\n if (input.search) return \"form\";\n const authored = input.query.trim();\n return authored && authored !== (input.defaultQuery ?? \"\").trim()\n ? \"json\"\n : \"form\";\n}\n"],"names":[],"mappings":";AAmBO,SAAS,qBAAqB,YAAwC;AAC3E,SAAO,0BAA0B,WAAW,aAAa,EAAE,SAAS;AACtE;AAUO,SAAS,cAAc,OAGX;AACjB,QAAM,OAAuB,CAAA;AAC7B,MAAI,MAAM,WAAW,WAAW,CAAC,MAAM,WAAW,aAAa;AAC7D,SAAK,KAAK,EAAE,IAAI,WAAW,OAAO,WAAW;AAAA,EAC/C;AACA,MAAI,MAAM,SAAS;AACjB,SAAK,KAAK,EAAE,IAAI,QAAQ,OAAO,OAAA,GAAU,EAAE,IAAI,QAAQ,OAAO,OAAA,CAAQ;AAAA,EACxE;AACA,SAAO;AACT;AAQO,SAAS,oBAAoB,OAKb;;AACrB,QAAM,MAAM,CAAC,OACX,MAAM,KAAK,KAAK,CAAC,QAAQ,IAAI,OAAO,EAAE;AACxC,MAAI,CAAC,IAAI,MAAM,WAAU,WAAM,KAAK,CAAC,MAAZ,mBAAe;AACxC,MAAI,MAAM,OAAQ,QAAO;AACzB,QAAM,WAAW,MAAM,MAAM,KAAA;AAC7B,SAAO,YAAY,cAAc,MAAM,gBAAgB,IAAI,SACvD,SACA;AACN;"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const esQueryOperators = require("./esQueryOperators.cjs");
4
+ const valueLimit = 100;
5
+ function valueLookupField(fields, name) {
6
+ if (!name) return void 0;
7
+ const field = fields.find((entry) => entry.name === name);
8
+ if (!field || esQueryOperators.fieldFamily(field) === "date") return void 0;
9
+ if (field.aggregatable !== false) return field.name;
10
+ const keyword = fields.find(
11
+ (entry) => entry.name === `${name}.keyword` && entry.aggregatable !== false
12
+ );
13
+ return keyword == null ? void 0 : keyword.name;
14
+ }
15
+ async function postValues(baseUrl, body) {
16
+ const response = await fetch(`${baseUrl}/values`, {
17
+ method: "POST",
18
+ headers: { "Content-Type": "application/json" },
19
+ body: JSON.stringify(body)
20
+ });
21
+ if (!response.ok) {
22
+ const text = (await response.text()).trim();
23
+ const error = new Error(text || `value lookup failed: ${response.status}`);
24
+ error.status = response.status;
25
+ throw error;
26
+ }
27
+ return await response.json();
28
+ }
29
+ function makeFieldValueLookup(options) {
30
+ const { baseUrl, index, params, roles } = options;
31
+ if (!baseUrl || !index) return void 0;
32
+ return ({ field, search }) => ({
33
+ key: JSON.stringify([
34
+ baseUrl,
35
+ index,
36
+ field,
37
+ search ?? null,
38
+ params ?? null,
39
+ roles ?? null
40
+ ]),
41
+ fetch: async (query) => {
42
+ const body = {
43
+ index,
44
+ field,
45
+ q: query,
46
+ limit: valueLimit,
47
+ ...search ? { search } : {},
48
+ ...params && Object.keys(params).length ? { params } : {},
49
+ ...roles && Object.keys(roles).length ? { roles } : {}
50
+ };
51
+ try {
52
+ return await postValues(baseUrl, body);
53
+ } catch (error) {
54
+ const status = error.status;
55
+ if (!search || status !== 422) throw error;
56
+ const { search: _dropped, ...unscoped } = body;
57
+ return postValues(baseUrl, unscoped);
58
+ }
59
+ }
60
+ });
61
+ }
62
+ exports.makeFieldValueLookup = makeFieldValueLookup;
63
+ exports.valueLookupField = valueLookupField;
64
+ //# sourceMappingURL=esFieldValues.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esFieldValues.cjs","sources":["../../src/profiles/esFieldValues.ts"],"sourcesContent":["/**\n * What a field actually holds. The browser answers a terms aggregation over the\n * selected index, so an operand is picked from real values rather than typed\n * from memory. Which field the aggregation can run on is not always the field\n * being filtered — an analyzed text field aggregates through its keyword\n * sibling — and that resolution is owned here.\n */\n\nimport type { EsSearch } from \"./esQueryBuilderModel\";\nimport { fieldFamily, type EsFieldMapping } from \"./esQueryOperators\";\n\nexport type FieldValue = { value: string; count: number };\n\nexport type FieldValuesResult = {\n values: FieldValue[];\n total: number;\n /** Whether the values reflect the rest of the query or the whole index. */\n scoped: boolean;\n};\n\n/**\n * One resolved lookup. `key` identifies what is being asked — field and scope —\n * so a consumer can cache the answer without re-serializing the request.\n */\nexport type FieldValuesQuery = {\n key: string;\n fetch: (query: string) => Promise<FieldValuesResult>;\n};\n\n/** A host's lookup, bound to a connection and an index. */\nexport type FieldValuesSource = (request: {\n field: string;\n search?: EsSearch;\n}) => FieldValuesQuery;\n\nconst valueLimit = 100;\n\n/**\n * valueLookupField resolves the field a terms aggregation can run on, or\n * undefined when none can. A text field is analyzed, so its own doc values are\n * absent and the aggregation goes through the keyword sibling _field_caps\n * reports beside it. Dates are excluded deliberately: every timestamp is\n * distinct, so a value list says nothing the date-math presets do not.\n */\nexport function valueLookupField(\n fields: EsFieldMapping[],\n name: string | undefined,\n): string | undefined {\n if (!name) return undefined;\n const field = fields.find((entry) => entry.name === name);\n if (!field || fieldFamily(field) === \"date\") return undefined;\n if (field.aggregatable !== false) return field.name;\n const keyword = fields.find(\n (entry) => entry.name === `${name}.keyword` && entry.aggregatable !== false,\n );\n return keyword?.name;\n}\n\ntype ValuesRequestBody = {\n index: string;\n field: string;\n q?: string;\n limit?: number;\n search?: EsSearch;\n params?: Record<string, unknown>;\n roles?: Record<string, string>;\n};\n\nasync function postValues(\n baseUrl: string,\n body: ValuesRequestBody,\n): Promise<FieldValuesResult> {\n const response = await fetch(`${baseUrl}/values`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n const text = (await response.text()).trim();\n const error = new Error(text || `value lookup failed: ${response.status}`);\n (error as Error & { status?: number }).status = response.status;\n throw error;\n }\n return (await response.json()) as FieldValuesResult;\n}\n\n/**\n * makeFieldValueLookup binds a lookup to a connection and an index. A scope the\n * server cannot compile — a sibling condition left half-finished — is answered\n * across the whole index instead, and the result says so, so the widened scope\n * is visible rather than silently assumed. The scope is compiled server-side\n * against `params`, so a sibling condition that interpolates `{{.params.…}}`\n * narrows the suggestions the same way a run would.\n */\nexport function makeFieldValueLookup(options: {\n baseUrl: string;\n index: string;\n params?: Record<string, unknown>;\n roles?: Record<string, string>;\n}): FieldValuesSource | undefined {\n const { baseUrl, index, params, roles } = options;\n if (!baseUrl || !index) return undefined;\n return ({ field, search }) => ({\n key: JSON.stringify([\n baseUrl,\n index,\n field,\n search ?? null,\n params ?? null,\n roles ?? null,\n ]),\n fetch: async (query) => {\n const body: ValuesRequestBody = {\n index,\n field,\n q: query,\n limit: valueLimit,\n ...(search ? { search } : {}),\n ...(params && Object.keys(params).length ? { params } : {}),\n ...(roles && Object.keys(roles).length ? { roles } : {}),\n };\n try {\n return await postValues(baseUrl, body);\n } catch (error) {\n const status = (error as Error & { status?: number }).status;\n if (!search || status !== 422) throw error;\n const { search: _dropped, ...unscoped } = body;\n return postValues(baseUrl, unscoped);\n }\n },\n });\n}\n"],"names":["fieldFamily"],"mappings":";;;AAmCA,MAAM,aAAa;AASZ,SAAS,iBACd,QACA,MACoB;AACpB,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AACxD,MAAI,CAAC,SAASA,iBAAAA,YAAY,KAAK,MAAM,OAAQ,QAAO;AACpD,MAAI,MAAM,iBAAiB,MAAO,QAAO,MAAM;AAC/C,QAAM,UAAU,OAAO;AAAA,IACrB,CAAC,UAAU,MAAM,SAAS,GAAG,IAAI,cAAc,MAAM,iBAAiB;AAAA,EAAA;AAExE,SAAO,mCAAS;AAClB;AAYA,eAAe,WACb,SACA,MAC4B;AAC5B,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,WAAW;AAAA,IAChD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,IAC3B,MAAM,KAAK,UAAU,IAAI;AAAA,EAAA,CAC1B;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAA,GAAQ,KAAA;AACrC,UAAM,QAAQ,IAAI,MAAM,QAAQ,wBAAwB,SAAS,MAAM,EAAE;AACxE,UAAsC,SAAS,SAAS;AACzD,UAAM;AAAA,EACR;AACA,SAAQ,MAAM,SAAS,KAAA;AACzB;AAUO,SAAS,qBAAqB,SAKH;AAChC,QAAM,EAAE,SAAS,OAAO,QAAQ,UAAU;AAC1C,MAAI,CAAC,WAAW,CAAC,MAAO,QAAO;AAC/B,SAAO,CAAC,EAAE,OAAO,cAAc;AAAA,IAC7B,KAAK,KAAK,UAAU;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,SAAS;AAAA,IAAA,CACV;AAAA,IACD,OAAO,OAAO,UAAU;AACtB,YAAM,OAA0B;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH,OAAO;AAAA,QACP,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,QAC1B,GAAI,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,QACxD,GAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,EAAE,UAAU,CAAA;AAAA,MAAC;AAExD,UAAI;AACF,eAAO,MAAM,WAAW,SAAS,IAAI;AAAA,MACvC,SAAS,OAAO;AACd,cAAM,SAAU,MAAsC;AACtD,YAAI,CAAC,UAAU,WAAW,IAAK,OAAM;AACrC,cAAM,EAAE,QAAQ,UAAU,GAAG,aAAa;AAC1C,eAAO,WAAW,SAAS,QAAQ;AAAA,MACrC;AAAA,IACF;AAAA,EAAA;AAEJ;;;"}
@@ -0,0 +1,48 @@
1
+ import { EsSearch } from './esQueryBuilderModel';
2
+ import { EsFieldMapping } from './esQueryOperators';
3
+ export type FieldValue = {
4
+ value: string;
5
+ count: number;
6
+ };
7
+ export type FieldValuesResult = {
8
+ values: FieldValue[];
9
+ total: number;
10
+ /** Whether the values reflect the rest of the query or the whole index. */
11
+ scoped: boolean;
12
+ };
13
+ /**
14
+ * One resolved lookup. `key` identifies what is being asked — field and scope —
15
+ * so a consumer can cache the answer without re-serializing the request.
16
+ */
17
+ export type FieldValuesQuery = {
18
+ key: string;
19
+ fetch: (query: string) => Promise<FieldValuesResult>;
20
+ };
21
+ /** A host's lookup, bound to a connection and an index. */
22
+ export type FieldValuesSource = (request: {
23
+ field: string;
24
+ search?: EsSearch;
25
+ }) => FieldValuesQuery;
26
+ /**
27
+ * valueLookupField resolves the field a terms aggregation can run on, or
28
+ * undefined when none can. A text field is analyzed, so its own doc values are
29
+ * absent and the aggregation goes through the keyword sibling _field_caps
30
+ * reports beside it. Dates are excluded deliberately: every timestamp is
31
+ * distinct, so a value list says nothing the date-math presets do not.
32
+ */
33
+ export declare function valueLookupField(fields: EsFieldMapping[], name: string | undefined): string | undefined;
34
+ /**
35
+ * makeFieldValueLookup binds a lookup to a connection and an index. A scope the
36
+ * server cannot compile — a sibling condition left half-finished — is answered
37
+ * across the whole index instead, and the result says so, so the widened scope
38
+ * is visible rather than silently assumed. The scope is compiled server-side
39
+ * against `params`, so a sibling condition that interpolates `{{.params.…}}`
40
+ * narrows the suggestions the same way a run would.
41
+ */
42
+ export declare function makeFieldValueLookup(options: {
43
+ baseUrl: string;
44
+ index: string;
45
+ params?: Record<string, unknown>;
46
+ roles?: Record<string, string>;
47
+ }): FieldValuesSource | undefined;
48
+ //# sourceMappingURL=esFieldValues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esFieldValues.d.ts","sourceRoot":"","sources":["../../src/profiles/esFieldValues.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEtE,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACtD,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB,KAAK,gBAAgB,CAAC;AAIvB;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,cAAc,EAAE,EACxB,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,MAAM,GAAG,SAAS,CASpB;AA8BD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,GAAG,iBAAiB,GAAG,SAAS,CAgChC"}
@@ -0,0 +1,64 @@
1
+ import { fieldFamily } from "./esQueryOperators.js";
2
+ const valueLimit = 100;
3
+ function valueLookupField(fields, name) {
4
+ if (!name) return void 0;
5
+ const field = fields.find((entry) => entry.name === name);
6
+ if (!field || fieldFamily(field) === "date") return void 0;
7
+ if (field.aggregatable !== false) return field.name;
8
+ const keyword = fields.find(
9
+ (entry) => entry.name === `${name}.keyword` && entry.aggregatable !== false
10
+ );
11
+ return keyword == null ? void 0 : keyword.name;
12
+ }
13
+ async function postValues(baseUrl, body) {
14
+ const response = await fetch(`${baseUrl}/values`, {
15
+ method: "POST",
16
+ headers: { "Content-Type": "application/json" },
17
+ body: JSON.stringify(body)
18
+ });
19
+ if (!response.ok) {
20
+ const text = (await response.text()).trim();
21
+ const error = new Error(text || `value lookup failed: ${response.status}`);
22
+ error.status = response.status;
23
+ throw error;
24
+ }
25
+ return await response.json();
26
+ }
27
+ function makeFieldValueLookup(options) {
28
+ const { baseUrl, index, params, roles } = options;
29
+ if (!baseUrl || !index) return void 0;
30
+ return ({ field, search }) => ({
31
+ key: JSON.stringify([
32
+ baseUrl,
33
+ index,
34
+ field,
35
+ search ?? null,
36
+ params ?? null,
37
+ roles ?? null
38
+ ]),
39
+ fetch: async (query) => {
40
+ const body = {
41
+ index,
42
+ field,
43
+ q: query,
44
+ limit: valueLimit,
45
+ ...search ? { search } : {},
46
+ ...params && Object.keys(params).length ? { params } : {},
47
+ ...roles && Object.keys(roles).length ? { roles } : {}
48
+ };
49
+ try {
50
+ return await postValues(baseUrl, body);
51
+ } catch (error) {
52
+ const status = error.status;
53
+ if (!search || status !== 422) throw error;
54
+ const { search: _dropped, ...unscoped } = body;
55
+ return postValues(baseUrl, unscoped);
56
+ }
57
+ }
58
+ });
59
+ }
60
+ export {
61
+ makeFieldValueLookup,
62
+ valueLookupField
63
+ };
64
+ //# sourceMappingURL=esFieldValues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esFieldValues.js","sources":["../../src/profiles/esFieldValues.ts"],"sourcesContent":["/**\n * What a field actually holds. The browser answers a terms aggregation over the\n * selected index, so an operand is picked from real values rather than typed\n * from memory. Which field the aggregation can run on is not always the field\n * being filtered — an analyzed text field aggregates through its keyword\n * sibling — and that resolution is owned here.\n */\n\nimport type { EsSearch } from \"./esQueryBuilderModel\";\nimport { fieldFamily, type EsFieldMapping } from \"./esQueryOperators\";\n\nexport type FieldValue = { value: string; count: number };\n\nexport type FieldValuesResult = {\n values: FieldValue[];\n total: number;\n /** Whether the values reflect the rest of the query or the whole index. */\n scoped: boolean;\n};\n\n/**\n * One resolved lookup. `key` identifies what is being asked — field and scope —\n * so a consumer can cache the answer without re-serializing the request.\n */\nexport type FieldValuesQuery = {\n key: string;\n fetch: (query: string) => Promise<FieldValuesResult>;\n};\n\n/** A host's lookup, bound to a connection and an index. */\nexport type FieldValuesSource = (request: {\n field: string;\n search?: EsSearch;\n}) => FieldValuesQuery;\n\nconst valueLimit = 100;\n\n/**\n * valueLookupField resolves the field a terms aggregation can run on, or\n * undefined when none can. A text field is analyzed, so its own doc values are\n * absent and the aggregation goes through the keyword sibling _field_caps\n * reports beside it. Dates are excluded deliberately: every timestamp is\n * distinct, so a value list says nothing the date-math presets do not.\n */\nexport function valueLookupField(\n fields: EsFieldMapping[],\n name: string | undefined,\n): string | undefined {\n if (!name) return undefined;\n const field = fields.find((entry) => entry.name === name);\n if (!field || fieldFamily(field) === \"date\") return undefined;\n if (field.aggregatable !== false) return field.name;\n const keyword = fields.find(\n (entry) => entry.name === `${name}.keyword` && entry.aggregatable !== false,\n );\n return keyword?.name;\n}\n\ntype ValuesRequestBody = {\n index: string;\n field: string;\n q?: string;\n limit?: number;\n search?: EsSearch;\n params?: Record<string, unknown>;\n roles?: Record<string, string>;\n};\n\nasync function postValues(\n baseUrl: string,\n body: ValuesRequestBody,\n): Promise<FieldValuesResult> {\n const response = await fetch(`${baseUrl}/values`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n const text = (await response.text()).trim();\n const error = new Error(text || `value lookup failed: ${response.status}`);\n (error as Error & { status?: number }).status = response.status;\n throw error;\n }\n return (await response.json()) as FieldValuesResult;\n}\n\n/**\n * makeFieldValueLookup binds a lookup to a connection and an index. A scope the\n * server cannot compile — a sibling condition left half-finished — is answered\n * across the whole index instead, and the result says so, so the widened scope\n * is visible rather than silently assumed. The scope is compiled server-side\n * against `params`, so a sibling condition that interpolates `{{.params.…}}`\n * narrows the suggestions the same way a run would.\n */\nexport function makeFieldValueLookup(options: {\n baseUrl: string;\n index: string;\n params?: Record<string, unknown>;\n roles?: Record<string, string>;\n}): FieldValuesSource | undefined {\n const { baseUrl, index, params, roles } = options;\n if (!baseUrl || !index) return undefined;\n return ({ field, search }) => ({\n key: JSON.stringify([\n baseUrl,\n index,\n field,\n search ?? null,\n params ?? null,\n roles ?? null,\n ]),\n fetch: async (query) => {\n const body: ValuesRequestBody = {\n index,\n field,\n q: query,\n limit: valueLimit,\n ...(search ? { search } : {}),\n ...(params && Object.keys(params).length ? { params } : {}),\n ...(roles && Object.keys(roles).length ? { roles } : {}),\n };\n try {\n return await postValues(baseUrl, body);\n } catch (error) {\n const status = (error as Error & { status?: number }).status;\n if (!search || status !== 422) throw error;\n const { search: _dropped, ...unscoped } = body;\n return postValues(baseUrl, unscoped);\n }\n },\n });\n}\n"],"names":[],"mappings":";AAmCA,MAAM,aAAa;AASZ,SAAS,iBACd,QACA,MACoB;AACpB,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AACxD,MAAI,CAAC,SAAS,YAAY,KAAK,MAAM,OAAQ,QAAO;AACpD,MAAI,MAAM,iBAAiB,MAAO,QAAO,MAAM;AAC/C,QAAM,UAAU,OAAO;AAAA,IACrB,CAAC,UAAU,MAAM,SAAS,GAAG,IAAI,cAAc,MAAM,iBAAiB;AAAA,EAAA;AAExE,SAAO,mCAAS;AAClB;AAYA,eAAe,WACb,SACA,MAC4B;AAC5B,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,WAAW;AAAA,IAChD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,IAC3B,MAAM,KAAK,UAAU,IAAI;AAAA,EAAA,CAC1B;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAA,GAAQ,KAAA;AACrC,UAAM,QAAQ,IAAI,MAAM,QAAQ,wBAAwB,SAAS,MAAM,EAAE;AACxE,UAAsC,SAAS,SAAS;AACzD,UAAM;AAAA,EACR;AACA,SAAQ,MAAM,SAAS,KAAA;AACzB;AAUO,SAAS,qBAAqB,SAKH;AAChC,QAAM,EAAE,SAAS,OAAO,QAAQ,UAAU;AAC1C,MAAI,CAAC,WAAW,CAAC,MAAO,QAAO;AAC/B,SAAO,CAAC,EAAE,OAAO,cAAc;AAAA,IAC7B,KAAK,KAAK,UAAU;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,SAAS;AAAA,IAAA,CACV;AAAA,IACD,OAAO,OAAO,UAAU;AACtB,YAAM,OAA0B;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH,OAAO;AAAA,QACP,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,QAC1B,GAAI,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,QACxD,GAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,EAAE,UAAU,CAAA;AAAA,MAAC;AAExD,UAAI;AACF,eAAO,MAAM,WAAW,SAAS,IAAI;AAAA,MACvC,SAAS,OAAO;AACd,cAAM,SAAU,MAAsC;AACtD,YAAI,CAAC,UAAU,WAAW,IAAK,OAAM;AACrC,cAAM,EAAE,QAAQ,UAAU,GAAG,aAAa;AAC1C,eAAO,WAAW,SAAS,QAAQ;AAAA,MACrC;AAAA,IACF;AAAA,EAAA;AAEJ;"}