@flanksource/clicky-ui 0.3.19 → 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 (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,198 @@
1
+ function applyPatch(value, patch) {
2
+ const next = { ...value };
3
+ for (const [key, entry] of Object.entries(patch)) {
4
+ if (entry === void 0) delete next[key];
5
+ else next[key] = entry;
6
+ }
7
+ return next;
8
+ }
9
+ const PARAM_TYPES_WITH_OPTIONS = ["enum", "list"];
10
+ function paramHasOptions(param) {
11
+ return param.type !== void 0 && PARAM_TYPES_WITH_OPTIONS.includes(param.type);
12
+ }
13
+ function withProfileLimits(draft, limits) {
14
+ const next = { ...draft };
15
+ if (limits) next.limits = limits;
16
+ else delete next.limits;
17
+ return next;
18
+ }
19
+ const PROFILE_COLUMN_FORMAT_OPTIONS = [
20
+ { value: "date", label: "Date/time" },
21
+ { value: "float", label: "Number" },
22
+ { value: "duration", label: "Duration" },
23
+ { value: "bytes", label: "Bytes" },
24
+ { value: "currency", label: "Currency" }
25
+ ];
26
+ const PROFILE_COLUMN_UNIT_OPTIONS = [
27
+ { value: "none", label: "Compact count" },
28
+ { value: "short", label: "Short number" },
29
+ { value: "percent", label: "Percent (0-100)" },
30
+ { value: "percentunit", label: "Percent (0-1)" },
31
+ { value: "bytes", label: "Bytes (IEC)" },
32
+ { value: "decbytes", label: "Bytes (SI)" },
33
+ { value: "Bps", label: "Bytes/sec" },
34
+ { value: "binBps", label: "Binary bytes/sec" },
35
+ { value: "ms", label: "Milliseconds" },
36
+ { value: "s", label: "Seconds" }
37
+ ];
38
+ const profileWizardSteps = [
39
+ { id: "source", label: "Choose source", description: "Connection" },
40
+ { id: "query", label: "Explore & sample", description: "Query" },
41
+ { id: "fields", label: "Name & shape", description: "Fields" },
42
+ { id: "review", label: "Review", description: "Save" }
43
+ ];
44
+ function filterProfileFields(fields, selectedNames, filter) {
45
+ const query = filter.query.trim().toLowerCase();
46
+ return fields.filter((field) => {
47
+ const selected = selectedNames.has(field.name);
48
+ if (filter.selection === "selected" && !selected) return false;
49
+ if (filter.selection === "unselected" && selected) return false;
50
+ if (filter.type && field.type !== filter.type) return false;
51
+ if (!query) return true;
52
+ return `${field.name} ${field.label ?? ""}`.toLowerCase().includes(query);
53
+ });
54
+ }
55
+ function availableProfileFields(discovered, configured) {
56
+ const configuredByName = new Map(
57
+ configured.map((field) => [field.name, field])
58
+ );
59
+ const configuredBySource = new Map(
60
+ configured.filter((field) => field.source).map((field) => [field.source, field])
61
+ );
62
+ const ordered = [...configured];
63
+ let anchor = 0;
64
+ for (const field of discovered) {
65
+ const match = configuredByName.get(field.name) ?? configuredBySource.get(field.name);
66
+ if (match) {
67
+ anchor = ordered.indexOf(match) + 1;
68
+ continue;
69
+ }
70
+ ordered.splice(anchor, 0, field);
71
+ anchor += 1;
72
+ }
73
+ return ordered;
74
+ }
75
+ function reorderProfileColumns(columns, sourceName, targetName) {
76
+ const from = columns.findIndex((column) => column.name === sourceName);
77
+ const to = columns.findIndex((column) => column.name === targetName);
78
+ if (from < 0 || to < 0 || from === to) return columns;
79
+ const next = [...columns];
80
+ next.splice(to, 0, ...next.splice(from, 1));
81
+ return next;
82
+ }
83
+ function applyVisibleFieldSelection(discovered, configured, visibleNames, selected) {
84
+ const selectedNames = new Set(configured.map((field) => field.name));
85
+ for (const name of visibleNames) {
86
+ if (selected) selectedNames.add(name);
87
+ else selectedNames.delete(name);
88
+ }
89
+ return availableProfileFields(discovered, configured).filter(
90
+ (field) => selectedNames.has(field.name)
91
+ );
92
+ }
93
+ const PROFILE_FILTER_KIND_OPTIONS = [
94
+ { value: "terms", label: "Value selection" },
95
+ { value: "range", label: "Numeric range" },
96
+ { value: "time", label: "Time range" },
97
+ { value: "boolean", label: "Yes/no" },
98
+ { value: "text", label: "Substring" },
99
+ { value: "none", label: "Not filterable" }
100
+ ];
101
+ const PROFILE_FILTER_DEFAULT_LIMIT = 50;
102
+ const PROFILE_FILTER_MAX_LIMIT = 200;
103
+ function patchColumnFilter(filter, patch) {
104
+ const merged = Object.fromEntries(
105
+ Object.entries({ ...filter, ...patch }).filter(([, value]) => value !== void 0)
106
+ );
107
+ return Object.keys(merged).length ? merged : void 0;
108
+ }
109
+ function inferredFilterKind(column) {
110
+ switch (column.type) {
111
+ case "number":
112
+ case "duration":
113
+ case "bytes":
114
+ return "range";
115
+ case "datetime":
116
+ return "time";
117
+ case "boolean":
118
+ return "boolean";
119
+ case "key_value":
120
+ case "key_values":
121
+ case "json":
122
+ return "none";
123
+ default:
124
+ return "terms";
125
+ }
126
+ }
127
+ function patchProfileField(field, patch) {
128
+ return Object.fromEntries(
129
+ Object.entries({ ...field, ...patch }).filter(
130
+ ([, value]) => value !== void 0
131
+ )
132
+ );
133
+ }
134
+ function renameProfileField(field, name) {
135
+ const source = field.source ?? (field.cel ? void 0 : field.name);
136
+ return patchProfileField(field, {
137
+ name,
138
+ source: source === name ? void 0 : source
139
+ });
140
+ }
141
+ function providerTypeFromConnectionLabel(label) {
142
+ var _a;
143
+ const match = label.match(/\(([^()]+)\)\s*$/);
144
+ return ((_a = match == null ? void 0 : match[1]) == null ? void 0 : _a.trim()) || null;
145
+ }
146
+ function profileConnectionID(value) {
147
+ const prefix = "connection://";
148
+ if (!value.startsWith(prefix)) return null;
149
+ return value.slice(prefix.length).trim() || null;
150
+ }
151
+ function profileWizardErrorMessage(error, fallback) {
152
+ return error instanceof Error && error.message.trim() ? error.message.trim() : fallback;
153
+ }
154
+ function profileWizardHasQuery(draft) {
155
+ var _a, _b, _c;
156
+ return Boolean(
157
+ ((_a = draft.query) == null ? void 0 : _a.trim()) || ((_c = (_b = draft.provider) == null ? void 0 : _b.options) == null ? void 0 : _c.search) !== void 0
158
+ );
159
+ }
160
+ function profileWizardStepReady(step, draft, discovered) {
161
+ var _a, _b, _c, _d, _e;
162
+ if (step === "source") {
163
+ return Boolean(((_a = draft.provider) == null ? void 0 : _a.connection) && draft.provider.type);
164
+ }
165
+ if (step === "query") {
166
+ return Boolean(profileWizardHasQuery(draft) && discovered.length > 0);
167
+ }
168
+ if (step === "fields") {
169
+ return Boolean(((_b = draft.profile) == null ? void 0 : _b.trim()) && ((_c = draft.columns) == null ? void 0 : _c.length));
170
+ }
171
+ return Boolean(((_d = draft.profile) == null ? void 0 : _d.trim()) && ((_e = draft.provider) == null ? void 0 : _e.connection)) && discovered.length > 0;
172
+ }
173
+ export {
174
+ PARAM_TYPES_WITH_OPTIONS,
175
+ PROFILE_COLUMN_FORMAT_OPTIONS,
176
+ PROFILE_COLUMN_UNIT_OPTIONS,
177
+ PROFILE_FILTER_DEFAULT_LIMIT,
178
+ PROFILE_FILTER_KIND_OPTIONS,
179
+ PROFILE_FILTER_MAX_LIMIT,
180
+ applyPatch,
181
+ applyVisibleFieldSelection,
182
+ availableProfileFields,
183
+ filterProfileFields,
184
+ inferredFilterKind,
185
+ paramHasOptions,
186
+ patchColumnFilter,
187
+ patchProfileField,
188
+ profileConnectionID,
189
+ profileWizardErrorMessage,
190
+ profileWizardHasQuery,
191
+ profileWizardStepReady,
192
+ profileWizardSteps,
193
+ providerTypeFromConnectionLabel,
194
+ renameProfileField,
195
+ reorderProfileColumns,
196
+ withProfileLimits
197
+ };
198
+ //# sourceMappingURL=profileWizardModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileWizardModel.js","sources":["../../src/profiles/profileWizardModel.ts"],"sourcesContent":["import type { ProfileRowLimits } from \"./connectionBrowserModel\";\n\n/** How a column is filtered at the backend; every field overrides an inference\n * the server would otherwise make from the column itself. */\nexport type ProfileColumnFilter = {\n /** Backend field the selection applies to; blank infers it from the column. */\n field?: string;\n /** terms, range, time, boolean, text or none; blank infers it from the type. */\n kind?: string;\n /** Enumerated values, replacing the backend lookup. */\n options?: string[];\n /** Ask the backend for this field's distinct values. */\n lookup?: boolean;\n /** How many of those values the control offers before the rest are typed for. */\n limit?: number;\n /** Allow several values at once. */\n multi?: boolean;\n /** Offer no filter while keeping the column rendered. */\n disabled?: boolean;\n};\n\n/**\n * A patch of T: every key optional, and explicitly settable to `undefined` to\n * clear it.\n *\n * Not Partial<T>. Under `exactOptionalPropertyTypes` an optional key may be\n * absent but not present-and-undefined, and \"clear this field\" — which is what\n * every editor control sends when its input goes empty — is precisely a present\n * `undefined`. The patch appliers drop those keys; the type has to permit them.\n */\nexport type Patch<T> = { [K in keyof T]?: T[K] | undefined };\n\n/**\n * Applies a patch, removing the keys it clears instead of leaving them present\n * and undefined.\n *\n * Spreading a patch would keep them, and these objects are serialized to the\n * server, where a present `field: undefined` is a key to interpret rather than\n * an absent one.\n */\nexport function applyPatch<T extends object>(value: T, patch: Patch<T>): T {\n const next = { ...value };\n for (const [key, entry] of Object.entries(patch)) {\n if (entry === undefined) delete next[key as keyof T];\n else next[key as keyof T] = entry as T[keyof T];\n }\n return next;\n}\n\nexport type ProfileColumn = {\n name: string;\n source?: string;\n label?: string;\n type?: string;\n kind?: string;\n format?: string;\n unit?: string;\n width?: number;\n cel?: string;\n /** Path computing the value, rooted at the row or at `source` when set. */\n jsonpath?: string;\n hidden?: boolean;\n filter?: ProfileColumnFilter;\n [key: string]: unknown;\n};\n\nexport type ProfileProvider = {\n type?: string;\n connection?: string;\n options?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\n/** The parameter types the profile schema accepts. */\nexport type ParamDraftType = \"string\" | \"number\" | \"boolean\" | \"date\" | \"enum\" | \"list\";\n\n/** filter, limit, offset, time-from or time-to; empty behaves as filter. */\nexport type ParamDraftRole = \"filter\" | \"limit\" | \"offset\" | \"time-from\" | \"time-to\";\n\nexport type ParamDraft = {\n name?: string | undefined;\n label?: string | undefined;\n type?: ParamDraftType | undefined;\n role?: ParamDraftRole | undefined;\n default?: unknown | undefined;\n options?: string[] | undefined;\n required?: boolean | undefined;\n description?: string | undefined;\n /** Value rewrite; {value} is the supplied value. */\n template?: string | undefined;\n /** Backend field a list parameter filters on. Setting it lets a value be\n * excluded as well as included; it requires an OpenSearch-backed provider. */\n field?: string | undefined;\n};\n\n/** PARAM_TYPES_WITH_OPTIONS are the types whose values come from a fixed set, so\n * the editor offers an options picker for them. */\nexport const PARAM_TYPES_WITH_OPTIONS: ParamDraftType[] = [\"enum\", \"list\"];\n\nexport function paramHasOptions(param: ParamDraft): boolean {\n return param.type !== undefined && PARAM_TYPES_WITH_OPTIONS.includes(param.type);\n}\n\nexport type ProfileWizardDraft = Record<string, unknown> & {\n namespace?: string | undefined;\n profile?: string | undefined;\n /** Overrides the sidebar/picker glyph the provider type would otherwise give. */\n icon?: string | undefined;\n provider?: ProfileProvider | undefined;\n query?: string | undefined;\n columns?: ProfileColumn[] | undefined;\n /** The inputs a run binds — by name in the query, the provider options or the\n * connection. The query workspace previews against their defaults. */\n params?: ParamDraft[] | undefined;\n /** The row caps this profile sets for itself; unset ones take their default. */\n limits?: ProfileRowLimits | undefined;\n};\n\n/**\n * A profile that caps nothing carries no block at all, so the defaults are what\n * it inherits rather than what it froze at the moment it was edited. Both draft\n * hosts write the caps through this, so neither can leave an empty map behind.\n */\nexport function withProfileLimits<T extends ProfileWizardDraft>(\n draft: T,\n limits: ProfileRowLimits | undefined,\n): T {\n const next = { ...draft };\n if (limits) next.limits = limits;\n else delete next.limits;\n return next;\n}\n\nexport type ProfileFieldFilter = {\n query: string;\n type: string;\n selection: \"all\" | \"selected\" | \"unselected\";\n};\n\nexport const PROFILE_COLUMN_FORMAT_OPTIONS = [\n { value: \"date\", label: \"Date/time\" },\n { value: \"float\", label: \"Number\" },\n { value: \"duration\", label: \"Duration\" },\n { value: \"bytes\", label: \"Bytes\" },\n { value: \"currency\", label: \"Currency\" },\n] as const;\n\nexport const PROFILE_COLUMN_UNIT_OPTIONS = [\n { value: \"none\", label: \"Compact count\" },\n { value: \"short\", label: \"Short number\" },\n { value: \"percent\", label: \"Percent (0-100)\" },\n { value: \"percentunit\", label: \"Percent (0-1)\" },\n { value: \"bytes\", label: \"Bytes (IEC)\" },\n { value: \"decbytes\", label: \"Bytes (SI)\" },\n { value: \"Bps\", label: \"Bytes/sec\" },\n { value: \"binBps\", label: \"Binary bytes/sec\" },\n { value: \"ms\", label: \"Milliseconds\" },\n { value: \"s\", label: \"Seconds\" },\n] as const;\n\nexport const profileWizardSteps = [\n { id: \"source\", label: \"Choose source\", description: \"Connection\" },\n { id: \"query\", label: \"Explore & sample\", description: \"Query\" },\n { id: \"fields\", label: \"Name & shape\", description: \"Fields\" },\n { id: \"review\", label: \"Review\", description: \"Save\" },\n] as const;\n\nexport function filterProfileFields(\n fields: ProfileColumn[],\n selectedNames: Set<string>,\n filter: ProfileFieldFilter,\n): ProfileColumn[] {\n const query = filter.query.trim().toLowerCase();\n return fields.filter((field) => {\n const selected = selectedNames.has(field.name);\n if (filter.selection === \"selected\" && !selected) return false;\n if (filter.selection === \"unselected\" && selected) return false;\n if (filter.type && field.type !== filter.type) return false;\n if (!query) return true;\n return `${field.name} ${field.label ?? \"\"}`.toLowerCase().includes(query);\n });\n}\n\n/**\n * Every field the editors can show, each in its configured form. A discovered\n * field is a snapshot of what the source reported — the configured one carries\n * the user's edits, so it is the only version safe to render into a control or\n * to patch on top of.\n *\n * The configuration owns the order, because it is the order the profile renders\n * its columns in and the one the user drags rows into. A discovered field that\n * was never configured (not selected, or dropped from the profile) has no place\n * of its own, so it keeps the one it had: it is anchored just after whichever\n * configured field preceded it in the sample.\n */\nexport function availableProfileFields(\n discovered: ProfileColumn[],\n configured: ProfileColumn[],\n): ProfileColumn[] {\n const configuredByName = new Map(\n configured.map((field) => [field.name, field]),\n );\n const configuredBySource = new Map(\n configured\n .filter((field) => field.source)\n .map((field) => [field.source as string, field]),\n );\n const ordered = [...configured];\n let anchor = 0;\n for (const field of discovered) {\n const match =\n configuredByName.get(field.name) ?? configuredBySource.get(field.name);\n if (match) {\n anchor = ordered.indexOf(match) + 1;\n continue;\n }\n ordered.splice(anchor, 0, field);\n anchor += 1;\n }\n return ordered;\n}\n\n/**\n * Moves the named column onto the target's position, shifting the columns\n * between them — the drop semantics the field grid's row drag needs. Columns\n * are addressed by name because a drag only ever carries the row's identity.\n * A name that is not configured has no position, so the order is returned\n * unchanged rather than guessed at.\n */\nexport function reorderProfileColumns(\n columns: ProfileColumn[],\n sourceName: string,\n targetName: string,\n): ProfileColumn[] {\n const from = columns.findIndex((column) => column.name === sourceName);\n const to = columns.findIndex((column) => column.name === targetName);\n if (from < 0 || to < 0 || from === to) return columns;\n const next = [...columns];\n next.splice(to, 0, ...next.splice(from, 1));\n return next;\n}\n\n/**\n * Selects or deselects the named fields, keeping the configured order intact —\n * a re-selected field returns to where the grid already showed it rather than\n * to the back of the list or to its position in the sample.\n */\nexport function applyVisibleFieldSelection(\n discovered: ProfileColumn[],\n configured: ProfileColumn[],\n visibleNames: Set<string>,\n selected: boolean,\n): ProfileColumn[] {\n const selectedNames = new Set(configured.map((field) => field.name));\n for (const name of visibleNames) {\n if (selected) selectedNames.add(name);\n else selectedNames.delete(name);\n }\n return availableProfileFields(discovered, configured).filter((field) =>\n selectedNames.has(field.name),\n );\n}\n\n/** The control kinds a column filter can render as, with the server's own\n * wording. Mirrors query.ColumnFilterKindValues() and the x-enum-labels the\n * profile schema carries for them. */\nexport const PROFILE_FILTER_KIND_OPTIONS = [\n { value: \"terms\", label: \"Value selection\" },\n { value: \"range\", label: \"Numeric range\" },\n { value: \"time\", label: \"Time range\" },\n { value: \"boolean\", label: \"Yes/no\" },\n { value: \"text\", label: \"Substring\" },\n { value: \"none\", label: \"Not filterable\" },\n] as const;\n\n/** The server's own default, so an unset limit can be shown for what it does.\n * Mirrors query.DefaultFilterLookupLimit. */\nexport const PROFILE_FILTER_DEFAULT_LIMIT = 50;\n\n/** Mirrors query.MaxFilterLookupLimit — the largest head a lookup will serve. */\nexport const PROFILE_FILTER_MAX_LIMIT = 200;\n\n/**\n * Merges one filter knob into a column's filter block, dropping the block once\n * nothing is left in it.\n *\n * The distinction matters on save: `filter: {}` is a declaration that declares\n * nothing, and the server reads a present-but-empty block differently from an\n * absent one — unchecking the last box has to mean \"infer this again\", not\n * \"override it with silence\".\n */\nexport function patchColumnFilter(\n filter: ProfileColumnFilter | undefined,\n patch: Patch<ProfileColumnFilter>,\n): ProfileColumnFilter | undefined {\n const merged = Object.fromEntries(\n Object.entries({ ...filter, ...patch }).filter(([, value]) => value !== undefined),\n ) as ProfileColumnFilter;\n return Object.keys(merged).length ? merged : undefined;\n}\n\n/** What the server picks for a column that declares no filter kind. Mirrors\n * columnFilterKindFor; text is absent there on purpose, so it is here too. */\nexport function inferredFilterKind(column: ProfileColumn): string {\n switch (column.type) {\n case \"number\":\n case \"duration\":\n case \"bytes\":\n return \"range\";\n case \"datetime\":\n return \"time\";\n case \"boolean\":\n return \"boolean\";\n case \"key_value\":\n case \"key_values\":\n case \"json\":\n return \"none\";\n default:\n return \"terms\";\n }\n}\n\nexport function patchProfileField(\n field: ProfileColumn,\n patch: Patch<ProfileColumn>,\n): ProfileColumn {\n return Object.fromEntries(\n Object.entries({ ...field, ...patch }).filter(\n ([, value]) => value !== undefined,\n ),\n ) as ProfileColumn;\n}\n\nexport function renameProfileField(\n field: ProfileColumn,\n name: string,\n): ProfileColumn {\n const source = field.source ?? (field.cel ? undefined : field.name);\n return patchProfileField(field, {\n name,\n source: source === name ? undefined : source,\n });\n}\n\nexport function providerTypeFromConnectionLabel(label: string): string | null {\n const match = label.match(/\\(([^()]+)\\)\\s*$/);\n return match?.[1]?.trim() || null;\n}\n\nexport function profileConnectionID(value: string): string | null {\n const prefix = \"connection://\";\n if (!value.startsWith(prefix)) return null;\n return value.slice(prefix.length).trim() || null;\n}\n\nexport function profileWizardErrorMessage(\n error: unknown,\n fallback: string,\n): string {\n return error instanceof Error && error.message.trim()\n ? error.message.trim()\n : fallback;\n}\n\n/**\n * A profile says what to fetch either as a raw query or as a structured search\n * specification — never both, which is why this is an either/or rather than a\n * check on `query` alone.\n */\nexport function profileWizardHasQuery(draft: ProfileWizardDraft): boolean {\n return Boolean(\n draft.query?.trim() || draft.provider?.options?.search !== undefined,\n );\n}\n\nexport function profileWizardStepReady(\n step: (typeof profileWizardSteps)[number][\"id\"],\n draft: ProfileWizardDraft,\n discovered: ProfileColumn[],\n): boolean {\n if (step === \"source\") {\n return Boolean(draft.provider?.connection && draft.provider.type);\n }\n if (step === \"query\") {\n return Boolean(profileWizardHasQuery(draft) && discovered.length > 0);\n }\n if (step === \"fields\") {\n return Boolean(draft.profile?.trim() && draft.columns?.length);\n }\n return (\n Boolean(draft.profile?.trim() && draft.provider?.connection) &&\n discovered.length > 0\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const reactQuery = require("@tanstack/react-query");
5
+ const react = require("react");
6
+ const connectionBrowserModel = require("./connectionBrowserModel.cjs");
7
+ const connectionQueryWorkspace = require("./connectionQueryWorkspace.cjs");
8
+ const profileApi = require("./profileApi.cjs");
9
+ const profileSamplePayload = require("./profileSamplePayload.cjs");
10
+ const profileWizardModel = require("./profileWizardModel.cjs");
11
+ const connectionQueryWorkspaceModel = require("./connectionQueryWorkspaceModel.cjs");
12
+ const esQueryBuilderForm = require("./esQueryBuilderForm.cjs");
13
+ function ProfileWizardQueryStep({
14
+ connectionID,
15
+ draft,
16
+ discovered,
17
+ onDraftChange,
18
+ onSample
19
+ }) {
20
+ var _a, _b, _c, _d;
21
+ const baseUrl = connectionBrowserModel.browserBaseUrl(connectionID);
22
+ const descriptor = reactQuery.useQuery({
23
+ queryKey: ["profile-wizard-descriptor", connectionID],
24
+ queryFn: () => connectionBrowserModel.fetchJSON(baseUrl),
25
+ retry: 0
26
+ });
27
+ const providerOptions = react.useMemo(
28
+ () => {
29
+ var _a2;
30
+ return { ...(_a2 = draft.provider) == null ? void 0 : _a2.options };
31
+ },
32
+ [(_a = draft.provider) == null ? void 0 : _a.options]
33
+ );
34
+ const [query, setQuery] = react.useState(draft.query ?? "");
35
+ const [liveOptions, setLiveOptions] = react.useState(providerOptions);
36
+ const [catalogOptions, setCatalogOptions] = react.useState(
37
+ {}
38
+ );
39
+ const [selectedDatabase, setSelectedDatabase] = react.useState("");
40
+ const rawArtifact = descriptor.data !== void 0 && !connectionQueryWorkspaceModel.supportsQueryBuilder(descriptor.data);
41
+ react.useEffect(() => {
42
+ var _a2;
43
+ if (rawArtifact && !query && ((_a2 = descriptor.data) == null ? void 0 : _a2.defaultQuery)) {
44
+ setQuery(descriptor.data.defaultQuery);
45
+ onDraftChange({ ...draft, query: descriptor.data.defaultQuery });
46
+ }
47
+ }, [(_b = descriptor.data) == null ? void 0 : _b.defaultQuery, draft, onDraftChange, query, rawArtifact]);
48
+ const explicitTargetKind = liveOptions.targetKind ?? providerOptions.targetKind;
49
+ const inspection = connectionBrowserModel.useInspection({
50
+ cacheKey: "profile-wizard-inspection",
51
+ id: connectionID,
52
+ baseUrl,
53
+ enabled: ((_c = descriptor.data) == null ? void 0 : _c.catalog) === true,
54
+ database: selectedDatabase,
55
+ fallbackDatabase: String(providerOptions.database ?? ""),
56
+ target: String(liveOptions.index ?? providerOptions.index ?? ""),
57
+ ...typeof explicitTargetKind === "string" ? { targetKind: explicitTargetKind } : {}
58
+ });
59
+ const browserOptions = react.useMemo(
60
+ () => {
61
+ var _a2;
62
+ return connectionBrowserModel.mergeProviderOptions({
63
+ layers: [
64
+ (_a2 = descriptor.data) == null ? void 0 : _a2.initialOptions,
65
+ providerOptions,
66
+ catalogOptions
67
+ ],
68
+ database: inspection.sqlDatabase,
69
+ keepTargetKind: true
70
+ });
71
+ },
72
+ [
73
+ catalogOptions,
74
+ (_d = descriptor.data) == null ? void 0 : _d.initialOptions,
75
+ inspection.sqlDatabase,
76
+ providerOptions
77
+ ]
78
+ );
79
+ const effectiveOptions = react.useCallback(
80
+ (options) => connectionBrowserModel.mergeProviderOptions({
81
+ layers: [providerOptions, catalogOptions, options],
82
+ database: inspection.sqlDatabase
83
+ }),
84
+ [catalogOptions, inspection.sqlDatabase, providerOptions]
85
+ );
86
+ if (descriptor.isLoading) {
87
+ return /* @__PURE__ */ jsxRuntime.jsx(QueryStepMessage, { children: "Loading connection browser…" });
88
+ }
89
+ if (descriptor.isError) {
90
+ return /* @__PURE__ */ jsxRuntime.jsx(QueryStepMessage, { error: true, children: profileWizardModel.profileWizardErrorMessage(
91
+ descriptor.error,
92
+ "Unable to load this connection browser"
93
+ ) });
94
+ }
95
+ if (!descriptor.data) {
96
+ return /* @__PURE__ */ jsxRuntime.jsx(QueryStepMessage, { children: "This saved connection does not expose a query browser." });
97
+ }
98
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-[32rem] flex-1 flex-col gap-3", children: [
99
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-4 rounded-lg border bg-muted/30 px-4 py-3", children: [
100
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
101
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: "Explore the source, then run a sample" }),
102
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: "Sampling discovers fields without saving the profile." })
103
+ ] }),
104
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 rounded-full bg-background px-3 py-1 text-xs font-medium text-muted-foreground", children: discovered.length ? `${discovered.length} fields discovered` : "No sample yet" })
105
+ ] }),
106
+ /* @__PURE__ */ jsxRuntime.jsx(
107
+ connectionQueryWorkspace.ConnectionQueryWorkspace,
108
+ {
109
+ id: `profile-wizard:${connectionID}`,
110
+ title: "Profile query",
111
+ descriptor: descriptor.data,
112
+ inspection,
113
+ onDatabaseChange: setSelectedDatabase,
114
+ query,
115
+ options: browserOptions,
116
+ optionsSchema: connectionBrowserModel.queryBrowserOptionsSchema(descriptor.data),
117
+ search: providerOptions.search,
118
+ onSearchChange: (transition) => {
119
+ const options = effectiveOptions(liveOptions);
120
+ if (transition.search) options.search = transition.search;
121
+ else delete options.search;
122
+ setQuery(transition.query);
123
+ onDraftChange({
124
+ ...draft,
125
+ query: transition.query,
126
+ provider: { ...draft.provider, options }
127
+ });
128
+ },
129
+ params: draft.params ?? [],
130
+ onParamMappingChange: (edit) => {
131
+ const options = effectiveOptions(liveOptions);
132
+ options.search = edit.search;
133
+ setQuery("");
134
+ onDraftChange({
135
+ ...draft,
136
+ query: "",
137
+ params: edit.params,
138
+ provider: { ...draft.provider, options }
139
+ });
140
+ },
141
+ paramValues: esQueryBuilderForm.defaultParamValues(draft.params),
142
+ paramRoles: esQueryBuilderForm.paramRoles(draft.params),
143
+ ...draft.limits ? { limits: draft.limits } : {},
144
+ onLimitsChange: (limits) => onDraftChange(profileWizardModel.withProfileLimits(draft, limits)),
145
+ compileBaseUrl: baseUrl,
146
+ className: "min-h-0 flex-1",
147
+ onQueryChange: (nextQuery) => {
148
+ setQuery(nextQuery);
149
+ onDraftChange({ ...draft, query: nextQuery });
150
+ },
151
+ onOptionsChange: (options) => {
152
+ setLiveOptions(options);
153
+ onDraftChange({
154
+ ...draft,
155
+ provider: {
156
+ ...draft.provider,
157
+ options: effectiveOptions(options)
158
+ }
159
+ });
160
+ },
161
+ onCatalogSelect: (node) => {
162
+ const nextQuery = node.query ?? query;
163
+ const nextOptions = node.options ?? {};
164
+ setQuery(nextQuery);
165
+ setCatalogOptions(nextOptions);
166
+ setLiveOptions({ ...browserOptions, ...nextOptions });
167
+ onDraftChange({
168
+ ...draft,
169
+ query: nextQuery,
170
+ provider: {
171
+ ...draft.provider,
172
+ options: effectiveOptions({ ...browserOptions, ...nextOptions })
173
+ }
174
+ });
175
+ },
176
+ execute: async (request) => {
177
+ const nextDraft = {
178
+ ...draft,
179
+ query: request.query,
180
+ provider: {
181
+ ...draft.provider,
182
+ options: effectiveOptions(request.options)
183
+ }
184
+ };
185
+ onDraftChange(nextDraft);
186
+ const result = await connectionBrowserModel.fetchJSON(profileApi.profileApiPath("profile/sample"), {
187
+ method: "POST",
188
+ headers: { "Content-Type": "application/json" },
189
+ body: JSON.stringify(profileSamplePayload.profileSamplePayload(nextDraft, request))
190
+ });
191
+ onSample({
192
+ columns: result.columns ?? [],
193
+ rows: result.rows ?? [],
194
+ sourceDraft: nextDraft
195
+ });
196
+ return result;
197
+ }
198
+ }
199
+ )
200
+ ] });
201
+ }
202
+ function QueryStepMessage({
203
+ children,
204
+ error = false
205
+ }) {
206
+ return /* @__PURE__ */ jsxRuntime.jsx(
207
+ "div",
208
+ {
209
+ className: `grid min-h-96 flex-1 place-items-center rounded-xl border border-dashed p-8 text-sm ${error ? "border-destructive/40 text-destructive" : "text-muted-foreground"}`,
210
+ children
211
+ }
212
+ );
213
+ }
214
+ exports.ProfileWizardQueryStep = ProfileWizardQueryStep;
215
+ //# sourceMappingURL=profileWizardQueryStep.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileWizardQueryStep.cjs","sources":["../../src/profiles/profileWizardQueryStep.tsx"],"sourcesContent":["import type { QueryBrowserResult } from \"../data/query-browser/QueryBrowser.types\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport {\n browserBaseUrl,\n fetchJSON,\n mergeProviderOptions,\n queryBrowserOptionsSchema,\n useInspection,\n type BrowserDescriptor,\n} from \"./connectionBrowserModel\";\nimport { ConnectionQueryWorkspace } from \"./connectionQueryWorkspace\";\nimport { profileApiPath } from \"./profileApi\";\nimport { profileSamplePayload } from \"./profileSamplePayload\";\nimport type { EsSearch } from \"./esQueryBuilderModel\";\nimport {\n profileWizardErrorMessage,\n withProfileLimits,\n type ProfileColumn,\n type ProfileWizardDraft,\n} from \"./profileWizardModel\";\nimport { supportsQueryBuilder } from \"./connectionQueryWorkspaceModel\";\nimport { defaultParamValues, paramRoles } from \"./esQueryBuilderForm\";\n\ntype SampleResult = QueryBrowserResult & {\n columns: ProfileColumn[];\n renderedQuery: string;\n};\n\n/** What a sample yields: the discovered column shape plus the rows it came\n * from, so the editor can preview the configured columns against real data. */\nexport type ProfileSample = {\n columns: ProfileColumn[];\n rows: Record<string, unknown>[];\n sourceDraft: ProfileWizardDraft;\n};\n\ntype ProfileWizardQueryStepProps = {\n connectionID: string;\n draft: ProfileWizardDraft;\n discovered: ProfileColumn[];\n onDraftChange: (draft: ProfileWizardDraft) => void;\n onSample: (sample: ProfileSample) => void;\n};\n\nexport function ProfileWizardQueryStep({\n connectionID,\n draft,\n discovered,\n onDraftChange,\n onSample,\n}: ProfileWizardQueryStepProps) {\n const baseUrl = browserBaseUrl(connectionID);\n const descriptor = useQuery({\n queryKey: [\"profile-wizard-descriptor\", connectionID],\n queryFn: () => fetchJSON<BrowserDescriptor>(baseUrl),\n retry: 0,\n });\n const providerOptions = useMemo(\n () => ({ ...draft.provider?.options }),\n [draft.provider?.options],\n );\n const [query, setQuery] = useState(draft.query ?? \"\");\n const [liveOptions, setLiveOptions] = useState(providerOptions);\n const [catalogOptions, setCatalogOptions] = useState<Record<string, unknown>>(\n {},\n );\n const [selectedDatabase, setSelectedDatabase] = useState(\"\");\n\n // The starter query is for a source whose artifact is the query. Where the\n // workspace builds filters instead, the specification is the artifact and a\n // query seeded beside it would be the pair the server rejects.\n const rawArtifact =\n descriptor.data !== undefined && !supportsQueryBuilder(descriptor.data);\n useEffect(() => {\n if (rawArtifact && !query && descriptor.data?.defaultQuery) {\n setQuery(descriptor.data.defaultQuery);\n onDraftChange({ ...draft, query: descriptor.data.defaultQuery });\n }\n }, [descriptor.data?.defaultQuery, draft, onDraftChange, query, rawArtifact]);\n\n const explicitTargetKind = liveOptions.targetKind ?? providerOptions.targetKind;\n const inspection = useInspection({\n cacheKey: \"profile-wizard-inspection\",\n id: connectionID,\n baseUrl,\n enabled: descriptor.data?.catalog === true,\n database: selectedDatabase,\n fallbackDatabase: String(providerOptions.database ?? \"\"),\n target: String(liveOptions.index ?? providerOptions.index ?? \"\"),\n ...(typeof explicitTargetKind === \"string\"\n ? { targetKind: explicitTargetKind }\n : {}),\n });\n const browserOptions = useMemo(\n () =>\n mergeProviderOptions({\n layers: [\n descriptor.data?.initialOptions,\n providerOptions,\n catalogOptions,\n ],\n database: inspection.sqlDatabase,\n keepTargetKind: true,\n }),\n [\n catalogOptions,\n descriptor.data?.initialOptions,\n inspection.sqlDatabase,\n providerOptions,\n ],\n );\n const effectiveOptions = useCallback(\n (options: Record<string, unknown>) =>\n mergeProviderOptions({\n layers: [providerOptions, catalogOptions, options],\n database: inspection.sqlDatabase,\n }),\n [catalogOptions, inspection.sqlDatabase, providerOptions],\n );\n\n if (descriptor.isLoading) {\n return <QueryStepMessage>Loading connection browser…</QueryStepMessage>;\n }\n if (descriptor.isError) {\n return (\n <QueryStepMessage error>\n {profileWizardErrorMessage(\n descriptor.error,\n \"Unable to load this connection browser\",\n )}\n </QueryStepMessage>\n );\n }\n if (!descriptor.data) {\n return (\n <QueryStepMessage>\n This saved connection does not expose a query browser.\n </QueryStepMessage>\n );\n }\n\n return (\n <div className=\"flex min-h-[32rem] flex-1 flex-col gap-3\">\n <div className=\"flex items-center justify-between gap-4 rounded-lg border bg-muted/30 px-4 py-3\">\n <div>\n <p className=\"text-sm font-medium\">Explore the source, then run a sample</p>\n <p className=\"text-xs text-muted-foreground\">\n Sampling discovers fields without saving the profile.\n </p>\n </div>\n <span className=\"shrink-0 rounded-full bg-background px-3 py-1 text-xs font-medium text-muted-foreground\">\n {discovered.length\n ? `${discovered.length} fields discovered`\n : \"No sample yet\"}\n </span>\n </div>\n <ConnectionQueryWorkspace\n id={`profile-wizard:${connectionID}`}\n title=\"Profile query\"\n descriptor={descriptor.data}\n inspection={inspection}\n onDatabaseChange={setSelectedDatabase}\n query={query}\n options={browserOptions}\n optionsSchema={queryBrowserOptionsSchema(descriptor.data)}\n search={providerOptions.search as EsSearch | undefined}\n onSearchChange={(transition) => {\n // Built from the merged options so a delete actually removes the key\n // rather than being reinstated by a lower layer on the next merge.\n const options = effectiveOptions(liveOptions);\n if (transition.search) options.search = transition.search;\n else delete options.search;\n setQuery(transition.query);\n onDraftChange({\n ...draft,\n query: transition.query,\n provider: { ...draft.provider, options },\n });\n }}\n params={draft.params ?? []}\n onParamMappingChange={(edit) => {\n const options = effectiveOptions(liveOptions);\n options.search = edit.search;\n setQuery(\"\");\n onDraftChange({\n ...draft,\n query: \"\",\n params: edit.params,\n provider: { ...draft.provider, options },\n });\n }}\n paramValues={defaultParamValues(draft.params)}\n paramRoles={paramRoles(draft.params)}\n {...(draft.limits ? { limits: draft.limits } : {})}\n onLimitsChange={(limits) => onDraftChange(withProfileLimits(draft, limits))}\n compileBaseUrl={baseUrl}\n className=\"min-h-0 flex-1\"\n onQueryChange={(nextQuery) => {\n setQuery(nextQuery);\n onDraftChange({ ...draft, query: nextQuery });\n }}\n onOptionsChange={(options) => {\n setLiveOptions(options);\n onDraftChange({\n ...draft,\n provider: {\n ...draft.provider,\n options: effectiveOptions(options),\n },\n });\n }}\n onCatalogSelect={(node) => {\n const nextQuery = node.query ?? query;\n const nextOptions = node.options ?? {};\n setQuery(nextQuery);\n setCatalogOptions(nextOptions);\n setLiveOptions({ ...browserOptions, ...nextOptions });\n onDraftChange({\n ...draft,\n query: nextQuery,\n provider: {\n ...draft.provider,\n options: effectiveOptions({ ...browserOptions, ...nextOptions }),\n },\n });\n }}\n execute={async (request) => {\n const nextDraft = {\n ...draft,\n query: request.query,\n provider: {\n ...draft.provider,\n options: effectiveOptions(request.options),\n },\n };\n onDraftChange(nextDraft);\n const result = await fetchJSON<SampleResult>(profileApiPath(\"profile/sample\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(profileSamplePayload(nextDraft, request)),\n });\n onSample({\n columns: result.columns ?? [],\n rows: result.rows ?? [],\n sourceDraft: nextDraft,\n });\n return result;\n }}\n />\n </div>\n );\n}\n\nfunction QueryStepMessage({\n children,\n error = false,\n}: {\n children: ReactNode;\n error?: boolean;\n}) {\n return (\n <div\n className={`grid min-h-96 flex-1 place-items-center rounded-xl border border-dashed p-8 text-sm ${error ? \"border-destructive/40 text-destructive\" : \"text-muted-foreground\"}`}\n >\n {children}\n </div>\n );\n}\n"],"names":["browserBaseUrl","useQuery","fetchJSON","useMemo","_a","useState","supportsQueryBuilder","useEffect","useInspection","mergeProviderOptions","useCallback","jsx","profileWizardErrorMessage","jsxs","ConnectionQueryWorkspace","queryBrowserOptionsSchema","defaultParamValues","paramRoles","withProfileLimits","profileApiPath","profileSamplePayload"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { ProfileColumn, ProfileWizardDraft } from './profileWizardModel';
2
+ /** What a sample yields: the discovered column shape plus the rows it came
3
+ * from, so the editor can preview the configured columns against real data. */
4
+ export type ProfileSample = {
5
+ columns: ProfileColumn[];
6
+ rows: Record<string, unknown>[];
7
+ sourceDraft: ProfileWizardDraft;
8
+ };
9
+ type ProfileWizardQueryStepProps = {
10
+ connectionID: string;
11
+ draft: ProfileWizardDraft;
12
+ discovered: ProfileColumn[];
13
+ onDraftChange: (draft: ProfileWizardDraft) => void;
14
+ onSample: (sample: ProfileSample) => void;
15
+ };
16
+ export declare function ProfileWizardQueryStep({ connectionID, draft, discovered, onDraftChange, onSample, }: ProfileWizardQueryStepProps): import("react/jsx-runtime").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=profileWizardQueryStep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileWizardQueryStep.d.ts","sourceRoot":"","sources":["../../src/profiles/profileWizardQueryStep.tsx"],"names":[],"mappings":"AAeA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAS9B;gFACgF;AAChF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,WAAW,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACnD,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EACrC,YAAY,EACZ,KAAK,EACL,UAAU,EACV,aAAa,EACb,QAAQ,GACT,EAAE,2BAA2B,2CAyM7B"}