@flanksource/clicky-ui 0.3.17 → 0.3.19
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.
- package/dist/ai.cjs +12 -6
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +10 -4
- package/dist/ai.js.map +1 -1
- package/dist/chat.cjs +36 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +37 -1
- package/dist/chat.js.map +1 -1
- package/dist/components/Combobox.cjs +122 -153
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +124 -155
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxControl.cjs +145 -0
- package/dist/components/ComboboxControl.cjs.map +1 -0
- package/dist/components/ComboboxControl.d.ts +37 -0
- package/dist/components/ComboboxControl.d.ts.map +1 -0
- package/dist/components/ComboboxControl.js +145 -0
- package/dist/components/ComboboxControl.js.map +1 -0
- package/dist/components/ComboboxMenu.cjs +35 -14
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +35 -14
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/ComboboxTags.cjs +40 -0
- package/dist/components/ComboboxTags.cjs.map +1 -0
- package/dist/components/ComboboxTags.d.ts +8 -0
- package/dist/components/ComboboxTags.d.ts.map +1 -0
- package/dist/components/ComboboxTags.js +40 -0
- package/dist/components/ComboboxTags.js.map +1 -0
- package/dist/components/EndpointSelector.model.cjs +96 -0
- package/dist/components/EndpointSelector.model.cjs.map +1 -0
- package/dist/components/EndpointSelector.model.d.ts +2 -0
- package/dist/components/EndpointSelector.model.d.ts.map +1 -1
- package/dist/components/EndpointSelector.model.js +96 -0
- package/dist/components/EndpointSelector.model.js.map +1 -0
- package/dist/components/ErrorWrapper.cjs +168 -0
- package/dist/components/ErrorWrapper.cjs.map +1 -0
- package/dist/components/ErrorWrapper.d.ts +19 -0
- package/dist/components/ErrorWrapper.d.ts.map +1 -0
- package/dist/components/ErrorWrapper.js +168 -0
- package/dist/components/ErrorWrapper.js.map +1 -0
- package/dist/components/FilterBar.cjs +116 -4
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +37 -2
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +116 -4
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/JSONPathField.cjs +112 -0
- package/dist/components/JSONPathField.cjs.map +1 -0
- package/dist/components/JSONPathField.d.ts +36 -0
- package/dist/components/JSONPathField.d.ts.map +1 -0
- package/dist/components/JSONPathField.js +112 -0
- package/dist/components/JSONPathField.js.map +1 -0
- package/dist/components/JSONPathPlayground.cjs +225 -0
- package/dist/components/JSONPathPlayground.cjs.map +1 -0
- package/dist/components/JSONPathPlayground.d.ts +59 -0
- package/dist/components/JSONPathPlayground.d.ts.map +1 -0
- package/dist/components/JSONPathPlayground.js +225 -0
- package/dist/components/JSONPathPlayground.js.map +1 -0
- package/dist/components/JsonSchemaForm.cjs +8 -4
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +8 -4
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/OnePasswordSelector.cjs +178 -0
- package/dist/components/OnePasswordSelector.cjs.map +1 -0
- package/dist/components/OnePasswordSelector.d.ts +8 -0
- package/dist/components/OnePasswordSelector.d.ts.map +1 -0
- package/dist/components/OnePasswordSelector.js +178 -0
- package/dist/components/OnePasswordSelector.js.map +1 -0
- package/dist/components/OnePasswordSelector.model.cjs +31 -0
- package/dist/components/OnePasswordSelector.model.cjs.map +1 -0
- package/dist/components/OnePasswordSelector.model.d.ts +27 -0
- package/dist/components/OnePasswordSelector.model.d.ts.map +1 -0
- package/dist/components/OnePasswordSelector.model.js +31 -0
- package/dist/components/OnePasswordSelector.model.js.map +1 -0
- package/dist/components/SecretFormField.cjs +142 -0
- package/dist/components/SecretFormField.cjs.map +1 -0
- package/dist/components/SecretFormField.d.ts +9 -0
- package/dist/components/SecretFormField.d.ts.map +1 -0
- package/dist/components/SecretFormField.js +142 -0
- package/dist/components/SecretFormField.js.map +1 -0
- package/dist/components/SecretKeySelector.cjs +20 -14
- package/dist/components/SecretKeySelector.cjs.map +1 -1
- package/dist/components/SecretKeySelector.d.ts +4 -1
- package/dist/components/SecretKeySelector.d.ts.map +1 -1
- package/dist/components/SecretKeySelector.js +20 -14
- package/dist/components/SecretKeySelector.js.map +1 -1
- package/dist/components/TreePickerField.cjs +71 -27
- package/dist/components/TreePickerField.cjs.map +1 -1
- package/dist/components/TreePickerField.d.ts +31 -2
- package/dist/components/TreePickerField.d.ts.map +1 -1
- package/dist/components/TreePickerField.js +72 -28
- package/dist/components/TreePickerField.js.map +1 -1
- package/dist/components/TriStateToggle.cjs +53 -0
- package/dist/components/TriStateToggle.cjs.map +1 -0
- package/dist/components/TriStateToggle.d.ts +27 -0
- package/dist/components/TriStateToggle.d.ts.map +1 -0
- package/dist/components/TriStateToggle.js +53 -0
- package/dist/components/TriStateToggle.js.map +1 -0
- package/dist/components/combobox-types.d.ts +25 -1
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/combobox-utils.cjs +26 -0
- package/dist/components/combobox-utils.cjs.map +1 -1
- package/dist/components/combobox-utils.d.ts +10 -0
- package/dist/components/combobox-utils.d.ts.map +1 -1
- package/dist/components/combobox-utils.js +26 -0
- package/dist/components/combobox-utils.js.map +1 -1
- package/dist/components/filter-bar-utils.cjs +12 -0
- package/dist/components/filter-bar-utils.cjs.map +1 -1
- package/dist/components/filter-bar-utils.d.ts.map +1 -1
- package/dist/components/filter-bar-utils.js +12 -0
- package/dist/components/filter-bar-utils.js.map +1 -1
- package/dist/components/jotai-bindings-core.cjs.map +1 -1
- package/dist/components/jotai-bindings-core.d.ts +4 -1
- package/dist/components/jotai-bindings-core.d.ts.map +1 -1
- package/dist/components/jotai-bindings-core.js.map +1 -1
- package/dist/components/json-schema-form-accordion-array.cjs +290 -0
- package/dist/components/json-schema-form-accordion-array.cjs.map +1 -0
- package/dist/components/json-schema-form-accordion-array.d.ts +7 -0
- package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -0
- package/dist/components/json-schema-form-accordion-array.js +290 -0
- package/dist/components/json-schema-form-accordion-array.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +99 -110
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +98 -109
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-error-display.cjs +4 -2
- package/dist/components/json-schema-form-error-display.cjs.map +1 -1
- package/dist/components/json-schema-form-error-display.d.ts +4 -2
- package/dist/components/json-schema-form-error-display.d.ts.map +1 -1
- package/dist/components/json-schema-form-error-display.js +4 -2
- package/dist/components/json-schema-form-error-display.js.map +1 -1
- package/dist/components/json-schema-form-extensions.cjs +10 -0
- package/dist/components/json-schema-form-extensions.cjs.map +1 -0
- package/dist/components/json-schema-form-extensions.d.ts +8 -0
- package/dist/components/json-schema-form-extensions.d.ts.map +1 -0
- package/dist/components/json-schema-form-extensions.js +10 -0
- package/dist/components/json-schema-form-extensions.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +25 -101
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +1 -32
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +28 -104
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +131 -0
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -0
- package/dist/components/json-schema-form-item-summary.d.ts +13 -0
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -0
- package/dist/components/json-schema-form-item-summary.js +131 -0
- package/dist/components/json-schema-form-item-summary.js.map +1 -0
- package/dist/components/json-schema-form-layout.cjs +156 -0
- package/dist/components/json-schema-form-layout.cjs.map +1 -0
- package/dist/components/json-schema-form-layout.d.ts +43 -0
- package/dist/components/json-schema-form-layout.d.ts.map +1 -0
- package/dist/components/json-schema-form-layout.js +156 -0
- package/dist/components/json-schema-form-layout.js.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.cjs +149 -0
- package/dist/components/json-schema-form-lookup-tree.cjs.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.d.ts +22 -0
- package/dist/components/json-schema-form-lookup-tree.d.ts.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.js +149 -0
- package/dist/components/json-schema-form-lookup-tree.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +11 -4
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +11 -4
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +53 -29
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +53 -29
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +62 -13
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts +1 -0
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +62 -13
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-table-array.cjs +123 -0
- package/dist/components/json-schema-form-table-array.cjs.map +1 -0
- package/dist/components/json-schema-form-table-array.d.ts +7 -0
- package/dist/components/json-schema-form-table-array.d.ts.map +1 -0
- package/dist/components/json-schema-form-table-array.js +123 -0
- package/dist/components/json-schema-form-table-array.js.map +1 -0
- package/dist/components/json-schema-form-tone.cjs +34 -0
- package/dist/components/json-schema-form-tone.cjs.map +1 -0
- package/dist/components/json-schema-form-tone.d.ts +8 -0
- package/dist/components/json-schema-form-tone.d.ts.map +1 -0
- package/dist/components/json-schema-form-tone.js +34 -0
- package/dist/components/json-schema-form-tone.js.map +1 -0
- package/dist/components/json-schema-form-types.d.ts +88 -10
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +47 -4
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +19 -4
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +47 -4
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components/jsonPathTree.cjs +189 -0
- package/dist/components/jsonPathTree.cjs.map +1 -0
- package/dist/components/jsonPathTree.d.ts +92 -0
- package/dist/components/jsonPathTree.d.ts.map +1 -0
- package/dist/components/jsonPathTree.js +189 -0
- package/dist/components/jsonPathTree.js.map +1 -0
- package/dist/components/secret-form-extension.cjs +30 -0
- package/dist/components/secret-form-extension.cjs.map +1 -0
- package/dist/components/secret-form-extension.d.ts +23 -0
- package/dist/components/secret-form-extension.d.ts.map +1 -0
- package/dist/components/secret-form-extension.js +30 -0
- package/dist/components/secret-form-extension.js.map +1 -0
- package/dist/components/tri-state.cjs +8 -0
- package/dist/components/tri-state.cjs.map +1 -0
- package/dist/components/tri-state.d.ts +5 -0
- package/dist/components/tri-state.d.ts.map +1 -0
- package/dist/components/tri-state.js +8 -0
- package/dist/components/tri-state.js.map +1 -0
- package/dist/components/useComboboxLayout.cjs +59 -0
- package/dist/components/useComboboxLayout.cjs.map +1 -0
- package/dist/components/useComboboxLayout.d.ts +5 -0
- package/dist/components/useComboboxLayout.d.ts.map +1 -0
- package/dist/components/useComboboxLayout.js +59 -0
- package/dist/components/useComboboxLayout.js.map +1 -0
- package/dist/components.cjs +37 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +20 -4
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +38 -1
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +51 -2
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +10 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +51 -2
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +185 -53
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +63 -3
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +185 -53
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/LogsTable.cjs +10 -1
- package/dist/data/LogsTable.cjs.map +1 -1
- package/dist/data/LogsTable.d.ts +3 -1
- package/dist/data/LogsTable.d.ts.map +1 -1
- package/dist/data/LogsTable.js +10 -1
- package/dist/data/LogsTable.js.map +1 -1
- package/dist/data/TaskExecDetails.cjs +40 -0
- package/dist/data/TaskExecDetails.cjs.map +1 -0
- package/dist/data/TaskExecDetails.d.ts +5 -0
- package/dist/data/TaskExecDetails.d.ts.map +1 -0
- package/dist/data/TaskExecDetails.js +40 -0
- package/dist/data/TaskExecDetails.js.map +1 -0
- package/dist/data/TaskManager.cjs +99 -14
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +100 -15
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskProgress.cjs +59 -14
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +2 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +59 -14
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +12 -1
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/TreeNode.cjs +3 -0
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +3 -0
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.cjs +289 -0
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -0
- package/dist/data/ai/AdvancedChatConfig.d.ts +21 -0
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -0
- package/dist/data/ai/AdvancedChatConfig.js +289 -0
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.cjs +120 -0
- package/dist/data/ai/AdvancedCostsPanel.cjs.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.d.ts +16 -0
- package/dist/data/ai/AdvancedCostsPanel.d.ts.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.js +120 -0
- package/dist/data/ai/AdvancedCostsPanel.js.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.cjs +74 -0
- package/dist/data/ai/ChatWindow.catalogs.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.d.ts +16 -0
- package/dist/data/ai/ChatWindow.catalogs.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.js +74 -0
- package/dist/data/ai/ChatWindow.catalogs.js.map +1 -0
- package/dist/data/ai/ChatWindow.cjs +78 -100
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +80 -102
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.d.ts +2 -4
- package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +120 -0
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts +20 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.runtime.js +120 -0
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread.cjs +1 -1
- package/dist/data/ai/ChatWindow.thread.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.thread.js +1 -1
- package/dist/data/ai/ChatWindow.thread.js.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.cjs +20 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts +17 -1
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.js +20 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
- package/dist/data/ai/ChatWindow.types.d.ts +13 -5
- package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.cjs +3 -1
- package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
- package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.js +3 -1
- package/dist/data/ai/ChatWindowManager.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +2 -2
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +2 -2
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/RuntimeModePicker.cjs +1 -1
- package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
- package/dist/data/ai/RuntimeModePicker.d.ts +1 -1
- package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
- package/dist/data/ai/RuntimeModePicker.js +1 -1
- package/dist/data/ai/RuntimeModePicker.js.map +1 -1
- package/dist/data/ai/SessionInspector.files.cjs +26 -43
- package/dist/data/ai/SessionInspector.files.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.files.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.files.js +26 -43
- package/dist/data/ai/SessionInspector.files.js.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
- package/dist/data/ai/SessionInspector.model.cjs +1 -1
- package/dist/data/ai/SessionInspector.model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.model.js +1 -1
- package/dist/data/ai/SessionInspector.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +4 -16
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +4 -16
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +12 -3
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +12 -3
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/fields.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +2 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/ThreadPicker.cjs +65 -3
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.d.ts +11 -5
- package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
- package/dist/data/ai/ThreadPicker.js +65 -3
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +65 -685
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +15 -17
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +64 -683
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/ToolPreferences.model.cjs +148 -0
- package/dist/data/ai/ToolPreferences.model.cjs.map +1 -0
- package/dist/data/ai/ToolPreferences.model.d.ts +31 -0
- package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -0
- package/dist/data/ai/ToolPreferences.model.js +148 -0
- package/dist/data/ai/ToolPreferences.model.js.map +1 -0
- package/dist/data/ai/ToolPreferencesList.cjs +270 -0
- package/dist/data/ai/ToolPreferencesList.cjs.map +1 -0
- package/dist/data/ai/ToolPreferencesList.d.ts +18 -0
- package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -0
- package/dist/data/ai/ToolPreferencesList.js +270 -0
- package/dist/data/ai/ToolPreferencesList.js.map +1 -0
- package/dist/data/ai/agent-action-icons.cjs.map +1 -1
- package/dist/data/ai/agent-action-icons.js.map +1 -1
- package/dist/data/ai/chat-window-context.cjs +4 -1
- package/dist/data/ai/chat-window-context.cjs.map +1 -1
- package/dist/data/ai/chat-window-context.d.ts +7 -0
- package/dist/data/ai/chat-window-context.d.ts.map +1 -1
- package/dist/data/ai/chat-window-context.js +4 -1
- package/dist/data/ai/chat-window-context.js.map +1 -1
- package/dist/data/ai/index.d.ts +6 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/session-tones.cjs +67 -0
- package/dist/data/ai/session-tones.cjs.map +1 -0
- package/dist/data/ai/session-tones.d.ts +34 -0
- package/dist/data/ai/session-tones.d.ts.map +1 -0
- package/dist/data/ai/session-tones.js +67 -0
- package/dist/data/ai/session-tones.js.map +1 -0
- package/dist/data/ai/thread-costs.cjs +39 -0
- package/dist/data/ai/thread-costs.cjs.map +1 -0
- package/dist/data/ai/thread-costs.d.ts +62 -0
- package/dist/data/ai/thread-costs.d.ts.map +1 -0
- package/dist/data/ai/thread-costs.js +39 -0
- package/dist/data/ai/thread-costs.js.map +1 -0
- package/dist/data/cells/CellFilterActions.cjs +68 -0
- package/dist/data/cells/CellFilterActions.cjs.map +1 -0
- package/dist/data/cells/CellFilterActions.d.ts +15 -0
- package/dist/data/cells/CellFilterActions.d.ts.map +1 -0
- package/dist/data/cells/CellFilterActions.js +68 -0
- package/dist/data/cells/CellFilterActions.js.map +1 -0
- package/dist/data/chat/Chat.cjs +156 -113
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +24 -7
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.cjs +48 -3
- package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
- package/dist/data/chat/Chat.fixtures.d.ts +1 -1
- package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.js +48 -3
- package/dist/data/chat/Chat.fixtures.js.map +1 -1
- package/dist/data/chat/Chat.js +160 -117
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/Chat.runtime.cjs +63 -0
- package/dist/data/chat/Chat.runtime.cjs.map +1 -0
- package/dist/data/chat/Chat.runtime.d.ts +16 -0
- package/dist/data/chat/Chat.runtime.d.ts.map +1 -0
- package/dist/data/chat/Chat.runtime.js +63 -0
- package/dist/data/chat/Chat.runtime.js.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.cjs +62 -0
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.d.ts +14 -0
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.js +62 -0
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -0
- package/dist/data/chat/ToolCall.cjs +86 -24
- package/dist/data/chat/ToolCall.cjs.map +1 -1
- package/dist/data/chat/ToolCall.d.ts +12 -5
- package/dist/data/chat/ToolCall.d.ts.map +1 -1
- package/dist/data/chat/ToolCall.js +86 -24
- package/dist/data/chat/ToolCall.js.map +1 -1
- package/dist/data/chat/approval.cjs +49 -6
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +11 -4
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js +49 -6
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/index.d.ts +5 -3
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/tool-render/ToolArgs.cjs +50 -0
- package/dist/data/chat/tool-render/ToolArgs.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolArgs.d.ts +7 -0
- package/dist/data/chat/tool-render/ToolArgs.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolArgs.js +50 -0
- package/dist/data/chat/tool-render/ToolArgs.js.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.cjs +155 -0
- package/dist/data/chat/tool-render/ToolParams.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.d.ts +20 -0
- package/dist/data/chat/tool-render/ToolParams.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.js +155 -0
- package/dist/data/chat/tool-render/ToolParams.js.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.cjs +140 -0
- package/dist/data/chat/tool-render/ToolValue.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.d.ts +16 -0
- package/dist/data/chat/tool-render/ToolValue.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.js +140 -0
- package/dist/data/chat/tool-render/ToolValue.js.map +1 -0
- package/dist/data/chat/tool-render/adapter.cjs +48 -0
- package/dist/data/chat/tool-render/adapter.cjs.map +1 -0
- package/dist/data/chat/tool-render/adapter.d.ts +57 -0
- package/dist/data/chat/tool-render/adapter.d.ts.map +1 -0
- package/dist/data/chat/tool-render/adapter.js +48 -0
- package/dist/data/chat/tool-render/adapter.js.map +1 -0
- package/dist/data/chat/tool-render/context.cjs +16 -0
- package/dist/data/chat/tool-render/context.cjs.map +1 -0
- package/dist/data/chat/tool-render/context.d.ts +6 -0
- package/dist/data/chat/tool-render/context.d.ts.map +1 -0
- package/dist/data/chat/tool-render/context.js +16 -0
- package/dist/data/chat/tool-render/context.js.map +1 -0
- package/dist/data/chat/tool-render/defaults.cjs +45 -0
- package/dist/data/chat/tool-render/defaults.cjs.map +1 -0
- package/dist/data/chat/tool-render/defaults.d.ts +11 -0
- package/dist/data/chat/tool-render/defaults.d.ts.map +1 -0
- package/dist/data/chat/tool-render/defaults.js +45 -0
- package/dist/data/chat/tool-render/defaults.js.map +1 -0
- package/dist/data/chat/tool-render/index.d.ts +13 -0
- package/dist/data/chat/tool-render/index.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.cjs +208 -0
- package/dist/data/chat/tool-render/known-tool-views.cjs.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.d.ts +10 -0
- package/dist/data/chat/tool-render/known-tool-views.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.js +208 -0
- package/dist/data/chat/tool-render/known-tool-views.js.map +1 -0
- package/dist/data/chat/tool-render/known-tools.cjs +58 -0
- package/dist/data/chat/tool-render/known-tools.cjs.map +1 -0
- package/dist/data/chat/tool-render/known-tools.d.ts +4 -0
- package/dist/data/chat/tool-render/known-tools.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tools.js +58 -0
- package/dist/data/chat/tool-render/known-tools.js.map +1 -0
- package/dist/data/chat/tool-render/normalize.cjs +42 -0
- package/dist/data/chat/tool-render/normalize.cjs.map +1 -0
- package/dist/data/chat/tool-render/normalize.d.ts +13 -0
- package/dist/data/chat/tool-render/normalize.d.ts.map +1 -0
- package/dist/data/chat/tool-render/normalize.js +42 -0
- package/dist/data/chat/tool-render/normalize.js.map +1 -0
- package/dist/data/chat/tool-render/registry.cjs +14 -0
- package/dist/data/chat/tool-render/registry.cjs.map +1 -0
- package/dist/data/chat/tool-render/registry.d.ts +7 -0
- package/dist/data/chat/tool-render/registry.d.ts.map +1 -0
- package/dist/data/chat/tool-render/registry.js +14 -0
- package/dist/data/chat/tool-render/registry.js.map +1 -0
- package/dist/data/chat/tool-render/schema.cjs +57 -0
- package/dist/data/chat/tool-render/schema.cjs.map +1 -0
- package/dist/data/chat/tool-render/schema.d.ts +28 -0
- package/dist/data/chat/tool-render/schema.d.ts.map +1 -0
- package/dist/data/chat/tool-render/schema.js +57 -0
- package/dist/data/chat/tool-render/schema.js.map +1 -0
- package/dist/data/chat/tool-render/shape.cjs +94 -0
- package/dist/data/chat/tool-render/shape.cjs.map +1 -0
- package/dist/data/chat/tool-render/shape.d.ts +39 -0
- package/dist/data/chat/tool-render/shape.d.ts.map +1 -0
- package/dist/data/chat/tool-render/shape.js +94 -0
- package/dist/data/chat/tool-render/shape.js.map +1 -0
- package/dist/data/chat/tool-render/summary.cjs +34 -0
- package/dist/data/chat/tool-render/summary.cjs.map +1 -0
- package/dist/data/chat/tool-render/summary.d.ts +8 -0
- package/dist/data/chat/tool-render/summary.d.ts.map +1 -0
- package/dist/data/chat/tool-render/summary.js +34 -0
- package/dist/data/chat/tool-render/summary.js.map +1 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +7 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/chat/usage-snapshot.cjs +17 -0
- package/dist/data/chat/usage-snapshot.cjs.map +1 -0
- package/dist/data/chat/usage-snapshot.d.ts +21 -0
- package/dist/data/chat/usage-snapshot.d.ts.map +1 -0
- package/dist/data/chat/usage-snapshot.js +17 -0
- package/dist/data/chat/usage-snapshot.js.map +1 -0
- package/dist/data/data-table-filter-values.cjs +103 -0
- package/dist/data/data-table-filter-values.cjs.map +1 -0
- package/dist/data/data-table-filter-values.d.ts +34 -0
- package/dist/data/data-table-filter-values.d.ts.map +1 -0
- package/dist/data/data-table-filter-values.js +103 -0
- package/dist/data/data-table-filter-values.js.map +1 -0
- package/dist/data/data-table-server-filters.cjs +165 -0
- package/dist/data/data-table-server-filters.cjs.map +1 -0
- package/dist/data/data-table-server-filters.d.ts +128 -0
- package/dist/data/data-table-server-filters.d.ts.map +1 -0
- package/dist/data/data-table-server-filters.js +165 -0
- package/dist/data/data-table-server-filters.js.map +1 -0
- package/dist/data/query-browser/QueryBrowser.cjs +204 -155
- package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
- package/dist/data/query-browser/QueryBrowser.d.ts +2 -41
- package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
- package/dist/data/query-browser/QueryBrowser.editor.cjs +88 -0
- package/dist/data/query-browser/QueryBrowser.editor.cjs.map +1 -0
- package/dist/data/query-browser/QueryBrowser.editor.d.ts +12 -0
- package/dist/data/query-browser/QueryBrowser.editor.d.ts.map +1 -0
- package/dist/data/query-browser/QueryBrowser.editor.js +88 -0
- package/dist/data/query-browser/QueryBrowser.editor.js.map +1 -0
- package/dist/data/query-browser/QueryBrowser.js +205 -156
- package/dist/data/query-browser/QueryBrowser.js.map +1 -1
- package/dist/data/query-browser/QueryBrowser.types.cjs +11 -0
- package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -0
- package/dist/data/query-browser/QueryBrowser.types.d.ts +92 -0
- package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -0
- package/dist/data/query-browser/QueryBrowser.types.js +11 -0
- package/dist/data/query-browser/QueryBrowser.types.js.map +1 -0
- package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.cjs +56 -0
- package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.cjs.map +1 -0
- package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.d.ts +5 -0
- package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.d.ts.map +1 -0
- package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.js +56 -0
- package/dist/data/query-browser/QueryBrowserDiagnosticsPanel.js.map +1 -0
- package/dist/data/query-browser/QueryBrowserResults.cjs +80 -0
- package/dist/data/query-browser/QueryBrowserResults.cjs.map +1 -0
- package/dist/data/query-browser/QueryBrowserResults.d.ts +16 -0
- package/dist/data/query-browser/QueryBrowserResults.d.ts.map +1 -0
- package/dist/data/query-browser/QueryBrowserResults.js +80 -0
- package/dist/data/query-browser/QueryBrowserResults.js.map +1 -0
- package/dist/data/query-browser/index.d.ts +2 -1
- package/dist/data/query-browser/index.d.ts.map +1 -1
- package/dist/data/runtime/ProviderStatusPanel.cjs +187 -0
- package/dist/data/runtime/ProviderStatusPanel.cjs.map +1 -0
- package/dist/data/runtime/ProviderStatusPanel.d.ts +10 -0
- package/dist/data/runtime/ProviderStatusPanel.d.ts.map +1 -0
- package/dist/data/runtime/ProviderStatusPanel.js +187 -0
- package/dist/data/runtime/ProviderStatusPanel.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.cjs +147 -0
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBar.d.ts +8 -6
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.js +147 -0
- package/dist/data/runtime/RuntimeBar.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBar.model.d.ts +2 -2
- package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.model.js.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.cjs +25 -30
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.d.ts +4 -3
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.js +25 -30
- package/dist/data/runtime/RuntimeBarCombo.js.map +1 -0
- package/dist/data/{ai/RuntimeBar.cjs → runtime/RuntimeBarSegments.cjs} +54 -120
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarSegments.d.ts +25 -0
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -0
- package/dist/data/{ai/RuntimeBar.js → runtime/RuntimeBarSegments.js} +58 -124
- package/dist/data/runtime/RuntimeBarSegments.js.map +1 -0
- package/dist/data/runtime/availability.cjs +11 -0
- package/dist/data/runtime/availability.cjs.map +1 -0
- package/dist/data/runtime/availability.d.ts +6 -0
- package/dist/data/runtime/availability.d.ts.map +1 -0
- package/dist/data/runtime/availability.js +11 -0
- package/dist/data/runtime/availability.js.map +1 -0
- package/dist/data/runtime/model-capabilities.cjs.map +1 -0
- package/dist/data/runtime/model-capabilities.d.ts.map +1 -0
- package/dist/data/runtime/model-capabilities.js.map +1 -0
- package/dist/data/runtime/provider-status.cjs +106 -0
- package/dist/data/runtime/provider-status.cjs.map +1 -0
- package/dist/data/runtime/provider-status.d.ts +24 -0
- package/dist/data/runtime/provider-status.d.ts.map +1 -0
- package/dist/data/runtime/provider-status.js +106 -0
- package/dist/data/runtime/provider-status.js.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.cjs +119 -27
- package/dist/data/runtime/runtime-mode.cjs.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.d.ts +7 -1
- package/dist/data/runtime/runtime-mode.d.ts.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.js +120 -28
- package/dist/data/runtime/runtime-mode.js.map +1 -0
- package/dist/data/task-exec-details.cjs +9 -0
- package/dist/data/task-exec-details.cjs.map +1 -0
- package/dist/data/task-exec-details.d.ts +3 -0
- package/dist/data/task-exec-details.d.ts.map +1 -0
- package/dist/data/task-exec-details.js +9 -0
- package/dist/data/task-exec-details.js.map +1 -0
- package/dist/data/task-query-keys.cjs +26 -0
- package/dist/data/task-query-keys.cjs.map +1 -0
- package/dist/data/task-query-keys.d.ts +27 -0
- package/dist/data/task-query-keys.d.ts.map +1 -0
- package/dist/data/task-query-keys.js +26 -0
- package/dist/data/task-query-keys.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +18 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +6 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +18 -0
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-hotkey.cjs +6 -1
- package/dist/hooks/use-hotkey.cjs.map +1 -1
- package/dist/hooks/use-hotkey.d.ts.map +1 -1
- package/dist/hooks/use-hotkey.js +6 -1
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-task-run.cjs +7 -4
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts +12 -0
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +7 -4
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +692 -0
- package/dist/icons/registry.cjs.map +1 -0
- package/dist/icons/registry.d.ts +21 -0
- package/dist/icons/registry.d.ts.map +1 -0
- package/dist/icons/registry.js +692 -0
- package/dist/icons/registry.js.map +1 -0
- package/dist/icons.cjs +3 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +4 -1
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +65 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +67 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +92 -56
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +49 -1
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +92 -56
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +144 -19
- package/dist/layout/AppShell.nav.cjs.map +1 -1
- package/dist/layout/AppShell.nav.d.ts +6 -1
- package/dist/layout/AppShell.nav.d.ts.map +1 -1
- package/dist/layout/AppShell.nav.js +144 -19
- package/dist/layout/AppShell.nav.js.map +1 -1
- package/dist/layout/SplitPane.cjs +23 -7
- package/dist/layout/SplitPane.cjs.map +1 -1
- package/dist/layout/SplitPane.d.ts +3 -1
- package/dist/layout/SplitPane.d.ts.map +1 -1
- package/dist/layout/SplitPane.js +23 -7
- package/dist/layout/SplitPane.js.map +1 -1
- package/dist/lib/format.cjs +86 -4
- package/dist/lib/format.cjs.map +1 -1
- package/dist/lib/format.d.ts +69 -0
- package/dist/lib/format.d.ts.map +1 -1
- package/dist/lib/format.js +86 -4
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/path-tree.cjs +69 -0
- package/dist/lib/path-tree.cjs.map +1 -0
- package/dist/lib/path-tree.d.ts +54 -0
- package/dist/lib/path-tree.d.ts.map +1 -0
- package/dist/lib/path-tree.js +69 -0
- package/dist/lib/path-tree.js.map +1 -0
- package/dist/monaco.d.ts +1 -0
- package/dist/monaco.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +13 -7
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +13 -7
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/overlay/Tour.cjs +173 -0
- package/dist/overlay/Tour.cjs.map +1 -0
- package/dist/overlay/Tour.d.ts +61 -0
- package/dist/overlay/Tour.d.ts.map +1 -0
- package/dist/overlay/Tour.js +173 -0
- package/dist/overlay/Tour.js.map +1 -0
- package/dist/overlay/TourCard.cjs +108 -0
- package/dist/overlay/TourCard.cjs.map +1 -0
- package/dist/overlay/TourCard.d.ts +23 -0
- package/dist/overlay/TourCard.d.ts.map +1 -0
- package/dist/overlay/TourCard.js +108 -0
- package/dist/overlay/TourCard.js.map +1 -0
- package/dist/overlay/TourProvider.cjs +160 -0
- package/dist/overlay/TourProvider.cjs.map +1 -0
- package/dist/overlay/TourProvider.d.ts +31 -0
- package/dist/overlay/TourProvider.d.ts.map +1 -0
- package/dist/overlay/TourProvider.js +160 -0
- package/dist/overlay/TourProvider.js.map +1 -0
- package/dist/overlay/TourSpotlight.cjs +47 -0
- package/dist/overlay/TourSpotlight.cjs.map +1 -0
- package/dist/overlay/TourSpotlight.d.ts +12 -0
- package/dist/overlay/TourSpotlight.d.ts.map +1 -0
- package/dist/overlay/TourSpotlight.js +47 -0
- package/dist/overlay/TourSpotlight.js.map +1 -0
- package/dist/overlay/modalStack.cjs +18 -4
- package/dist/overlay/modalStack.cjs.map +1 -1
- package/dist/overlay/modalStack.d.ts +10 -2
- package/dist/overlay/modalStack.d.ts.map +1 -1
- package/dist/overlay/modalStack.js +19 -5
- package/dist/overlay/modalStack.js.map +1 -1
- package/dist/overlay/tour-anchor.cjs +114 -0
- package/dist/overlay/tour-anchor.cjs.map +1 -0
- package/dist/overlay/tour-anchor.d.ts +30 -0
- package/dist/overlay/tour-anchor.d.ts.map +1 -0
- package/dist/overlay/tour-anchor.js +114 -0
- package/dist/overlay/tour-anchor.js.map +1 -0
- package/dist/overlay/tour-context.cjs +12 -0
- package/dist/overlay/tour-context.cjs.map +1 -0
- package/dist/overlay/tour-context.d.ts +40 -0
- package/dist/overlay/tour-context.d.ts.map +1 -0
- package/dist/overlay/tour-context.js +12 -0
- package/dist/overlay/tour-context.js.map +1 -0
- package/dist/overlay/tour-geometry.cjs +65 -0
- package/dist/overlay/tour-geometry.cjs.map +1 -0
- package/dist/overlay/tour-geometry.d.ts +47 -0
- package/dist/overlay/tour-geometry.d.ts.map +1 -0
- package/dist/overlay/tour-geometry.js +65 -0
- package/dist/overlay/tour-geometry.js.map +1 -0
- package/dist/overlay/tour-model.cjs +79 -0
- package/dist/overlay/tour-model.cjs.map +1 -0
- package/dist/overlay/tour-model.d.ts +29 -0
- package/dist/overlay/tour-model.d.ts.map +1 -0
- package/dist/overlay/tour-model.js +79 -0
- package/dist/overlay/tour-model.js.map +1 -0
- package/dist/overlay/tour-progress.cjs +54 -0
- package/dist/overlay/tour-progress.cjs.map +1 -0
- package/dist/overlay/tour-progress.d.ts +40 -0
- package/dist/overlay/tour-progress.d.ts.map +1 -0
- package/dist/overlay/tour-progress.js +54 -0
- package/dist/overlay/tour-progress.js.map +1 -0
- package/dist/overlay/tour-types.d.ts +144 -0
- package/dist/overlay/tour-types.d.ts.map +1 -0
- package/dist/overlay/use-tour-anchor.cjs +43 -0
- package/dist/overlay/use-tour-anchor.cjs.map +1 -0
- package/dist/overlay/use-tour-anchor.d.ts +23 -0
- package/dist/overlay/use-tour-anchor.d.ts.map +1 -0
- package/dist/overlay/use-tour-anchor.js +43 -0
- package/dist/overlay/use-tour-anchor.js.map +1 -0
- package/dist/overlay/use-tour-rect.cjs +33 -0
- package/dist/overlay/use-tour-rect.cjs.map +1 -0
- package/dist/overlay/use-tour-rect.d.ts +12 -0
- package/dist/overlay/use-tour-rect.d.ts.map +1 -0
- package/dist/overlay/use-tour-rect.js +33 -0
- package/dist/overlay/use-tour-rect.js.map +1 -0
- package/dist/overlay/use-tour-step.cjs +66 -0
- package/dist/overlay/use-tour-step.cjs.map +1 -0
- package/dist/overlay/use-tour-step.d.ts +45 -0
- package/dist/overlay/use-tour-step.d.ts.map +1 -0
- package/dist/overlay/use-tour-step.js +66 -0
- package/dist/overlay/use-tour-step.js.map +1 -0
- package/dist/overlay/zIndex.cjs +8 -0
- package/dist/overlay/zIndex.cjs.map +1 -1
- package/dist/overlay/zIndex.d.ts +8 -0
- package/dist/overlay/zIndex.d.ts.map +1 -1
- package/dist/overlay/zIndex.js +8 -0
- package/dist/overlay/zIndex.js.map +1 -1
- package/dist/rpc/CommandOutput.cjs +8 -0
- package/dist/rpc/CommandOutput.cjs.map +1 -1
- package/dist/rpc/CommandOutput.d.ts +4 -1
- package/dist/rpc/CommandOutput.d.ts.map +1 -1
- package/dist/rpc/CommandOutput.js +8 -0
- package/dist/rpc/CommandOutput.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +10 -16
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +10 -16
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +20 -0
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.js +20 -0
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/OperationActionBar.cjs +1 -1
- package/dist/rpc/OperationActionBar.cjs.map +1 -1
- package/dist/rpc/OperationActionBar.js +1 -1
- package/dist/rpc/OperationActionBar.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +83 -7
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +84 -8
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +2 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -1
- package/dist/rpc/OperationResultView.d.ts +6 -0
- package/dist/rpc/OperationResultView.d.ts.map +1 -1
- package/dist/rpc/OperationResultView.js +2 -0
- package/dist/rpc/OperationResultView.js.map +1 -1
- package/dist/rpc/SchemaActionForm.cjs +2 -21
- package/dist/rpc/SchemaActionForm.cjs.map +1 -1
- package/dist/rpc/SchemaActionForm.d.ts.map +1 -1
- package/dist/rpc/SchemaActionForm.js +3 -22
- package/dist/rpc/SchemaActionForm.js.map +1 -1
- package/dist/rpc/apiClient.cjs +16 -2
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +16 -2
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +123 -49
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +14 -6
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +121 -47
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/operationFilterSearch.cjs +23 -0
- package/dist/rpc/operationFilterSearch.cjs.map +1 -0
- package/dist/rpc/operationFilterSearch.d.ts +22 -0
- package/dist/rpc/operationFilterSearch.d.ts.map +1 -0
- package/dist/rpc/operationFilterSearch.js +23 -0
- package/dist/rpc/operationFilterSearch.js.map +1 -0
- package/dist/rpc/operationLookupFetcher.cjs +28 -0
- package/dist/rpc/operationLookupFetcher.cjs.map +1 -0
- package/dist/rpc/operationLookupFetcher.d.ts +17 -0
- package/dist/rpc/operationLookupFetcher.d.ts.map +1 -0
- package/dist/rpc/operationLookupFetcher.js +28 -0
- package/dist/rpc/operationLookupFetcher.js.map +1 -0
- package/dist/rpc/surfaceNav.cjs +77 -0
- package/dist/rpc/surfaceNav.cjs.map +1 -0
- package/dist/rpc/surfaceNav.d.ts +19 -0
- package/dist/rpc/surfaceNav.d.ts.map +1 -0
- package/dist/rpc/surfaceNav.js +77 -0
- package/dist/rpc/surfaceNav.js.map +1 -0
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +21 -2
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils.cjs +8 -0
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.ts +2 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +10 -2
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
- package/dist/data/ai/RuntimeBar.cjs.map +0 -1
- package/dist/data/ai/RuntimeBar.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBar.js.map +0 -1
- package/dist/data/ai/RuntimeBar.model.cjs.map +0 -1
- package/dist/data/ai/RuntimeBar.model.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBar.model.js.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.cjs.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.js.map +0 -1
- package/dist/data/ai/model-capabilities.cjs.map +0 -1
- package/dist/data/ai/model-capabilities.d.ts.map +0 -1
- package/dist/data/ai/model-capabilities.js.map +0 -1
- package/dist/data/ai/runtime-mode.cjs.map +0 -1
- package/dist/data/ai/runtime-mode.d.ts.map +0 -1
- package/dist/data/ai/runtime-mode.js.map +0 -1
- /package/dist/data/{ai → runtime}/RuntimeBar.model.cjs +0 -0
- /package/dist/data/{ai → runtime}/RuntimeBar.model.js +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.cjs +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.d.ts +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaActionForm.cjs","sources":["../../src/rpc/SchemaActionForm.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { resolveLookupScope } from \"../components/form-lookup-context\";\nimport { Tabs } from \"../layout/Tabs\";\nimport type {\n JsonSchemaObject,\n LookupFetcher,\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport { lookupOptionsToFieldOptions } from \"./formMetadata\";\nimport {\n collectionPath,\n resolveActionPath,\n scalarValues,\n} from \"./schemaActionPath\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\nimport type { MonacoValidationState } from \"../monaco/types\";\n\nconst LazyMonacoSchemaEditor = lazy(() =>\n import(\"../monaco/MonacoSchemaEditor\").then((module) => ({\n default: module.MonacoSchemaEditor,\n })),\n);\nlet schemaActionEditorSequence = 0;\n\n// FormActionContext is handed to a footerActions renderer so a host app can add\n// form-level actions (e.g. a connection \"Test\" button) that operate on the live\n// form value.\nexport type FormActionContext = {\n value: Record<string, unknown>;\n action: ResolvedOperation;\n canSubmit: boolean;\n};\n\n// FormActionsRenderer renders extra action buttons in the form footer, left of\n// the Save button. Returns null/undefined to add none.\nexport type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;\n\nexport type SchemaActionFormSlots = {\n body: ReactNode;\n footer?: ReactNode;\n};\n\nexport type SchemaActionFormProps = {\n client: OperationsApiClient;\n // The create (POST) or update (PUT) operation this form submits to.\n action: ResolvedOperation;\n // Values used to resolve path parameters (e.g. { id } when editing a row).\n lockedValues?: Record<string, string>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n submitLabel?: string;\n onSuccess?: (response: ExecutionResponse) => void;\n // Custom JsonSchemaForm field extensions (e.g. a SecretKeySelector widget keyed\n // on an `x-clicky-component` hint). Forwarded verbatim to the rendered form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions (e.g. a connection \"Test\" split-button) that\n // operate on the current form value, rendered left of the Save button.\n footerActions?: FormActionsRenderer;\n // Optional host layout. Dialog consumers use this to place footer controls in\n // the modal's pinned footer while standalone consumers retain the inline\n // layout below.\n renderLayout?: (slots: SchemaActionFormSlots) => ReactNode;\n // Rendered when the resource exposes no JSON Schema (or schema forms are not\n // applicable to this action) — the existing parameter form.\n fallback: ReactNode;\n};\n\n// SchemaActionForm renders a JSON-Schema-driven create/edit form for resources\n// that expose a schema via content negotiation (connections, profiles). It falls\n// back to the parameter form for everything else. Submission sends the full\n// nested form value as JSON (client.submitForm), so nested objects/arrays survive.\nexport function SchemaActionForm({\n client,\n action,\n lockedValues,\n initialValue,\n submitLabel = \"Save\",\n onSuccess,\n formPre,\n formPost,\n footerActions,\n renderLayout,\n fallback,\n}: SchemaActionFormProps) {\n const method = action.method.toUpperCase();\n const canSchemaForm = Boolean(\n client.getSchema && client.submitForm && isMutation(method),\n );\n const schemaPath = collectionPath(action.path);\n\n // Resolve `x-clicky-lookup` fields against the live form value: fetch the\n // referenced entity's lookup options (server-side search) and scope them by a\n // sibling field. Undefined when the client has no lookup endpoint (the field\n // then degrades to a free-text combobox).\n const lookupFetcher: LookupFetcher | undefined = useMemo(() => {\n const lookup = client.lookupFilterOptions;\n if (!lookup) return undefined;\n return async ({ descriptor, query, rootValue }) => {\n const extra = resolveLookupScope(descriptor, rootValue);\n const filter = await lookup.call(\n client,\n descriptor.url,\n \"GET\",\n descriptor.filter,\n query,\n extra,\n );\n return lookupOptionsToFieldOptions(filter).map((o) => ({\n value: o.value,\n label: o.label,\n }));\n };\n }, [client]);\n\n const schemaQuery = useQuery<JsonSchemaObject | null>({\n queryKey: [\"entity-schema\", schemaPath],\n // react-query forbids undefined query data; normalize \"no schema\" to null.\n queryFn: async () => (await client.getSchema!(schemaPath)) ?? null,\n enabled: canSchemaForm,\n staleTime: 5 * 60 * 1000,\n retry: 0,\n });\n\n const [value, setValue] = useState<Record<string, unknown>>(\n initialValue ?? {},\n );\n const [view, setView] = useState<\"form\" | \"yaml\">(\"form\");\n const [yamlText, setYamlText] = useState(() =>\n stringifyYaml(initialValue ?? {}),\n );\n const [yamlError, setYamlError] = useState(\"\");\n const [yamlValidation, setYamlValidation] = useState<MonacoValidationState>({\n status: \"valid\",\n errors: [],\n });\n const [error, setError] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n // Monaco keys models by path. A React useId can be reused after one dialog\n // unmounts and another occupies the same tree position, briefly exposing the\n // previous dialog's retained model during deferred StrictMode-safe cleanup.\n const [editorId] = useState(() => ++schemaActionEditorSequence);\n const editorPath = `file:///clicky-schema-action-${editorId}.yaml`;\n const canSubmit =\n !yamlError && (view !== \"yaml\" || yamlValidation.status === \"valid\");\n const handleValidationChange = useCallback((next: MonacoValidationState) => {\n setYamlValidation(next);\n }, []);\n\n function renderSlots(slots: SchemaActionFormSlots) {\n if (renderLayout) return renderLayout(slots);\n return (\n <div className=\"space-y-4\">\n {slots.body}\n {slots.footer}\n </div>\n );\n }\n\n if (!canSchemaForm) return <>{renderSlots({ body: fallback })}</>;\n if (schemaQuery.isLoading) {\n return (\n <>\n {renderSlots({\n body: (\n <div className=\"text-sm text-muted-foreground\">Loading form…</div>\n ),\n })}\n </>\n );\n }\n const schema = schemaQuery.data;\n if (!schema) return <>{renderSlots({ body: fallback })}</>;\n\n async function handleSubmit() {\n if (!client.submitForm) return;\n if (!canSubmit) {\n setError(\"Fix the YAML before saving.\");\n return;\n }\n setIsSubmitting(true);\n setError(\"\");\n try {\n const path = resolveActionPath(action.path, {\n ...scalarValues(value),\n ...lockedValues,\n });\n // Entity update operations do not always encode their identifier in the\n // path. Clicky can expose an entity-scoped PUT on the collection path and\n // use x-clicky.idParam to lock the row id in the action context. Keep\n // locked values out of the editable form, but include any values that\n // were not consumed by path placeholders in the request body.\n const pathParams = new Set(\n Array.from(action.path.matchAll(/\\{([^{}]+)\\}/g), (match) => match[1]),\n );\n const lockedBodyValues = Object.fromEntries(\n Object.entries(lockedValues ?? {}).filter(\n ([name]) => !pathParams.has(name),\n ),\n );\n const response = await client.submitForm(\n path,\n method,\n { ...value, ...lockedBodyValues },\n {\n Accept: \"application/json+clicky\",\n },\n );\n if (response.error) {\n setError(response.error);\n return;\n }\n onSuccess?.(response);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : String(err ?? \"Unknown error\"),\n );\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function changeView(next: string) {\n if (next !== \"form\" && next !== \"yaml\") return;\n if (next === \"form\") {\n // Form mode uses the last successfully parsed object, so an invalid YAML\n // draft should not trap the user in the editor or keep form actions disabled.\n setYamlError(\"\");\n }\n if (next === \"yaml\") {\n setYamlText(stringifyYaml(value));\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n }\n setView(next);\n }\n\n function changeYaml(next: string) {\n setYamlText(next);\n setError(\"\");\n try {\n const parsed = next.trim() ? parseYaml(next) : {};\n if (!isRecord(parsed))\n throw new Error(\"The YAML document must contain an object.\");\n setValue(parsed);\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n } catch (err) {\n setYamlError(err instanceof Error ? err.message : String(err));\n }\n }\n\n const body = (\n <div className=\"space-y-4\">\n <Tabs\n tabs={[\n { id: \"form\", label: \"Form\" },\n { id: \"yaml\", label: \"YAML\" },\n ]}\n value={view}\n onChange={changeView}\n />\n {view === \"form\" ? (\n <div role=\"tabpanel\" aria-label=\"Form\">\n <JsonSchemaForm\n schema={schema}\n value={value}\n onChange={setValue}\n {...(formPre ? { pre: formPre } : {})}\n {...(formPost ? { post: formPost } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n ) : (\n <div role=\"tabpanel\" aria-label=\"YAML\" className=\"space-y-2\">\n <Suspense\n fallback={\n <div className=\"h-80 rounded-md border border-input p-3 text-sm text-muted-foreground\">\n Loading Monaco editor…\n </div>\n }\n >\n <LazyMonacoSchemaEditor\n language=\"yaml\"\n value={yamlText}\n onChange={changeYaml}\n path={editorPath}\n schemaUri={`${editorPath}.schema.json`}\n schema={schema}\n onValidationChange={handleValidationChange}\n />\n </Suspense>\n <div className=\"text-xs text-muted-foreground\">\n Returning through Form preserves values but discards YAML comments,\n anchors, ordering, and formatting.\n </div>\n {(yamlValidation.status === \"invalid\" ||\n yamlValidation.status === \"unavailable\") &&\n yamlValidation.errors.length > 0 && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlValidation.errors[0]}\n </div>\n )}\n {yamlValidation.status === \"loading\" && !yamlError && (\n <div className=\"text-xs text-muted-foreground\">\n Validating YAML…\n </div>\n )}\n {yamlError && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlError}\n </div>\n )}\n </div>\n )}\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </div>\n );\n const footer = (\n <div className=\"flex items-center justify-end gap-2\">\n {footerActions?.({ value, action, canSubmit })}\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !canSubmit}\n >\n {isSubmitting ? \"Saving…\" : submitLabel}\n </Button>\n </div>\n );\n return <>{renderSlots({ body, footer })}</>;\n}\n\nfunction isMutation(method: string): boolean {\n return method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"names":["lazy","module","collectionPath","useMemo","resolveLookupScope","lookupOptionsToFieldOptions","useQuery","useState","stringifyYaml","useCallback","jsxs","jsx","Fragment","resolveActionPath","scalarValues","parseYaml","Tabs","JsonSchemaForm","Suspense","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SchemaActionForm.cjs","sources":["../../src/rpc/SchemaActionForm.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { Tabs } from \"../layout/Tabs\";\nimport type {\n JsonSchemaObject,\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport { useOperationLookupFetcher } from \"./operationLookupFetcher\";\nimport {\n collectionPath,\n resolveActionPath,\n scalarValues,\n} from \"./schemaActionPath\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\nimport type { MonacoValidationState } from \"../monaco/types\";\n\nconst LazyMonacoSchemaEditor = lazy(() =>\n import(\"../monaco/MonacoSchemaEditor\").then((module) => ({\n default: module.MonacoSchemaEditor,\n })),\n);\nlet schemaActionEditorSequence = 0;\n\n// FormActionContext is handed to a footerActions renderer so a host app can add\n// form-level actions (e.g. a connection \"Test\" button) that operate on the live\n// form value.\nexport type FormActionContext = {\n value: Record<string, unknown>;\n action: ResolvedOperation;\n canSubmit: boolean;\n};\n\n// FormActionsRenderer renders extra action buttons in the form footer, left of\n// the Save button. Returns null/undefined to add none.\nexport type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;\n\nexport type SchemaActionFormSlots = {\n body: ReactNode;\n footer?: ReactNode;\n};\n\nexport type SchemaActionFormProps = {\n client: OperationsApiClient;\n // The create (POST) or update (PUT) operation this form submits to.\n action: ResolvedOperation;\n // Values used to resolve path parameters (e.g. { id } when editing a row).\n lockedValues?: Record<string, string>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n submitLabel?: string;\n onSuccess?: (response: ExecutionResponse) => void;\n // Custom JsonSchemaForm field extensions (e.g. a SecretKeySelector widget keyed\n // on an `x-clicky-component` hint). Forwarded verbatim to the rendered form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions (e.g. a connection \"Test\" split-button) that\n // operate on the current form value, rendered left of the Save button.\n footerActions?: FormActionsRenderer;\n // Optional host layout. Dialog consumers use this to place footer controls in\n // the modal's pinned footer while standalone consumers retain the inline\n // layout below.\n renderLayout?: (slots: SchemaActionFormSlots) => ReactNode;\n // Rendered when the resource exposes no JSON Schema (or schema forms are not\n // applicable to this action) — the existing parameter form.\n fallback: ReactNode;\n};\n\n// SchemaActionForm renders a JSON-Schema-driven create/edit form for resources\n// that expose a schema via content negotiation (connections, profiles). It falls\n// back to the parameter form for everything else. Submission sends the full\n// nested form value as JSON (client.submitForm), so nested objects/arrays survive.\nexport function SchemaActionForm({\n client,\n action,\n lockedValues,\n initialValue,\n submitLabel = \"Save\",\n onSuccess,\n formPre,\n formPost,\n footerActions,\n renderLayout,\n fallback,\n}: SchemaActionFormProps) {\n const method = action.method.toUpperCase();\n const canSchemaForm = Boolean(\n client.getSchema && client.submitForm && isMutation(method),\n );\n const schemaPath = collectionPath(action.path);\n\n const lookupFetcher = useOperationLookupFetcher(client);\n\n const schemaQuery = useQuery<JsonSchemaObject | null>({\n queryKey: [\"entity-schema\", schemaPath],\n // react-query forbids undefined query data; normalize \"no schema\" to null.\n queryFn: async () => (await client.getSchema!(schemaPath)) ?? null,\n enabled: canSchemaForm,\n staleTime: 5 * 60 * 1000,\n retry: 0,\n });\n\n const [value, setValue] = useState<Record<string, unknown>>(\n initialValue ?? {},\n );\n const [view, setView] = useState<\"form\" | \"yaml\">(\"form\");\n const [yamlText, setYamlText] = useState(() =>\n stringifyYaml(initialValue ?? {}),\n );\n const [yamlError, setYamlError] = useState(\"\");\n const [yamlValidation, setYamlValidation] = useState<MonacoValidationState>({\n status: \"valid\",\n errors: [],\n });\n const [error, setError] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n // Monaco keys models by path. A React useId can be reused after one dialog\n // unmounts and another occupies the same tree position, briefly exposing the\n // previous dialog's retained model during deferred StrictMode-safe cleanup.\n const [editorId] = useState(() => ++schemaActionEditorSequence);\n const editorPath = `file:///clicky-schema-action-${editorId}.yaml`;\n const canSubmit =\n !yamlError && (view !== \"yaml\" || yamlValidation.status === \"valid\");\n const handleValidationChange = useCallback((next: MonacoValidationState) => {\n setYamlValidation(next);\n }, []);\n\n function renderSlots(slots: SchemaActionFormSlots) {\n if (renderLayout) return renderLayout(slots);\n return (\n <div className=\"space-y-4\">\n {slots.body}\n {slots.footer}\n </div>\n );\n }\n\n if (!canSchemaForm) return <>{renderSlots({ body: fallback })}</>;\n if (schemaQuery.isLoading) {\n return (\n <>\n {renderSlots({\n body: (\n <div className=\"text-sm text-muted-foreground\">Loading form…</div>\n ),\n })}\n </>\n );\n }\n const schema = schemaQuery.data;\n if (!schema) return <>{renderSlots({ body: fallback })}</>;\n\n async function handleSubmit() {\n if (!client.submitForm) return;\n if (!canSubmit) {\n setError(\"Fix the YAML before saving.\");\n return;\n }\n setIsSubmitting(true);\n setError(\"\");\n try {\n const path = resolveActionPath(action.path, {\n ...scalarValues(value),\n ...lockedValues,\n });\n // Entity update operations do not always encode their identifier in the\n // path. Clicky can expose an entity-scoped PUT on the collection path and\n // use x-clicky.idParam to lock the row id in the action context. Keep\n // locked values out of the editable form, but include any values that\n // were not consumed by path placeholders in the request body.\n const pathParams = new Set(\n Array.from(action.path.matchAll(/\\{([^{}]+)\\}/g), (match) => match[1]),\n );\n const lockedBodyValues = Object.fromEntries(\n Object.entries(lockedValues ?? {}).filter(\n ([name]) => !pathParams.has(name),\n ),\n );\n const response = await client.submitForm(\n path,\n method,\n { ...value, ...lockedBodyValues },\n {\n Accept: \"application/json+clicky\",\n },\n );\n if (response.error) {\n setError(response.error);\n return;\n }\n onSuccess?.(response);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : String(err ?? \"Unknown error\"),\n );\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function changeView(next: string) {\n if (next !== \"form\" && next !== \"yaml\") return;\n if (next === \"form\") {\n // Form mode uses the last successfully parsed object, so an invalid YAML\n // draft should not trap the user in the editor or keep form actions disabled.\n setYamlError(\"\");\n }\n if (next === \"yaml\") {\n setYamlText(stringifyYaml(value));\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n }\n setView(next);\n }\n\n function changeYaml(next: string) {\n setYamlText(next);\n setError(\"\");\n try {\n const parsed = next.trim() ? parseYaml(next) : {};\n if (!isRecord(parsed))\n throw new Error(\"The YAML document must contain an object.\");\n setValue(parsed);\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n } catch (err) {\n setYamlError(err instanceof Error ? err.message : String(err));\n }\n }\n\n const body = (\n <div className=\"space-y-4\">\n <Tabs\n tabs={[\n { id: \"form\", label: \"Form\" },\n { id: \"yaml\", label: \"YAML\" },\n ]}\n value={view}\n onChange={changeView}\n />\n {view === \"form\" ? (\n <div role=\"tabpanel\" aria-label=\"Form\">\n <JsonSchemaForm\n schema={schema}\n value={value}\n onChange={setValue}\n {...(formPre ? { pre: formPre } : {})}\n {...(formPost ? { post: formPost } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n ) : (\n <div role=\"tabpanel\" aria-label=\"YAML\" className=\"space-y-2\">\n <Suspense\n fallback={\n <div className=\"h-80 rounded-md border border-input p-3 text-sm text-muted-foreground\">\n Loading Monaco editor…\n </div>\n }\n >\n <LazyMonacoSchemaEditor\n language=\"yaml\"\n value={yamlText}\n onChange={changeYaml}\n path={editorPath}\n schemaUri={`${editorPath}.schema.json`}\n schema={schema}\n onValidationChange={handleValidationChange}\n />\n </Suspense>\n <div className=\"text-xs text-muted-foreground\">\n Returning through Form preserves values but discards YAML comments,\n anchors, ordering, and formatting.\n </div>\n {(yamlValidation.status === \"invalid\" ||\n yamlValidation.status === \"unavailable\") &&\n yamlValidation.errors.length > 0 && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlValidation.errors[0]}\n </div>\n )}\n {yamlValidation.status === \"loading\" && !yamlError && (\n <div className=\"text-xs text-muted-foreground\">\n Validating YAML…\n </div>\n )}\n {yamlError && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlError}\n </div>\n )}\n </div>\n )}\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </div>\n );\n const footer = (\n <div className=\"flex items-center justify-end gap-2\">\n {footerActions?.({ value, action, canSubmit })}\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !canSubmit}\n >\n {isSubmitting ? \"Saving…\" : submitLabel}\n </Button>\n </div>\n );\n return <>{renderSlots({ body, footer })}</>;\n}\n\nfunction isMutation(method: string): boolean {\n return method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"names":["lazy","module","collectionPath","useOperationLookupFetcher","useQuery","useState","stringifyYaml","useCallback","jsxs","jsx","Fragment","resolveActionPath","scalarValues","parseYaml","Tabs","JsonSchemaForm","Suspense","Button"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaActionForm.d.ts","sourceRoot":"","sources":["../../src/rpc/SchemaActionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"SchemaActionForm.d.ts","sourceRoot":"","sources":["../../src/rpc/SchemaActionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAMf,OAAO,KAAK,EAEV,YAAY,EACZ,aAAa,EACd,MAAM,sCAAsC,CAAC;AAO9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAa3D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAIF,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,iBAAiB,KAAK,SAAS,CAAC;AAExE,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,mBAAmB,CAAC;IAE5B,MAAM,EAAE,iBAAiB,CAAC;IAE1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAGlD,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAG3B,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAIpC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,SAAS,CAAC;IAG3D,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAMF,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,WAAoB,EACpB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,QAAQ,GACT,EAAE,qBAAqB,2CAqOvB"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { jsx, Fragment, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { useState, useCallback, Suspense, lazy } from "react";
|
|
3
3
|
import { useQuery } from "@tanstack/react-query";
|
|
4
4
|
import { stringify, parse } from "yaml";
|
|
5
5
|
import { Button } from "../components/button.js";
|
|
6
6
|
import { JsonSchemaForm } from "../components/JsonSchemaForm.js";
|
|
7
|
-
import { resolveLookupScope } from "../components/form-lookup-context.js";
|
|
8
7
|
import { Tabs } from "../layout/Tabs.js";
|
|
9
|
-
import {
|
|
8
|
+
import { useOperationLookupFetcher } from "./operationLookupFetcher.js";
|
|
10
9
|
import { collectionPath, resolveActionPath, scalarValues } from "./schemaActionPath.js";
|
|
11
10
|
const LazyMonacoSchemaEditor = lazy(
|
|
12
11
|
() => import("../monaco/MonacoSchemaEditor.js").then((module) => ({
|
|
@@ -32,25 +31,7 @@ function SchemaActionForm({
|
|
|
32
31
|
client.getSchema && client.submitForm && isMutation(method)
|
|
33
32
|
);
|
|
34
33
|
const schemaPath = collectionPath(action.path);
|
|
35
|
-
const lookupFetcher =
|
|
36
|
-
const lookup = client.lookupFilterOptions;
|
|
37
|
-
if (!lookup) return void 0;
|
|
38
|
-
return async ({ descriptor, query, rootValue }) => {
|
|
39
|
-
const extra = resolveLookupScope(descriptor, rootValue);
|
|
40
|
-
const filter = await lookup.call(
|
|
41
|
-
client,
|
|
42
|
-
descriptor.url,
|
|
43
|
-
"GET",
|
|
44
|
-
descriptor.filter,
|
|
45
|
-
query,
|
|
46
|
-
extra
|
|
47
|
-
);
|
|
48
|
-
return lookupOptionsToFieldOptions(filter).map((o) => ({
|
|
49
|
-
value: o.value,
|
|
50
|
-
label: o.label
|
|
51
|
-
}));
|
|
52
|
-
};
|
|
53
|
-
}, [client]);
|
|
34
|
+
const lookupFetcher = useOperationLookupFetcher(client);
|
|
54
35
|
const schemaQuery = useQuery({
|
|
55
36
|
queryKey: ["entity-schema", schemaPath],
|
|
56
37
|
// react-query forbids undefined query data; normalize "no schema" to null.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaActionForm.js","sources":["../../src/rpc/SchemaActionForm.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { resolveLookupScope } from \"../components/form-lookup-context\";\nimport { Tabs } from \"../layout/Tabs\";\nimport type {\n JsonSchemaObject,\n LookupFetcher,\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport { lookupOptionsToFieldOptions } from \"./formMetadata\";\nimport {\n collectionPath,\n resolveActionPath,\n scalarValues,\n} from \"./schemaActionPath\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\nimport type { MonacoValidationState } from \"../monaco/types\";\n\nconst LazyMonacoSchemaEditor = lazy(() =>\n import(\"../monaco/MonacoSchemaEditor\").then((module) => ({\n default: module.MonacoSchemaEditor,\n })),\n);\nlet schemaActionEditorSequence = 0;\n\n// FormActionContext is handed to a footerActions renderer so a host app can add\n// form-level actions (e.g. a connection \"Test\" button) that operate on the live\n// form value.\nexport type FormActionContext = {\n value: Record<string, unknown>;\n action: ResolvedOperation;\n canSubmit: boolean;\n};\n\n// FormActionsRenderer renders extra action buttons in the form footer, left of\n// the Save button. Returns null/undefined to add none.\nexport type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;\n\nexport type SchemaActionFormSlots = {\n body: ReactNode;\n footer?: ReactNode;\n};\n\nexport type SchemaActionFormProps = {\n client: OperationsApiClient;\n // The create (POST) or update (PUT) operation this form submits to.\n action: ResolvedOperation;\n // Values used to resolve path parameters (e.g. { id } when editing a row).\n lockedValues?: Record<string, string>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n submitLabel?: string;\n onSuccess?: (response: ExecutionResponse) => void;\n // Custom JsonSchemaForm field extensions (e.g. a SecretKeySelector widget keyed\n // on an `x-clicky-component` hint). Forwarded verbatim to the rendered form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions (e.g. a connection \"Test\" split-button) that\n // operate on the current form value, rendered left of the Save button.\n footerActions?: FormActionsRenderer;\n // Optional host layout. Dialog consumers use this to place footer controls in\n // the modal's pinned footer while standalone consumers retain the inline\n // layout below.\n renderLayout?: (slots: SchemaActionFormSlots) => ReactNode;\n // Rendered when the resource exposes no JSON Schema (or schema forms are not\n // applicable to this action) — the existing parameter form.\n fallback: ReactNode;\n};\n\n// SchemaActionForm renders a JSON-Schema-driven create/edit form for resources\n// that expose a schema via content negotiation (connections, profiles). It falls\n// back to the parameter form for everything else. Submission sends the full\n// nested form value as JSON (client.submitForm), so nested objects/arrays survive.\nexport function SchemaActionForm({\n client,\n action,\n lockedValues,\n initialValue,\n submitLabel = \"Save\",\n onSuccess,\n formPre,\n formPost,\n footerActions,\n renderLayout,\n fallback,\n}: SchemaActionFormProps) {\n const method = action.method.toUpperCase();\n const canSchemaForm = Boolean(\n client.getSchema && client.submitForm && isMutation(method),\n );\n const schemaPath = collectionPath(action.path);\n\n // Resolve `x-clicky-lookup` fields against the live form value: fetch the\n // referenced entity's lookup options (server-side search) and scope them by a\n // sibling field. Undefined when the client has no lookup endpoint (the field\n // then degrades to a free-text combobox).\n const lookupFetcher: LookupFetcher | undefined = useMemo(() => {\n const lookup = client.lookupFilterOptions;\n if (!lookup) return undefined;\n return async ({ descriptor, query, rootValue }) => {\n const extra = resolveLookupScope(descriptor, rootValue);\n const filter = await lookup.call(\n client,\n descriptor.url,\n \"GET\",\n descriptor.filter,\n query,\n extra,\n );\n return lookupOptionsToFieldOptions(filter).map((o) => ({\n value: o.value,\n label: o.label,\n }));\n };\n }, [client]);\n\n const schemaQuery = useQuery<JsonSchemaObject | null>({\n queryKey: [\"entity-schema\", schemaPath],\n // react-query forbids undefined query data; normalize \"no schema\" to null.\n queryFn: async () => (await client.getSchema!(schemaPath)) ?? null,\n enabled: canSchemaForm,\n staleTime: 5 * 60 * 1000,\n retry: 0,\n });\n\n const [value, setValue] = useState<Record<string, unknown>>(\n initialValue ?? {},\n );\n const [view, setView] = useState<\"form\" | \"yaml\">(\"form\");\n const [yamlText, setYamlText] = useState(() =>\n stringifyYaml(initialValue ?? {}),\n );\n const [yamlError, setYamlError] = useState(\"\");\n const [yamlValidation, setYamlValidation] = useState<MonacoValidationState>({\n status: \"valid\",\n errors: [],\n });\n const [error, setError] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n // Monaco keys models by path. A React useId can be reused after one dialog\n // unmounts and another occupies the same tree position, briefly exposing the\n // previous dialog's retained model during deferred StrictMode-safe cleanup.\n const [editorId] = useState(() => ++schemaActionEditorSequence);\n const editorPath = `file:///clicky-schema-action-${editorId}.yaml`;\n const canSubmit =\n !yamlError && (view !== \"yaml\" || yamlValidation.status === \"valid\");\n const handleValidationChange = useCallback((next: MonacoValidationState) => {\n setYamlValidation(next);\n }, []);\n\n function renderSlots(slots: SchemaActionFormSlots) {\n if (renderLayout) return renderLayout(slots);\n return (\n <div className=\"space-y-4\">\n {slots.body}\n {slots.footer}\n </div>\n );\n }\n\n if (!canSchemaForm) return <>{renderSlots({ body: fallback })}</>;\n if (schemaQuery.isLoading) {\n return (\n <>\n {renderSlots({\n body: (\n <div className=\"text-sm text-muted-foreground\">Loading form…</div>\n ),\n })}\n </>\n );\n }\n const schema = schemaQuery.data;\n if (!schema) return <>{renderSlots({ body: fallback })}</>;\n\n async function handleSubmit() {\n if (!client.submitForm) return;\n if (!canSubmit) {\n setError(\"Fix the YAML before saving.\");\n return;\n }\n setIsSubmitting(true);\n setError(\"\");\n try {\n const path = resolveActionPath(action.path, {\n ...scalarValues(value),\n ...lockedValues,\n });\n // Entity update operations do not always encode their identifier in the\n // path. Clicky can expose an entity-scoped PUT on the collection path and\n // use x-clicky.idParam to lock the row id in the action context. Keep\n // locked values out of the editable form, but include any values that\n // were not consumed by path placeholders in the request body.\n const pathParams = new Set(\n Array.from(action.path.matchAll(/\\{([^{}]+)\\}/g), (match) => match[1]),\n );\n const lockedBodyValues = Object.fromEntries(\n Object.entries(lockedValues ?? {}).filter(\n ([name]) => !pathParams.has(name),\n ),\n );\n const response = await client.submitForm(\n path,\n method,\n { ...value, ...lockedBodyValues },\n {\n Accept: \"application/json+clicky\",\n },\n );\n if (response.error) {\n setError(response.error);\n return;\n }\n onSuccess?.(response);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : String(err ?? \"Unknown error\"),\n );\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function changeView(next: string) {\n if (next !== \"form\" && next !== \"yaml\") return;\n if (next === \"form\") {\n // Form mode uses the last successfully parsed object, so an invalid YAML\n // draft should not trap the user in the editor or keep form actions disabled.\n setYamlError(\"\");\n }\n if (next === \"yaml\") {\n setYamlText(stringifyYaml(value));\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n }\n setView(next);\n }\n\n function changeYaml(next: string) {\n setYamlText(next);\n setError(\"\");\n try {\n const parsed = next.trim() ? parseYaml(next) : {};\n if (!isRecord(parsed))\n throw new Error(\"The YAML document must contain an object.\");\n setValue(parsed);\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n } catch (err) {\n setYamlError(err instanceof Error ? err.message : String(err));\n }\n }\n\n const body = (\n <div className=\"space-y-4\">\n <Tabs\n tabs={[\n { id: \"form\", label: \"Form\" },\n { id: \"yaml\", label: \"YAML\" },\n ]}\n value={view}\n onChange={changeView}\n />\n {view === \"form\" ? (\n <div role=\"tabpanel\" aria-label=\"Form\">\n <JsonSchemaForm\n schema={schema}\n value={value}\n onChange={setValue}\n {...(formPre ? { pre: formPre } : {})}\n {...(formPost ? { post: formPost } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n ) : (\n <div role=\"tabpanel\" aria-label=\"YAML\" className=\"space-y-2\">\n <Suspense\n fallback={\n <div className=\"h-80 rounded-md border border-input p-3 text-sm text-muted-foreground\">\n Loading Monaco editor…\n </div>\n }\n >\n <LazyMonacoSchemaEditor\n language=\"yaml\"\n value={yamlText}\n onChange={changeYaml}\n path={editorPath}\n schemaUri={`${editorPath}.schema.json`}\n schema={schema}\n onValidationChange={handleValidationChange}\n />\n </Suspense>\n <div className=\"text-xs text-muted-foreground\">\n Returning through Form preserves values but discards YAML comments,\n anchors, ordering, and formatting.\n </div>\n {(yamlValidation.status === \"invalid\" ||\n yamlValidation.status === \"unavailable\") &&\n yamlValidation.errors.length > 0 && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlValidation.errors[0]}\n </div>\n )}\n {yamlValidation.status === \"loading\" && !yamlError && (\n <div className=\"text-xs text-muted-foreground\">\n Validating YAML…\n </div>\n )}\n {yamlError && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlError}\n </div>\n )}\n </div>\n )}\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </div>\n );\n const footer = (\n <div className=\"flex items-center justify-end gap-2\">\n {footerActions?.({ value, action, canSubmit })}\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !canSubmit}\n >\n {isSubmitting ? \"Saving…\" : submitLabel}\n </Button>\n </div>\n );\n return <>{renderSlots({ body, footer })}</>;\n}\n\nfunction isMutation(method: string): boolean {\n return method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"names":["stringifyYaml","parseYaml"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SchemaActionForm.js","sources":["../../src/rpc/SchemaActionForm.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { Tabs } from \"../layout/Tabs\";\nimport type {\n JsonSchemaObject,\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport { useOperationLookupFetcher } from \"./operationLookupFetcher\";\nimport {\n collectionPath,\n resolveActionPath,\n scalarValues,\n} from \"./schemaActionPath\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\nimport type { MonacoValidationState } from \"../monaco/types\";\n\nconst LazyMonacoSchemaEditor = lazy(() =>\n import(\"../monaco/MonacoSchemaEditor\").then((module) => ({\n default: module.MonacoSchemaEditor,\n })),\n);\nlet schemaActionEditorSequence = 0;\n\n// FormActionContext is handed to a footerActions renderer so a host app can add\n// form-level actions (e.g. a connection \"Test\" button) that operate on the live\n// form value.\nexport type FormActionContext = {\n value: Record<string, unknown>;\n action: ResolvedOperation;\n canSubmit: boolean;\n};\n\n// FormActionsRenderer renders extra action buttons in the form footer, left of\n// the Save button. Returns null/undefined to add none.\nexport type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;\n\nexport type SchemaActionFormSlots = {\n body: ReactNode;\n footer?: ReactNode;\n};\n\nexport type SchemaActionFormProps = {\n client: OperationsApiClient;\n // The create (POST) or update (PUT) operation this form submits to.\n action: ResolvedOperation;\n // Values used to resolve path parameters (e.g. { id } when editing a row).\n lockedValues?: Record<string, string>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n submitLabel?: string;\n onSuccess?: (response: ExecutionResponse) => void;\n // Custom JsonSchemaForm field extensions (e.g. a SecretKeySelector widget keyed\n // on an `x-clicky-component` hint). Forwarded verbatim to the rendered form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions (e.g. a connection \"Test\" split-button) that\n // operate on the current form value, rendered left of the Save button.\n footerActions?: FormActionsRenderer;\n // Optional host layout. Dialog consumers use this to place footer controls in\n // the modal's pinned footer while standalone consumers retain the inline\n // layout below.\n renderLayout?: (slots: SchemaActionFormSlots) => ReactNode;\n // Rendered when the resource exposes no JSON Schema (or schema forms are not\n // applicable to this action) — the existing parameter form.\n fallback: ReactNode;\n};\n\n// SchemaActionForm renders a JSON-Schema-driven create/edit form for resources\n// that expose a schema via content negotiation (connections, profiles). It falls\n// back to the parameter form for everything else. Submission sends the full\n// nested form value as JSON (client.submitForm), so nested objects/arrays survive.\nexport function SchemaActionForm({\n client,\n action,\n lockedValues,\n initialValue,\n submitLabel = \"Save\",\n onSuccess,\n formPre,\n formPost,\n footerActions,\n renderLayout,\n fallback,\n}: SchemaActionFormProps) {\n const method = action.method.toUpperCase();\n const canSchemaForm = Boolean(\n client.getSchema && client.submitForm && isMutation(method),\n );\n const schemaPath = collectionPath(action.path);\n\n const lookupFetcher = useOperationLookupFetcher(client);\n\n const schemaQuery = useQuery<JsonSchemaObject | null>({\n queryKey: [\"entity-schema\", schemaPath],\n // react-query forbids undefined query data; normalize \"no schema\" to null.\n queryFn: async () => (await client.getSchema!(schemaPath)) ?? null,\n enabled: canSchemaForm,\n staleTime: 5 * 60 * 1000,\n retry: 0,\n });\n\n const [value, setValue] = useState<Record<string, unknown>>(\n initialValue ?? {},\n );\n const [view, setView] = useState<\"form\" | \"yaml\">(\"form\");\n const [yamlText, setYamlText] = useState(() =>\n stringifyYaml(initialValue ?? {}),\n );\n const [yamlError, setYamlError] = useState(\"\");\n const [yamlValidation, setYamlValidation] = useState<MonacoValidationState>({\n status: \"valid\",\n errors: [],\n });\n const [error, setError] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n // Monaco keys models by path. A React useId can be reused after one dialog\n // unmounts and another occupies the same tree position, briefly exposing the\n // previous dialog's retained model during deferred StrictMode-safe cleanup.\n const [editorId] = useState(() => ++schemaActionEditorSequence);\n const editorPath = `file:///clicky-schema-action-${editorId}.yaml`;\n const canSubmit =\n !yamlError && (view !== \"yaml\" || yamlValidation.status === \"valid\");\n const handleValidationChange = useCallback((next: MonacoValidationState) => {\n setYamlValidation(next);\n }, []);\n\n function renderSlots(slots: SchemaActionFormSlots) {\n if (renderLayout) return renderLayout(slots);\n return (\n <div className=\"space-y-4\">\n {slots.body}\n {slots.footer}\n </div>\n );\n }\n\n if (!canSchemaForm) return <>{renderSlots({ body: fallback })}</>;\n if (schemaQuery.isLoading) {\n return (\n <>\n {renderSlots({\n body: (\n <div className=\"text-sm text-muted-foreground\">Loading form…</div>\n ),\n })}\n </>\n );\n }\n const schema = schemaQuery.data;\n if (!schema) return <>{renderSlots({ body: fallback })}</>;\n\n async function handleSubmit() {\n if (!client.submitForm) return;\n if (!canSubmit) {\n setError(\"Fix the YAML before saving.\");\n return;\n }\n setIsSubmitting(true);\n setError(\"\");\n try {\n const path = resolveActionPath(action.path, {\n ...scalarValues(value),\n ...lockedValues,\n });\n // Entity update operations do not always encode their identifier in the\n // path. Clicky can expose an entity-scoped PUT on the collection path and\n // use x-clicky.idParam to lock the row id in the action context. Keep\n // locked values out of the editable form, but include any values that\n // were not consumed by path placeholders in the request body.\n const pathParams = new Set(\n Array.from(action.path.matchAll(/\\{([^{}]+)\\}/g), (match) => match[1]),\n );\n const lockedBodyValues = Object.fromEntries(\n Object.entries(lockedValues ?? {}).filter(\n ([name]) => !pathParams.has(name),\n ),\n );\n const response = await client.submitForm(\n path,\n method,\n { ...value, ...lockedBodyValues },\n {\n Accept: \"application/json+clicky\",\n },\n );\n if (response.error) {\n setError(response.error);\n return;\n }\n onSuccess?.(response);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : String(err ?? \"Unknown error\"),\n );\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function changeView(next: string) {\n if (next !== \"form\" && next !== \"yaml\") return;\n if (next === \"form\") {\n // Form mode uses the last successfully parsed object, so an invalid YAML\n // draft should not trap the user in the editor or keep form actions disabled.\n setYamlError(\"\");\n }\n if (next === \"yaml\") {\n setYamlText(stringifyYaml(value));\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n }\n setView(next);\n }\n\n function changeYaml(next: string) {\n setYamlText(next);\n setError(\"\");\n try {\n const parsed = next.trim() ? parseYaml(next) : {};\n if (!isRecord(parsed))\n throw new Error(\"The YAML document must contain an object.\");\n setValue(parsed);\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n } catch (err) {\n setYamlError(err instanceof Error ? err.message : String(err));\n }\n }\n\n const body = (\n <div className=\"space-y-4\">\n <Tabs\n tabs={[\n { id: \"form\", label: \"Form\" },\n { id: \"yaml\", label: \"YAML\" },\n ]}\n value={view}\n onChange={changeView}\n />\n {view === \"form\" ? (\n <div role=\"tabpanel\" aria-label=\"Form\">\n <JsonSchemaForm\n schema={schema}\n value={value}\n onChange={setValue}\n {...(formPre ? { pre: formPre } : {})}\n {...(formPost ? { post: formPost } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n ) : (\n <div role=\"tabpanel\" aria-label=\"YAML\" className=\"space-y-2\">\n <Suspense\n fallback={\n <div className=\"h-80 rounded-md border border-input p-3 text-sm text-muted-foreground\">\n Loading Monaco editor…\n </div>\n }\n >\n <LazyMonacoSchemaEditor\n language=\"yaml\"\n value={yamlText}\n onChange={changeYaml}\n path={editorPath}\n schemaUri={`${editorPath}.schema.json`}\n schema={schema}\n onValidationChange={handleValidationChange}\n />\n </Suspense>\n <div className=\"text-xs text-muted-foreground\">\n Returning through Form preserves values but discards YAML comments,\n anchors, ordering, and formatting.\n </div>\n {(yamlValidation.status === \"invalid\" ||\n yamlValidation.status === \"unavailable\") &&\n yamlValidation.errors.length > 0 && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlValidation.errors[0]}\n </div>\n )}\n {yamlValidation.status === \"loading\" && !yamlError && (\n <div className=\"text-xs text-muted-foreground\">\n Validating YAML…\n </div>\n )}\n {yamlError && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlError}\n </div>\n )}\n </div>\n )}\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </div>\n );\n const footer = (\n <div className=\"flex items-center justify-end gap-2\">\n {footerActions?.({ value, action, canSubmit })}\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !canSubmit}\n >\n {isSubmitting ? \"Saving…\" : submitLabel}\n </Button>\n </div>\n );\n return <>{renderSlots({ body, footer })}</>;\n}\n\nfunction isMutation(method: string): boolean {\n return method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"names":["stringifyYaml","parseYaml"],"mappings":"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"}
|
package/dist/rpc/apiClient.cjs
CHANGED
|
@@ -153,9 +153,9 @@ function createOperationsApiClient(options = {}) {
|
|
|
153
153
|
async lookupFilterOptions(path, method, filterKey, query, extraParams) {
|
|
154
154
|
var _a, _b;
|
|
155
155
|
const upper = method.toUpperCase();
|
|
156
|
-
const resolved = resolvePathParams(path, {});
|
|
156
|
+
const resolved = resolvePathParams(path, extraParams ?? {});
|
|
157
157
|
const queryParams = {
|
|
158
|
-
...
|
|
158
|
+
...resolved.params,
|
|
159
159
|
__lookup: "filters",
|
|
160
160
|
__lookup_filter: filterKey,
|
|
161
161
|
__lookup_q: query
|
|
@@ -310,8 +310,22 @@ function paginationFromHeaders(headers) {
|
|
|
310
310
|
if (total !== void 0) pagination.total = total;
|
|
311
311
|
if (limit !== void 0) pagination.limit = limit;
|
|
312
312
|
if (offset !== void 0) pagination.offset = offset;
|
|
313
|
+
const relation = headers["x-total-relation"];
|
|
314
|
+
if (relation === "eq" || relation === "gte") pagination.totalRelation = relation;
|
|
315
|
+
const hasMore = booleanHeader(headers["x-has-more"]);
|
|
316
|
+
if (hasMore !== void 0) pagination.hasMore = hasMore;
|
|
317
|
+
const cursor = headers["x-next-cursor"];
|
|
318
|
+
if (cursor != null && cursor.trim() !== "") pagination.nextCursor = cursor;
|
|
319
|
+
if (booleanHeader(headers["x-truncated"]) === true) pagination.truncated = true;
|
|
313
320
|
return Object.keys(pagination).length > 0 ? pagination : void 0;
|
|
314
321
|
}
|
|
322
|
+
function booleanHeader(value) {
|
|
323
|
+
if (value == null || value.trim() === "") return void 0;
|
|
324
|
+
const normalized = value.trim().toLowerCase();
|
|
325
|
+
if (normalized === "true") return true;
|
|
326
|
+
if (normalized === "false") return false;
|
|
327
|
+
return void 0;
|
|
328
|
+
}
|
|
315
329
|
function integerHeader(value) {
|
|
316
330
|
if (value == null || value.trim() === "") return void 0;
|
|
317
331
|
const parsed = parseInt(value, 10);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiClient.cjs","sources":["../../src/rpc/apiClient.ts"],"sourcesContent":["import type { JsonSchemaObject } from \"../components/json-schema-form-types\";\nimport { stripLeadingSlashes, stripTrailingSlashes } from \"../lib/string\";\nimport type {\n ExecutionPagination,\n ExecutionResponse,\n OpenAPISpec,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type OperationApiClientContext = {\n path: string;\n method: string;\n};\n\nexport type OperationDefaultParams = (context: {\n path: string;\n method: string;\n params: Record<string, string>;\n}) => MaybePromise<Record<string, string>>;\n\nexport type OperationHeadersProvider = (\n headers: Headers,\n context: OperationApiClientContext,\n) => MaybePromise<HeadersInit | void>;\n\nexport type CreateOperationsApiClientOptions = {\n baseUrl?: string;\n openApiPath?: string;\n credentials?: RequestCredentials;\n fetch?: typeof fetch;\n prepareHeaders?: OperationHeadersProvider;\n defaultParams?: OperationDefaultParams;\n};\n\nexport class OperationsApiClientError extends Error {\n status: number | undefined;\n method: string | undefined;\n url: string | undefined;\n responseBody: string | undefined;\n responseData: unknown;\n responseHeaders: Record<string, string> | undefined;\n\n constructor(\n message: string,\n options: {\n status?: number;\n method?: string;\n url?: string;\n responseBody?: string;\n responseData?: unknown;\n responseHeaders?: Record<string, string>;\n } = {},\n ) {\n super(message);\n this.name = \"OperationsApiClientError\";\n this.status = options.status;\n this.method = options.method;\n this.url = options.url;\n this.responseBody = options.responseBody;\n this.responseData = options.responseData;\n this.responseHeaders = options.responseHeaders;\n }\n}\n\nexport interface SharedOperationsApiClient extends OperationsApiClient {\n lookupFilterOptions(\n path: string,\n method: string,\n filterKey: string,\n query: string,\n extraParams?: Record<string, string>,\n ): Promise<OperationLookupFilter>;\n executeCommandBody(\n path: string,\n body: Record<string, unknown>,\n headers?: Record<string, string>,\n ): Promise<ExecutionResponse>;\n getSchema(path: string): Promise<JsonSchemaObject | undefined>;\n submitForm(\n path: string,\n method: string,\n body: Record<string, unknown>,\n headers?: Record<string, string>,\n ): Promise<ExecutionResponse>;\n}\n\nexport function createOperationsApiClient(\n options: CreateOperationsApiClientOptions = {},\n): SharedOperationsApiClient {\n const fetcher = options.fetch ?? fetch;\n const openApiPath = options.openApiPath ?? \"/api/openapi.json\";\n\n async function makeHeaders(\n base: HeadersInit | undefined,\n context: OperationApiClientContext,\n ): Promise<Headers> {\n const headers = new Headers(base);\n const prepared = await options.prepareHeaders?.(headers, context);\n return prepared ? new Headers(prepared) : headers;\n }\n\n async function request(\n path: string,\n method: string,\n init: Omit<RequestInit, \"method\" | \"headers\" | \"credentials\"> & {\n headers?: HeadersInit;\n requestUrl?: string;\n } = {},\n ): Promise<Response> {\n const url = joinUrl(options.baseUrl, path);\n const headers = await makeHeaders(init.headers, { path, method });\n return fetcher(url, {\n ...init,\n method,\n headers,\n ...(options.credentials ? { credentials: options.credentials } : {}),\n });\n }\n\n async function getOpenAPISpec(): Promise<OpenAPISpec> {\n const response = await request(openApiPath, \"GET\", {\n headers: { Accept: \"application/json\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) {\n throw errorFromResponse(response, \"GET\", openApiPath, parsed);\n }\n return parsed.data as OpenAPISpec;\n }\n\n async function withDefaults(path: string, method: string, params: Record<string, string>) {\n return (await options.defaultParams?.({ path, method, params })) ?? params;\n }\n\n return {\n getOpenAPISpec,\n\n async executeCommand(path, method, params, headers) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, params);\n const scoped = await withDefaults(resolved.path, upper, resolved.params);\n const accept = headerValue(headers, \"Accept\");\n\n if (upper === \"GET\") {\n const requestUrl = appendQuery(resolved.path, scoped);\n const response = await request(requestUrl, upper, {\n ...(headers ? { headers } : {}),\n requestUrl,\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl,\n });\n }\n\n const response = await request(resolved.path, upper, {\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify(scoped),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl: resolved.path,\n });\n },\n\n async executeCommandBody(path, body, headers) {\n const accept = headerValue(headers, \"Accept\");\n const response = await request(path, \"POST\", {\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: \"POST\",\n requestUrl: path,\n });\n },\n\n // getSchema fetches a resource's JSON Schema via content negotiation\n // (Accept: application/schema+json on the same endpoint). It returns\n // undefined when the resource serves no schema (the request falls through to\n // its data representation), so callers can fall back to a parameter form.\n async getSchema(path) {\n const response = await request(path, \"GET\", {\n headers: { Accept: \"application/schema+json\" },\n });\n if (!response.ok) return undefined;\n const contentType = response.headers.get(\"Content-Type\") || \"\";\n if (!contentType.toLowerCase().includes(\"schema\")) return undefined;\n const parsed = await readResponseBody(response, \"json\");\n const data = parsed.data;\n return data && typeof data === \"object\" ? (data as JsonSchemaObject) : undefined;\n },\n\n // submitForm sends a nested JSON body with the given HTTP method (POST to\n // create, PUT to update). Unlike executeCommand it preserves nested objects\n // and arrays — the server reads the raw body (clicky's RequestFromContext),\n // so connection `properties` and profile `provider`/`params`/`columns`\n // survive intact.\n async submitForm(path, method, body, headers) {\n const upper = method.toUpperCase();\n const response = await request(path, upper, {\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n });\n return parseExecutionResponse(response, await readResponseBody(response, \"json\"), {\n method: upper,\n requestUrl: path,\n });\n },\n\n async lookupFilters(path, method, params, headers) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, params);\n\n if (upper === \"GET\") {\n const requestUrl = appendQuery(resolved.path, { ...resolved.params, __lookup: \"filters\" });\n const response = await request(requestUrl, \"GET\", {\n headers: { Accept: \"application/json+clicky\", ...headers },\n });\n if (response.status === 404) return { filters: {} };\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) throw errorFromResponse(response, \"GET\", requestUrl, parsed);\n return (parsed.data as OperationLookupResponse | undefined) ?? { filters: {} };\n }\n\n const response = await request(appendQuery(resolved.path, { __lookup: \"filters\" }), upper, {\n headers: {\n Accept: \"application/json+clicky\",\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify(resolved.params),\n });\n if (response.status === 404) return { filters: {} };\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) throw errorFromResponse(response, upper, resolved.path, parsed);\n return (parsed.data as OperationLookupResponse | undefined) ?? { filters: {} };\n },\n\n async lookupFilterOptions(path, method, filterKey, query, extraParams) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, {});\n const queryParams = {\n ...extraParams,\n __lookup: \"filters\",\n __lookup_filter: filterKey,\n __lookup_q: query,\n };\n\n const requestPath = appendQuery(resolved.path, queryParams);\n const response = await request(requestPath, upper, {\n headers: { Accept: \"application/json+clicky\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) throw errorFromResponse(response, upper, requestPath, parsed);\n return ((parsed.data as OperationLookupResponse | undefined)?.filters?.[filterKey] ??\n {}) as OperationLookupFilter;\n },\n };\n}\n\nfunction responseKind(accept?: string): \"json\" | \"text\" | \"blob\" {\n if (!accept) return \"json\";\n const normalized = accept.toLowerCase();\n if (normalized.includes(\"application/pdf\")) return \"blob\";\n if (\n normalized.includes(\"text/\") ||\n normalized.includes(\"application/x-yaml\") ||\n normalized.includes(\"application/yaml\")\n ) {\n return \"text\";\n }\n return \"json\";\n}\n\ntype ParsedBody = {\n data: unknown;\n text: string;\n blob?: Blob;\n contentType: string;\n};\n\nasync function readResponseBody(response: Response, kind: \"json\" | \"text\" | \"blob\"): Promise<ParsedBody> {\n const contentType = response.headers.get(\"Content-Type\") || \"\";\n if (kind === \"blob\") {\n const blob = await response.blob();\n return { data: undefined, text: \"[binary]\", blob, contentType };\n }\n\n const text = await response.text();\n if (kind === \"text\" || !shouldParseJson(text, contentType)) {\n return { data: text, text, contentType };\n }\n\n try {\n return { data: JSON.parse(text) as unknown, text, contentType };\n } catch {\n return { data: text, text, contentType };\n }\n}\n\nfunction parseExecutionResponse(\n response: Response,\n parsed: ParsedBody,\n context: { method: string; requestUrl: string },\n): ExecutionResponse {\n const headers = responseHeaders(response.headers);\n const data = parsed.data;\n const stdout =\n parsed.blob != null\n ? \"[binary]\"\n : typeof data === \"string\"\n ? data\n : parsed.text || JSON.stringify(data, null, 2);\n const clickyEnvelope = isClickyEnvelope(data);\n\n if (!response.ok && !clickyEnvelope) {\n throw errorFromResponse(response, context.method, context.requestUrl, parsed);\n }\n\n const clickyError = errorFromClickyEnvelope(data);\n const successHeader = headers[\"x-execution-success\"];\n const success = successHeader == null ? response.ok && !clickyError : successHeader !== \"false\";\n const exitCode = parseInt(headers[\"x-exit-code\"] ?? (success ? \"0\" : \"1\"), 10);\n const cli = headers[\"x-cli-command\"];\n const error = headers[\"x-error\"] || clickyError;\n const pagination = paginationFromHeaders(headers);\n\n return {\n success,\n stdout,\n output: stdout,\n exit_code: Number.isFinite(exitCode) ? exitCode : success ? 0 : 1,\n contentType: parsed.contentType || headers[\"content-type\"] || \"application/json\",\n requestUrl: context.requestUrl,\n responseHeaders: headers,\n ...(pagination ? { pagination } : {}),\n ...(cli ? { cli } : {}),\n ...(error ? { error } : {}),\n ...(parsed.blob ? { blob: parsed.blob } : {}),\n ...(parsed.blob == null && typeof data !== \"string\" ? { parsed: data } : {}),\n };\n}\n\nfunction errorFromResponse(\n response: Response,\n method: string,\n url: string,\n parsed: ParsedBody,\n): OperationsApiClientError {\n const headers = responseHeaders(response.headers);\n const message =\n headers[\"x-error\"] ||\n messageFromBody(parsed.data) ||\n `${method} ${url} failed with ${response.status}: ${\n parsed.text || response.statusText\n }`;\n return new OperationsApiClientError(message, {\n status: response.status,\n method,\n url,\n responseBody: parsed.text,\n responseData: parsed.data,\n responseHeaders: headers,\n });\n}\n\nfunction resolvePathParams(\n path: string,\n params: Record<string, string>,\n): { path: string; params: Record<string, string> } {\n const queryParams = { ...params };\n let resolvedPath = path;\n const placeholders = [...path.matchAll(/\\{([^{}]+)\\}/g)]\n .map((match) => match[1])\n .filter((name): name is string => Boolean(name));\n const argValues = parseArgsParam(params.args);\n let consumedArgs = false;\n const consumedDirectValues: string[] = [];\n\n for (const [index, name] of placeholders.entries()) {\n const directValue = queryParams[name];\n const fallbackValue = directValue || argValues[index];\n if (!fallbackValue) continue;\n\n resolvedPath = resolvedPath.replace(`{${name}}`, encodeURIComponent(fallbackValue));\n delete queryParams[name];\n if (!directValue && argValues[index]) consumedArgs = true;\n if (directValue) consumedDirectValues[index] = directValue;\n }\n\n const argsDuplicateResolvedPath =\n argValues.length > 0 &&\n argValues.length === consumedDirectValues.filter(Boolean).length &&\n argValues.every((value, index) => value === consumedDirectValues[index]);\n\n if (consumedArgs || argsDuplicateResolvedPath) {\n delete queryParams.args;\n }\n\n return { path: resolvedPath, params: stripRunnerParams(queryParams) };\n}\n\nfunction parseArgsParam(value: string | undefined): string[] {\n if (!value) return [];\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed.toLowerCase() === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited args below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction stripRunnerParams(params: Record<string, string>) {\n const next = { ...params };\n delete next.autoRun;\n delete next.__autoRun;\n return next;\n}\n\nfunction appendQuery(path: string, params: Record<string, string>) {\n const query = new URLSearchParams(pruneParams(params)).toString();\n if (!query) return path;\n return `${path}${path.includes(\"?\") ? \"&\" : \"?\"}${query}`;\n}\n\nfunction pruneParams(params: Record<string, string>) {\n return Object.fromEntries(Object.entries(params).filter(([, value]) => value !== \"\"));\n}\n\nfunction joinUrl(baseUrl: string | undefined, path: string) {\n if (!baseUrl || /^https?:\\/\\//i.test(path)) return path;\n return `${stripTrailingSlashes(baseUrl)}/${stripLeadingSlashes(path)}`;\n}\n\nfunction headerValue(headers: Record<string, string> | undefined, name: string) {\n const wanted = name.toLowerCase();\n for (const [key, value] of Object.entries(headers ?? {})) {\n if (key.toLowerCase() === wanted) return value;\n }\n return undefined;\n}\n\nfunction responseHeaders(headers: Headers): Record<string, string> {\n const out: Record<string, string> = {};\n headers.forEach((value, key) => {\n out[key.toLowerCase()] = value;\n });\n return out;\n}\n\nfunction paginationFromHeaders(headers: Record<string, string>): ExecutionPagination | undefined {\n const pagination: ExecutionPagination = {};\n const total = integerHeader(headers[\"x-total-count\"]);\n const limit = integerHeader(headers[\"x-page-limit\"]);\n const offset = integerHeader(headers[\"x-page-offset\"]);\n\n if (total !== undefined) pagination.total = total;\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n\n return Object.keys(pagination).length > 0 ? pagination : undefined;\n}\n\nfunction integerHeader(value: string | undefined): number | undefined {\n if (value == null || value.trim() === \"\") return undefined;\n const parsed = parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction shouldParseJson(text: string, contentType: string) {\n const trimmed = text.trim();\n return (\n trimmed !== \"\" &&\n (contentType.toLowerCase().includes(\"json\") ||\n trimmed.startsWith(\"{\") ||\n trimmed.startsWith(\"[\"))\n );\n}\n\nfunction isClickyEnvelope(data: unknown): boolean {\n if (!data || typeof data !== \"object\") return false;\n const body = data as Record<string, unknown>;\n return body.version != null && body.node != null && typeof body.node === \"object\";\n}\n\nfunction readClickyText(node: unknown): string | undefined {\n if (!node || typeof node !== \"object\") return undefined;\n const n = node as Record<string, unknown>;\n if (typeof n.plain === \"string\" && n.plain !== \"\") return n.plain;\n if (typeof n.text === \"string\" && n.text !== \"\") return n.text;\n if (Array.isArray(n.children)) {\n for (const child of n.children) {\n const text = readClickyText(child);\n if (text) return text;\n }\n }\n return undefined;\n}\n\nfunction errorFromClickyEnvelope(data: unknown): string | undefined {\n if (!data || typeof data !== \"object\") return undefined;\n const node = (data as Record<string, unknown>).node;\n if (!node || typeof node !== \"object\") return undefined;\n const n = node as Record<string, unknown>;\n if (n.kind !== \"map\" || !Array.isArray(n.fields)) return undefined;\n\n let errorText: string | undefined;\n let failed = false;\n for (const field of n.fields) {\n if (!field || typeof field !== \"object\") continue;\n const f = field as Record<string, unknown>;\n if (f.name === \"Error\") errorText = readClickyText(f.value);\n if (f.name === \"Success\" && readClickyText(f.value) === \"false\") failed = true;\n }\n return failed ? errorText : undefined;\n}\n\nfunction messageFromBody(data: unknown): string | undefined {\n if (!data || typeof data !== \"object\") return undefined;\n const body = data as Record<string, unknown>;\n if (typeof body.error === \"string\" && body.error) return body.error;\n if (typeof body.message === \"string\" && body.message) return body.message;\n return errorFromClickyEnvelope(data);\n}\n"],"names":["response","parsed","stripTrailingSlashes","stripLeadingSlashes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"apiClient.cjs","sources":["../../src/rpc/apiClient.ts"],"sourcesContent":["import type { JsonSchemaObject } from \"../components/json-schema-form-types\";\nimport { stripLeadingSlashes, stripTrailingSlashes } from \"../lib/string\";\nimport type {\n ExecutionPagination,\n ExecutionResponse,\n OpenAPISpec,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type OperationApiClientContext = {\n path: string;\n method: string;\n};\n\nexport type OperationDefaultParams = (context: {\n path: string;\n method: string;\n params: Record<string, string>;\n}) => MaybePromise<Record<string, string>>;\n\nexport type OperationHeadersProvider = (\n headers: Headers,\n context: OperationApiClientContext,\n) => MaybePromise<HeadersInit | void>;\n\nexport type CreateOperationsApiClientOptions = {\n baseUrl?: string;\n openApiPath?: string;\n credentials?: RequestCredentials;\n fetch?: typeof fetch;\n prepareHeaders?: OperationHeadersProvider;\n defaultParams?: OperationDefaultParams;\n};\n\nexport class OperationsApiClientError extends Error {\n status: number | undefined;\n method: string | undefined;\n url: string | undefined;\n responseBody: string | undefined;\n responseData: unknown;\n responseHeaders: Record<string, string> | undefined;\n\n constructor(\n message: string,\n options: {\n status?: number;\n method?: string;\n url?: string;\n responseBody?: string;\n responseData?: unknown;\n responseHeaders?: Record<string, string>;\n } = {},\n ) {\n super(message);\n this.name = \"OperationsApiClientError\";\n this.status = options.status;\n this.method = options.method;\n this.url = options.url;\n this.responseBody = options.responseBody;\n this.responseData = options.responseData;\n this.responseHeaders = options.responseHeaders;\n }\n}\n\nexport interface SharedOperationsApiClient extends OperationsApiClient {\n lookupFilterOptions(\n path: string,\n method: string,\n filterKey: string,\n query: string,\n extraParams?: Record<string, string>,\n ): Promise<OperationLookupFilter>;\n executeCommandBody(\n path: string,\n body: Record<string, unknown>,\n headers?: Record<string, string>,\n ): Promise<ExecutionResponse>;\n getSchema(path: string): Promise<JsonSchemaObject | undefined>;\n submitForm(\n path: string,\n method: string,\n body: Record<string, unknown>,\n headers?: Record<string, string>,\n ): Promise<ExecutionResponse>;\n}\n\nexport function createOperationsApiClient(\n options: CreateOperationsApiClientOptions = {},\n): SharedOperationsApiClient {\n const fetcher = options.fetch ?? fetch;\n const openApiPath = options.openApiPath ?? \"/api/openapi.json\";\n\n async function makeHeaders(\n base: HeadersInit | undefined,\n context: OperationApiClientContext,\n ): Promise<Headers> {\n const headers = new Headers(base);\n const prepared = await options.prepareHeaders?.(headers, context);\n return prepared ? new Headers(prepared) : headers;\n }\n\n async function request(\n path: string,\n method: string,\n init: Omit<RequestInit, \"method\" | \"headers\" | \"credentials\"> & {\n headers?: HeadersInit;\n requestUrl?: string;\n } = {},\n ): Promise<Response> {\n const url = joinUrl(options.baseUrl, path);\n const headers = await makeHeaders(init.headers, { path, method });\n return fetcher(url, {\n ...init,\n method,\n headers,\n ...(options.credentials ? { credentials: options.credentials } : {}),\n });\n }\n\n async function getOpenAPISpec(): Promise<OpenAPISpec> {\n const response = await request(openApiPath, \"GET\", {\n headers: { Accept: \"application/json\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) {\n throw errorFromResponse(response, \"GET\", openApiPath, parsed);\n }\n return parsed.data as OpenAPISpec;\n }\n\n async function withDefaults(path: string, method: string, params: Record<string, string>) {\n return (await options.defaultParams?.({ path, method, params })) ?? params;\n }\n\n return {\n getOpenAPISpec,\n\n async executeCommand(path, method, params, headers) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, params);\n const scoped = await withDefaults(resolved.path, upper, resolved.params);\n const accept = headerValue(headers, \"Accept\");\n\n if (upper === \"GET\") {\n const requestUrl = appendQuery(resolved.path, scoped);\n const response = await request(requestUrl, upper, {\n ...(headers ? { headers } : {}),\n requestUrl,\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl,\n });\n }\n\n const response = await request(resolved.path, upper, {\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify(scoped),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl: resolved.path,\n });\n },\n\n async executeCommandBody(path, body, headers) {\n const accept = headerValue(headers, \"Accept\");\n const response = await request(path, \"POST\", {\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: \"POST\",\n requestUrl: path,\n });\n },\n\n // getSchema fetches a resource's JSON Schema via content negotiation\n // (Accept: application/schema+json on the same endpoint). It returns\n // undefined when the resource serves no schema (the request falls through to\n // its data representation), so callers can fall back to a parameter form.\n async getSchema(path) {\n const response = await request(path, \"GET\", {\n headers: { Accept: \"application/schema+json\" },\n });\n if (!response.ok) return undefined;\n const contentType = response.headers.get(\"Content-Type\") || \"\";\n if (!contentType.toLowerCase().includes(\"schema\")) return undefined;\n const parsed = await readResponseBody(response, \"json\");\n const data = parsed.data;\n return data && typeof data === \"object\" ? (data as JsonSchemaObject) : undefined;\n },\n\n // submitForm sends a nested JSON body with the given HTTP method (POST to\n // create, PUT to update). Unlike executeCommand it preserves nested objects\n // and arrays — the server reads the raw body (clicky's RequestFromContext),\n // so connection `properties` and profile `provider`/`params`/`columns`\n // survive intact.\n async submitForm(path, method, body, headers) {\n const upper = method.toUpperCase();\n const response = await request(path, upper, {\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n });\n return parseExecutionResponse(response, await readResponseBody(response, \"json\"), {\n method: upper,\n requestUrl: path,\n });\n },\n\n async lookupFilters(path, method, params, headers) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, params);\n\n if (upper === \"GET\") {\n const requestUrl = appendQuery(resolved.path, { ...resolved.params, __lookup: \"filters\" });\n const response = await request(requestUrl, \"GET\", {\n headers: { Accept: \"application/json+clicky\", ...headers },\n });\n if (response.status === 404) return { filters: {} };\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) throw errorFromResponse(response, \"GET\", requestUrl, parsed);\n return (parsed.data as OperationLookupResponse | undefined) ?? { filters: {} };\n }\n\n const response = await request(appendQuery(resolved.path, { __lookup: \"filters\" }), upper, {\n headers: {\n Accept: \"application/json+clicky\",\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify(resolved.params),\n });\n if (response.status === 404) return { filters: {} };\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) throw errorFromResponse(response, upper, resolved.path, parsed);\n return (parsed.data as OperationLookupResponse | undefined) ?? { filters: {} };\n },\n\n async lookupFilterOptions(path, method, filterKey, query, extraParams) {\n const upper = method.toUpperCase();\n // Resolved against the supplied params, as lookupFilters does: a lookup on\n // an operation with a templated path would otherwise request the literal\n // \"{id}\" and the sibling values that scope the search would be lost.\n const resolved = resolvePathParams(path, extraParams ?? {});\n const queryParams = {\n ...resolved.params,\n __lookup: \"filters\",\n __lookup_filter: filterKey,\n __lookup_q: query,\n };\n\n const requestPath = appendQuery(resolved.path, queryParams);\n const response = await request(requestPath, upper, {\n headers: { Accept: \"application/json+clicky\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) throw errorFromResponse(response, upper, requestPath, parsed);\n return ((parsed.data as OperationLookupResponse | undefined)?.filters?.[filterKey] ??\n {}) as OperationLookupFilter;\n },\n };\n}\n\nfunction responseKind(accept?: string): \"json\" | \"text\" | \"blob\" {\n if (!accept) return \"json\";\n const normalized = accept.toLowerCase();\n if (normalized.includes(\"application/pdf\")) return \"blob\";\n if (\n normalized.includes(\"text/\") ||\n normalized.includes(\"application/x-yaml\") ||\n normalized.includes(\"application/yaml\")\n ) {\n return \"text\";\n }\n return \"json\";\n}\n\ntype ParsedBody = {\n data: unknown;\n text: string;\n blob?: Blob;\n contentType: string;\n};\n\nasync function readResponseBody(response: Response, kind: \"json\" | \"text\" | \"blob\"): Promise<ParsedBody> {\n const contentType = response.headers.get(\"Content-Type\") || \"\";\n if (kind === \"blob\") {\n const blob = await response.blob();\n return { data: undefined, text: \"[binary]\", blob, contentType };\n }\n\n const text = await response.text();\n if (kind === \"text\" || !shouldParseJson(text, contentType)) {\n return { data: text, text, contentType };\n }\n\n try {\n return { data: JSON.parse(text) as unknown, text, contentType };\n } catch {\n return { data: text, text, contentType };\n }\n}\n\nfunction parseExecutionResponse(\n response: Response,\n parsed: ParsedBody,\n context: { method: string; requestUrl: string },\n): ExecutionResponse {\n const headers = responseHeaders(response.headers);\n const data = parsed.data;\n const stdout =\n parsed.blob != null\n ? \"[binary]\"\n : typeof data === \"string\"\n ? data\n : parsed.text || JSON.stringify(data, null, 2);\n const clickyEnvelope = isClickyEnvelope(data);\n\n if (!response.ok && !clickyEnvelope) {\n throw errorFromResponse(response, context.method, context.requestUrl, parsed);\n }\n\n const clickyError = errorFromClickyEnvelope(data);\n const successHeader = headers[\"x-execution-success\"];\n const success = successHeader == null ? response.ok && !clickyError : successHeader !== \"false\";\n const exitCode = parseInt(headers[\"x-exit-code\"] ?? (success ? \"0\" : \"1\"), 10);\n const cli = headers[\"x-cli-command\"];\n const error = headers[\"x-error\"] || clickyError;\n const pagination = paginationFromHeaders(headers);\n\n return {\n success,\n stdout,\n output: stdout,\n exit_code: Number.isFinite(exitCode) ? exitCode : success ? 0 : 1,\n contentType: parsed.contentType || headers[\"content-type\"] || \"application/json\",\n requestUrl: context.requestUrl,\n responseHeaders: headers,\n ...(pagination ? { pagination } : {}),\n ...(cli ? { cli } : {}),\n ...(error ? { error } : {}),\n ...(parsed.blob ? { blob: parsed.blob } : {}),\n ...(parsed.blob == null && typeof data !== \"string\" ? { parsed: data } : {}),\n };\n}\n\nfunction errorFromResponse(\n response: Response,\n method: string,\n url: string,\n parsed: ParsedBody,\n): OperationsApiClientError {\n const headers = responseHeaders(response.headers);\n const message =\n headers[\"x-error\"] ||\n messageFromBody(parsed.data) ||\n `${method} ${url} failed with ${response.status}: ${\n parsed.text || response.statusText\n }`;\n return new OperationsApiClientError(message, {\n status: response.status,\n method,\n url,\n responseBody: parsed.text,\n responseData: parsed.data,\n responseHeaders: headers,\n });\n}\n\nfunction resolvePathParams(\n path: string,\n params: Record<string, string>,\n): { path: string; params: Record<string, string> } {\n const queryParams = { ...params };\n let resolvedPath = path;\n const placeholders = [...path.matchAll(/\\{([^{}]+)\\}/g)]\n .map((match) => match[1])\n .filter((name): name is string => Boolean(name));\n const argValues = parseArgsParam(params.args);\n let consumedArgs = false;\n const consumedDirectValues: string[] = [];\n\n for (const [index, name] of placeholders.entries()) {\n const directValue = queryParams[name];\n const fallbackValue = directValue || argValues[index];\n if (!fallbackValue) continue;\n\n resolvedPath = resolvedPath.replace(`{${name}}`, encodeURIComponent(fallbackValue));\n delete queryParams[name];\n if (!directValue && argValues[index]) consumedArgs = true;\n if (directValue) consumedDirectValues[index] = directValue;\n }\n\n const argsDuplicateResolvedPath =\n argValues.length > 0 &&\n argValues.length === consumedDirectValues.filter(Boolean).length &&\n argValues.every((value, index) => value === consumedDirectValues[index]);\n\n if (consumedArgs || argsDuplicateResolvedPath) {\n delete queryParams.args;\n }\n\n return { path: resolvedPath, params: stripRunnerParams(queryParams) };\n}\n\nfunction parseArgsParam(value: string | undefined): string[] {\n if (!value) return [];\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed.toLowerCase() === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited args below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction stripRunnerParams(params: Record<string, string>) {\n const next = { ...params };\n delete next.autoRun;\n delete next.__autoRun;\n return next;\n}\n\nfunction appendQuery(path: string, params: Record<string, string>) {\n const query = new URLSearchParams(pruneParams(params)).toString();\n if (!query) return path;\n return `${path}${path.includes(\"?\") ? \"&\" : \"?\"}${query}`;\n}\n\nfunction pruneParams(params: Record<string, string>) {\n return Object.fromEntries(Object.entries(params).filter(([, value]) => value !== \"\"));\n}\n\nfunction joinUrl(baseUrl: string | undefined, path: string) {\n if (!baseUrl || /^https?:\\/\\//i.test(path)) return path;\n return `${stripTrailingSlashes(baseUrl)}/${stripLeadingSlashes(path)}`;\n}\n\nfunction headerValue(headers: Record<string, string> | undefined, name: string) {\n const wanted = name.toLowerCase();\n for (const [key, value] of Object.entries(headers ?? {})) {\n if (key.toLowerCase() === wanted) return value;\n }\n return undefined;\n}\n\nfunction responseHeaders(headers: Headers): Record<string, string> {\n const out: Record<string, string> = {};\n headers.forEach((value, key) => {\n out[key.toLowerCase()] = value;\n });\n return out;\n}\n\nfunction paginationFromHeaders(headers: Record<string, string>): ExecutionPagination | undefined {\n const pagination: ExecutionPagination = {};\n const total = integerHeader(headers[\"x-total-count\"]);\n const limit = integerHeader(headers[\"x-page-limit\"]);\n const offset = integerHeader(headers[\"x-page-offset\"]);\n\n if (total !== undefined) pagination.total = total;\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n\n const relation = headers[\"x-total-relation\"];\n if (relation === \"eq\" || relation === \"gte\") pagination.totalRelation = relation;\n\n const hasMore = booleanHeader(headers[\"x-has-more\"]);\n if (hasMore !== undefined) pagination.hasMore = hasMore;\n\n const cursor = headers[\"x-next-cursor\"];\n if (cursor != null && cursor.trim() !== \"\") pagination.nextCursor = cursor;\n\n if (booleanHeader(headers[\"x-truncated\"]) === true) pagination.truncated = true;\n\n return Object.keys(pagination).length > 0 ? pagination : undefined;\n}\n\nfunction booleanHeader(value: string | undefined): boolean | undefined {\n if (value == null || value.trim() === \"\") return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized === \"true\") return true;\n if (normalized === \"false\") return false;\n return undefined;\n}\n\nfunction integerHeader(value: string | undefined): number | undefined {\n if (value == null || value.trim() === \"\") return undefined;\n const parsed = parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction shouldParseJson(text: string, contentType: string) {\n const trimmed = text.trim();\n return (\n trimmed !== \"\" &&\n (contentType.toLowerCase().includes(\"json\") ||\n trimmed.startsWith(\"{\") ||\n trimmed.startsWith(\"[\"))\n );\n}\n\nfunction isClickyEnvelope(data: unknown): boolean {\n if (!data || typeof data !== \"object\") return false;\n const body = data as Record<string, unknown>;\n return body.version != null && body.node != null && typeof body.node === \"object\";\n}\n\nfunction readClickyText(node: unknown): string | undefined {\n if (!node || typeof node !== \"object\") return undefined;\n const n = node as Record<string, unknown>;\n if (typeof n.plain === \"string\" && n.plain !== \"\") return n.plain;\n if (typeof n.text === \"string\" && n.text !== \"\") return n.text;\n if (Array.isArray(n.children)) {\n for (const child of n.children) {\n const text = readClickyText(child);\n if (text) return text;\n }\n }\n return undefined;\n}\n\nfunction errorFromClickyEnvelope(data: unknown): string | undefined {\n if (!data || typeof data !== \"object\") return undefined;\n const node = (data as Record<string, unknown>).node;\n if (!node || typeof node !== \"object\") return undefined;\n const n = node as Record<string, unknown>;\n if (n.kind !== \"map\" || !Array.isArray(n.fields)) return undefined;\n\n let errorText: string | undefined;\n let failed = false;\n for (const field of n.fields) {\n if (!field || typeof field !== \"object\") continue;\n const f = field as Record<string, unknown>;\n if (f.name === \"Error\") errorText = readClickyText(f.value);\n if (f.name === \"Success\" && readClickyText(f.value) === \"false\") failed = true;\n }\n return failed ? errorText : undefined;\n}\n\nfunction messageFromBody(data: unknown): string | undefined {\n if (!data || typeof data !== \"object\") return undefined;\n const body = data as Record<string, unknown>;\n if (typeof body.error === \"string\" && body.error) return body.error;\n if (typeof body.message === \"string\" && body.message) return body.message;\n return errorFromClickyEnvelope(data);\n}\n"],"names":["response","parsed","stripTrailingSlashes","stripLeadingSlashes"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../src/rpc/apiClient.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../src/rpc/apiClient.ts"],"names":[],"mappings":"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"}
|
package/dist/rpc/apiClient.js
CHANGED
|
@@ -151,9 +151,9 @@ function createOperationsApiClient(options = {}) {
|
|
|
151
151
|
async lookupFilterOptions(path, method, filterKey, query, extraParams) {
|
|
152
152
|
var _a, _b;
|
|
153
153
|
const upper = method.toUpperCase();
|
|
154
|
-
const resolved = resolvePathParams(path, {});
|
|
154
|
+
const resolved = resolvePathParams(path, extraParams ?? {});
|
|
155
155
|
const queryParams = {
|
|
156
|
-
...
|
|
156
|
+
...resolved.params,
|
|
157
157
|
__lookup: "filters",
|
|
158
158
|
__lookup_filter: filterKey,
|
|
159
159
|
__lookup_q: query
|
|
@@ -308,8 +308,22 @@ function paginationFromHeaders(headers) {
|
|
|
308
308
|
if (total !== void 0) pagination.total = total;
|
|
309
309
|
if (limit !== void 0) pagination.limit = limit;
|
|
310
310
|
if (offset !== void 0) pagination.offset = offset;
|
|
311
|
+
const relation = headers["x-total-relation"];
|
|
312
|
+
if (relation === "eq" || relation === "gte") pagination.totalRelation = relation;
|
|
313
|
+
const hasMore = booleanHeader(headers["x-has-more"]);
|
|
314
|
+
if (hasMore !== void 0) pagination.hasMore = hasMore;
|
|
315
|
+
const cursor = headers["x-next-cursor"];
|
|
316
|
+
if (cursor != null && cursor.trim() !== "") pagination.nextCursor = cursor;
|
|
317
|
+
if (booleanHeader(headers["x-truncated"]) === true) pagination.truncated = true;
|
|
311
318
|
return Object.keys(pagination).length > 0 ? pagination : void 0;
|
|
312
319
|
}
|
|
320
|
+
function booleanHeader(value) {
|
|
321
|
+
if (value == null || value.trim() === "") return void 0;
|
|
322
|
+
const normalized = value.trim().toLowerCase();
|
|
323
|
+
if (normalized === "true") return true;
|
|
324
|
+
if (normalized === "false") return false;
|
|
325
|
+
return void 0;
|
|
326
|
+
}
|
|
313
327
|
function integerHeader(value) {
|
|
314
328
|
if (value == null || value.trim() === "") return void 0;
|
|
315
329
|
const parsed = parseInt(value, 10);
|