@flanksource/clicky-ui 0.3.18 → 0.3.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (609) hide show
  1. package/dist/components/ComboboxMenu.cjs +5 -1
  2. package/dist/components/ComboboxMenu.cjs.map +1 -1
  3. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  4. package/dist/components/ComboboxMenu.js +5 -1
  5. package/dist/components/ComboboxMenu.js.map +1 -1
  6. package/dist/components/EndpointSelector.model.cjs +96 -0
  7. package/dist/components/EndpointSelector.model.cjs.map +1 -0
  8. package/dist/components/EndpointSelector.model.d.ts +2 -0
  9. package/dist/components/EndpointSelector.model.d.ts.map +1 -1
  10. package/dist/components/EndpointSelector.model.js +96 -0
  11. package/dist/components/EndpointSelector.model.js.map +1 -0
  12. package/dist/components/ErrorWrapper.cjs +1 -1
  13. package/dist/components/ErrorWrapper.cjs.map +1 -1
  14. package/dist/components/ErrorWrapper.js +1 -1
  15. package/dist/components/ErrorWrapper.js.map +1 -1
  16. package/dist/components/FilterBar.cjs +52 -2
  17. package/dist/components/FilterBar.cjs.map +1 -1
  18. package/dist/components/FilterBar.d.ts +20 -2
  19. package/dist/components/FilterBar.d.ts.map +1 -1
  20. package/dist/components/FilterBar.js +52 -2
  21. package/dist/components/FilterBar.js.map +1 -1
  22. package/dist/components/JSONPathField.cjs +87 -66
  23. package/dist/components/JSONPathField.cjs.map +1 -1
  24. package/dist/components/JSONPathField.d.ts +26 -9
  25. package/dist/components/JSONPathField.d.ts.map +1 -1
  26. package/dist/components/JSONPathField.js +88 -67
  27. package/dist/components/JSONPathField.js.map +1 -1
  28. package/dist/components/JSONPathPlayground.cjs +225 -0
  29. package/dist/components/JSONPathPlayground.cjs.map +1 -0
  30. package/dist/components/JSONPathPlayground.d.ts +59 -0
  31. package/dist/components/JSONPathPlayground.d.ts.map +1 -0
  32. package/dist/components/JSONPathPlayground.js +225 -0
  33. package/dist/components/JSONPathPlayground.js.map +1 -0
  34. package/dist/components/OnePasswordSelector.cjs +178 -0
  35. package/dist/components/OnePasswordSelector.cjs.map +1 -0
  36. package/dist/components/OnePasswordSelector.d.ts +8 -0
  37. package/dist/components/OnePasswordSelector.d.ts.map +1 -0
  38. package/dist/components/OnePasswordSelector.js +178 -0
  39. package/dist/components/OnePasswordSelector.js.map +1 -0
  40. package/dist/components/OnePasswordSelector.model.cjs +31 -0
  41. package/dist/components/OnePasswordSelector.model.cjs.map +1 -0
  42. package/dist/components/OnePasswordSelector.model.d.ts +27 -0
  43. package/dist/components/OnePasswordSelector.model.d.ts.map +1 -0
  44. package/dist/components/OnePasswordSelector.model.js +31 -0
  45. package/dist/components/OnePasswordSelector.model.js.map +1 -0
  46. package/dist/components/SecretFormField.cjs +142 -0
  47. package/dist/components/SecretFormField.cjs.map +1 -0
  48. package/dist/components/SecretFormField.d.ts +9 -0
  49. package/dist/components/SecretFormField.d.ts.map +1 -0
  50. package/dist/components/SecretFormField.js +142 -0
  51. package/dist/components/SecretFormField.js.map +1 -0
  52. package/dist/components/SecretKeySelector.cjs +20 -14
  53. package/dist/components/SecretKeySelector.cjs.map +1 -1
  54. package/dist/components/SecretKeySelector.d.ts +4 -1
  55. package/dist/components/SecretKeySelector.d.ts.map +1 -1
  56. package/dist/components/SecretKeySelector.js +20 -14
  57. package/dist/components/SecretKeySelector.js.map +1 -1
  58. package/dist/components/TreePickerField.cjs +55 -29
  59. package/dist/components/TreePickerField.cjs.map +1 -1
  60. package/dist/components/TreePickerField.d.ts +10 -1
  61. package/dist/components/TreePickerField.d.ts.map +1 -1
  62. package/dist/components/TreePickerField.js +56 -30
  63. package/dist/components/TreePickerField.js.map +1 -1
  64. package/dist/components/UnitStepControls.cjs +55 -0
  65. package/dist/components/UnitStepControls.cjs.map +1 -0
  66. package/dist/components/UnitStepControls.d.ts +10 -0
  67. package/dist/components/UnitStepControls.d.ts.map +1 -0
  68. package/dist/components/UnitStepControls.js +55 -0
  69. package/dist/components/UnitStepControls.js.map +1 -0
  70. package/dist/components/combobox-types.d.ts +9 -0
  71. package/dist/components/combobox-types.d.ts.map +1 -1
  72. package/dist/components/filter-bar-utils.cjs +7 -0
  73. package/dist/components/filter-bar-utils.cjs.map +1 -1
  74. package/dist/components/filter-bar-utils.d.ts.map +1 -1
  75. package/dist/components/filter-bar-utils.js +7 -0
  76. package/dist/components/filter-bar-utils.js.map +1 -1
  77. package/dist/components/jotai-bindings-core.cjs.map +1 -1
  78. package/dist/components/jotai-bindings-core.d.ts +4 -1
  79. package/dist/components/jotai-bindings-core.d.ts.map +1 -1
  80. package/dist/components/jotai-bindings-core.js.map +1 -1
  81. package/dist/components/json-schema-form-accordion-array.cjs +5 -73
  82. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
  83. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
  84. package/dist/components/json-schema-form-accordion-array.js +3 -71
  85. package/dist/components/json-schema-form-accordion-array.js.map +1 -1
  86. package/dist/components/json-schema-form-array.cjs +6 -1
  87. package/dist/components/json-schema-form-array.cjs.map +1 -1
  88. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  89. package/dist/components/json-schema-form-array.js +6 -1
  90. package/dist/components/json-schema-form-array.js.map +1 -1
  91. package/dist/components/json-schema-form-cards-array.cjs +96 -0
  92. package/dist/components/json-schema-form-cards-array.cjs.map +1 -0
  93. package/dist/components/json-schema-form-cards-array.d.ts +7 -0
  94. package/dist/components/json-schema-form-cards-array.d.ts.map +1 -0
  95. package/dist/components/json-schema-form-cards-array.js +96 -0
  96. package/dist/components/json-schema-form-cards-array.js.map +1 -0
  97. package/dist/components/json-schema-form-item-row.cjs +81 -0
  98. package/dist/components/json-schema-form-item-row.cjs.map +1 -0
  99. package/dist/components/json-schema-form-item-row.d.ts +19 -0
  100. package/dist/components/json-schema-form-item-row.d.ts.map +1 -0
  101. package/dist/components/json-schema-form-item-row.js +81 -0
  102. package/dist/components/json-schema-form-item-row.js.map +1 -0
  103. package/dist/components/json-schema-form-render.cjs +4 -3
  104. package/dist/components/json-schema-form-render.cjs.map +1 -1
  105. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  106. package/dist/components/json-schema-form-render.js +4 -3
  107. package/dist/components/json-schema-form-render.js.map +1 -1
  108. package/dist/components/json-schema-form-resolve.cjs +1 -1
  109. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  110. package/dist/components/json-schema-form-resolve.js +1 -1
  111. package/dist/components/json-schema-form-resolve.js.map +1 -1
  112. package/dist/components/json-schema-form-tone.cjs +12 -0
  113. package/dist/components/json-schema-form-tone.cjs.map +1 -1
  114. package/dist/components/json-schema-form-tone.js +12 -0
  115. package/dist/components/json-schema-form-tone.js.map +1 -1
  116. package/dist/components/json-schema-form-types.d.ts +10 -1
  117. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  118. package/dist/components/jsonPathTree.cjs +189 -0
  119. package/dist/components/jsonPathTree.cjs.map +1 -0
  120. package/dist/components/jsonPathTree.d.ts +92 -0
  121. package/dist/components/jsonPathTree.d.ts.map +1 -0
  122. package/dist/components/jsonPathTree.js +189 -0
  123. package/dist/components/jsonPathTree.js.map +1 -0
  124. package/dist/components/secret-form-extension.cjs +30 -0
  125. package/dist/components/secret-form-extension.cjs.map +1 -0
  126. package/dist/components/secret-form-extension.d.ts +23 -0
  127. package/dist/components/secret-form-extension.d.ts.map +1 -0
  128. package/dist/components/secret-form-extension.js +30 -0
  129. package/dist/components/secret-form-extension.js.map +1 -0
  130. package/dist/components/unit-form-extension.cjs +126 -0
  131. package/dist/components/unit-form-extension.cjs.map +1 -0
  132. package/dist/components/unit-form-extension.d.ts +8 -0
  133. package/dist/components/unit-form-extension.d.ts.map +1 -0
  134. package/dist/components/unit-form-extension.js +126 -0
  135. package/dist/components/unit-form-extension.js.map +1 -0
  136. package/dist/components.cjs +20 -0
  137. package/dist/components.cjs.map +1 -1
  138. package/dist/components.d.ts +7 -0
  139. package/dist/components.d.ts.map +1 -1
  140. package/dist/components.js +20 -0
  141. package/dist/components.js.map +1 -1
  142. package/dist/data/TaskExecDetails.cjs +40 -0
  143. package/dist/data/TaskExecDetails.cjs.map +1 -0
  144. package/dist/data/TaskExecDetails.d.ts +5 -0
  145. package/dist/data/TaskExecDetails.d.ts.map +1 -0
  146. package/dist/data/TaskExecDetails.js +40 -0
  147. package/dist/data/TaskExecDetails.js.map +1 -0
  148. package/dist/data/TaskProgress.cjs +9 -3
  149. package/dist/data/TaskProgress.cjs.map +1 -1
  150. package/dist/data/TaskProgress.d.ts.map +1 -1
  151. package/dist/data/TaskProgress.js +9 -3
  152. package/dist/data/TaskProgress.js.map +1 -1
  153. package/dist/data/TaskSnapshot.cjs.map +1 -1
  154. package/dist/data/TaskSnapshot.d.ts +12 -1
  155. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  156. package/dist/data/TaskSnapshot.js.map +1 -1
  157. package/dist/data/TreeNode.cjs +3 -0
  158. package/dist/data/TreeNode.cjs.map +1 -1
  159. package/dist/data/TreeNode.d.ts.map +1 -1
  160. package/dist/data/TreeNode.js +3 -0
  161. package/dist/data/TreeNode.js.map +1 -1
  162. package/dist/data/data-table-filter-values.cjs +20 -0
  163. package/dist/data/data-table-filter-values.cjs.map +1 -1
  164. package/dist/data/data-table-filter-values.d.ts +16 -0
  165. package/dist/data/data-table-filter-values.d.ts.map +1 -1
  166. package/dist/data/data-table-filter-values.js +20 -0
  167. package/dist/data/data-table-filter-values.js.map +1 -1
  168. package/dist/data/data-table-server-filters.cjs +23 -29
  169. package/dist/data/data-table-server-filters.cjs.map +1 -1
  170. package/dist/data/data-table-server-filters.d.ts.map +1 -1
  171. package/dist/data/data-table-server-filters.js +21 -27
  172. package/dist/data/data-table-server-filters.js.map +1 -1
  173. package/dist/data/diagnostics/ErrorDetails.cjs +61 -8
  174. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  175. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  176. package/dist/data/diagnostics/ErrorDetails.js +61 -8
  177. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  178. package/dist/data/diagnostics/error-diagnostics.cjs +10 -4
  179. package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
  180. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
  181. package/dist/data/diagnostics/error-diagnostics.js +10 -4
  182. package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
  183. package/dist/data/query-browser/QueryBrowser.cjs +139 -161
  184. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  185. package/dist/data/query-browser/QueryBrowser.d.ts +1 -71
  186. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  187. package/dist/data/query-browser/QueryBrowser.editor.cjs +88 -0
  188. package/dist/data/query-browser/QueryBrowser.editor.cjs.map +1 -0
  189. package/dist/data/query-browser/QueryBrowser.editor.d.ts +12 -0
  190. package/dist/data/query-browser/QueryBrowser.editor.d.ts.map +1 -0
  191. package/dist/data/query-browser/QueryBrowser.editor.js +88 -0
  192. package/dist/data/query-browser/QueryBrowser.editor.js.map +1 -0
  193. package/dist/data/query-browser/QueryBrowser.js +140 -162
  194. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  195. package/dist/data/query-browser/QueryBrowser.types.cjs +12 -0
  196. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -0
  197. package/dist/data/query-browser/QueryBrowser.types.d.ts +94 -0
  198. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -0
  199. package/dist/data/query-browser/QueryBrowser.types.js +12 -0
  200. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -0
  201. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.cjs +56 -0
  202. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.cjs.map +1 -0
  203. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.d.ts +5 -0
  204. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.d.ts.map +1 -0
  205. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.js +56 -0
  206. package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.js.map +1 -0
  207. package/dist/data/query-browser/QueryBrowserResults.cjs +80 -0
  208. package/dist/data/query-browser/QueryBrowserResults.cjs.map +1 -0
  209. package/dist/data/query-browser/QueryBrowserResults.d.ts +16 -0
  210. package/dist/data/query-browser/QueryBrowserResults.d.ts.map +1 -0
  211. package/dist/data/query-browser/QueryBrowserResults.js +80 -0
  212. package/dist/data/query-browser/QueryBrowserResults.js.map +1 -0
  213. package/dist/data/query-browser/index.d.ts +2 -1
  214. package/dist/data/query-browser/index.d.ts.map +1 -1
  215. package/dist/data/task-exec-details.cjs +9 -0
  216. package/dist/data/task-exec-details.cjs.map +1 -0
  217. package/dist/data/task-exec-details.d.ts +3 -0
  218. package/dist/data/task-exec-details.d.ts.map +1 -0
  219. package/dist/data/task-exec-details.js +9 -0
  220. package/dist/data/task-exec-details.js.map +1 -0
  221. package/dist/data/version-info.cjs +3 -3
  222. package/dist/data/version-info.js +3 -3
  223. package/dist/data.cjs +2 -0
  224. package/dist/data.cjs.map +1 -1
  225. package/dist/data.d.ts +1 -1
  226. package/dist/data.d.ts.map +1 -1
  227. package/dist/data.js +2 -0
  228. package/dist/data.js.map +1 -1
  229. package/dist/index.cjs +22 -0
  230. package/dist/index.cjs.map +1 -1
  231. package/dist/index.js +22 -0
  232. package/dist/index.js.map +1 -1
  233. package/dist/lib/string.cjs +8 -0
  234. package/dist/lib/string.cjs.map +1 -1
  235. package/dist/lib/string.d.ts +1 -0
  236. package/dist/lib/string.d.ts.map +1 -1
  237. package/dist/lib/string.js +8 -0
  238. package/dist/lib/string.js.map +1 -1
  239. package/dist/profiles/catalogTree.cjs +133 -0
  240. package/dist/profiles/catalogTree.cjs.map +1 -0
  241. package/dist/profiles/catalogTree.d.ts +11 -0
  242. package/dist/profiles/catalogTree.d.ts.map +1 -0
  243. package/dist/profiles/catalogTree.js +133 -0
  244. package/dist/profiles/catalogTree.js.map +1 -0
  245. package/dist/profiles/connectionBrowserModel.cjs +185 -0
  246. package/dist/profiles/connectionBrowserModel.cjs.map +1 -0
  247. package/dist/profiles/connectionBrowserModel.d.ts +169 -0
  248. package/dist/profiles/connectionBrowserModel.d.ts.map +1 -0
  249. package/dist/profiles/connectionBrowserModel.js +185 -0
  250. package/dist/profiles/connectionBrowserModel.js.map +1 -0
  251. package/dist/profiles/connectionQueryWorkspace.cjs +185 -0
  252. package/dist/profiles/connectionQueryWorkspace.cjs.map +1 -0
  253. package/dist/profiles/connectionQueryWorkspace.d.ts +63 -0
  254. package/dist/profiles/connectionQueryWorkspace.d.ts.map +1 -0
  255. package/dist/profiles/connectionQueryWorkspace.js +185 -0
  256. package/dist/profiles/connectionQueryWorkspace.js.map +1 -0
  257. package/dist/profiles/connectionQueryWorkspaceModel.cjs +28 -0
  258. package/dist/profiles/connectionQueryWorkspaceModel.cjs.map +1 -0
  259. package/dist/profiles/connectionQueryWorkspaceModel.d.ts +38 -0
  260. package/dist/profiles/connectionQueryWorkspaceModel.d.ts.map +1 -0
  261. package/dist/profiles/connectionQueryWorkspaceModel.js +28 -0
  262. package/dist/profiles/connectionQueryWorkspaceModel.js.map +1 -0
  263. package/dist/profiles/esFieldValues.cjs +64 -0
  264. package/dist/profiles/esFieldValues.cjs.map +1 -0
  265. package/dist/profiles/esFieldValues.d.ts +48 -0
  266. package/dist/profiles/esFieldValues.d.ts.map +1 -0
  267. package/dist/profiles/esFieldValues.js +64 -0
  268. package/dist/profiles/esFieldValues.js.map +1 -0
  269. package/dist/profiles/esParamMappingModel.cjs +301 -0
  270. package/dist/profiles/esParamMappingModel.cjs.map +1 -0
  271. package/dist/profiles/esParamMappingModel.d.ts +37 -0
  272. package/dist/profiles/esParamMappingModel.d.ts.map +1 -0
  273. package/dist/profiles/esParamMappingModel.js +301 -0
  274. package/dist/profiles/esParamMappingModel.js.map +1 -0
  275. package/dist/profiles/esParamMappingPill.cjs +24 -0
  276. package/dist/profiles/esParamMappingPill.cjs.map +1 -0
  277. package/dist/profiles/esParamMappingPill.d.ts +13 -0
  278. package/dist/profiles/esParamMappingPill.d.ts.map +1 -0
  279. package/dist/profiles/esParamMappingPill.js +24 -0
  280. package/dist/profiles/esParamMappingPill.js.map +1 -0
  281. package/dist/profiles/esParamOperandExtension.cjs +75 -0
  282. package/dist/profiles/esParamOperandExtension.cjs.map +1 -0
  283. package/dist/profiles/esParamOperandExtension.d.ts +11 -0
  284. package/dist/profiles/esParamOperandExtension.d.ts.map +1 -0
  285. package/dist/profiles/esParamOperandExtension.js +75 -0
  286. package/dist/profiles/esParamOperandExtension.js.map +1 -0
  287. package/dist/profiles/esQueryBuilder.cjs +205 -0
  288. package/dist/profiles/esQueryBuilder.cjs.map +1 -0
  289. package/dist/profiles/esQueryBuilder.d.ts +35 -0
  290. package/dist/profiles/esQueryBuilder.d.ts.map +1 -0
  291. package/dist/profiles/esQueryBuilder.js +205 -0
  292. package/dist/profiles/esQueryBuilder.js.map +1 -0
  293. package/dist/profiles/esQueryBuilderExtension.cjs +23 -0
  294. package/dist/profiles/esQueryBuilderExtension.cjs.map +1 -0
  295. package/dist/profiles/esQueryBuilderExtension.d.ts +5 -0
  296. package/dist/profiles/esQueryBuilderExtension.d.ts.map +1 -0
  297. package/dist/profiles/esQueryBuilderExtension.js +23 -0
  298. package/dist/profiles/esQueryBuilderExtension.js.map +1 -0
  299. package/dist/profiles/esQueryBuilderForm.cjs +26 -0
  300. package/dist/profiles/esQueryBuilderForm.cjs.map +1 -0
  301. package/dist/profiles/esQueryBuilderForm.d.ts +18 -0
  302. package/dist/profiles/esQueryBuilderForm.d.ts.map +1 -0
  303. package/dist/profiles/esQueryBuilderForm.js +26 -0
  304. package/dist/profiles/esQueryBuilderForm.js.map +1 -0
  305. package/dist/profiles/esQueryBuilderModel.cjs +131 -0
  306. package/dist/profiles/esQueryBuilderModel.cjs.map +1 -0
  307. package/dist/profiles/esQueryBuilderModel.d.ts +108 -0
  308. package/dist/profiles/esQueryBuilderModel.d.ts.map +1 -0
  309. package/dist/profiles/esQueryBuilderModel.js +131 -0
  310. package/dist/profiles/esQueryBuilderModel.js.map +1 -0
  311. package/dist/profiles/esQueryClauseGroup.cjs +144 -0
  312. package/dist/profiles/esQueryClauseGroup.cjs.map +1 -0
  313. package/dist/profiles/esQueryClauseGroup.d.ts +10 -0
  314. package/dist/profiles/esQueryClauseGroup.d.ts.map +1 -0
  315. package/dist/profiles/esQueryClauseGroup.js +144 -0
  316. package/dist/profiles/esQueryClauseGroup.js.map +1 -0
  317. package/dist/profiles/esQueryCompile.cjs +47 -0
  318. package/dist/profiles/esQueryCompile.cjs.map +1 -0
  319. package/dist/profiles/esQueryCompile.d.ts +39 -0
  320. package/dist/profiles/esQueryCompile.d.ts.map +1 -0
  321. package/dist/profiles/esQueryCompile.js +47 -0
  322. package/dist/profiles/esQueryCompile.js.map +1 -0
  323. package/dist/profiles/esQueryConditionRow.cjs +168 -0
  324. package/dist/profiles/esQueryConditionRow.cjs.map +1 -0
  325. package/dist/profiles/esQueryConditionRow.d.ts +37 -0
  326. package/dist/profiles/esQueryConditionRow.d.ts.map +1 -0
  327. package/dist/profiles/esQueryConditionRow.js +168 -0
  328. package/dist/profiles/esQueryConditionRow.js.map +1 -0
  329. package/dist/profiles/esQueryGroupModel.cjs +12 -0
  330. package/dist/profiles/esQueryGroupModel.cjs.map +1 -0
  331. package/dist/profiles/esQueryGroupModel.d.ts +9 -0
  332. package/dist/profiles/esQueryGroupModel.d.ts.map +1 -0
  333. package/dist/profiles/esQueryGroupModel.js +12 -0
  334. package/dist/profiles/esQueryGroupModel.js.map +1 -0
  335. package/dist/profiles/esQueryOccur.cjs +16 -0
  336. package/dist/profiles/esQueryOccur.cjs.map +1 -0
  337. package/dist/profiles/esQueryOccur.d.ts +11 -0
  338. package/dist/profiles/esQueryOccur.d.ts.map +1 -0
  339. package/dist/profiles/esQueryOccur.js +16 -0
  340. package/dist/profiles/esQueryOccur.js.map +1 -0
  341. package/dist/profiles/esQueryOperandEditors.cjs +279 -0
  342. package/dist/profiles/esQueryOperandEditors.cjs.map +1 -0
  343. package/dist/profiles/esQueryOperandEditors.d.ts +24 -0
  344. package/dist/profiles/esQueryOperandEditors.d.ts.map +1 -0
  345. package/dist/profiles/esQueryOperandEditors.js +279 -0
  346. package/dist/profiles/esQueryOperandEditors.js.map +1 -0
  347. package/dist/profiles/esQueryOperandModel.cjs +28 -0
  348. package/dist/profiles/esQueryOperandModel.cjs.map +1 -0
  349. package/dist/profiles/esQueryOperandModel.d.ts +17 -0
  350. package/dist/profiles/esQueryOperandModel.d.ts.map +1 -0
  351. package/dist/profiles/esQueryOperandModel.js +28 -0
  352. package/dist/profiles/esQueryOperandModel.js.map +1 -0
  353. package/dist/profiles/esQueryOperators.cjs +165 -0
  354. package/dist/profiles/esQueryOperators.cjs.map +1 -0
  355. package/dist/profiles/esQueryOperators.d.ts +83 -0
  356. package/dist/profiles/esQueryOperators.d.ts.map +1 -0
  357. package/dist/profiles/esQueryOperators.js +165 -0
  358. package/dist/profiles/esQueryOperators.js.map +1 -0
  359. package/dist/profiles/esQueryOutputEditor.cjs +138 -0
  360. package/dist/profiles/esQueryOutputEditor.cjs.map +1 -0
  361. package/dist/profiles/esQueryOutputEditor.d.ts +7 -0
  362. package/dist/profiles/esQueryOutputEditor.d.ts.map +1 -0
  363. package/dist/profiles/esQueryOutputEditor.js +138 -0
  364. package/dist/profiles/esQueryOutputEditor.js.map +1 -0
  365. package/dist/profiles/esQueryOutputModel.cjs +16 -0
  366. package/dist/profiles/esQueryOutputModel.cjs.map +1 -0
  367. package/dist/profiles/esQueryOutputModel.d.ts +14 -0
  368. package/dist/profiles/esQueryOutputModel.d.ts.map +1 -0
  369. package/dist/profiles/esQueryOutputModel.js +16 -0
  370. package/dist/profiles/esQueryOutputModel.js.map +1 -0
  371. package/dist/profiles/esQueryPreview.cjs +30 -0
  372. package/dist/profiles/esQueryPreview.cjs.map +1 -0
  373. package/dist/profiles/esQueryPreview.d.ts +6 -0
  374. package/dist/profiles/esQueryPreview.d.ts.map +1 -0
  375. package/dist/profiles/esQueryPreview.js +30 -0
  376. package/dist/profiles/esQueryPreview.js.map +1 -0
  377. package/dist/profiles/esQuerySortEditor.cjs +143 -0
  378. package/dist/profiles/esQuerySortEditor.cjs.map +1 -0
  379. package/dist/profiles/esQuerySortEditor.d.ts +9 -0
  380. package/dist/profiles/esQuerySortEditor.d.ts.map +1 -0
  381. package/dist/profiles/esQuerySortEditor.js +143 -0
  382. package/dist/profiles/esQuerySortEditor.js.map +1 -0
  383. package/dist/profiles/esQuerySortModel.cjs +13 -0
  384. package/dist/profiles/esQuerySortModel.cjs.map +1 -0
  385. package/dist/profiles/esQuerySortModel.d.ts +4 -0
  386. package/dist/profiles/esQuerySortModel.d.ts.map +1 -0
  387. package/dist/profiles/esQuerySortModel.js +13 -0
  388. package/dist/profiles/esQuerySortModel.js.map +1 -0
  389. package/dist/profiles/esValueCombobox.cjs +86 -0
  390. package/dist/profiles/esValueCombobox.cjs.map +1 -0
  391. package/dist/profiles/esValueCombobox.d.ts +15 -0
  392. package/dist/profiles/esValueCombobox.d.ts.map +1 -0
  393. package/dist/profiles/esValueCombobox.js +86 -0
  394. package/dist/profiles/esValueCombobox.js.map +1 -0
  395. package/dist/profiles/jsonPathSample.cjs +75 -0
  396. package/dist/profiles/jsonPathSample.cjs.map +1 -0
  397. package/dist/profiles/jsonPathSample.d.ts +27 -0
  398. package/dist/profiles/jsonPathSample.d.ts.map +1 -0
  399. package/dist/profiles/jsonPathSample.js +75 -0
  400. package/dist/profiles/jsonPathSample.js.map +1 -0
  401. package/dist/profiles/jsonPathSampleRow.cjs +14 -0
  402. package/dist/profiles/jsonPathSampleRow.cjs.map +1 -0
  403. package/dist/profiles/jsonPathSampleRow.d.ts +6 -0
  404. package/dist/profiles/jsonPathSampleRow.d.ts.map +1 -0
  405. package/dist/profiles/jsonPathSampleRow.js +14 -0
  406. package/dist/profiles/jsonPathSampleRow.js.map +1 -0
  407. package/dist/profiles/profileApi.cjs +37 -0
  408. package/dist/profiles/profileApi.cjs.map +1 -0
  409. package/dist/profiles/profileApi.d.ts +32 -0
  410. package/dist/profiles/profileApi.d.ts.map +1 -0
  411. package/dist/profiles/profileApi.js +37 -0
  412. package/dist/profiles/profileApi.js.map +1 -0
  413. package/dist/profiles/profileBuilder.cjs +65 -0
  414. package/dist/profiles/profileBuilder.cjs.map +1 -0
  415. package/dist/profiles/profileBuilder.d.ts +11 -0
  416. package/dist/profiles/profileBuilder.d.ts.map +1 -0
  417. package/dist/profiles/profileBuilder.js +65 -0
  418. package/dist/profiles/profileBuilder.js.map +1 -0
  419. package/dist/profiles/profileBuilderExtension.cjs +25 -0
  420. package/dist/profiles/profileBuilderExtension.cjs.map +1 -0
  421. package/dist/profiles/profileBuilderExtension.d.ts +5 -0
  422. package/dist/profiles/profileBuilderExtension.d.ts.map +1 -0
  423. package/dist/profiles/profileBuilderExtension.js +25 -0
  424. package/dist/profiles/profileBuilderExtension.js.map +1 -0
  425. package/dist/profiles/profileBuilderWorkspace.cjs +368 -0
  426. package/dist/profiles/profileBuilderWorkspace.cjs.map +1 -0
  427. package/dist/profiles/profileBuilderWorkspace.d.ts +21 -0
  428. package/dist/profiles/profileBuilderWorkspace.d.ts.map +1 -0
  429. package/dist/profiles/profileBuilderWorkspace.js +368 -0
  430. package/dist/profiles/profileBuilderWorkspace.js.map +1 -0
  431. package/dist/profiles/profileColumnModel.cjs +23 -0
  432. package/dist/profiles/profileColumnModel.cjs.map +1 -0
  433. package/dist/profiles/profileColumnModel.d.ts +8 -0
  434. package/dist/profiles/profileColumnModel.d.ts.map +1 -0
  435. package/dist/profiles/profileColumnModel.js +23 -0
  436. package/dist/profiles/profileColumnModel.js.map +1 -0
  437. package/dist/profiles/profileColumnPicker.cjs +68 -0
  438. package/dist/profiles/profileColumnPicker.cjs.map +1 -0
  439. package/dist/profiles/profileColumnPicker.d.ts +11 -0
  440. package/dist/profiles/profileColumnPicker.d.ts.map +1 -0
  441. package/dist/profiles/profileColumnPicker.js +68 -0
  442. package/dist/profiles/profileColumnPicker.js.map +1 -0
  443. package/dist/profiles/profileEditor.cjs +386 -0
  444. package/dist/profiles/profileEditor.cjs.map +1 -0
  445. package/dist/profiles/profileEditor.d.ts +19 -0
  446. package/dist/profiles/profileEditor.d.ts.map +1 -0
  447. package/dist/profiles/profileEditor.js +386 -0
  448. package/dist/profiles/profileEditor.js.map +1 -0
  449. package/dist/profiles/profileEditorModel.cjs +181 -0
  450. package/dist/profiles/profileEditorModel.cjs.map +1 -0
  451. package/dist/profiles/profileEditorModel.d.ts +74 -0
  452. package/dist/profiles/profileEditorModel.d.ts.map +1 -0
  453. package/dist/profiles/profileEditorModel.js +181 -0
  454. package/dist/profiles/profileEditorModel.js.map +1 -0
  455. package/dist/profiles/profileEditorPreview.cjs +38 -0
  456. package/dist/profiles/profileEditorPreview.cjs.map +1 -0
  457. package/dist/profiles/profileEditorPreview.d.ts +12 -0
  458. package/dist/profiles/profileEditorPreview.d.ts.map +1 -0
  459. package/dist/profiles/profileEditorPreview.js +38 -0
  460. package/dist/profiles/profileEditorPreview.js.map +1 -0
  461. package/dist/profiles/profileEditorRail.cjs +46 -0
  462. package/dist/profiles/profileEditorRail.cjs.map +1 -0
  463. package/dist/profiles/profileEditorRail.d.ts +8 -0
  464. package/dist/profiles/profileEditorRail.d.ts.map +1 -0
  465. package/dist/profiles/profileEditorRail.js +46 -0
  466. package/dist/profiles/profileEditorRail.js.map +1 -0
  467. package/dist/profiles/profileEditorRaw.cjs +118 -0
  468. package/dist/profiles/profileEditorRaw.cjs.map +1 -0
  469. package/dist/profiles/profileEditorRaw.d.ts +7 -0
  470. package/dist/profiles/profileEditorRaw.d.ts.map +1 -0
  471. package/dist/profiles/profileEditorRaw.js +118 -0
  472. package/dist/profiles/profileEditorRaw.js.map +1 -0
  473. package/dist/profiles/profileEditorRoutes.cjs +7 -0
  474. package/dist/profiles/profileEditorRoutes.cjs.map +1 -0
  475. package/dist/profiles/profileEditorRoutes.d.ts +2 -0
  476. package/dist/profiles/profileEditorRoutes.d.ts.map +1 -0
  477. package/dist/profiles/profileEditorRoutes.js +7 -0
  478. package/dist/profiles/profileEditorRoutes.js.map +1 -0
  479. package/dist/profiles/profileEditorSections.cjs +213 -0
  480. package/dist/profiles/profileEditorSections.cjs.map +1 -0
  481. package/dist/profiles/profileEditorSections.d.ts +23 -0
  482. package/dist/profiles/profileEditorSections.d.ts.map +1 -0
  483. package/dist/profiles/profileEditorSections.js +213 -0
  484. package/dist/profiles/profileEditorSections.js.map +1 -0
  485. package/dist/profiles/profileFieldEditor.cjs +200 -0
  486. package/dist/profiles/profileFieldEditor.cjs.map +1 -0
  487. package/dist/profiles/profileFieldEditor.d.ts +34 -0
  488. package/dist/profiles/profileFieldEditor.d.ts.map +1 -0
  489. package/dist/profiles/profileFieldEditor.js +200 -0
  490. package/dist/profiles/profileFieldEditor.js.map +1 -0
  491. package/dist/profiles/profileFieldGrid.cjs +250 -0
  492. package/dist/profiles/profileFieldGrid.cjs.map +1 -0
  493. package/dist/profiles/profileFieldGrid.d.ts +20 -0
  494. package/dist/profiles/profileFieldGrid.d.ts.map +1 -0
  495. package/dist/profiles/profileFieldGrid.js +250 -0
  496. package/dist/profiles/profileFieldGrid.js.map +1 -0
  497. package/dist/profiles/profileFieldManager.cjs +103 -0
  498. package/dist/profiles/profileFieldManager.cjs.map +1 -0
  499. package/dist/profiles/profileFieldManager.d.ts +9 -0
  500. package/dist/profiles/profileFieldManager.d.ts.map +1 -0
  501. package/dist/profiles/profileFieldManager.js +103 -0
  502. package/dist/profiles/profileFieldManager.js.map +1 -0
  503. package/dist/profiles/profileFieldState.cjs +136 -0
  504. package/dist/profiles/profileFieldState.cjs.map +1 -0
  505. package/dist/profiles/profileFieldState.d.ts +41 -0
  506. package/dist/profiles/profileFieldState.d.ts.map +1 -0
  507. package/dist/profiles/profileFieldState.js +136 -0
  508. package/dist/profiles/profileFieldState.js.map +1 -0
  509. package/dist/profiles/profileFieldTypes.cjs +17 -0
  510. package/dist/profiles/profileFieldTypes.cjs.map +1 -0
  511. package/dist/profiles/profileFieldTypes.d.ts +8 -0
  512. package/dist/profiles/profileFieldTypes.d.ts.map +1 -0
  513. package/dist/profiles/profileFieldTypes.js +17 -0
  514. package/dist/profiles/profileFieldTypes.js.map +1 -0
  515. package/dist/profiles/profileParamModel.cjs +78 -0
  516. package/dist/profiles/profileParamModel.cjs.map +1 -0
  517. package/dist/profiles/profileParamModel.d.ts +3 -0
  518. package/dist/profiles/profileParamModel.d.ts.map +1 -0
  519. package/dist/profiles/profileParamModel.js +78 -0
  520. package/dist/profiles/profileParamModel.js.map +1 -0
  521. package/dist/profiles/profileSamplePayload.cjs +15 -0
  522. package/dist/profiles/profileSamplePayload.cjs.map +1 -0
  523. package/dist/profiles/profileSamplePayload.d.ts +13 -0
  524. package/dist/profiles/profileSamplePayload.d.ts.map +1 -0
  525. package/dist/profiles/profileSamplePayload.js +15 -0
  526. package/dist/profiles/profileSamplePayload.js.map +1 -0
  527. package/dist/profiles/profileWizard.cjs +257 -0
  528. package/dist/profiles/profileWizard.cjs.map +1 -0
  529. package/dist/profiles/profileWizard.d.ts +12 -0
  530. package/dist/profiles/profileWizard.d.ts.map +1 -0
  531. package/dist/profiles/profileWizard.js +257 -0
  532. package/dist/profiles/profileWizard.js.map +1 -0
  533. package/dist/profiles/profileWizardHelp.cjs +10 -0
  534. package/dist/profiles/profileWizardHelp.cjs.map +1 -0
  535. package/dist/profiles/profileWizardHelp.d.ts +13 -0
  536. package/dist/profiles/profileWizardHelp.d.ts.map +1 -0
  537. package/dist/profiles/profileWizardHelp.js +10 -0
  538. package/dist/profiles/profileWizardHelp.js.map +1 -0
  539. package/dist/profiles/profileWizardModel.cjs +198 -0
  540. package/dist/profiles/profileWizardModel.cjs.map +1 -0
  541. package/dist/profiles/profileWizardModel.d.ts +255 -0
  542. package/dist/profiles/profileWizardModel.d.ts.map +1 -0
  543. package/dist/profiles/profileWizardModel.js +198 -0
  544. package/dist/profiles/profileWizardModel.js.map +1 -0
  545. package/dist/profiles/profileWizardQueryStep.cjs +215 -0
  546. package/dist/profiles/profileWizardQueryStep.cjs.map +1 -0
  547. package/dist/profiles/profileWizardQueryStep.d.ts +18 -0
  548. package/dist/profiles/profileWizardQueryStep.d.ts.map +1 -0
  549. package/dist/profiles/profileWizardQueryStep.js +215 -0
  550. package/dist/profiles/profileWizardQueryStep.js.map +1 -0
  551. package/dist/profiles/profileWizardSteps.cjs +214 -0
  552. package/dist/profiles/profileWizardSteps.cjs.map +1 -0
  553. package/dist/profiles/profileWizardSteps.d.ts +35 -0
  554. package/dist/profiles/profileWizardSteps.d.ts.map +1 -0
  555. package/dist/profiles/profileWizardSteps.js +214 -0
  556. package/dist/profiles/profileWizardSteps.js.map +1 -0
  557. package/dist/profiles/profileYaml.cjs +19 -0
  558. package/dist/profiles/profileYaml.cjs.map +1 -0
  559. package/dist/profiles/profileYaml.d.ts +4 -0
  560. package/dist/profiles/profileYaml.d.ts.map +1 -0
  561. package/dist/profiles/profileYaml.js +19 -0
  562. package/dist/profiles/profileYaml.js.map +1 -0
  563. package/dist/profiles/prometheusResults.cjs +60 -0
  564. package/dist/profiles/prometheusResults.cjs.map +1 -0
  565. package/dist/profiles/prometheusResults.d.ts +7 -0
  566. package/dist/profiles/prometheusResults.d.ts.map +1 -0
  567. package/dist/profiles/prometheusResults.js +60 -0
  568. package/dist/profiles/prometheusResults.js.map +1 -0
  569. package/dist/profiles/queryRowLimits.cjs +82 -0
  570. package/dist/profiles/queryRowLimits.cjs.map +1 -0
  571. package/dist/profiles/queryRowLimits.d.ts +9 -0
  572. package/dist/profiles/queryRowLimits.d.ts.map +1 -0
  573. package/dist/profiles/queryRowLimits.js +82 -0
  574. package/dist/profiles/queryRowLimits.js.map +1 -0
  575. package/dist/profiles/queryRowLimitsModel.cjs +10 -0
  576. package/dist/profiles/queryRowLimitsModel.cjs.map +1 -0
  577. package/dist/profiles/queryRowLimitsModel.d.ts +9 -0
  578. package/dist/profiles/queryRowLimitsModel.d.ts.map +1 -0
  579. package/dist/profiles/queryRowLimitsModel.js +10 -0
  580. package/dist/profiles/queryRowLimitsModel.js.map +1 -0
  581. package/dist/profiles/queryTargetPicker.cjs +42 -0
  582. package/dist/profiles/queryTargetPicker.cjs.map +1 -0
  583. package/dist/profiles/queryTargetPicker.d.ts +8 -0
  584. package/dist/profiles/queryTargetPicker.d.ts.map +1 -0
  585. package/dist/profiles/queryTargetPicker.js +42 -0
  586. package/dist/profiles/queryTargetPicker.js.map +1 -0
  587. package/dist/profiles/testSchema.d.ts +3 -0
  588. package/dist/profiles/testSchema.d.ts.map +1 -0
  589. package/dist/profiles.cjs +223 -0
  590. package/dist/profiles.cjs.map +1 -0
  591. package/dist/profiles.d.ts +68 -0
  592. package/dist/profiles.d.ts.map +1 -0
  593. package/dist/profiles.js +223 -0
  594. package/dist/profiles.js.map +1 -0
  595. package/dist/rpc/FilterForm.cjs +20 -0
  596. package/dist/rpc/FilterForm.cjs.map +1 -1
  597. package/dist/rpc/FilterForm.js +20 -0
  598. package/dist/rpc/FilterForm.js.map +1 -1
  599. package/dist/rpc/formMetadata.cjs +34 -0
  600. package/dist/rpc/formMetadata.cjs.map +1 -1
  601. package/dist/rpc/formMetadata.d.ts.map +1 -1
  602. package/dist/rpc/formMetadata.js +35 -1
  603. package/dist/rpc/formMetadata.js.map +1 -1
  604. package/dist/rpc/types.cjs.map +1 -1
  605. package/dist/rpc/types.d.ts +9 -1
  606. package/dist/rpc/types.d.ts.map +1 -1
  607. package/dist/rpc/types.js.map +1 -1
  608. package/dist/styles.css +1 -1
  609. package/package.json +6 -1
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const utils = require("../lib/utils.cjs");
6
+ const Icon = require("../data/Icon.cjs");
7
+ const JsonView = require("../data/JsonView.cjs");
8
+ const Tree = require("../data/Tree.cjs");
9
+ const Modal = require("../overlay/Modal.cjs");
10
+ const button = require("./button.cjs");
11
+ const InputField = require("./InputField.cjs");
12
+ const jsonPathTree = require("./jsonPathTree.cjs");
13
+ const UiWarningTriangle = require("../icons/components/UiWarningTriangle.cjs");
14
+ const UiInfo = require("../icons/components/UiInfo.cjs");
15
+ const EVALUATE_DEBOUNCE_MS = 250;
16
+ function JSONPathPlayground({
17
+ open,
18
+ onClose,
19
+ rows,
20
+ value,
21
+ onCommit,
22
+ assignsRoot,
23
+ source,
24
+ evaluate,
25
+ title = "JSONPath playground"
26
+ }) {
27
+ const [draft, setDraft] = react.useState(value);
28
+ const [rowIndex, setRowIndex] = react.useState(0);
29
+ const [selected, setSelected] = react.useState(null);
30
+ const [result, setResult] = react.useState(null);
31
+ const [evaluating, setEvaluating] = react.useState(false);
32
+ react.useEffect(() => {
33
+ if (open) {
34
+ setDraft(value);
35
+ setRowIndex((current) => current < rows.length ? current : 0);
36
+ }
37
+ }, [open, value, rows.length]);
38
+ const row = rows[rowIndex];
39
+ const browsed = react.useMemo(() => decodeSource(row, source), [row, source]);
40
+ const tree = react.useMemo(
41
+ () => jsonPathTree.createLazyJSONPathTree(browsed, { keyPrefix: `row${rowIndex}:${source ?? ""}:` }),
42
+ [browsed, rowIndex, source]
43
+ );
44
+ react.useEffect(() => {
45
+ if (!open) return;
46
+ setSelected(tree.materializePath(draft) ?? null);
47
+ }, [open, tree]);
48
+ const root = (selected == null ? void 0 : selected.root) ?? source;
49
+ const rootPending = root !== void 0 && root !== source && !assignsRoot;
50
+ const latestRequest = react.useRef(0);
51
+ react.useEffect(() => {
52
+ if (!open || !evaluate) return;
53
+ const request = latestRequest.current += 1;
54
+ setEvaluating(true);
55
+ const timer = setTimeout(() => {
56
+ const payload = { jsonpath: draft, row };
57
+ if (root !== void 0) payload.source = root;
58
+ void evaluate(payload).then((next) => {
59
+ if (latestRequest.current === request) setResult(next);
60
+ }).catch((error) => {
61
+ if (latestRequest.current === request) {
62
+ setResult({ matches: [], count: 0, error: String(error) });
63
+ }
64
+ }).finally(() => {
65
+ if (latestRequest.current === request) setEvaluating(false);
66
+ });
67
+ }, EVALUATE_DEBOUNCE_MS);
68
+ return () => clearTimeout(timer);
69
+ }, [open, evaluate, draft, row, root]);
70
+ const commit = () => {
71
+ onCommit(draft, root === void 0 ? {} : { root });
72
+ onClose();
73
+ };
74
+ return /* @__PURE__ */ jsxRuntime.jsx(
75
+ Modal.Modal,
76
+ {
77
+ open,
78
+ onClose,
79
+ title,
80
+ size: "2xl",
81
+ scrollBody: false,
82
+ className: "h-[80vh]",
83
+ footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-2", children: [
84
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { variant: "outline", onClick: onClose, children: "Cancel" }),
85
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { onClick: commit, disabled: draft.trim() === "", children: "Use path" })
86
+ ] }),
87
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-h-0 flex-col gap-3", children: [
88
+ rows.length > 1 && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex shrink-0 items-center gap-2 text-xs text-muted-foreground", children: [
89
+ "Sample row",
90
+ /* @__PURE__ */ jsxRuntime.jsx(
91
+ "select",
92
+ {
93
+ "aria-label": "Sample row",
94
+ value: rowIndex,
95
+ onChange: (event) => setRowIndex(Number(event.target.value)),
96
+ className: "h-7 rounded-md border border-input bg-background px-2 text-xs text-foreground",
97
+ children: rows.map((_, index) => /* @__PURE__ */ jsxRuntime.jsxs("option", { value: index, children: [
98
+ index + 1,
99
+ " of ",
100
+ rows.length
101
+ ] }, index))
102
+ }
103
+ ),
104
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Fields absent from the first row are only visible in the one that carries them." })
105
+ ] }),
106
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid min-h-0 flex-1 gap-3 md:grid-cols-2", children: [
107
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-0 flex-col overflow-hidden rounded-md border border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
108
+ Tree.Tree,
109
+ {
110
+ className: "min-h-0 flex-1",
111
+ ariaLabel: "JSON paths",
112
+ roots: tree.roots,
113
+ getKey: (node) => node.key,
114
+ getChildren: tree.getChildren,
115
+ hasMoreChildren: tree.hasMoreChildren,
116
+ loadChildren: tree.loadChildren,
117
+ getSearchText: (node) => `${node.path} ${node.summary}`,
118
+ defaultOpen: (_node, depth) => depth < 2,
119
+ selected,
120
+ revealSelected: true,
121
+ onSelect: (node) => {
122
+ if (node.kind === "more") return;
123
+ setSelected(node);
124
+ setDraft(node.path);
125
+ },
126
+ renderRow: ({ node }) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-density-2 font-mono text-xs", children: [
127
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: utils.cn("shrink-0", node.kind === "more" ? "text-muted-foreground" : "text-primary"), children: node.kind === "more" ? "…" : node.path }),
128
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-muted-foreground", title: node.summary, children: node.summary })
129
+ ] })
130
+ }
131
+ ) }),
132
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-col gap-2", children: [
133
+ /* @__PURE__ */ jsxRuntime.jsx(
134
+ InputField.InputField,
135
+ {
136
+ "aria-label": "JSONPath expression",
137
+ value: draft,
138
+ onChange: setDraft,
139
+ inputClassName: "font-mono text-xs",
140
+ placeholder: "$.messages[0].payload"
141
+ }
142
+ ),
143
+ root !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs(
144
+ "p",
145
+ {
146
+ className: utils.cn(
147
+ "flex shrink-0 items-start gap-1.5 rounded-md border px-2 py-1.5 text-xs text-foreground",
148
+ rootPending ? "border-amber-600/40 bg-amber-500/10" : "border-border bg-muted/40"
149
+ ),
150
+ children: [
151
+ /* @__PURE__ */ jsxRuntime.jsx(
152
+ Icon.Icon,
153
+ {
154
+ icon: rootPending ? UiWarningTriangle.UiWarningTriangle : UiInfo.UiInfo,
155
+ className: utils.cn("mt-0.5 shrink-0", rootPending ? "text-amber-600" : "text-muted-foreground")
156
+ }
157
+ ),
158
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
159
+ "This path is rooted inside ",
160
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "font-mono", children: root }),
161
+ ", a column holding JSON as text.",
162
+ " ",
163
+ root === source ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
164
+ "That is already the column's ",
165
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "font-mono", children: "Source" }),
166
+ "."
167
+ ] }) : assignsRoot ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
168
+ "Applying it sets the column's ",
169
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "font-mono", children: "Source" }),
170
+ " to",
171
+ " ",
172
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "font-mono", children: root }),
173
+ "."
174
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
175
+ "The column's ",
176
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "font-mono", children: "Source" }),
177
+ " must be set to",
178
+ " ",
179
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "font-mono", children: root }),
180
+ " for it to resolve."
181
+ ] })
182
+ ] })
183
+ ]
184
+ }
185
+ ),
186
+ /* @__PURE__ */ jsxRuntime.jsx(ResultPane, { evaluating, result, selected, evaluated: Boolean(evaluate) })
187
+ ] })
188
+ ] })
189
+ ] })
190
+ }
191
+ );
192
+ }
193
+ function decodeSource(row, source) {
194
+ if (!source) return row;
195
+ if (row === null || typeof row !== "object") return void 0;
196
+ const value = row[source];
197
+ if (typeof value !== "string") return value;
198
+ try {
199
+ return JSON.parse(value);
200
+ } catch {
201
+ return value;
202
+ }
203
+ }
204
+ function ResultPane({
205
+ evaluating,
206
+ result,
207
+ selected,
208
+ evaluated
209
+ }) {
210
+ if (!evaluated) {
211
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-auto rounded-md border border-border bg-muted/20 p-2 text-xs", children: selected ? /* @__PURE__ */ jsxRuntime.jsx(JsonView.JsonView, { data: selected.value, defaultOpenDepth: 1 }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: "Select a node to see its value." }) });
212
+ }
213
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
214
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs", children: [
215
+ (result == null ? void 0 : result.error) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-mono text-destructive", children: result.error }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: utils.cn(result && result.count === 0 && "text-muted-foreground"), children: evaluating && result === null ? "Evaluating…" : `${(result == null ? void 0 : result.count) ?? 0} match${(result == null ? void 0 : result.count) === 1 ? "" : "es"}` }),
216
+ result && !result.error && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: result.filterField ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
217
+ "Filterable as ",
218
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "font-mono text-foreground", children: result.filterField })
219
+ ] }) : "Selects a set — not filterable unless the column declares filter.field" })
220
+ ] }),
221
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-auto rounded-md border border-border bg-muted/20 p-2 text-xs", children: result && !result.error && result.count > 0 ? /* @__PURE__ */ jsxRuntime.jsx(JsonView.JsonView, { data: result.count === 1 ? result.matches[0] : result.matches, defaultOpenDepth: 1 }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: (result == null ? void 0 : result.error) ? "Fix the expression to see what it selects." : "This path selects nothing in this row." }) })
222
+ ] });
223
+ }
224
+ exports.JSONPathPlayground = JSONPathPlayground;
225
+ //# sourceMappingURL=JSONPathPlayground.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSONPathPlayground.cjs","sources":["../../src/components/JSONPathPlayground.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { JsonView } from \"../data/JsonView\";\nimport { Tree } from \"../data/Tree\";\nimport { UiInfo, UiWarningTriangle } from \"../icons\";\nimport { Modal } from \"../overlay/Modal\";\nimport { Button } from \"./button\";\nimport { InputField } from \"./InputField\";\nimport { createLazyJSONPathTree, type JSONPathNode } from \"./jsonPathTree\";\n\n/** What evaluating an expression against one row reports back. */\nexport interface JSONPathEvalResult {\n matches: unknown[];\n count: number;\n /** Why the expression could not be evaluated — a parse error is an answer, not a failure. */\n error?: string;\n /** Backend field the expression addresses, when it addresses one rather than selecting a set. */\n filterField?: string;\n}\n\nexport interface JSONPathEvalRequest {\n jsonpath: string;\n /** Column the path is rooted at, when it addresses a decoded JSON-encoded column. */\n source?: string;\n row: unknown;\n}\n\nexport interface JSONPathPlaygroundProps {\n open: boolean;\n onClose: () => void;\n /** Sampled rows to browse. A row switcher appears once there is more than one. */\n rows: unknown[];\n /** The expression the field currently holds. */\n value: string;\n /** Commits the drafted expression, along with the column it must be rooted at. */\n onCommit: (path: string, context: { root?: string }) => void;\n /**\n * True when `onCommit` writes the root itself. It only changes what the\n * dialog says about a path that descends into an encoded column: that the\n * root will be recorded, rather than instructing the author to go and record\n * it. Consumers that drop the root leave this unset and keep the warning.\n */\n assignsRoot?: boolean;\n /**\n * The column the field's path is *already* rooted at — its saved `source`.\n *\n * Without it the dialog browses and evaluates from the row while the value it\n * was opened with is written against a decoded column, so a column that works\n * perfectly well reports no matches and an author is invited to fix it.\n */\n source?: string;\n /**\n * Evaluates the draft against the selected row. Without it the dialog is a\n * browser only — it shows the selected node's own value instead of a match\n * set, which is all an offline demo can honestly claim.\n */\n evaluate?: (request: JSONPathEvalRequest) => Promise<JSONPathEvalResult>;\n title?: string;\n}\n\nconst EVALUATE_DEBOUNCE_MS = 250;\n\n/**\n * The full-size counterpart to the inline JSONPath dropdown.\n *\n * The dropdown is a preview and caps its walk to stay instant; this browses the\n * row with no depth limit, every array element, and every property — and pairs\n * the tree with what the expression actually selects, evaluated by the backend\n * that will run it, so an author stops finding out at query time.\n */\nexport function JSONPathPlayground({\n open,\n onClose,\n rows,\n value,\n onCommit,\n assignsRoot,\n source,\n evaluate,\n title = \"JSONPath playground\",\n}: JSONPathPlaygroundProps) {\n const [draft, setDraft] = useState(value);\n const [rowIndex, setRowIndex] = useState(0);\n const [selected, setSelected] = useState<JSONPathNode | null>(null);\n const [result, setResult] = useState<JSONPathEvalResult | null>(null);\n const [evaluating, setEvaluating] = useState(false);\n\n // Reopening starts from whatever the field holds now, not from the last\n // session's draft — the operator may have typed over it in between.\n useEffect(() => {\n if (open) {\n setDraft(value);\n setRowIndex((current) => (current < rows.length ? current : 0));\n }\n }, [open, value, rows.length]);\n\n const row = rows[rowIndex];\n // A column with a `source` has its paths written against that column decoded,\n // not against the row, so that is what the tree has to browse — otherwise the\n // paths it offers and the path the field holds are in two different languages.\n const browsed = useMemo(() => decodeSource(row, source), [row, source]);\n const tree = useMemo(\n () => createLazyJSONPathTree(browsed, { keyPrefix: `row${rowIndex}:${source ?? \"\"}:` }),\n [browsed, rowIndex, source],\n );\n\n // Reveal the branch the current expression addresses, so the dialog opens\n // showing the value rather than a collapsed root.\n useEffect(() => {\n if (!open) return;\n setSelected(tree.materializePath(draft) ?? null);\n // Only on (re)open and row change: re-running this per keystroke would yank\n // the tree around while the operator is typing.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, tree]);\n\n // The root belongs to the selection, and hand-editing the expression keeps it:\n // an operator who descended into an encoded column and is now tuning the path\n // inside it still means that column. It is never silent — the banner below\n // names it — and selecting any node outside that subtree clears it. A column\n // that already declares a source starts there rather than at nothing.\n const root = selected?.root ?? source;\n // Only a root nobody has recorded yet is a warning: one the column already\n // declares, or one this dialog is about to write, is just context.\n const rootPending = root !== undefined && root !== source && !assignsRoot;\n\n const latestRequest = useRef(0);\n useEffect(() => {\n if (!open || !evaluate) return;\n const request = (latestRequest.current += 1);\n setEvaluating(true);\n const timer = setTimeout(() => {\n const payload: JSONPathEvalRequest = { jsonpath: draft, row };\n if (root !== undefined) payload.source = root;\n void evaluate(payload)\n .then((next) => {\n if (latestRequest.current === request) setResult(next);\n })\n .catch((error: unknown) => {\n if (latestRequest.current === request) {\n setResult({ matches: [], count: 0, error: String(error) });\n }\n })\n .finally(() => {\n if (latestRequest.current === request) setEvaluating(false);\n });\n }, EVALUATE_DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [open, evaluate, draft, row, root]);\n\n const commit = () => {\n onCommit(draft, root === undefined ? {} : { root });\n onClose();\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={title}\n size=\"2xl\"\n scrollBody={false}\n className=\"h-[80vh]\"\n footer={(\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"outline\" onClick={onClose}>Cancel</Button>\n <Button onClick={commit} disabled={draft.trim() === \"\"}>Use path</Button>\n </div>\n )}\n >\n <div className=\"flex h-full min-h-0 flex-col gap-3\">\n {rows.length > 1 && (\n <label className=\"flex shrink-0 items-center gap-2 text-xs text-muted-foreground\">\n Sample row\n <select\n aria-label=\"Sample row\"\n value={rowIndex}\n onChange={(event) => setRowIndex(Number(event.target.value))}\n className=\"h-7 rounded-md border border-input bg-background px-2 text-xs text-foreground\"\n >\n {rows.map((_, index) => (\n <option key={index} value={index}>{index + 1} of {rows.length}</option>\n ))}\n </select>\n <span>Fields absent from the first row are only visible in the one that carries them.</span>\n </label>\n )}\n\n <div className=\"grid min-h-0 flex-1 gap-3 md:grid-cols-2\">\n <div className=\"flex min-h-0 flex-col overflow-hidden rounded-md border border-border\">\n <Tree<JSONPathNode>\n className=\"min-h-0 flex-1\"\n ariaLabel=\"JSON paths\"\n roots={tree.roots}\n getKey={(node) => node.key}\n getChildren={tree.getChildren}\n hasMoreChildren={tree.hasMoreChildren}\n loadChildren={tree.loadChildren}\n getSearchText={(node) => `${node.path} ${node.summary}`}\n defaultOpen={(_node, depth) => depth < 2}\n selected={selected}\n revealSelected\n onSelect={(node) => {\n if (node.kind === \"more\") return;\n setSelected(node);\n setDraft(node.path);\n }}\n renderRow={({ node }) => (\n <span className=\"flex min-w-0 flex-1 items-center gap-density-2 font-mono text-xs\">\n <span className={cn(\"shrink-0\", node.kind === \"more\" ? \"text-muted-foreground\" : \"text-primary\")}>\n {node.kind === \"more\" ? \"…\" : node.path}\n </span>\n <span className=\"truncate text-muted-foreground\" title={node.summary}>{node.summary}</span>\n </span>\n )}\n />\n </div>\n\n <div className=\"flex min-h-0 flex-col gap-2\">\n <InputField\n aria-label=\"JSONPath expression\"\n value={draft}\n onChange={setDraft}\n inputClassName=\"font-mono text-xs\"\n placeholder=\"$.messages[0].payload\"\n />\n\n {root !== undefined && (\n <p\n className={cn(\n \"flex shrink-0 items-start gap-1.5 rounded-md border px-2 py-1.5 text-xs text-foreground\",\n rootPending\n ? \"border-amber-600/40 bg-amber-500/10\"\n : \"border-border bg-muted/40\",\n )}\n >\n <Icon\n icon={rootPending ? UiWarningTriangle : UiInfo}\n className={cn(\"mt-0.5 shrink-0\", rootPending ? \"text-amber-600\" : \"text-muted-foreground\")}\n />\n <span>\n This path is rooted inside <code className=\"font-mono\">{root}</code>, a column holding JSON\n as text.{\" \"}\n {root === source ? (\n <>\n That is already the column's <code className=\"font-mono\">Source</code>.\n </>\n ) : assignsRoot ? (\n <>\n Applying it sets the column's <code className=\"font-mono\">Source</code> to{\" \"}\n <code className=\"font-mono\">{root}</code>.\n </>\n ) : (\n <>\n The column's <code className=\"font-mono\">Source</code> must be set to{\" \"}\n <code className=\"font-mono\">{root}</code> for it to resolve.\n </>\n )}\n </span>\n </p>\n )}\n\n <ResultPane evaluating={evaluating} result={result} selected={selected} evaluated={Boolean(evaluate)} />\n </div>\n </div>\n </div>\n </Modal>\n );\n}\n\n/**\n * The value a `source` column's paths are written against: the column itself,\n * decoded when it carries JSON as text — which mirrors what the backend does\n * before it applies the path.\n */\nfunction decodeSource(row: unknown, source: string | undefined): unknown {\n if (!source) return row;\n if (row === null || typeof row !== \"object\") return undefined;\n const value = (row as Record<string, unknown>)[source];\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction ResultPane({\n evaluating,\n result,\n selected,\n evaluated,\n}: {\n evaluating: boolean;\n result: JSONPathEvalResult | null;\n selected: JSONPathNode | null;\n evaluated: boolean;\n}) {\n if (!evaluated) {\n return (\n <div className=\"min-h-0 flex-1 overflow-auto rounded-md border border-border bg-muted/20 p-2 text-xs\">\n {selected ? (\n <JsonView data={selected.value} defaultOpenDepth={1} />\n ) : (\n <p className=\"text-muted-foreground\">Select a node to see its value.</p>\n )}\n </div>\n );\n }\n\n return (\n <>\n <div className=\"flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs\">\n {result?.error ? (\n <span className=\"font-mono text-destructive\">{result.error}</span>\n ) : (\n <span className={cn(result && result.count === 0 && \"text-muted-foreground\")}>\n {evaluating && result === null\n ? \"Evaluating…\"\n : `${result?.count ?? 0} match${result?.count === 1 ? \"\" : \"es\"}`}\n </span>\n )}\n {result && !result.error && (\n <span className=\"text-muted-foreground\">\n {result.filterField\n ? <>Filterable as <code className=\"font-mono text-foreground\">{result.filterField}</code></>\n : \"Selects a set — not filterable unless the column declares filter.field\"}\n </span>\n )}\n </div>\n <div className=\"min-h-0 flex-1 overflow-auto rounded-md border border-border bg-muted/20 p-2 text-xs\">\n {result && !result.error && result.count > 0 ? (\n <JsonView data={result.count === 1 ? result.matches[0] : result.matches} defaultOpenDepth={1} />\n ) : (\n <p className=\"text-muted-foreground\">\n {result?.error ? \"Fix the expression to see what it selects.\" : \"This path selects nothing in this row.\"}\n </p>\n )}\n </div>\n </>\n );\n}\n"],"names":["useState","useEffect","useMemo","createLazyJSONPathTree","useRef","jsx","Modal","jsxs","Button","Tree","cn","InputField","Icon","UiWarningTriangle","UiInfo","Fragment","JsonView"],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /** What evaluating an expression against one row reports back. */
2
+ export interface JSONPathEvalResult {
3
+ matches: unknown[];
4
+ count: number;
5
+ /** Why the expression could not be evaluated — a parse error is an answer, not a failure. */
6
+ error?: string;
7
+ /** Backend field the expression addresses, when it addresses one rather than selecting a set. */
8
+ filterField?: string;
9
+ }
10
+ export interface JSONPathEvalRequest {
11
+ jsonpath: string;
12
+ /** Column the path is rooted at, when it addresses a decoded JSON-encoded column. */
13
+ source?: string;
14
+ row: unknown;
15
+ }
16
+ export interface JSONPathPlaygroundProps {
17
+ open: boolean;
18
+ onClose: () => void;
19
+ /** Sampled rows to browse. A row switcher appears once there is more than one. */
20
+ rows: unknown[];
21
+ /** The expression the field currently holds. */
22
+ value: string;
23
+ /** Commits the drafted expression, along with the column it must be rooted at. */
24
+ onCommit: (path: string, context: {
25
+ root?: string;
26
+ }) => void;
27
+ /**
28
+ * True when `onCommit` writes the root itself. It only changes what the
29
+ * dialog says about a path that descends into an encoded column: that the
30
+ * root will be recorded, rather than instructing the author to go and record
31
+ * it. Consumers that drop the root leave this unset and keep the warning.
32
+ */
33
+ assignsRoot?: boolean;
34
+ /**
35
+ * The column the field's path is *already* rooted at — its saved `source`.
36
+ *
37
+ * Without it the dialog browses and evaluates from the row while the value it
38
+ * was opened with is written against a decoded column, so a column that works
39
+ * perfectly well reports no matches and an author is invited to fix it.
40
+ */
41
+ source?: string;
42
+ /**
43
+ * Evaluates the draft against the selected row. Without it the dialog is a
44
+ * browser only — it shows the selected node's own value instead of a match
45
+ * set, which is all an offline demo can honestly claim.
46
+ */
47
+ evaluate?: (request: JSONPathEvalRequest) => Promise<JSONPathEvalResult>;
48
+ title?: string;
49
+ }
50
+ /**
51
+ * The full-size counterpart to the inline JSONPath dropdown.
52
+ *
53
+ * The dropdown is a preview and caps its walk to stay instant; this browses the
54
+ * row with no depth limit, every array element, and every property — and pairs
55
+ * the tree with what the expression actually selects, evaluated by the backend
56
+ * that will run it, so an author stops finding out at query time.
57
+ */
58
+ export declare function JSONPathPlayground({ open, onClose, rows, value, onCommit, assignsRoot, source, evaluate, title, }: JSONPathPlaygroundProps): import("react/jsx-runtime").JSX.Element;
59
+ //# sourceMappingURL=JSONPathPlayground.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSONPathPlayground.d.ts","sourceRoot":"","sources":["../../src/components/JSONPathPlayground.tsx"],"names":[],"mappings":"AAWA,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kFAAkF;IAClF,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC7D;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,WAAW,EACX,MAAM,EACN,QAAQ,EACR,KAA6B,GAC9B,EAAE,uBAAuB,2CA4LzB"}
@@ -0,0 +1,225 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect, useMemo, useRef } from "react";
3
+ import { cn } from "../lib/utils.js";
4
+ import { Icon } from "../data/Icon.js";
5
+ import { JsonView } from "../data/JsonView.js";
6
+ import { Tree } from "../data/Tree.js";
7
+ import { Modal } from "../overlay/Modal.js";
8
+ import { Button } from "./button.js";
9
+ import { InputField } from "./InputField.js";
10
+ import { createLazyJSONPathTree } from "./jsonPathTree.js";
11
+ import { UiWarningTriangle } from "../icons/components/UiWarningTriangle.js";
12
+ import { UiInfo } from "../icons/components/UiInfo.js";
13
+ const EVALUATE_DEBOUNCE_MS = 250;
14
+ function JSONPathPlayground({
15
+ open,
16
+ onClose,
17
+ rows,
18
+ value,
19
+ onCommit,
20
+ assignsRoot,
21
+ source,
22
+ evaluate,
23
+ title = "JSONPath playground"
24
+ }) {
25
+ const [draft, setDraft] = useState(value);
26
+ const [rowIndex, setRowIndex] = useState(0);
27
+ const [selected, setSelected] = useState(null);
28
+ const [result, setResult] = useState(null);
29
+ const [evaluating, setEvaluating] = useState(false);
30
+ useEffect(() => {
31
+ if (open) {
32
+ setDraft(value);
33
+ setRowIndex((current) => current < rows.length ? current : 0);
34
+ }
35
+ }, [open, value, rows.length]);
36
+ const row = rows[rowIndex];
37
+ const browsed = useMemo(() => decodeSource(row, source), [row, source]);
38
+ const tree = useMemo(
39
+ () => createLazyJSONPathTree(browsed, { keyPrefix: `row${rowIndex}:${source ?? ""}:` }),
40
+ [browsed, rowIndex, source]
41
+ );
42
+ useEffect(() => {
43
+ if (!open) return;
44
+ setSelected(tree.materializePath(draft) ?? null);
45
+ }, [open, tree]);
46
+ const root = (selected == null ? void 0 : selected.root) ?? source;
47
+ const rootPending = root !== void 0 && root !== source && !assignsRoot;
48
+ const latestRequest = useRef(0);
49
+ useEffect(() => {
50
+ if (!open || !evaluate) return;
51
+ const request = latestRequest.current += 1;
52
+ setEvaluating(true);
53
+ const timer = setTimeout(() => {
54
+ const payload = { jsonpath: draft, row };
55
+ if (root !== void 0) payload.source = root;
56
+ void evaluate(payload).then((next) => {
57
+ if (latestRequest.current === request) setResult(next);
58
+ }).catch((error) => {
59
+ if (latestRequest.current === request) {
60
+ setResult({ matches: [], count: 0, error: String(error) });
61
+ }
62
+ }).finally(() => {
63
+ if (latestRequest.current === request) setEvaluating(false);
64
+ });
65
+ }, EVALUATE_DEBOUNCE_MS);
66
+ return () => clearTimeout(timer);
67
+ }, [open, evaluate, draft, row, root]);
68
+ const commit = () => {
69
+ onCommit(draft, root === void 0 ? {} : { root });
70
+ onClose();
71
+ };
72
+ return /* @__PURE__ */ jsx(
73
+ Modal,
74
+ {
75
+ open,
76
+ onClose,
77
+ title,
78
+ size: "2xl",
79
+ scrollBody: false,
80
+ className: "h-[80vh]",
81
+ footer: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2", children: [
82
+ /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: onClose, children: "Cancel" }),
83
+ /* @__PURE__ */ jsx(Button, { onClick: commit, disabled: draft.trim() === "", children: "Use path" })
84
+ ] }),
85
+ children: /* @__PURE__ */ jsxs("div", { className: "flex h-full min-h-0 flex-col gap-3", children: [
86
+ rows.length > 1 && /* @__PURE__ */ jsxs("label", { className: "flex shrink-0 items-center gap-2 text-xs text-muted-foreground", children: [
87
+ "Sample row",
88
+ /* @__PURE__ */ jsx(
89
+ "select",
90
+ {
91
+ "aria-label": "Sample row",
92
+ value: rowIndex,
93
+ onChange: (event) => setRowIndex(Number(event.target.value)),
94
+ className: "h-7 rounded-md border border-input bg-background px-2 text-xs text-foreground",
95
+ children: rows.map((_, index) => /* @__PURE__ */ jsxs("option", { value: index, children: [
96
+ index + 1,
97
+ " of ",
98
+ rows.length
99
+ ] }, index))
100
+ }
101
+ ),
102
+ /* @__PURE__ */ jsx("span", { children: "Fields absent from the first row are only visible in the one that carries them." })
103
+ ] }),
104
+ /* @__PURE__ */ jsxs("div", { className: "grid min-h-0 flex-1 gap-3 md:grid-cols-2", children: [
105
+ /* @__PURE__ */ jsx("div", { className: "flex min-h-0 flex-col overflow-hidden rounded-md border border-border", children: /* @__PURE__ */ jsx(
106
+ Tree,
107
+ {
108
+ className: "min-h-0 flex-1",
109
+ ariaLabel: "JSON paths",
110
+ roots: tree.roots,
111
+ getKey: (node) => node.key,
112
+ getChildren: tree.getChildren,
113
+ hasMoreChildren: tree.hasMoreChildren,
114
+ loadChildren: tree.loadChildren,
115
+ getSearchText: (node) => `${node.path} ${node.summary}`,
116
+ defaultOpen: (_node, depth) => depth < 2,
117
+ selected,
118
+ revealSelected: true,
119
+ onSelect: (node) => {
120
+ if (node.kind === "more") return;
121
+ setSelected(node);
122
+ setDraft(node.path);
123
+ },
124
+ renderRow: ({ node }) => /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-density-2 font-mono text-xs", children: [
125
+ /* @__PURE__ */ jsx("span", { className: cn("shrink-0", node.kind === "more" ? "text-muted-foreground" : "text-primary"), children: node.kind === "more" ? "…" : node.path }),
126
+ /* @__PURE__ */ jsx("span", { className: "truncate text-muted-foreground", title: node.summary, children: node.summary })
127
+ ] })
128
+ }
129
+ ) }),
130
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-col gap-2", children: [
131
+ /* @__PURE__ */ jsx(
132
+ InputField,
133
+ {
134
+ "aria-label": "JSONPath expression",
135
+ value: draft,
136
+ onChange: setDraft,
137
+ inputClassName: "font-mono text-xs",
138
+ placeholder: "$.messages[0].payload"
139
+ }
140
+ ),
141
+ root !== void 0 && /* @__PURE__ */ jsxs(
142
+ "p",
143
+ {
144
+ className: cn(
145
+ "flex shrink-0 items-start gap-1.5 rounded-md border px-2 py-1.5 text-xs text-foreground",
146
+ rootPending ? "border-amber-600/40 bg-amber-500/10" : "border-border bg-muted/40"
147
+ ),
148
+ children: [
149
+ /* @__PURE__ */ jsx(
150
+ Icon,
151
+ {
152
+ icon: rootPending ? UiWarningTriangle : UiInfo,
153
+ className: cn("mt-0.5 shrink-0", rootPending ? "text-amber-600" : "text-muted-foreground")
154
+ }
155
+ ),
156
+ /* @__PURE__ */ jsxs("span", { children: [
157
+ "This path is rooted inside ",
158
+ /* @__PURE__ */ jsx("code", { className: "font-mono", children: root }),
159
+ ", a column holding JSON as text.",
160
+ " ",
161
+ root === source ? /* @__PURE__ */ jsxs(Fragment, { children: [
162
+ "That is already the column's ",
163
+ /* @__PURE__ */ jsx("code", { className: "font-mono", children: "Source" }),
164
+ "."
165
+ ] }) : assignsRoot ? /* @__PURE__ */ jsxs(Fragment, { children: [
166
+ "Applying it sets the column's ",
167
+ /* @__PURE__ */ jsx("code", { className: "font-mono", children: "Source" }),
168
+ " to",
169
+ " ",
170
+ /* @__PURE__ */ jsx("code", { className: "font-mono", children: root }),
171
+ "."
172
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
173
+ "The column's ",
174
+ /* @__PURE__ */ jsx("code", { className: "font-mono", children: "Source" }),
175
+ " must be set to",
176
+ " ",
177
+ /* @__PURE__ */ jsx("code", { className: "font-mono", children: root }),
178
+ " for it to resolve."
179
+ ] })
180
+ ] })
181
+ ]
182
+ }
183
+ ),
184
+ /* @__PURE__ */ jsx(ResultPane, { evaluating, result, selected, evaluated: Boolean(evaluate) })
185
+ ] })
186
+ ] })
187
+ ] })
188
+ }
189
+ );
190
+ }
191
+ function decodeSource(row, source) {
192
+ if (!source) return row;
193
+ if (row === null || typeof row !== "object") return void 0;
194
+ const value = row[source];
195
+ if (typeof value !== "string") return value;
196
+ try {
197
+ return JSON.parse(value);
198
+ } catch {
199
+ return value;
200
+ }
201
+ }
202
+ function ResultPane({
203
+ evaluating,
204
+ result,
205
+ selected,
206
+ evaluated
207
+ }) {
208
+ if (!evaluated) {
209
+ return /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-auto rounded-md border border-border bg-muted/20 p-2 text-xs", children: selected ? /* @__PURE__ */ jsx(JsonView, { data: selected.value, defaultOpenDepth: 1 }) : /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "Select a node to see its value." }) });
210
+ }
211
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
212
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs", children: [
213
+ (result == null ? void 0 : result.error) ? /* @__PURE__ */ jsx("span", { className: "font-mono text-destructive", children: result.error }) : /* @__PURE__ */ jsx("span", { className: cn(result && result.count === 0 && "text-muted-foreground"), children: evaluating && result === null ? "Evaluating…" : `${(result == null ? void 0 : result.count) ?? 0} match${(result == null ? void 0 : result.count) === 1 ? "" : "es"}` }),
214
+ result && !result.error && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: result.filterField ? /* @__PURE__ */ jsxs(Fragment, { children: [
215
+ "Filterable as ",
216
+ /* @__PURE__ */ jsx("code", { className: "font-mono text-foreground", children: result.filterField })
217
+ ] }) : "Selects a set — not filterable unless the column declares filter.field" })
218
+ ] }),
219
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-auto rounded-md border border-border bg-muted/20 p-2 text-xs", children: result && !result.error && result.count > 0 ? /* @__PURE__ */ jsx(JsonView, { data: result.count === 1 ? result.matches[0] : result.matches, defaultOpenDepth: 1 }) : /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: (result == null ? void 0 : result.error) ? "Fix the expression to see what it selects." : "This path selects nothing in this row." }) })
220
+ ] });
221
+ }
222
+ export {
223
+ JSONPathPlayground
224
+ };
225
+ //# sourceMappingURL=JSONPathPlayground.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSONPathPlayground.js","sources":["../../src/components/JSONPathPlayground.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { JsonView } from \"../data/JsonView\";\nimport { Tree } from \"../data/Tree\";\nimport { UiInfo, UiWarningTriangle } from \"../icons\";\nimport { Modal } from \"../overlay/Modal\";\nimport { Button } from \"./button\";\nimport { InputField } from \"./InputField\";\nimport { createLazyJSONPathTree, type JSONPathNode } from \"./jsonPathTree\";\n\n/** What evaluating an expression against one row reports back. */\nexport interface JSONPathEvalResult {\n matches: unknown[];\n count: number;\n /** Why the expression could not be evaluated — a parse error is an answer, not a failure. */\n error?: string;\n /** Backend field the expression addresses, when it addresses one rather than selecting a set. */\n filterField?: string;\n}\n\nexport interface JSONPathEvalRequest {\n jsonpath: string;\n /** Column the path is rooted at, when it addresses a decoded JSON-encoded column. */\n source?: string;\n row: unknown;\n}\n\nexport interface JSONPathPlaygroundProps {\n open: boolean;\n onClose: () => void;\n /** Sampled rows to browse. A row switcher appears once there is more than one. */\n rows: unknown[];\n /** The expression the field currently holds. */\n value: string;\n /** Commits the drafted expression, along with the column it must be rooted at. */\n onCommit: (path: string, context: { root?: string }) => void;\n /**\n * True when `onCommit` writes the root itself. It only changes what the\n * dialog says about a path that descends into an encoded column: that the\n * root will be recorded, rather than instructing the author to go and record\n * it. Consumers that drop the root leave this unset and keep the warning.\n */\n assignsRoot?: boolean;\n /**\n * The column the field's path is *already* rooted at — its saved `source`.\n *\n * Without it the dialog browses and evaluates from the row while the value it\n * was opened with is written against a decoded column, so a column that works\n * perfectly well reports no matches and an author is invited to fix it.\n */\n source?: string;\n /**\n * Evaluates the draft against the selected row. Without it the dialog is a\n * browser only — it shows the selected node's own value instead of a match\n * set, which is all an offline demo can honestly claim.\n */\n evaluate?: (request: JSONPathEvalRequest) => Promise<JSONPathEvalResult>;\n title?: string;\n}\n\nconst EVALUATE_DEBOUNCE_MS = 250;\n\n/**\n * The full-size counterpart to the inline JSONPath dropdown.\n *\n * The dropdown is a preview and caps its walk to stay instant; this browses the\n * row with no depth limit, every array element, and every property — and pairs\n * the tree with what the expression actually selects, evaluated by the backend\n * that will run it, so an author stops finding out at query time.\n */\nexport function JSONPathPlayground({\n open,\n onClose,\n rows,\n value,\n onCommit,\n assignsRoot,\n source,\n evaluate,\n title = \"JSONPath playground\",\n}: JSONPathPlaygroundProps) {\n const [draft, setDraft] = useState(value);\n const [rowIndex, setRowIndex] = useState(0);\n const [selected, setSelected] = useState<JSONPathNode | null>(null);\n const [result, setResult] = useState<JSONPathEvalResult | null>(null);\n const [evaluating, setEvaluating] = useState(false);\n\n // Reopening starts from whatever the field holds now, not from the last\n // session's draft — the operator may have typed over it in between.\n useEffect(() => {\n if (open) {\n setDraft(value);\n setRowIndex((current) => (current < rows.length ? current : 0));\n }\n }, [open, value, rows.length]);\n\n const row = rows[rowIndex];\n // A column with a `source` has its paths written against that column decoded,\n // not against the row, so that is what the tree has to browse — otherwise the\n // paths it offers and the path the field holds are in two different languages.\n const browsed = useMemo(() => decodeSource(row, source), [row, source]);\n const tree = useMemo(\n () => createLazyJSONPathTree(browsed, { keyPrefix: `row${rowIndex}:${source ?? \"\"}:` }),\n [browsed, rowIndex, source],\n );\n\n // Reveal the branch the current expression addresses, so the dialog opens\n // showing the value rather than a collapsed root.\n useEffect(() => {\n if (!open) return;\n setSelected(tree.materializePath(draft) ?? null);\n // Only on (re)open and row change: re-running this per keystroke would yank\n // the tree around while the operator is typing.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, tree]);\n\n // The root belongs to the selection, and hand-editing the expression keeps it:\n // an operator who descended into an encoded column and is now tuning the path\n // inside it still means that column. It is never silent — the banner below\n // names it — and selecting any node outside that subtree clears it. A column\n // that already declares a source starts there rather than at nothing.\n const root = selected?.root ?? source;\n // Only a root nobody has recorded yet is a warning: one the column already\n // declares, or one this dialog is about to write, is just context.\n const rootPending = root !== undefined && root !== source && !assignsRoot;\n\n const latestRequest = useRef(0);\n useEffect(() => {\n if (!open || !evaluate) return;\n const request = (latestRequest.current += 1);\n setEvaluating(true);\n const timer = setTimeout(() => {\n const payload: JSONPathEvalRequest = { jsonpath: draft, row };\n if (root !== undefined) payload.source = root;\n void evaluate(payload)\n .then((next) => {\n if (latestRequest.current === request) setResult(next);\n })\n .catch((error: unknown) => {\n if (latestRequest.current === request) {\n setResult({ matches: [], count: 0, error: String(error) });\n }\n })\n .finally(() => {\n if (latestRequest.current === request) setEvaluating(false);\n });\n }, EVALUATE_DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [open, evaluate, draft, row, root]);\n\n const commit = () => {\n onCommit(draft, root === undefined ? {} : { root });\n onClose();\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={title}\n size=\"2xl\"\n scrollBody={false}\n className=\"h-[80vh]\"\n footer={(\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"outline\" onClick={onClose}>Cancel</Button>\n <Button onClick={commit} disabled={draft.trim() === \"\"}>Use path</Button>\n </div>\n )}\n >\n <div className=\"flex h-full min-h-0 flex-col gap-3\">\n {rows.length > 1 && (\n <label className=\"flex shrink-0 items-center gap-2 text-xs text-muted-foreground\">\n Sample row\n <select\n aria-label=\"Sample row\"\n value={rowIndex}\n onChange={(event) => setRowIndex(Number(event.target.value))}\n className=\"h-7 rounded-md border border-input bg-background px-2 text-xs text-foreground\"\n >\n {rows.map((_, index) => (\n <option key={index} value={index}>{index + 1} of {rows.length}</option>\n ))}\n </select>\n <span>Fields absent from the first row are only visible in the one that carries them.</span>\n </label>\n )}\n\n <div className=\"grid min-h-0 flex-1 gap-3 md:grid-cols-2\">\n <div className=\"flex min-h-0 flex-col overflow-hidden rounded-md border border-border\">\n <Tree<JSONPathNode>\n className=\"min-h-0 flex-1\"\n ariaLabel=\"JSON paths\"\n roots={tree.roots}\n getKey={(node) => node.key}\n getChildren={tree.getChildren}\n hasMoreChildren={tree.hasMoreChildren}\n loadChildren={tree.loadChildren}\n getSearchText={(node) => `${node.path} ${node.summary}`}\n defaultOpen={(_node, depth) => depth < 2}\n selected={selected}\n revealSelected\n onSelect={(node) => {\n if (node.kind === \"more\") return;\n setSelected(node);\n setDraft(node.path);\n }}\n renderRow={({ node }) => (\n <span className=\"flex min-w-0 flex-1 items-center gap-density-2 font-mono text-xs\">\n <span className={cn(\"shrink-0\", node.kind === \"more\" ? \"text-muted-foreground\" : \"text-primary\")}>\n {node.kind === \"more\" ? \"…\" : node.path}\n </span>\n <span className=\"truncate text-muted-foreground\" title={node.summary}>{node.summary}</span>\n </span>\n )}\n />\n </div>\n\n <div className=\"flex min-h-0 flex-col gap-2\">\n <InputField\n aria-label=\"JSONPath expression\"\n value={draft}\n onChange={setDraft}\n inputClassName=\"font-mono text-xs\"\n placeholder=\"$.messages[0].payload\"\n />\n\n {root !== undefined && (\n <p\n className={cn(\n \"flex shrink-0 items-start gap-1.5 rounded-md border px-2 py-1.5 text-xs text-foreground\",\n rootPending\n ? \"border-amber-600/40 bg-amber-500/10\"\n : \"border-border bg-muted/40\",\n )}\n >\n <Icon\n icon={rootPending ? UiWarningTriangle : UiInfo}\n className={cn(\"mt-0.5 shrink-0\", rootPending ? \"text-amber-600\" : \"text-muted-foreground\")}\n />\n <span>\n This path is rooted inside <code className=\"font-mono\">{root}</code>, a column holding JSON\n as text.{\" \"}\n {root === source ? (\n <>\n That is already the column's <code className=\"font-mono\">Source</code>.\n </>\n ) : assignsRoot ? (\n <>\n Applying it sets the column's <code className=\"font-mono\">Source</code> to{\" \"}\n <code className=\"font-mono\">{root}</code>.\n </>\n ) : (\n <>\n The column's <code className=\"font-mono\">Source</code> must be set to{\" \"}\n <code className=\"font-mono\">{root}</code> for it to resolve.\n </>\n )}\n </span>\n </p>\n )}\n\n <ResultPane evaluating={evaluating} result={result} selected={selected} evaluated={Boolean(evaluate)} />\n </div>\n </div>\n </div>\n </Modal>\n );\n}\n\n/**\n * The value a `source` column's paths are written against: the column itself,\n * decoded when it carries JSON as text — which mirrors what the backend does\n * before it applies the path.\n */\nfunction decodeSource(row: unknown, source: string | undefined): unknown {\n if (!source) return row;\n if (row === null || typeof row !== \"object\") return undefined;\n const value = (row as Record<string, unknown>)[source];\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction ResultPane({\n evaluating,\n result,\n selected,\n evaluated,\n}: {\n evaluating: boolean;\n result: JSONPathEvalResult | null;\n selected: JSONPathNode | null;\n evaluated: boolean;\n}) {\n if (!evaluated) {\n return (\n <div className=\"min-h-0 flex-1 overflow-auto rounded-md border border-border bg-muted/20 p-2 text-xs\">\n {selected ? (\n <JsonView data={selected.value} defaultOpenDepth={1} />\n ) : (\n <p className=\"text-muted-foreground\">Select a node to see its value.</p>\n )}\n </div>\n );\n }\n\n return (\n <>\n <div className=\"flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs\">\n {result?.error ? (\n <span className=\"font-mono text-destructive\">{result.error}</span>\n ) : (\n <span className={cn(result && result.count === 0 && \"text-muted-foreground\")}>\n {evaluating && result === null\n ? \"Evaluating…\"\n : `${result?.count ?? 0} match${result?.count === 1 ? \"\" : \"es\"}`}\n </span>\n )}\n {result && !result.error && (\n <span className=\"text-muted-foreground\">\n {result.filterField\n ? <>Filterable as <code className=\"font-mono text-foreground\">{result.filterField}</code></>\n : \"Selects a set — not filterable unless the column declares filter.field\"}\n </span>\n )}\n </div>\n <div className=\"min-h-0 flex-1 overflow-auto rounded-md border border-border bg-muted/20 p-2 text-xs\">\n {result && !result.error && result.count > 0 ? (\n <JsonView data={result.count === 1 ? result.matches[0] : result.matches} defaultOpenDepth={1} />\n ) : (\n <p className=\"text-muted-foreground\">\n {result?.error ? \"Fix the expression to see what it selects.\" : \"This path selects nothing in this row.\"}\n </p>\n )}\n </div>\n </>\n );\n}\n"],"names":[],"mappings":"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"}