@flanksource/clicky-ui 0.3.22 → 0.3.24
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/components/CountryFlag.cjs +55 -0
- package/dist/components/CountryFlag.cjs.map +1 -0
- package/dist/components/CountryFlag.d.ts +8 -0
- package/dist/components/CountryFlag.d.ts.map +1 -0
- package/dist/components/CountryFlag.js +38 -0
- package/dist/components/CountryFlag.js.map +1 -0
- package/dist/components/CountryPicker.cjs +35 -0
- package/dist/components/CountryPicker.cjs.map +1 -0
- package/dist/components/CountryPicker.d.ts +4 -0
- package/dist/components/CountryPicker.d.ts.map +1 -0
- package/dist/components/CountryPicker.js +35 -0
- package/dist/components/CountryPicker.js.map +1 -0
- package/dist/components/SplitButton.cjs +3 -2
- package/dist/components/SplitButton.cjs.map +1 -1
- package/dist/components/SplitButton.d.ts +6 -1
- package/dist/components/SplitButton.d.ts.map +1 -1
- package/dist/components/SplitButton.js +3 -2
- package/dist/components/SplitButton.js.map +1 -1
- package/dist/components/country-options.cjs +34 -0
- package/dist/components/country-options.cjs.map +1 -0
- package/dist/components/country-options.d.ts +8 -0
- package/dist/components/country-options.d.ts.map +1 -0
- package/dist/components/country-options.js +34 -0
- package/dist/components/country-options.js.map +1 -0
- package/dist/components.cjs +11 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +4 -0
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +11 -0
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +4 -1
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +4 -1
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/CodeDiff.cjs +3 -18
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.d.ts.map +1 -1
- package/dist/data/CodeDiff.js +3 -18
- package/dist/data/CodeDiff.js.map +1 -1
- package/dist/data/DataTable.cjs +182 -64
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +9 -1
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.cjs +26 -0
- package/dist/data/DataTable.grouping.cjs.map +1 -1
- package/dist/data/DataTable.grouping.d.ts +38 -0
- package/dist/data/DataTable.grouping.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.js +26 -0
- package/dist/data/DataTable.grouping.js.map +1 -1
- package/dist/data/DataTable.js +183 -65
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/DataTableGroupingControls.cjs +84 -0
- package/dist/data/DataTableGroupingControls.cjs.map +1 -0
- package/dist/data/DataTableGroupingControls.d.ts +17 -0
- package/dist/data/DataTableGroupingControls.d.ts.map +1 -0
- package/dist/data/DataTableGroupingControls.js +84 -0
- package/dist/data/DataTableGroupingControls.js.map +1 -0
- package/dist/data/HighlightedTokens.cjs +21 -0
- package/dist/data/HighlightedTokens.cjs.map +1 -0
- package/dist/data/HighlightedTokens.d.ts +6 -0
- package/dist/data/HighlightedTokens.d.ts.map +1 -0
- package/dist/data/HighlightedTokens.js +21 -0
- package/dist/data/HighlightedTokens.js.map +1 -0
- package/dist/data/ai/AdvancedChatConfig.cjs +3 -0
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts +2 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.js +3 -0
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +77 -4
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +78 -5
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +19 -4
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.d.ts +2 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.js +19 -4
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
- package/dist/data/ai/ChatWindow.test-utils.d.ts +2 -1
- package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +8 -1
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +2 -1
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +8 -1
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/chat/Chat.cjs +26 -3
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +9 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +26 -3
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +2 -0
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts +2 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +2 -0
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/Message.cjs +36 -1
- package/dist/data/chat/Message.cjs.map +1 -1
- package/dist/data/chat/Message.d.ts +1 -1
- package/dist/data/chat/Message.d.ts.map +1 -1
- package/dist/data/chat/Message.js +37 -2
- package/dist/data/chat/Message.js.map +1 -1
- package/dist/data/chat/approval.cjs +17 -0
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +5 -0
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js +17 -0
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/fork-seed.cjs +22 -0
- package/dist/data/chat/fork-seed.cjs.map +1 -0
- package/dist/data/chat/fork-seed.d.ts +8 -0
- package/dist/data/chat/fork-seed.d.ts.map +1 -0
- package/dist/data/chat/fork-seed.js +22 -0
- package/dist/data/chat/fork-seed.js.map +1 -0
- package/dist/data/code-highlight.cjs +0 -6
- package/dist/data/code-highlight.cjs.map +1 -1
- package/dist/data/code-highlight.d.ts +4 -3
- package/dist/data/code-highlight.d.ts.map +1 -1
- package/dist/data/code-highlight.js +1 -7
- package/dist/data/code-highlight.js.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +6 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +8 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +6 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.cjs +29 -5
- package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.js +29 -5
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +54 -24
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts +2 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +54 -24
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts +3 -0
- package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.js.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.cjs +14 -30
- package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.d.ts +6 -9
- package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.js +15 -31
- package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.cjs +14 -144
- package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.d.ts +6 -6
- package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.js +15 -145
- package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.cjs +65 -0
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.d.ts +13 -0
- package/dist/data/diagnostics/StackFrameRow.d.ts.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.js +65 -0
- package/dist/data/diagnostics/StackFrameRow.js.map +1 -0
- package/dist/data/diagnostics/ThreadCard.cjs +9 -2
- package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
- package/dist/data/diagnostics/ThreadCard.d.ts +3 -1
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
- package/dist/data/diagnostics/ThreadCard.js +9 -2
- package/dist/data/diagnostics/ThreadCard.js.map +1 -1
- package/dist/data/diagnostics/frame-heuristics.cjs +26 -0
- package/dist/data/diagnostics/frame-heuristics.cjs.map +1 -0
- package/dist/data/diagnostics/frame-heuristics.d.ts +5 -0
- package/dist/data/diagnostics/frame-heuristics.d.ts.map +1 -0
- package/dist/data/diagnostics/frame-heuristics.js +26 -0
- package/dist/data/diagnostics/frame-heuristics.js.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.cjs +5 -7
- package/dist/data/diagnostics/jvm-stacktrace.cjs.map +1 -1
- package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -1
- package/dist/data/diagnostics/jvm-stacktrace.js +5 -7
- package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.cjs +4 -9
- package/dist/data/diagnostics/stacktrace-parse.cjs.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.js +4 -9
- package/dist/data/diagnostics/stacktrace-parse.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +3 -0
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +3 -1
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +3 -0
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.cjs +15 -1
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts +2 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.js +15 -1
- package/dist/data/runtime/RuntimeBarCombo.js.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.cjs +7 -0
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts +2 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.js +7 -0
- package/dist/data/runtime/RuntimeBarSegments.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +7 -1
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +4 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +8 -2
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +18 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/rpc/CommandForm.cjs +8 -18
- package/dist/rpc/CommandForm.cjs.map +1 -1
- package/dist/rpc/CommandForm.d.ts +8 -2
- package/dist/rpc/CommandForm.d.ts.map +1 -1
- package/dist/rpc/CommandForm.js +9 -19
- package/dist/rpc/CommandForm.js.map +1 -1
- package/dist/rpc/OperationActionDialog.cjs +3 -3
- package/dist/rpc/OperationActionDialog.cjs.map +1 -1
- package/dist/rpc/OperationActionDialog.js +3 -3
- package/dist/rpc/OperationActionDialog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs +7 -7
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js +7 -7
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/apiClient.cjs +17 -3
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts +4 -4
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +17 -3
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +5 -9
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +3 -3
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +5 -9
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +1 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc/useOperations.cjs.map +1 -1
- package/dist/rpc/useOperations.d.ts +4 -4
- package/dist/rpc/useOperations.d.ts.map +1 -1
- package/dist/rpc/useOperations.js.map +1 -1
- package/dist/rpc.d.ts +2 -2
- package/dist/rpc.d.ts.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCommandPage.js","sources":["../../src/rpc/OperationCommandPage.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { stripTrailingSlashes } from \"../lib/string\";\nimport { CommandForm } from \"./CommandForm\";\nimport { pathParamNames, submitValue } from \"./command-form-utils\";\nimport type { RenderLink } from \"./EndpointList\";\nimport {\n buildInitialParameterValues,\n dataTablePaginationFromForm,\n packLookupParameterValues,\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport { useCursorStaleRecovery } from \"./cursorStale\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationActionDialog } from \"./OperationActionDialog\";\nimport { OperationResultView } from \"./OperationResultView\";\nimport { hrefForOperation } from \"./rowNavigation\";\nimport type {\n ExecutionResponse,\n OpenAPIParameter,\n ResolvedOperation,\n} from \"./types\";\nimport { useOperationById, type OperationsApiClient } from \"./useOperations\";\n\n// All operation results are fetched as clicky documents; the in-result View\n// menu re-fetches other formats on demand via the response's requestUrl.\nconst RESULT_ACCEPT = \"application/clicky+json\";\n\nexport type OperationCommandPageProps = {\n client: OperationsApiClient;\n operationId?: string;\n operation?: ResolvedOperation;\n operations?: ResolvedOperation[];\n initialValues?: ParameterValues;\n autoRun?: boolean;\n backHref?: string;\n backLabel?: string;\n renderLink?: RenderLink;\n commandRuntime?: ClickyCommandRuntime;\n onNavigate?: (href: string) => void;\n onResult?: (\n response: ExecutionResponse,\n operation: ResolvedOperation,\n values: ParameterValues,\n ) => void;\n hideLockedPathFilters?: boolean;\n className?: string;\n};\n\nconst EMPTY_PARAMETER_VALUES: ParameterValues = {};\n\nexport function OperationCommandPage({\n client,\n operationId,\n operation: providedOperation,\n operations = providedOperation ? [providedOperation] : [],\n initialValues = EMPTY_PARAMETER_VALUES,\n autoRun,\n backHref,\n backLabel = \"Back\",\n renderLink,\n onNavigate,\n onResult,\n commandRuntime,\n hideLockedPathFilters = Boolean(providedOperation),\n className,\n}: OperationCommandPageProps) {\n const lookup = useOperationById(\n client,\n providedOperation ? undefined : operationId,\n );\n const operation = providedOperation ?? lookup.operation;\n const isLoading = providedOperation ? false : lookup.isLoading;\n const [isExecuting, setIsExecuting] = useState(false);\n const [result, setResult] = useState<ExecutionResponse | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [hasAutoRun, setHasAutoRun] = useState(false);\n const parameters = operation?.operation.parameters ?? [];\n const isGet = (operation?.method ?? \"\").toUpperCase() === \"GET\";\n const effectiveAutoRun = operation ? (autoRun ?? isGet) : false;\n const parameterSignature = JSON.stringify(\n parameters.map((param) => ({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n default: param.schema?.default ?? null,\n })),\n );\n const operationKey = `${operation?.method ?? \"\"}:${operation?.path ?? \"\"}:${operation?.operation.operationId ?? \"\"}`;\n const effectiveInitialValues = useMemo(\n () =>\n operation\n ? buildInitialParameterValues(\n parameters,\n operation.method,\n {},\n {\n ...readQueryParameterValuesFromUrl(parameters),\n ...stripRunnerParams(initialValues),\n },\n )\n : stripRunnerParams(initialValues),\n [initialValues, operation?.method, parameterSignature],\n );\n const pathParameters = parameters.filter((param) => param.in === \"path\");\n const lockedPathValues = useMemo<ParameterValues>(() => {\n const values: ParameterValues = {};\n for (const param of pathParameters) {\n const value = effectiveInitialValues[param.name];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n values[param.name] = value;\n }\n }\n return values;\n }, [effectiveInitialValues, pathParameters]);\n const detailOperation = useMemo(\n () => (operation ? findDetailOperation(operation, operations) : undefined),\n [operation, operations],\n );\n const relatedOperations = useMemo(\n () =>\n operation\n ? findRelatedOperations(operation, operations, lockedPathValues)\n : [],\n [lockedPathValues, operation, operations],\n );\n\n // GET-mode parameter state: filter values + pagination cursor are driven\n // by the page so they can flow natively into the result table's in-table\n // FilterBar and pagination footer (via OperationResultView's filterConfig).\n const [values, setValues] = useState<ParameterValues>(effectiveInitialValues);\n useEffect(() => {\n setValues(effectiveInitialValues);\n }, [effectiveInitialValues]);\n const debouncedValues = useDebouncedRecord(values, 250);\n\n useEffect(() => {\n if (!isGet || !operation) return;\n writeQueryParameterValuesToUrl(debouncedValues, parameters);\n }, [isGet, operationKey, debouncedValues, parameterSignature]);\n\n const lookupParameters = useMemo(\n () => packLookupParameterValues(debouncedValues, parameters),\n [debouncedValues, parameters],\n );\n\n const lookupQuery = useQuery({\n queryKey: [\n \"operation-query-lookup\",\n operation?.method,\n operation?.path,\n lookupParameters,\n ],\n queryFn: async () => {\n if (!operation) return { filters: {} };\n return (\n (await client.lookupFilters?.(\n operation.path,\n operation.method,\n lookupParameters,\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} }\n );\n },\n enabled:\n isGet &&\n !!operation &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n // Shapes come from the spec so a control keeps its identity while the lookup\n // that fills it is in flight; see parametersToFormConfig.\n const filterShapes = lookup.spec?.components?.[\"x-clicky-filters\"];\n\n const formConfig = useMemo(() => {\n if (!isGet) return { filters: [] };\n return parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n components: filterShapes,\n lockedValues: lockedPathValues,\n hideLocked: hideLockedPathFilters,\n });\n }, [\n isGet,\n parameters,\n values,\n lookupQuery.data,\n filterShapes,\n lockedPathValues,\n hideLockedPathFilters,\n ]);\n\n const dataTablePagination = useMemo(\n () => dataTablePaginationFromForm(formConfig.pagination, result),\n [formConfig.pagination, result],\n );\n\n // Ref tracking the last submitted parameter signature so the\n // auto-submit-on-debounced-change effect coordinates against the same\n // \"have I already fired this set of values\" check.\n const lastSubmittedSignature = useRef(\"\");\n\n async function executeOperation(values: ParameterValues) {\n if (!operation) return;\n\n setIsExecuting(true);\n setError(null);\n\n try {\n const response = await client.executeCommand(\n operation.path,\n operation.method,\n packParameterValues(values, operation.operation.parameters ?? []),\n { Accept: RESULT_ACCEPT },\n );\n setResult(response);\n onResult?.(response, operation, values);\n } catch (err) {\n setResult(null);\n setError(err);\n } finally {\n setIsExecuting(false);\n }\n }\n\n useCursorStaleRecovery({ error, parameters, values, setValues });\n\n useEffect(() => {\n setHasAutoRun(false);\n setResult(null);\n setError(null);\n lastSubmittedSignature.current = \"\";\n }, [effectiveAutoRun, operationKey]);\n\n useEffect(() => {\n if (!effectiveAutoRun || !operation || hasAutoRun) return;\n // Auto-run a GET as long as every required parameter has a value. Optional\n // params (limit/offset, filter chips, etc.) get their defaults; the\n // sidebar's \"click → instant table\" flow depends on this not bailing just\n // because the operation declares any parameters at all.\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (effectiveInitialValues[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(\n pruneParameterValues(effectiveInitialValues),\n );\n void executeOperation(effectiveInitialValues);\n }, [\n effectiveAutoRun,\n effectiveInitialValues,\n hasAutoRun,\n operationKey,\n parameterSignature,\n ]);\n\n // GET re-runs on debounced filter/pagination changes once the initial\n // auto-run has fired; non-GETs keep their explicit-submit behavior.\n useEffect(() => {\n if (!isGet || !operation || !hasAutoRun) return;\n const merged = { ...debouncedValues, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n const signature = JSON.stringify(pruneParameterValues(merged));\n if (lastSubmittedSignature.current === signature) return;\n lastSubmittedSignature.current = signature;\n void executeOperation(merged);\n }, [\n isGet,\n hasAutoRun,\n debouncedValues,\n lockedPathValues,\n parameterSignature,\n ]);\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a\n href={backHref}\n className=\"text-sm text-primary underline-offset-4 hover:underline\"\n >\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return (\n <div className=\"text-sm text-muted-foreground\">Loading operation...</div>\n );\n }\n\n if (!operation) {\n return (\n <div className=\"space-y-4\">\n <div className=\"text-sm text-muted-foreground\">\n Unknown operation: <code>{operationId}</code>\n </div>\n {backLink}\n </div>\n );\n }\n\n const { path, method, operation: op } = operation;\n\n return (\n <div className={className ?? \"min-w-0 flex-1 space-y-6 p-6\"}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={method} />\n <h1 className=\"truncate text-xl font-bold\">\n {op.summary || op.operationId || path}\n </h1>\n </div>\n <p className=\"mt-1 font-mono text-xs text-muted-foreground\">{path}</p>\n {op.operationId && op.summary && (\n <p className=\"mt-2 font-mono text-xs text-muted-foreground\">\n {op.operationId}\n </p>\n )}\n {op.description && op.description !== op.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {op.description}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-3\">\n {relatedOperations.length > 0 && (\n <div className=\"flex flex-wrap justify-end gap-2\">\n {relatedOperations.map((related) =>\n related.href ? (\n renderLink ? (\n renderLink({\n key: `${related.operation.method}:${related.operation.path}`,\n to: related.href,\n className:\n \"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\",\n children: related.label,\n })\n ) : (\n <a\n key={`${related.operation.method}:${related.operation.path}`}\n href={related.href}\n className=\"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\"\n >\n {related.label}\n </a>\n )\n ) : (\n <OperationActionDialog\n key={`${related.operation.method}:${related.operation.path}`}\n operation={related.operation}\n client={client}\n initialValues={lockedPathValues}\n label={related.label}\n defaultAccept={RESULT_ACCEPT}\n {...(onNavigate ? { onNavigateAction: onNavigate } : {})}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n\n {method.toUpperCase() !== \"GET\" && (\n <section className=\"space-y-3\">\n <div className=\"rounded-lg border p-4\">\n <CommandForm\n parameters={parameters}\n onExecute={(params) => executeOperation(params)}\n isPending={isExecuting}\n method={method}\n path={path}\n accept={RESULT_ACCEPT}\n initialValues={effectiveInitialValues}\n />\n </div>\n </section>\n )}\n\n {error ? (\n <InlineError title={`Failed to load ${path}`} error={error} />\n ) : isExecuting || result ? (\n <OperationResultView\n response={result}\n loading={isExecuting}\n loadingMessage=\"Loading execution results…\"\n ariaLabel=\"Response body\"\n detailOperation={detailOperation}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(isGet && effectiveAutoRun\n ? {\n filterConfig: {\n filters: formConfig.filters,\n ...(formConfig.timeRange\n ? { timeRange: formConfig.timeRange }\n : {}),\n },\n }\n : {})}\n {...(isGet && effectiveAutoRun && dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n {...(isGet && effectiveAutoRun && formConfig.sort\n ? { sort: formConfig.sort }\n : {})}\n />\n ) : null}\n </div>\n );\n}\n\ntype RelatedOperation = {\n operation: ResolvedOperation;\n label: string;\n href?: string;\n};\n\nfunction findRelatedOperations(\n current: ResolvedOperation,\n operations: ResolvedOperation[],\n pathValues: Record<string, string>,\n): RelatedOperation[] {\n if (current.method.toUpperCase() !== \"GET\") return [];\n if (!pathTemplateSatisfied(current.path, pathValues)) return [];\n\n const basePath = stripTrailingSlashes(current.path);\n return operations\n .filter((candidate) => {\n if (candidate === current) return false;\n if (!candidate.path.startsWith(`${basePath}/`)) return false;\n if (!pathTemplateSatisfied(candidate.path, pathValues)) return false;\n const method = candidate.method.toUpperCase();\n return (\n method === \"GET\" ||\n method === \"POST\" ||\n method === \"PUT\" ||\n method === \"DELETE\"\n );\n })\n .map((related) => {\n const method = related.method.toUpperCase();\n const href =\n method === \"GET\"\n ? hrefForOperation(related, [], pathValues)\n : undefined;\n return {\n operation: related,\n label: operationLabel(related),\n ...(href ? { href } : {}),\n };\n })\n .filter(\n (related) =>\n related.operation.method.toUpperCase() !== \"GET\" || related.href,\n );\n}\n\nfunction findDetailOperation(\n current: ResolvedOperation,\n operations: ResolvedOperation[],\n) {\n const method = current.method.toUpperCase();\n const detailPath = `${stripTrailingSlashes(current.path)}/{id}`;\n return operations.find(\n (candidate) =>\n candidate.method.toUpperCase() === method &&\n candidate.path === detailPath &&\n candidate.operation.parameters?.some(\n (param) => param.in === \"path\" && param.name === \"id\" && param.required,\n ),\n );\n}\n\nfunction pathTemplateSatisfied(path: string, values: Record<string, string>) {\n return pathParamNames(path).every((name) => Boolean(values[name]));\n}\n\nfunction operationLabel(operation: ResolvedOperation): string {\n const actionName =\n operation.operation[\"x-clicky\"]?.actionName ||\n operation.path.split(\"/\").filter(Boolean).at(-1) ||\n operation.operation.operationId ||\n operation.method;\n return titleCase(actionName.replace(/[_-]+/g, \" \"));\n}\n\nfunction stripRunnerParams(values: ParameterValues): ParameterValues {\n const next: ParameterValues = {};\n for (const [key, value] of Object.entries(values)) {\n if (key === \"autoRun\" || key.startsWith(\"__\")) continue;\n next[key] = value;\n }\n return next;\n}\n\nfunction readQueryParameterValuesFromUrl(\n parameters: OpenAPIParameter[],\n): ParameterValues {\n if (typeof window === \"undefined\") return {};\n const queryParamNames = new Set(\n parameters.filter((param) => param.in === \"query\").map((p) => p.name),\n );\n if (queryParamNames.size === 0) return {};\n\n const values: ParameterValues = {};\n const search = new URLSearchParams(window.location.search);\n for (const name of queryParamNames) {\n const value = search.get(name);\n if (value != null && value !== \"\") {\n values[name] = value;\n }\n }\n return values;\n}\n\nfunction writeQueryParameterValuesToUrl(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n) {\n if (typeof window === \"undefined\") return;\n const queryParameters = parameters.filter((param) => param.in === \"query\");\n if (queryParameters.length === 0) return;\n\n const search = new URLSearchParams(window.location.search);\n for (const param of queryParameters) {\n const value = submitValue(param, values[param.name]);\n if (value == null) {\n search.delete(param.name);\n } else {\n search.set(param.name, value);\n }\n }\n\n const query = search.toString();\n const next = `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`;\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n if (next !== current) {\n window.history.replaceState(window.history.state, \"\", next);\n }\n}\n"],"names":["_a","values"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationCommandPage.js","sources":["../../src/rpc/OperationCommandPage.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { stripTrailingSlashes } from \"../lib/string\";\nimport { CommandForm } from \"./CommandForm\";\nimport { pathParamNames, submitValue } from \"./command-form-utils\";\nimport type { RenderLink } from \"./EndpointList\";\nimport {\n buildInitialParameterValues,\n dataTablePaginationFromForm,\n packLookupParameterValues,\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport { useCursorStaleRecovery } from \"./cursorStale\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationActionDialog } from \"./OperationActionDialog\";\nimport { OperationResultView } from \"./OperationResultView\";\nimport { hrefForOperation } from \"./rowNavigation\";\nimport type {\n ExecutionResponse,\n OpenAPIParameter,\n OperationRequestValues,\n ResolvedOperation,\n} from \"./types\";\nimport { useOperationById, type OperationsApiClient } from \"./useOperations\";\n\n// All operation results are fetched as clicky documents; the in-result View\n// menu re-fetches other formats on demand via the response's requestUrl.\nconst RESULT_ACCEPT = \"application/clicky+json\";\n\nexport type OperationCommandPageProps = {\n client: OperationsApiClient;\n operationId?: string;\n operation?: ResolvedOperation;\n operations?: ResolvedOperation[];\n initialValues?: ParameterValues;\n autoRun?: boolean;\n backHref?: string;\n backLabel?: string;\n renderLink?: RenderLink;\n commandRuntime?: ClickyCommandRuntime;\n onNavigate?: (href: string) => void;\n onResult?: (\n response: ExecutionResponse,\n operation: ResolvedOperation,\n values: ParameterValues,\n ) => void;\n hideLockedPathFilters?: boolean;\n className?: string;\n};\n\nconst EMPTY_PARAMETER_VALUES: ParameterValues = {};\n\nexport function OperationCommandPage({\n client,\n operationId,\n operation: providedOperation,\n operations = providedOperation ? [providedOperation] : [],\n initialValues = EMPTY_PARAMETER_VALUES,\n autoRun,\n backHref,\n backLabel = \"Back\",\n renderLink,\n onNavigate,\n onResult,\n commandRuntime,\n hideLockedPathFilters = Boolean(providedOperation),\n className,\n}: OperationCommandPageProps) {\n const lookup = useOperationById(\n client,\n providedOperation ? undefined : operationId,\n );\n const operation = providedOperation ?? lookup.operation;\n const isLoading = providedOperation ? false : lookup.isLoading;\n const [isExecuting, setIsExecuting] = useState(false);\n const [result, setResult] = useState<ExecutionResponse | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [hasAutoRun, setHasAutoRun] = useState(false);\n const parameters = operation?.operation.parameters ?? [];\n const isGet = (operation?.method ?? \"\").toUpperCase() === \"GET\";\n const effectiveAutoRun = operation ? (autoRun ?? isGet) : false;\n const parameterSignature = JSON.stringify(\n parameters.map((param) => ({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n default: param.schema?.default ?? null,\n })),\n );\n const operationKey = `${operation?.method ?? \"\"}:${operation?.path ?? \"\"}:${operation?.operation.operationId ?? \"\"}`;\n const effectiveInitialValues = useMemo(\n () =>\n operation\n ? buildInitialParameterValues(\n parameters,\n operation.method,\n {},\n {\n ...readQueryParameterValuesFromUrl(parameters),\n ...stripRunnerParams(initialValues),\n },\n )\n : stripRunnerParams(initialValues),\n [initialValues, operation?.method, parameterSignature],\n );\n const pathParameters = parameters.filter((param) => param.in === \"path\");\n const lockedPathValues = useMemo<ParameterValues>(() => {\n const values: ParameterValues = {};\n for (const param of pathParameters) {\n const value = effectiveInitialValues[param.name];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n values[param.name] = value;\n }\n }\n return values;\n }, [effectiveInitialValues, pathParameters]);\n const detailOperation = useMemo(\n () => (operation ? findDetailOperation(operation, operations) : undefined),\n [operation, operations],\n );\n const relatedOperations = useMemo(\n () =>\n operation\n ? findRelatedOperations(operation, operations, lockedPathValues)\n : [],\n [lockedPathValues, operation, operations],\n );\n\n // GET-mode parameter state: filter values + pagination cursor are driven\n // by the page so they can flow natively into the result table's in-table\n // FilterBar and pagination footer (via OperationResultView's filterConfig).\n const [values, setValues] = useState<ParameterValues>(effectiveInitialValues);\n useEffect(() => {\n setValues(effectiveInitialValues);\n }, [effectiveInitialValues]);\n const debouncedValues = useDebouncedRecord(values, 250);\n\n useEffect(() => {\n if (!isGet || !operation) return;\n writeQueryParameterValuesToUrl(debouncedValues, parameters);\n }, [isGet, operationKey, debouncedValues, parameterSignature]);\n\n const lookupParameters = useMemo(\n () => packLookupParameterValues(debouncedValues, parameters),\n [debouncedValues, parameters],\n );\n\n const lookupQuery = useQuery({\n queryKey: [\n \"operation-query-lookup\",\n operation?.method,\n operation?.path,\n lookupParameters,\n ],\n queryFn: async () => {\n if (!operation) return { filters: {} };\n return (\n (await client.lookupFilters?.(\n operation.path,\n operation.method,\n lookupParameters,\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} }\n );\n },\n enabled:\n isGet &&\n !!operation &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n // Shapes come from the spec so a control keeps its identity while the lookup\n // that fills it is in flight; see parametersToFormConfig.\n const filterShapes = lookup.spec?.components?.[\"x-clicky-filters\"];\n\n const formConfig = useMemo(() => {\n if (!isGet) return { filters: [] };\n return parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n components: filterShapes,\n lockedValues: lockedPathValues,\n hideLocked: hideLockedPathFilters,\n });\n }, [\n isGet,\n parameters,\n values,\n lookupQuery.data,\n filterShapes,\n lockedPathValues,\n hideLockedPathFilters,\n ]);\n\n const dataTablePagination = useMemo(\n () => dataTablePaginationFromForm(formConfig.pagination, result),\n [formConfig.pagination, result],\n );\n\n // Ref tracking the last submitted parameter signature so the\n // auto-submit-on-debounced-change effect coordinates against the same\n // \"have I already fired this set of values\" check.\n const lastSubmittedSignature = useRef(\"\");\n\n async function executeOperation(options: {\n values: ParameterValues;\n request?: OperationRequestValues;\n headers?: Record<string, string>;\n }) {\n if (!operation) return;\n\n setIsExecuting(true);\n setError(null);\n\n try {\n const response = await client.executeCommand(\n operation.path,\n operation.method,\n options.request ?? packParameterValues(options.values, operation.operation.parameters ?? []),\n options.headers ?? { Accept: RESULT_ACCEPT },\n );\n setResult(response);\n onResult?.(response, operation, options.values);\n } catch (err) {\n setResult(null);\n setError(err);\n } finally {\n setIsExecuting(false);\n }\n }\n\n useCursorStaleRecovery({ error, parameters, values, setValues });\n\n useEffect(() => {\n setHasAutoRun(false);\n setResult(null);\n setError(null);\n lastSubmittedSignature.current = \"\";\n }, [effectiveAutoRun, operationKey]);\n\n useEffect(() => {\n if (!effectiveAutoRun || !operation || hasAutoRun) return;\n // Auto-run a GET as long as every required parameter has a value. Optional\n // params (limit/offset, filter chips, etc.) get their defaults; the\n // sidebar's \"click → instant table\" flow depends on this not bailing just\n // because the operation declares any parameters at all.\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (effectiveInitialValues[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(\n pruneParameterValues(effectiveInitialValues),\n );\n void executeOperation({ values: effectiveInitialValues });\n }, [\n effectiveAutoRun,\n effectiveInitialValues,\n hasAutoRun,\n operationKey,\n parameterSignature,\n ]);\n\n // GET re-runs on debounced filter/pagination changes once the initial\n // auto-run has fired; non-GETs keep their explicit-submit behavior.\n useEffect(() => {\n if (!isGet || !operation || !hasAutoRun) return;\n const merged = { ...debouncedValues, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n const signature = JSON.stringify(pruneParameterValues(merged));\n if (lastSubmittedSignature.current === signature) return;\n lastSubmittedSignature.current = signature;\n void executeOperation({ values: merged });\n }, [\n isGet,\n hasAutoRun,\n debouncedValues,\n lockedPathValues,\n parameterSignature,\n ]);\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a\n href={backHref}\n className=\"text-sm text-primary underline-offset-4 hover:underline\"\n >\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return (\n <div className=\"text-sm text-muted-foreground\">Loading operation...</div>\n );\n }\n\n if (!operation) {\n return (\n <div className=\"space-y-4\">\n <div className=\"text-sm text-muted-foreground\">\n Unknown operation: <code>{operationId}</code>\n </div>\n {backLink}\n </div>\n );\n }\n\n const { path, method, operation: op } = operation;\n\n return (\n <div className={className ?? \"min-w-0 flex-1 space-y-6 p-6\"}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={method} />\n <h1 className=\"truncate text-xl font-bold\">\n {op.summary || op.operationId || path}\n </h1>\n </div>\n <p className=\"mt-1 font-mono text-xs text-muted-foreground\">{path}</p>\n {op.operationId && op.summary && (\n <p className=\"mt-2 font-mono text-xs text-muted-foreground\">\n {op.operationId}\n </p>\n )}\n {op.description && op.description !== op.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {op.description}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-3\">\n {relatedOperations.length > 0 && (\n <div className=\"flex flex-wrap justify-end gap-2\">\n {relatedOperations.map((related) =>\n related.href ? (\n renderLink ? (\n renderLink({\n key: `${related.operation.method}:${related.operation.path}`,\n to: related.href,\n className:\n \"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\",\n children: related.label,\n })\n ) : (\n <a\n key={`${related.operation.method}:${related.operation.path}`}\n href={related.href}\n className=\"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\"\n >\n {related.label}\n </a>\n )\n ) : (\n <OperationActionDialog\n key={`${related.operation.method}:${related.operation.path}`}\n operation={related.operation}\n client={client}\n initialValues={lockedPathValues}\n label={related.label}\n defaultAccept={RESULT_ACCEPT}\n {...(onNavigate ? { onNavigateAction: onNavigate } : {})}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n\n {method.toUpperCase() !== \"GET\" && (\n <section className=\"space-y-3\">\n <div className=\"rounded-lg border p-4\">\n <CommandForm\n parameters={parameters}\n onExecute={(submission) => executeOperation(submission)}\n isPending={isExecuting}\n method={method}\n path={path}\n accept={RESULT_ACCEPT}\n initialValues={effectiveInitialValues}\n />\n </div>\n </section>\n )}\n\n {error ? (\n <InlineError title={`Failed to load ${path}`} error={error} />\n ) : isExecuting || result ? (\n <OperationResultView\n response={result}\n loading={isExecuting}\n loadingMessage=\"Loading execution results…\"\n ariaLabel=\"Response body\"\n detailOperation={detailOperation}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(isGet && effectiveAutoRun\n ? {\n filterConfig: {\n filters: formConfig.filters,\n ...(formConfig.timeRange\n ? { timeRange: formConfig.timeRange }\n : {}),\n },\n }\n : {})}\n {...(isGet && effectiveAutoRun && dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n {...(isGet && effectiveAutoRun && formConfig.sort\n ? { sort: formConfig.sort }\n : {})}\n />\n ) : null}\n </div>\n );\n}\n\ntype RelatedOperation = {\n operation: ResolvedOperation;\n label: string;\n href?: string;\n};\n\nfunction findRelatedOperations(\n current: ResolvedOperation,\n operations: ResolvedOperation[],\n pathValues: Record<string, string>,\n): RelatedOperation[] {\n if (current.method.toUpperCase() !== \"GET\") return [];\n if (!pathTemplateSatisfied(current.path, pathValues)) return [];\n\n const basePath = stripTrailingSlashes(current.path);\n return operations\n .filter((candidate) => {\n if (candidate === current) return false;\n if (!candidate.path.startsWith(`${basePath}/`)) return false;\n if (!pathTemplateSatisfied(candidate.path, pathValues)) return false;\n const method = candidate.method.toUpperCase();\n return (\n method === \"GET\" ||\n method === \"POST\" ||\n method === \"PUT\" ||\n method === \"DELETE\"\n );\n })\n .map((related) => {\n const method = related.method.toUpperCase();\n const href =\n method === \"GET\"\n ? hrefForOperation(related, [], pathValues)\n : undefined;\n return {\n operation: related,\n label: operationLabel(related),\n ...(href ? { href } : {}),\n };\n })\n .filter(\n (related) =>\n related.operation.method.toUpperCase() !== \"GET\" || related.href,\n );\n}\n\nfunction findDetailOperation(\n current: ResolvedOperation,\n operations: ResolvedOperation[],\n) {\n const method = current.method.toUpperCase();\n const detailPath = `${stripTrailingSlashes(current.path)}/{id}`;\n return operations.find(\n (candidate) =>\n candidate.method.toUpperCase() === method &&\n candidate.path === detailPath &&\n candidate.operation.parameters?.some(\n (param) => param.in === \"path\" && param.name === \"id\" && param.required,\n ),\n );\n}\n\nfunction pathTemplateSatisfied(path: string, values: Record<string, string>) {\n return pathParamNames(path).every((name) => Boolean(values[name]));\n}\n\nfunction operationLabel(operation: ResolvedOperation): string {\n const actionName =\n operation.operation[\"x-clicky\"]?.actionName ||\n operation.path.split(\"/\").filter(Boolean).at(-1) ||\n operation.operation.operationId ||\n operation.method;\n return titleCase(actionName.replace(/[_-]+/g, \" \"));\n}\n\nfunction stripRunnerParams(values: ParameterValues): ParameterValues {\n const next: ParameterValues = {};\n for (const [key, value] of Object.entries(values)) {\n if (key === \"autoRun\" || key.startsWith(\"__\")) continue;\n next[key] = value;\n }\n return next;\n}\n\nfunction readQueryParameterValuesFromUrl(\n parameters: OpenAPIParameter[],\n): ParameterValues {\n if (typeof window === \"undefined\") return {};\n const queryParamNames = new Set(\n parameters.filter((param) => param.in === \"query\").map((p) => p.name),\n );\n if (queryParamNames.size === 0) return {};\n\n const values: ParameterValues = {};\n const search = new URLSearchParams(window.location.search);\n for (const name of queryParamNames) {\n const value = search.get(name);\n if (value != null && value !== \"\") {\n values[name] = value;\n }\n }\n return values;\n}\n\nfunction writeQueryParameterValuesToUrl(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n) {\n if (typeof window === \"undefined\") return;\n const queryParameters = parameters.filter((param) => param.in === \"query\");\n if (queryParameters.length === 0) return;\n\n const search = new URLSearchParams(window.location.search);\n for (const param of queryParameters) {\n const value = submitValue(param, values[param.name]);\n if (value == null) {\n search.delete(param.name);\n } else {\n search.set(param.name, value);\n }\n }\n\n const query = search.toString();\n const next = `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`;\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n if (next !== current) {\n window.history.replaceState(window.history.state, \"\", next);\n }\n}\n"],"names":["_a","values"],"mappings":"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"}
|
package/dist/rpc/apiClient.cjs
CHANGED
|
@@ -252,7 +252,11 @@ function resolvePathParams(path, params) {
|
|
|
252
252
|
let consumedArgs = false;
|
|
253
253
|
const consumedDirectValues = [];
|
|
254
254
|
for (const [index, name] of placeholders.entries()) {
|
|
255
|
-
const
|
|
255
|
+
const rawDirectValue = queryParams[name];
|
|
256
|
+
if (Array.isArray(rawDirectValue)) {
|
|
257
|
+
throw new Error(`Path parameter ${name} must be a scalar value`);
|
|
258
|
+
}
|
|
259
|
+
const directValue = rawDirectValue;
|
|
256
260
|
const fallbackValue = directValue || argValues[index];
|
|
257
261
|
if (!fallbackValue) continue;
|
|
258
262
|
resolvedPath = resolvedPath.replace(`{${name}}`, encodeURIComponent(fallbackValue));
|
|
@@ -268,6 +272,7 @@ function resolvePathParams(path, params) {
|
|
|
268
272
|
}
|
|
269
273
|
function parseArgsParam(value) {
|
|
270
274
|
if (!value) return [];
|
|
275
|
+
if (Array.isArray(value)) return value.map(String).filter(Boolean);
|
|
271
276
|
const trimmed = value.trim();
|
|
272
277
|
if (!trimmed || trimmed === "[]" || trimmed.toLowerCase() === "null") return [];
|
|
273
278
|
try {
|
|
@@ -284,12 +289,21 @@ function stripRunnerParams(params) {
|
|
|
284
289
|
return next;
|
|
285
290
|
}
|
|
286
291
|
function appendQuery(path, params) {
|
|
287
|
-
const query = new URLSearchParams(
|
|
292
|
+
const query = new URLSearchParams(
|
|
293
|
+
Object.fromEntries(
|
|
294
|
+
Object.entries(pruneParams(params)).map(([key, value]) => [
|
|
295
|
+
key,
|
|
296
|
+
Array.isArray(value) ? value.join(",") : value
|
|
297
|
+
])
|
|
298
|
+
)
|
|
299
|
+
).toString();
|
|
288
300
|
if (!query) return path;
|
|
289
301
|
return `${path}${path.includes("?") ? "&" : "?"}${query}`;
|
|
290
302
|
}
|
|
291
303
|
function pruneParams(params) {
|
|
292
|
-
return Object.fromEntries(
|
|
304
|
+
return Object.fromEntries(
|
|
305
|
+
Object.entries(params).filter(([, value]) => value !== "" && value.length > 0)
|
|
306
|
+
);
|
|
293
307
|
}
|
|
294
308
|
function joinUrl(baseUrl, path) {
|
|
295
309
|
if (!baseUrl || /^https?:\/\//i.test(path)) return path;
|
|
@@ -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\n/** Operation catalog: an OpenAPI document whose response schemas may be stubs. */\nexport const CLICKY_OPENAPI_MEDIA_TYPE = \"application/vnd.clicky.openapi+json\";\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 // Each field mirrors the property it lands on, undefined included: a caller\n // rebuilding an error from a partial response should not have to spread\n // conditionally to say \"this one is unknown\".\n options: {\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 ) {\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 // Prefer the catalog projection — the same document with each operation's\n // response schemas stubbed, which nothing here reads and which is over\n // half the bytes. A server that does not serve it answers with the\n // complete document, which parses the same.\n headers: {\n Accept: `${CLICKY_OPENAPI_MEDIA_TYPE}, application/json;q=0.9`,\n },\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\nexport type ParsedBody = {\n data: unknown;\n text: string;\n blob?: Blob;\n contentType: string;\n};\n\nexport async 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\n// Exported because every fetch in the package has to fail the same way: with\n// the status, the URL and the parsed body attached, which is what\n// operationErrorDiagnostics reads back out to render ErrorDetails. A second\n// error-from-Response path would silently drop one of those again.\nexport function 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
|
+
{"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 OperationRequestValues,\n} from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/** Operation catalog: an OpenAPI document whose response schemas may be stubs. */\nexport const CLICKY_OPENAPI_MEDIA_TYPE = \"application/vnd.clicky.openapi+json\";\n\nexport type OperationApiClientContext = {\n path: string;\n method: string;\n};\n\nexport type OperationDefaultParams = (context: {\n path: string;\n method: string;\n params: OperationRequestValues;\n}) => MaybePromise<OperationRequestValues>;\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 // Each field mirrors the property it lands on, undefined included: a caller\n // rebuilding an error from a partial response should not have to spread\n // conditionally to say \"this one is unknown\".\n options: {\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 ) {\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?: OperationRequestValues,\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 // Prefer the catalog projection — the same document with each operation's\n // response schemas stubbed, which nothing here reads and which is over\n // half the bytes. A server that does not serve it answers with the\n // complete document, which parses the same.\n headers: {\n Accept: `${CLICKY_OPENAPI_MEDIA_TYPE}, application/json;q=0.9`,\n },\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: OperationRequestValues) {\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\nexport type ParsedBody = {\n data: unknown;\n text: string;\n blob?: Blob;\n contentType: string;\n};\n\nexport async 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\n// Exported because every fetch in the package has to fail the same way: with\n// the status, the URL and the parsed body attached, which is what\n// operationErrorDiagnostics reads back out to render ErrorDetails. A second\n// error-from-Response path would silently drop one of those again.\nexport function 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: OperationRequestValues,\n): { path: string; params: OperationRequestValues } {\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 rawDirectValue = queryParams[name];\n if (Array.isArray(rawDirectValue)) {\n throw new Error(`Path parameter ${name} must be a scalar value`);\n }\n const directValue = rawDirectValue;\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 | string[] | undefined): string[] {\n if (!value) return [];\n if (Array.isArray(value)) return value.map(String).filter(Boolean);\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: OperationRequestValues) {\n const next = { ...params };\n delete next.autoRun;\n delete next.__autoRun;\n return next;\n}\n\nfunction appendQuery(path: string, params: OperationRequestValues) {\n const query = new URLSearchParams(\n Object.fromEntries(\n Object.entries(pruneParams(params)).map(([key, value]) => [\n key,\n Array.isArray(value) ? value.join(\",\") : value,\n ]),\n ),\n ).toString();\n if (!query) return path;\n return `${path}${path.includes(\"?\") ? \"&\" : \"?\"}${query}`;\n}\n\nfunction pruneParams(params: OperationRequestValues): OperationRequestValues {\n return Object.fromEntries(\n Object.entries(params).filter(([, value]) => value !== \"\" && value.length > 0),\n );\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":";;;;;;AAeO,MAAM,4BAA4B;AA2BlC,MAAM,iCAAiC,MAAM;AAAA,EAQlD,YACE,SAIA,UAOI,IACJ;AACA,UAAM,OAAO;AArBf;AACA;AACA;AACA;AACA;AACA;AAiBE,SAAK,OAAO;AACZ,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ;AACtB,SAAK,MAAM,QAAQ;AACnB,SAAK,eAAe,QAAQ;AAC5B,SAAK,eAAe,QAAQ;AAC5B,SAAK,kBAAkB,QAAQ;AAAA,EACjC;AACF;AAwBO,SAAS,0BACd,UAA4C,IACjB;AAC3B,QAAM,UAAU,QAAQ,SAAS;AACjC,QAAM,cAAc,QAAQ,eAAe;AAE3C,iBAAe,YACb,MACA,SACkB;;AAClB,UAAM,UAAU,IAAI,QAAQ,IAAI;AAChC,UAAM,WAAW,QAAM,aAAQ,mBAAR,iCAAyB,SAAS;AACzD,WAAO,WAAW,IAAI,QAAQ,QAAQ,IAAI;AAAA,EAC5C;AAEA,iBAAe,QACb,MACA,QACA,OAGI,CAAA,GACe;AACnB,UAAM,MAAM,QAAQ,QAAQ,SAAS,IAAI;AACzC,UAAM,UAAU,MAAM,YAAY,KAAK,SAAS,EAAE,MAAM,QAAQ;AAChE,WAAO,QAAQ,KAAK;AAAA,MAClB,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,GAAI,QAAQ,cAAc,EAAE,aAAa,QAAQ,YAAA,IAAgB,CAAA;AAAA,IAAC,CACnE;AAAA,EACH;AAEA,iBAAe,iBAAuC;AACpD,UAAM,WAAW,MAAM,QAAQ,aAAa,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKjD,SAAS;AAAA,QACP,QAAQ,GAAG,yBAAyB;AAAA,MAAA;AAAA,IACtC,CACD;AACD,UAAM,SAAS,MAAM,iBAAiB,UAAU,MAAM;AACtD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,kBAAkB,UAAU,OAAO,aAAa,MAAM;AAAA,IAC9D;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,iBAAe,aAAa,MAAc,QAAgB,QAAgC;;AACxF,WAAQ,QAAM,aAAQ,kBAAR,iCAAwB,EAAE,MAAM,QAAQ,OAAA,OAAc;AAAA,EACtE;AAEA,SAAO;AAAA,IACL;AAAA,IAEA,MAAM,eAAe,MAAM,QAAQ,QAAQ,SAAS;AAClD,YAAM,QAAQ,OAAO,YAAA;AACrB,YAAM,WAAW,kBAAkB,MAAM,MAAM;AAC/C,YAAM,SAAS,MAAM,aAAa,SAAS,MAAM,OAAO,SAAS,MAAM;AACvE,YAAM,SAAS,YAAY,SAAS,QAAQ;AAE5C,UAAI,UAAU,OAAO;AACnB,cAAM,aAAa,YAAY,SAAS,MAAM,MAAM;AACpD,cAAMA,YAAW,MAAM,QAAQ,YAAY,OAAO;AAAA,UAChD,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA;AAAA,UAC5B;AAAA,QAAA,CACD;AACD,eAAO,uBAAuBA,WAAU,MAAM,iBAAiBA,WAAU,aAAa,MAAM,CAAC,GAAG;AAAA,UAC9F,QAAQ;AAAA,UACR;AAAA,QAAA,CACD;AAAA,MACH;AAEA,YAAM,WAAW,MAAM,QAAQ,SAAS,MAAM,OAAO;AAAA,QACnD,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,QAAA;AAAA,QAClD,MAAM,KAAK,UAAU,MAAM;AAAA,MAAA,CAC5B;AACD,aAAO,uBAAuB,UAAU,MAAM,iBAAiB,UAAU,aAAa,MAAM,CAAC,GAAG;AAAA,QAC9F,QAAQ;AAAA,QACR,YAAY,SAAS;AAAA,MAAA,CACtB;AAAA,IACH;AAAA,IAEA,MAAM,mBAAmB,MAAM,MAAM,SAAS;AAC5C,YAAM,SAAS,YAAY,SAAS,QAAQ;AAC5C,YAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ;AAAA,QAC3C,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,QAAA;AAAA,QAClD,MAAM,KAAK,UAAU,IAAI;AAAA,MAAA,CAC1B;AACD,aAAO,uBAAuB,UAAU,MAAM,iBAAiB,UAAU,aAAa,MAAM,CAAC,GAAG;AAAA,QAC9F,QAAQ;AAAA,QACR,YAAY;AAAA,MAAA,CACb;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,UAAU,MAAM;AACpB,YAAM,WAAW,MAAM,QAAQ,MAAM,OAAO;AAAA,QAC1C,SAAS,EAAE,QAAQ,0BAAA;AAAA,MAA0B,CAC9C;AACD,UAAI,CAAC,SAAS,GAAI,QAAO;AACzB,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,UAAI,CAAC,YAAY,YAAA,EAAc,SAAS,QAAQ,EAAG,QAAO;AAC1D,YAAM,SAAS,MAAM,iBAAiB,UAAU,MAAM;AACtD,YAAM,OAAO,OAAO;AACpB,aAAO,QAAQ,OAAO,SAAS,WAAY,OAA4B;AAAA,IACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,WAAW,MAAM,QAAQ,MAAM,SAAS;AAC5C,YAAM,QAAQ,OAAO,YAAA;AACrB,YAAM,WAAW,MAAM,QAAQ,MAAM,OAAO;AAAA,QAC1C,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,QAAA;AAAA,QAClD,MAAM,KAAK,UAAU,IAAI;AAAA,MAAA,CAC1B;AACD,aAAO,uBAAuB,UAAU,MAAM,iBAAiB,UAAU,MAAM,GAAG;AAAA,QAChF,QAAQ;AAAA,QACR,YAAY;AAAA,MAAA,CACb;AAAA,IACH;AAAA,IAEA,MAAM,cAAc,MAAM,QAAQ,QAAQ,SAAS;AACjD,YAAM,QAAQ,OAAO,YAAA;AACrB,YAAM,WAAW,kBAAkB,MAAM,MAAM;AAE/C,UAAI,UAAU,OAAO;AACnB,cAAM,aAAa,YAAY,SAAS,MAAM,EAAE,GAAG,SAAS,QAAQ,UAAU,WAAW;AACzF,cAAMA,YAAW,MAAM,QAAQ,YAAY,OAAO;AAAA,UAChD,SAAS,EAAE,QAAQ,2BAA2B,GAAG,QAAA;AAAA,QAAQ,CAC1D;AACD,YAAIA,UAAS,WAAW,YAAY,EAAE,SAAS,CAAA,EAAC;AAChD,cAAMC,UAAS,MAAM,iBAAiBD,WAAU,MAAM;AACtD,YAAI,CAACA,UAAS,GAAI,OAAM,kBAAkBA,WAAU,OAAO,YAAYC,OAAM;AAC7E,eAAQA,QAAO,QAAgD,EAAE,SAAS,CAAA,EAAC;AAAA,MAC7E;AAEA,YAAM,WAAW,MAAM,QAAQ,YAAY,SAAS,MAAM,EAAE,UAAU,WAAW,GAAG,OAAO;AAAA,QACzF,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,gBAAgB;AAAA,UAChB,GAAG;AAAA,QAAA;AAAA,QAEL,MAAM,KAAK,UAAU,SAAS,MAAM;AAAA,MAAA,CACrC;AACD,UAAI,SAAS,WAAW,YAAY,EAAE,SAAS,CAAA,EAAC;AAChD,YAAM,SAAS,MAAM,iBAAiB,UAAU,MAAM;AACtD,UAAI,CAAC,SAAS,GAAI,OAAM,kBAAkB,UAAU,OAAO,SAAS,MAAM,MAAM;AAChF,aAAQ,OAAO,QAAgD,EAAE,SAAS,CAAA,EAAC;AAAA,IAC7E;AAAA,IAEA,MAAM,oBAAoB,MAAM,QAAQ,WAAW,OAAO,aAAa;;AACrE,YAAM,QAAQ,OAAO,YAAA;AAIrB,YAAM,WAAW,kBAAkB,MAAM,eAAe,CAAA,CAAE;AAC1D,YAAM,cAAc;AAAA,QAClB,GAAG,SAAS;AAAA,QACZ,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,YAAY;AAAA,MAAA;AAGd,YAAM,cAAc,YAAY,SAAS,MAAM,WAAW;AAC1D,YAAM,WAAW,MAAM,QAAQ,aAAa,OAAO;AAAA,QACjD,SAAS,EAAE,QAAQ,0BAAA;AAAA,MAA0B,CAC9C;AACD,YAAM,SAAS,MAAM,iBAAiB,UAAU,MAAM;AACtD,UAAI,CAAC,SAAS,GAAI,OAAM,kBAAkB,UAAU,OAAO,aAAa,MAAM;AAC9E,eAAS,kBAAO,SAAP,mBAAqD,YAArD,mBAA+D,eACtE,CAAA;AAAA,IACJ;AAAA,EAAA;AAEJ;AAEA,SAAS,aAAa,QAA2C;AAC/D,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,aAAa,OAAO,YAAA;AAC1B,MAAI,WAAW,SAAS,iBAAiB,EAAG,QAAO;AACnD,MACE,WAAW,SAAS,OAAO,KAC3B,WAAW,SAAS,oBAAoB,KACxC,WAAW,SAAS,kBAAkB,GACtC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AASA,eAAsB,iBAAiB,UAAoB,MAAqD;AAC9G,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,MAAI,SAAS,QAAQ;AACnB,UAAM,OAAO,MAAM,SAAS,KAAA;AAC5B,WAAO,EAAE,MAAM,QAAW,MAAM,YAAY,MAAM,YAAA;AAAA,EACpD;AAEA,QAAM,OAAO,MAAM,SAAS,KAAA;AAC5B,MAAI,SAAS,UAAU,CAAC,gBAAgB,MAAM,WAAW,GAAG;AAC1D,WAAO,EAAE,MAAM,MAAM,MAAM,YAAA;AAAA,EAC7B;AAEA,MAAI;AACF,WAAO,EAAE,MAAM,KAAK,MAAM,IAAI,GAAc,MAAM,YAAA;AAAA,EACpD,QAAQ;AACN,WAAO,EAAE,MAAM,MAAM,MAAM,YAAA;AAAA,EAC7B;AACF;AAEA,SAAS,uBACP,UACA,QACA,SACmB;AACnB,QAAM,UAAU,gBAAgB,SAAS,OAAO;AAChD,QAAM,OAAO,OAAO;AACpB,QAAM,SACJ,OAAO,QAAQ,OACX,aACA,OAAO,SAAS,WACd,OACA,OAAO,QAAQ,KAAK,UAAU,MAAM,MAAM,CAAC;AACnD,QAAM,iBAAiB,iBAAiB,IAAI;AAE5C,MAAI,CAAC,SAAS,MAAM,CAAC,gBAAgB;AACnC,UAAM,kBAAkB,UAAU,QAAQ,QAAQ,QAAQ,YAAY,MAAM;AAAA,EAC9E;AAEA,QAAM,cAAc,wBAAwB,IAAI;AAChD,QAAM,gBAAgB,QAAQ,qBAAqB;AACnD,QAAM,UAAU,iBAAiB,OAAO,SAAS,MAAM,CAAC,cAAc,kBAAkB;AACxF,QAAM,WAAW,SAAS,QAAQ,aAAa,MAAM,UAAU,MAAM,MAAM,EAAE;AAC7E,QAAM,MAAM,QAAQ,eAAe;AACnC,QAAM,QAAQ,QAAQ,SAAS,KAAK;AACpC,QAAM,aAAa,sBAAsB,OAAO;AAEhD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,WAAW,OAAO,SAAS,QAAQ,IAAI,WAAW,UAAU,IAAI;AAAA,IAChE,aAAa,OAAO,eAAe,QAAQ,cAAc,KAAK;AAAA,IAC9D,YAAY,QAAQ;AAAA,IACpB,iBAAiB;AAAA,IACjB,GAAI,aAAa,EAAE,WAAA,IAAe,CAAA;AAAA,IAClC,GAAI,MAAM,EAAE,IAAA,IAAQ,CAAA;AAAA,IACpB,GAAI,QAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,IACxB,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,KAAA,IAAS,CAAA;AAAA,IAC1C,GAAI,OAAO,QAAQ,QAAQ,OAAO,SAAS,WAAW,EAAE,QAAQ,SAAS,CAAA;AAAA,EAAC;AAE9E;AAMO,SAAS,kBACd,UACA,QACA,KACA,QAC0B;AAC1B,QAAM,UAAU,gBAAgB,SAAS,OAAO;AAChD,QAAM,UACJ,QAAQ,SAAS,KACjB,gBAAgB,OAAO,IAAI,KAC3B,GAAG,MAAM,IAAI,GAAG,gBAAgB,SAAS,MAAM,KAC7C,OAAO,QAAQ,SAAS,UAC1B;AACF,SAAO,IAAI,yBAAyB,SAAS;AAAA,IAC3C,QAAQ,SAAS;AAAA,IACjB;AAAA,IACA;AAAA,IACA,cAAc,OAAO;AAAA,IACrB,cAAc,OAAO;AAAA,IACrB,iBAAiB;AAAA,EAAA,CAClB;AACH;AAEA,SAAS,kBACP,MACA,QACkD;AAClD,QAAM,cAAc,EAAE,GAAG,OAAA;AACzB,MAAI,eAAe;AACnB,QAAM,eAAe,CAAC,GAAG,KAAK,SAAS,eAAe,CAAC,EACpD,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,EACvB,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AACjD,QAAM,YAAY,eAAe,OAAO,IAAI;AAC5C,MAAI,eAAe;AACnB,QAAM,uBAAiC,CAAA;AAEvC,aAAW,CAAC,OAAO,IAAI,KAAK,aAAa,WAAW;AAClD,UAAM,iBAAiB,YAAY,IAAI;AACvC,QAAI,MAAM,QAAQ,cAAc,GAAG;AACjC,YAAM,IAAI,MAAM,kBAAkB,IAAI,yBAAyB;AAAA,IACjE;AACA,UAAM,cAAc;AACpB,UAAM,gBAAgB,eAAe,UAAU,KAAK;AACpD,QAAI,CAAC,cAAe;AAEpB,mBAAe,aAAa,QAAQ,IAAI,IAAI,KAAK,mBAAmB,aAAa,CAAC;AAClF,WAAO,YAAY,IAAI;AACvB,QAAI,CAAC,eAAe,UAAU,KAAK,EAAG,gBAAe;AACrD,QAAI,YAAa,sBAAqB,KAAK,IAAI;AAAA,EACjD;AAEA,QAAM,4BACJ,UAAU,SAAS,KACnB,UAAU,WAAW,qBAAqB,OAAO,OAAO,EAAE,UAC1D,UAAU,MAAM,CAAC,OAAO,UAAU,UAAU,qBAAqB,KAAK,CAAC;AAEzE,MAAI,gBAAgB,2BAA2B;AAC7C,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO,EAAE,MAAM,cAAc,QAAQ,kBAAkB,WAAW,EAAA;AACpE;AAEA,SAAS,eAAe,OAAgD;AACtE,MAAI,CAAC,MAAO,QAAO,CAAA;AACnB,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,MAAM,EAAE,OAAO,OAAO;AACjE,QAAM,UAAU,MAAM,KAAA;AACtB,MAAI,CAAC,WAAW,YAAY,QAAQ,QAAQ,YAAA,MAAkB,OAAQ,QAAO,CAAA;AAC7E,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,MAAM,QAAQ,MAAM,EAAG,QAAO,OAAO,IAAI,MAAM,EAAE,OAAO,OAAO;AAAA,EACrE,QAAQ;AAAA,EAER;AACA,SAAO,QACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAA,CAAM,EACzB,OAAO,OAAO;AACnB;AAEA,SAAS,kBAAkB,QAAgC;AACzD,QAAM,OAAO,EAAE,GAAG,OAAA;AAClB,SAAO,KAAK;AACZ,SAAO,KAAK;AACZ,SAAO;AACT;AAEA,SAAS,YAAY,MAAc,QAAgC;AACjE,QAAM,QAAQ,IAAI;AAAA,IAChB,OAAO;AAAA,MACL,OAAO,QAAQ,YAAY,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,QACxD;AAAA,QACA,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,IAAI;AAAA,MAAA,CAC1C;AAAA,IAAA;AAAA,EACH,EACA,SAAA;AACF,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,GAAG,IAAI,GAAG,KAAK,SAAS,GAAG,IAAI,MAAM,GAAG,GAAG,KAAK;AACzD;AAEA,SAAS,YAAY,QAAwD;AAC3E,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAA,EAAG,KAAK,MAAM,UAAU,MAAM,MAAM,SAAS,CAAC;AAAA,EAAA;AAEjF;AAEA,SAAS,QAAQ,SAA6B,MAAc;AAC1D,MAAI,CAAC,WAAW,gBAAgB,KAAK,IAAI,EAAG,QAAO;AACnD,SAAO,GAAGC,OAAAA,qBAAqB,OAAO,CAAC,IAAIC,OAAAA,oBAAoB,IAAI,CAAC;AACtE;AAEA,SAAS,YAAY,SAA6C,MAAc;AAC9E,QAAM,SAAS,KAAK,YAAA;AACpB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,CAAA,CAAE,GAAG;AACxD,QAAI,IAAI,kBAAkB,OAAQ,QAAO;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAA0C;AACjE,QAAM,MAA8B,CAAA;AACpC,UAAQ,QAAQ,CAAC,OAAO,QAAQ;AAC9B,QAAI,IAAI,YAAA,CAAa,IAAI;AAAA,EAC3B,CAAC;AACD,SAAO;AACT;AAEA,SAAS,sBAAsB,SAAkE;AAC/F,QAAM,aAAkC,CAAA;AACxC,QAAM,QAAQ,cAAc,QAAQ,eAAe,CAAC;AACpD,QAAM,QAAQ,cAAc,QAAQ,cAAc,CAAC;AACnD,QAAM,SAAS,cAAc,QAAQ,eAAe,CAAC;AAErD,MAAI,UAAU,OAAW,YAAW,QAAQ;AAC5C,MAAI,UAAU,OAAW,YAAW,QAAQ;AAC5C,MAAI,WAAW,OAAW,YAAW,SAAS;AAE9C,QAAM,WAAW,QAAQ,kBAAkB;AAC3C,MAAI,aAAa,QAAQ,aAAa,kBAAkB,gBAAgB;AAExE,QAAM,UAAU,cAAc,QAAQ,YAAY,CAAC;AACnD,MAAI,YAAY,OAAW,YAAW,UAAU;AAEhD,QAAM,SAAS,QAAQ,eAAe;AACtC,MAAI,UAAU,QAAQ,OAAO,WAAW,eAAe,aAAa;AAEpE,MAAI,cAAc,QAAQ,aAAa,CAAC,MAAM,iBAAiB,YAAY;AAE3E,SAAO,OAAO,KAAK,UAAU,EAAE,SAAS,IAAI,aAAa;AAC3D;AAEA,SAAS,cAAc,OAAgD;AACrE,MAAI,SAAS,QAAQ,MAAM,KAAA,MAAW,GAAI,QAAO;AACjD,QAAM,aAAa,MAAM,KAAA,EAAO,YAAA;AAChC,MAAI,eAAe,OAAQ,QAAO;AAClC,MAAI,eAAe,QAAS,QAAO;AACnC,SAAO;AACT;AAEA,SAAS,cAAc,OAA+C;AACpE,MAAI,SAAS,QAAQ,MAAM,KAAA,MAAW,GAAI,QAAO;AACjD,QAAM,SAAS,SAAS,OAAO,EAAE;AACjC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,gBAAgB,MAAc,aAAqB;AAC1D,QAAM,UAAU,KAAK,KAAA;AACrB,SACE,YAAY,OACX,YAAY,YAAA,EAAc,SAAS,MAAM,KACxC,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,GAAG;AAE5B;AAEA,SAAS,iBAAiB,MAAwB;AAChD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,OAAO;AACb,SAAO,KAAK,WAAW,QAAQ,KAAK,QAAQ,QAAQ,OAAO,KAAK,SAAS;AAC3E;AAEA,SAAS,eAAe,MAAmC;AACzD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,UAAU,YAAY,EAAE,UAAU,WAAW,EAAE;AAC5D,MAAI,OAAO,EAAE,SAAS,YAAY,EAAE,SAAS,WAAW,EAAE;AAC1D,MAAI,MAAM,QAAQ,EAAE,QAAQ,GAAG;AAC7B,eAAW,SAAS,EAAE,UAAU;AAC9B,YAAM,OAAO,eAAe,KAAK;AACjC,UAAI,KAAM,QAAO;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,MAAmC;AAClE,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,OAAQ,KAAiC;AAC/C,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,IAAI;AACV,MAAI,EAAE,SAAS,SAAS,CAAC,MAAM,QAAQ,EAAE,MAAM,EAAG,QAAO;AAEzD,MAAI;AACJ,MAAI,SAAS;AACb,aAAW,SAAS,EAAE,QAAQ;AAC5B,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,UAAM,IAAI;AACV,QAAI,EAAE,SAAS,QAAS,aAAY,eAAe,EAAE,KAAK;AAC1D,QAAI,EAAE,SAAS,aAAa,eAAe,EAAE,KAAK,MAAM,QAAS,UAAS;AAAA,EAC5E;AACA,SAAO,SAAS,YAAY;AAC9B;AAEA,SAAS,gBAAgB,MAAmC;AAC1D,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,OAAO;AACb,MAAI,OAAO,KAAK,UAAU,YAAY,KAAK,cAAc,KAAK;AAC9D,MAAI,OAAO,KAAK,YAAY,YAAY,KAAK,gBAAgB,KAAK;AAClE,SAAO,wBAAwB,IAAI;AACrC;;;;;;"}
|
package/dist/rpc/apiClient.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { JsonSchemaObject } from '../components/json-schema-form-types';
|
|
2
|
-
import { ExecutionResponse, OperationLookupFilter } from './types';
|
|
2
|
+
import { ExecutionResponse, OperationLookupFilter, OperationRequestValues } from './types';
|
|
3
3
|
import { OperationsApiClient } from './useOperations';
|
|
4
4
|
type MaybePromise<T> = T | Promise<T>;
|
|
5
5
|
/** Operation catalog: an OpenAPI document whose response schemas may be stubs. */
|
|
@@ -11,8 +11,8 @@ export type OperationApiClientContext = {
|
|
|
11
11
|
export type OperationDefaultParams = (context: {
|
|
12
12
|
path: string;
|
|
13
13
|
method: string;
|
|
14
|
-
params:
|
|
15
|
-
}) => MaybePromise<
|
|
14
|
+
params: OperationRequestValues;
|
|
15
|
+
}) => MaybePromise<OperationRequestValues>;
|
|
16
16
|
export type OperationHeadersProvider = (headers: Headers, context: OperationApiClientContext) => MaybePromise<HeadersInit | void>;
|
|
17
17
|
export type CreateOperationsApiClientOptions = {
|
|
18
18
|
baseUrl?: string;
|
|
@@ -39,7 +39,7 @@ export declare class OperationsApiClientError extends Error {
|
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
41
|
export interface SharedOperationsApiClient extends OperationsApiClient {
|
|
42
|
-
lookupFilterOptions(path: string, method: string, filterKey: string, query: string, extraParams?:
|
|
42
|
+
lookupFilterOptions(path: string, method: string, filterKey: string, query: string, extraParams?: OperationRequestValues): Promise<OperationLookupFilter>;
|
|
43
43
|
executeCommandBody(path: string, body: Record<string, unknown>, headers?: Record<string, string>): Promise<ExecutionResponse>;
|
|
44
44
|
getSchema(path: string): Promise<JsonSchemaObject | undefined>;
|
|
45
45
|
submitForm(path: string, method: string, body: Record<string, unknown>, headers?: Record<string, string>): Promise<ExecutionResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../src/rpc/apiClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAE7E,OAAO,KAAK,EAEV,iBAAiB,EAEjB,qBAAqB,
|
|
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
|
@@ -250,7 +250,11 @@ function resolvePathParams(path, params) {
|
|
|
250
250
|
let consumedArgs = false;
|
|
251
251
|
const consumedDirectValues = [];
|
|
252
252
|
for (const [index, name] of placeholders.entries()) {
|
|
253
|
-
const
|
|
253
|
+
const rawDirectValue = queryParams[name];
|
|
254
|
+
if (Array.isArray(rawDirectValue)) {
|
|
255
|
+
throw new Error(`Path parameter ${name} must be a scalar value`);
|
|
256
|
+
}
|
|
257
|
+
const directValue = rawDirectValue;
|
|
254
258
|
const fallbackValue = directValue || argValues[index];
|
|
255
259
|
if (!fallbackValue) continue;
|
|
256
260
|
resolvedPath = resolvedPath.replace(`{${name}}`, encodeURIComponent(fallbackValue));
|
|
@@ -266,6 +270,7 @@ function resolvePathParams(path, params) {
|
|
|
266
270
|
}
|
|
267
271
|
function parseArgsParam(value) {
|
|
268
272
|
if (!value) return [];
|
|
273
|
+
if (Array.isArray(value)) return value.map(String).filter(Boolean);
|
|
269
274
|
const trimmed = value.trim();
|
|
270
275
|
if (!trimmed || trimmed === "[]" || trimmed.toLowerCase() === "null") return [];
|
|
271
276
|
try {
|
|
@@ -282,12 +287,21 @@ function stripRunnerParams(params) {
|
|
|
282
287
|
return next;
|
|
283
288
|
}
|
|
284
289
|
function appendQuery(path, params) {
|
|
285
|
-
const query = new URLSearchParams(
|
|
290
|
+
const query = new URLSearchParams(
|
|
291
|
+
Object.fromEntries(
|
|
292
|
+
Object.entries(pruneParams(params)).map(([key, value]) => [
|
|
293
|
+
key,
|
|
294
|
+
Array.isArray(value) ? value.join(",") : value
|
|
295
|
+
])
|
|
296
|
+
)
|
|
297
|
+
).toString();
|
|
286
298
|
if (!query) return path;
|
|
287
299
|
return `${path}${path.includes("?") ? "&" : "?"}${query}`;
|
|
288
300
|
}
|
|
289
301
|
function pruneParams(params) {
|
|
290
|
-
return Object.fromEntries(
|
|
302
|
+
return Object.fromEntries(
|
|
303
|
+
Object.entries(params).filter(([, value]) => value !== "" && value.length > 0)
|
|
304
|
+
);
|
|
291
305
|
}
|
|
292
306
|
function joinUrl(baseUrl, path) {
|
|
293
307
|
if (!baseUrl || /^https?:\/\//i.test(path)) return path;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiClient.js","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\n/** Operation catalog: an OpenAPI document whose response schemas may be stubs. */\nexport const CLICKY_OPENAPI_MEDIA_TYPE = \"application/vnd.clicky.openapi+json\";\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 // Each field mirrors the property it lands on, undefined included: a caller\n // rebuilding an error from a partial response should not have to spread\n // conditionally to say \"this one is unknown\".\n options: {\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 ) {\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 // Prefer the catalog projection — the same document with each operation's\n // response schemas stubbed, which nothing here reads and which is over\n // half the bytes. A server that does not serve it answers with the\n // complete document, which parses the same.\n headers: {\n Accept: `${CLICKY_OPENAPI_MEDIA_TYPE}, application/json;q=0.9`,\n },\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\nexport type ParsedBody = {\n data: unknown;\n text: string;\n blob?: Blob;\n contentType: string;\n};\n\nexport async 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\n// Exported because every fetch in the package has to fail the same way: with\n// the status, the URL and the parsed body attached, which is what\n// operationErrorDiagnostics reads back out to render ErrorDetails. A second\n// error-from-Response path would silently drop one of those again.\nexport function 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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"apiClient.js","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 OperationRequestValues,\n} from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/** Operation catalog: an OpenAPI document whose response schemas may be stubs. */\nexport const CLICKY_OPENAPI_MEDIA_TYPE = \"application/vnd.clicky.openapi+json\";\n\nexport type OperationApiClientContext = {\n path: string;\n method: string;\n};\n\nexport type OperationDefaultParams = (context: {\n path: string;\n method: string;\n params: OperationRequestValues;\n}) => MaybePromise<OperationRequestValues>;\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 // Each field mirrors the property it lands on, undefined included: a caller\n // rebuilding an error from a partial response should not have to spread\n // conditionally to say \"this one is unknown\".\n options: {\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 ) {\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?: OperationRequestValues,\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 // Prefer the catalog projection — the same document with each operation's\n // response schemas stubbed, which nothing here reads and which is over\n // half the bytes. A server that does not serve it answers with the\n // complete document, which parses the same.\n headers: {\n Accept: `${CLICKY_OPENAPI_MEDIA_TYPE}, application/json;q=0.9`,\n },\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: OperationRequestValues) {\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\nexport type ParsedBody = {\n data: unknown;\n text: string;\n blob?: Blob;\n contentType: string;\n};\n\nexport async 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\n// Exported because every fetch in the package has to fail the same way: with\n// the status, the URL and the parsed body attached, which is what\n// operationErrorDiagnostics reads back out to render ErrorDetails. A second\n// error-from-Response path would silently drop one of those again.\nexport function 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: OperationRequestValues,\n): { path: string; params: OperationRequestValues } {\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 rawDirectValue = queryParams[name];\n if (Array.isArray(rawDirectValue)) {\n throw new Error(`Path parameter ${name} must be a scalar value`);\n }\n const directValue = rawDirectValue;\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 | string[] | undefined): string[] {\n if (!value) return [];\n if (Array.isArray(value)) return value.map(String).filter(Boolean);\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: OperationRequestValues) {\n const next = { ...params };\n delete next.autoRun;\n delete next.__autoRun;\n return next;\n}\n\nfunction appendQuery(path: string, params: OperationRequestValues) {\n const query = new URLSearchParams(\n Object.fromEntries(\n Object.entries(pruneParams(params)).map(([key, value]) => [\n key,\n Array.isArray(value) ? value.join(\",\") : value,\n ]),\n ),\n ).toString();\n if (!query) return path;\n return `${path}${path.includes(\"?\") ? \"&\" : \"?\"}${query}`;\n}\n\nfunction pruneParams(params: OperationRequestValues): OperationRequestValues {\n return Object.fromEntries(\n Object.entries(params).filter(([, value]) => value !== \"\" && value.length > 0),\n );\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"],"mappings":"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"}
|