@flanksource/clicky-ui 0.2.9 → 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/components/Combobox.cjs +4 -1
  2. package/dist/components/Combobox.cjs.map +1 -1
  3. package/dist/components/Combobox.d.ts +6 -0
  4. package/dist/components/Combobox.d.ts.map +1 -1
  5. package/dist/components/Combobox.js +4 -1
  6. package/dist/components/Combobox.js.map +1 -1
  7. package/dist/components/JsonSchemaForm.cjs +24 -5
  8. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  9. package/dist/components/JsonSchemaForm.d.ts +1 -1
  10. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  11. package/dist/components/JsonSchemaForm.js +24 -5
  12. package/dist/components/JsonSchemaForm.js.map +1 -1
  13. package/dist/components/json-schema-form-array.cjs +117 -37
  14. package/dist/components/json-schema-form-array.cjs.map +1 -1
  15. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  16. package/dist/components/json-schema-form-array.js +118 -38
  17. package/dist/components/json-schema-form-array.js.map +1 -1
  18. package/dist/components/json-schema-form-fields.cjs +121 -51
  19. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  20. package/dist/components/json-schema-form-fields.d.ts +9 -6
  21. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  22. package/dist/components/json-schema-form-fields.js +121 -51
  23. package/dist/components/json-schema-form-fields.js.map +1 -1
  24. package/dist/components/json-schema-form-render.cjs +15 -8
  25. package/dist/components/json-schema-form-render.cjs.map +1 -1
  26. package/dist/components/json-schema-form-render.d.ts +5 -2
  27. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  28. package/dist/components/json-schema-form-render.js +15 -8
  29. package/dist/components/json-schema-form-render.js.map +1 -1
  30. package/dist/components/json-schema-form-resolve.cjs +41 -6
  31. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  32. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  33. package/dist/components/json-schema-form-resolve.js +41 -6
  34. package/dist/components/json-schema-form-resolve.js.map +1 -1
  35. package/dist/components/json-schema-form-size.cjs +61 -0
  36. package/dist/components/json-schema-form-size.cjs.map +1 -0
  37. package/dist/components/json-schema-form-size.d.ts +11 -0
  38. package/dist/components/json-schema-form-size.d.ts.map +1 -0
  39. package/dist/components/json-schema-form-size.js +61 -0
  40. package/dist/components/json-schema-form-size.js.map +1 -0
  41. package/dist/components/json-schema-form-types.d.ts +36 -1
  42. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  43. package/dist/components.cjs +2 -0
  44. package/dist/components.cjs.map +1 -1
  45. package/dist/components.d.ts +3 -1
  46. package/dist/components.d.ts.map +1 -1
  47. package/dist/components.js +2 -0
  48. package/dist/components.js.map +1 -1
  49. package/dist/data/Clicky.cjs +412 -90
  50. package/dist/data/Clicky.cjs.map +1 -1
  51. package/dist/data/Clicky.d.ts +4 -2
  52. package/dist/data/Clicky.d.ts.map +1 -1
  53. package/dist/data/Clicky.js +413 -91
  54. package/dist/data/Clicky.js.map +1 -1
  55. package/dist/data/DataTable.cjs +534 -293
  56. package/dist/data/DataTable.cjs.map +1 -1
  57. package/dist/data/DataTable.d.ts +12 -0
  58. package/dist/data/DataTable.d.ts.map +1 -1
  59. package/dist/data/DataTable.js +534 -293
  60. package/dist/data/DataTable.js.map +1 -1
  61. package/dist/data.d.ts +1 -1
  62. package/dist/data.d.ts.map +1 -1
  63. package/dist/index.cjs +2 -0
  64. package/dist/index.cjs.map +1 -1
  65. package/dist/index.js +2 -0
  66. package/dist/index.js.map +1 -1
  67. package/dist/rpc/CommandOutput.cjs +101 -20
  68. package/dist/rpc/CommandOutput.cjs.map +1 -1
  69. package/dist/rpc/CommandOutput.d.ts +12 -4
  70. package/dist/rpc/CommandOutput.d.ts.map +1 -1
  71. package/dist/rpc/CommandOutput.js +102 -21
  72. package/dist/rpc/CommandOutput.js.map +1 -1
  73. package/dist/rpc/ExecutionResult.cjs +4 -76
  74. package/dist/rpc/ExecutionResult.cjs.map +1 -1
  75. package/dist/rpc/ExecutionResult.d.ts +3 -22
  76. package/dist/rpc/ExecutionResult.d.ts.map +1 -1
  77. package/dist/rpc/ExecutionResult.js +4 -76
  78. package/dist/rpc/ExecutionResult.js.map +1 -1
  79. package/dist/rpc/OperationCatalog.cjs +22 -13
  80. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  81. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  82. package/dist/rpc/OperationCatalog.js +24 -15
  83. package/dist/rpc/OperationCatalog.js.map +1 -1
  84. package/dist/rpc/OperationCommandPage.cjs +10 -20
  85. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  86. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  87. package/dist/rpc/OperationCommandPage.js +11 -21
  88. package/dist/rpc/OperationCommandPage.js.map +1 -1
  89. package/dist/rpc/apiClient.cjs +18 -0
  90. package/dist/rpc/apiClient.cjs.map +1 -1
  91. package/dist/rpc/apiClient.d.ts.map +1 -1
  92. package/dist/rpc/apiClient.js +18 -0
  93. package/dist/rpc/apiClient.js.map +1 -1
  94. package/dist/rpc/formMetadata.cjs +31 -0
  95. package/dist/rpc/formMetadata.cjs.map +1 -1
  96. package/dist/rpc/formMetadata.d.ts +3 -1
  97. package/dist/rpc/formMetadata.d.ts.map +1 -1
  98. package/dist/rpc/formMetadata.js +31 -0
  99. package/dist/rpc/formMetadata.js.map +1 -1
  100. package/dist/rpc/types.cjs.map +1 -1
  101. package/dist/rpc/types.d.ts +7 -0
  102. package/dist/rpc/types.d.ts.map +1 -1
  103. package/dist/rpc/types.js.map +1 -1
  104. package/dist/styles.css +1 -1
  105. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"OperationCommandPage.js","sources":["../../src/rpc/OperationCommandPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type {\n ClickyCommandRuntime,\n ClickyNode,\n ClickyRow,\n ClickyTableRowClick,\n ClickyTableRowHref,\n} from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { AcceptPicker, type OperationPreviewMode } from \"./AcceptPicker\";\nimport { CommandForm, pathParamNames, submitValue } from \"./CommandForm\";\nimport { CommandOutput } from \"./CommandOutput\";\nimport type { RenderLink } from \"./EndpointList\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport {\n buildInitialParameterValues,\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationActionDialog } from \"./OperationActionDialog\";\nimport { isPositionalParam, type ExecutionResponse, type ResolvedOperation } from \"./types\";\nimport { useOperationById, type OperationsApiClient } from \"./useOperations\";\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 hideLockedPathFilters?: boolean;\n className?: string;\n};\n\nexport function OperationCommandPage({\n client,\n operationId,\n operation: providedOperation,\n operations = providedOperation ? [providedOperation] : [],\n initialValues = {},\n autoRun,\n backHref,\n backLabel = \"Back\",\n renderLink,\n onNavigate,\n hideLockedPathFilters = Boolean(providedOperation),\n className,\n}: OperationCommandPageProps) {\n const lookup = useOperationById(client, providedOperation ? undefined : operationId);\n const operation = providedOperation ?? lookup.operation;\n const isLoading = providedOperation ? false : lookup.isLoading;\n const [accept, setAccept] = useState(\"application/clicky+json\");\n const [previewMode, setPreviewMode] = useState<OperationPreviewMode>(\"hidden\");\n const [isExecuting, setIsExecuting] = useState(false);\n const [result, setResult] = useState<ExecutionResponse | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [submitError, setSubmitError] = useState(\"\");\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 stripRunnerParams(initialValues),\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 () => (operation ? findRelatedOperations(operation, operations, lockedPathValues) : []),\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 <CommandOutput>'s filter bar\n // and pagination footer instead of through a separate OperationQueryFilterBar.\n const [values, setValues] = useState<ParameterValues>(effectiveInitialValues);\n useEffect(() => {\n setValues(effectiveInitialValues);\n setSubmitError(\"\");\n }, [effectiveInitialValues]);\n const debouncedValues = useDebouncedRecord(values, 250);\n\n const lookupQuery = useQuery({\n queryKey: [\"operation-query-lookup\", operation?.method, operation?.path, debouncedValues],\n queryFn: async () => {\n if (!operation) return { filters: {} };\n return (\n (await client.lookupFilters?.(\n operation.path,\n operation.method,\n packParameterValues(debouncedValues, parameters),\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 staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(() => {\n if (!isGet) return { filters: [] };\n return parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues: lockedPathValues,\n hideLocked: hideLockedPathFilters,\n });\n }, [isGet, parameters, values, lookupQuery.data, lockedPathValues, hideLockedPathFilters]);\n\n const dataTablePagination = useMemo<DataTablePagination | undefined>(() => {\n const p = formConfig.pagination;\n if (!p) return undefined;\n const pageSize = Math.max(parseInt(p.limitValue, 10) || 25, 1);\n const offset = Math.max(parseInt(p.offsetValue, 10) || 0, 0);\n const page = Math.floor(offset / pageSize);\n return {\n page,\n pageSize,\n onPageChange: (next: number) => p.setOffset(String(Math.max(next, 0) * pageSize)),\n onPageSizeChange: (next: number) => {\n p.setLimit(String(next));\n p.setOffset(\"0\");\n },\n };\n }, [formConfig.pagination]);\n\n // Ref tracking the last submitted parameter signature so that the\n // auto-submit-on-debounced-change effect and the manual submit button\n // both coordinate against the same \"have I already fired this set of\n // values\" check.\n const lastSubmittedSignature = useRef(\"\");\n\n function handleManualSubmit() {\n if (!operation) return;\n const merged = { ...values, ...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) {\n setSubmitError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`,\n );\n return;\n }\n setSubmitError(\"\");\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(merged));\n void executeOperation(merged);\n }\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: accept },\n );\n setResult(response);\n } catch (err) {\n setResult(null);\n setError(err);\n } finally {\n setIsExecuting(false);\n }\n }\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(pruneParameterValues(effectiveInitialValues));\n void executeOperation(effectiveInitialValues);\n }, [\n accept,\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 }, [isGet, hasAutoRun, debouncedValues, lockedPathValues, parameterSignature]);\n\n const getRowDetailHref = useCallback<ClickyTableRowHref>(\n (row) => {\n if (!detailOperation) return undefined;\n const id = getClickyRowId(row);\n if (!id) return undefined;\n return hrefForOperation(detailOperation, [], { id });\n },\n [detailOperation],\n );\n\n const handleTableRowClick = useCallback<ClickyTableRowClick>(\n (row) => {\n const href = getRowDetailHref(row);\n if (href) onNavigate?.(href);\n },\n [getRowDetailHref, onNavigate],\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 href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading operation...</div>;\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 const preview = buildOperationPreview(operation, effectiveInitialValues, accept, previewMode);\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\">{op.summary || op.operationId || path}</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\">{op.operationId}</p>\n )}\n {op.description && op.description !== op.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{op.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-3\">\n <div>\n <div className=\"mb-1 text-right text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n Accept\n </div>\n <AcceptPicker\n value={accept}\n onChange={setAccept}\n previewMode={previewMode}\n onPreviewModeChange={setPreviewMode}\n />\n </div>\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={accept}\n {...(onNavigate ? { onNavigateAction: onNavigate } : {})}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n\n <section className=\"space-y-3\">\n {method.toUpperCase() === \"GET\" ? (\n parameters.length > 0 ? (\n // Before a result lands the FilterBar lives here so users can\n // fill in path params / required inputs and submit. Once a\n // result is showing AND auto-run is on (sidebar flow), the same\n // filter chips relocate into the DataTable's filter bar via\n // externalFilters, which is the unified placement the user asked\n // for. The two branches share `formConfig.filters` so the values\n // stay in sync.\n !result || !effectiveAutoRun ? (\n <div className=\"space-y-2\">\n <FilterBar\n autoSubmit={effectiveAutoRun}\n filters={formConfig.filters}\n {...(!effectiveAutoRun ? { onApply: () => handleManualSubmit() } : {})}\n applyLabel=\"Execute request\"\n isPending={isExecuting}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n />\n {submitError && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {submitError}\n </div>\n )}\n </div>\n ) : null\n ) : null\n ) : (\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={accept}\n initialValues={effectiveInitialValues}\n />\n </div>\n )}\n\n {preview && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">{preview}</pre>\n )}\n </section>\n\n {error ? (\n <InlineError title={`Failed to load ${path} as ${accept}`} error={error} />\n ) : isExecuting && !result ? (\n <ExecutionResult loading loadingMessage=\"Loading execution results…\" className=\"mt-0\" />\n ) : result ? (\n <div role=\"region\" aria-label=\"Response body\">\n <CommandOutput\n response={result}\n bare\n {...(detailOperation\n ? {\n getTableRowHref: getRowDetailHref,\n onTableRowClick: handleTableRowClick,\n isTableRowClickable: (row: ClickyRow) => Boolean(getRowDetailHref(row)),\n }\n : {})}\n {...(isGet && effectiveAutoRun && formConfig.filters.length > 0\n ? { externalFilters: formConfig.filters }\n : {})}\n {...(isGet && effectiveAutoRun && dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n />\n </div>\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 = current.path.replace(/\\/+$/, \"\");\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 method === \"GET\" || method === \"POST\" || method === \"PUT\" || method === \"DELETE\";\n })\n .map((related) => {\n const method = related.method.toUpperCase();\n const href = method === \"GET\" ? hrefForOperation(related, [], pathValues) : undefined;\n return {\n operation: related,\n label: operationLabel(related),\n ...(href ? { href } : {}),\n };\n })\n .filter((related) => related.operation.method.toUpperCase() !== \"GET\" || related.href);\n}\n\nfunction findDetailOperation(current: ResolvedOperation, operations: ResolvedOperation[]) {\n const method = current.method.toUpperCase();\n const detailPath = `${current.path.replace(/\\/+$/, \"\")}/{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 hrefForOperation(\n operation: ResolvedOperation,\n args: string[] = [],\n flags: Record<string, string> = {},\n): string | undefined {\n let route = apiPathToRoutePath(operation.path);\n const consumedFlags = new Set<string>();\n\n pathParamNames(operation.path).forEach((name, index) => {\n const value = flags[name] ?? args[index];\n if (!value) return;\n consumedFlags.add(name);\n route = route.replace(`:${name}`, encodeURIComponent(value));\n });\n\n if (route.includes(\":\")) return undefined;\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(flags)) {\n if (value && !consumedFlags.has(key)) search.set(key, value);\n }\n const query = search.toString();\n return query ? `${route}?${query}` : route;\n}\n\nfunction apiPathToRoutePath(path: string): string {\n const cliPath = path\n .trim()\n .replace(/^\\/api\\/v1\\/?/, \"\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n if (!cliPath) return \"/\";\n return `/${cliPath.replace(/\\{([^}]+)\\}/g, \":$1\")}`;\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 buildOperationPreview(\n operation: ResolvedOperation,\n values: ParameterValues,\n accept: string,\n mode: OperationPreviewMode,\n) {\n if (mode === \"hidden\") return \"\";\n if (mode === \"cli\") return buildCliPreview(operation, values);\n return buildCurlPreview(operation, values, accept);\n}\n\nfunction buildCurlPreview(operation: ResolvedOperation, values: ParameterValues, accept: string) {\n const params = operation.operation.parameters ?? [];\n const parts = [`curl -X ${operation.method.toUpperCase()}`];\n if (accept !== \"application/json\") parts.push(`-H \"Accept: ${accept}\"`);\n let url = operation.path;\n const queryParts: string[] = [];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\") {\n url = url.replace(`{${param.name}}`, encodeURIComponent(value));\n } else if (param.in === \"query\") {\n queryParts.push(`${encodeURIComponent(param.name)}=${encodeURIComponent(value)}`);\n }\n }\n if (queryParts.length > 0) url += `?${queryParts.join(\"&\")}`;\n parts.push(`\"${url}\"`);\n return parts.join(\" \");\n}\n\nfunction buildCliPreview(operation: ResolvedOperation, values: ParameterValues) {\n const command = operation.operation[\"x-clicky\"]?.command;\n if (!command) return buildCurlPreview(operation, values, \"application/json\");\n const params = operation.operation.parameters ?? [];\n const positionalNames = new Set(params.filter(isPositionalParam).map((param) => param.name));\n const parts = [command.replaceAll(\"/\", \" \")];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\" || positionalNames.has(param.name)) {\n parts.push(shellQuote(value));\n continue;\n }\n parts.push(`--${param.name}`, shellQuote(value));\n }\n return parts.join(\" \");\n}\n\nfunction shellQuote(value: string) {\n if (/^[a-zA-Z0-9_./:@-]+$/.test(value)) return value;\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\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 === \"__autoRun\") continue;\n next[key] = value;\n }\n return next;\n}\n\nfunction getClickyRowId(row: ClickyRow) {\n const candidates = [\"_id\", \"id\", \"ID\", \"guid\", \"GUID\"];\n for (const key of candidates) {\n const value = clickyNodeText(row.cells[key]);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction clickyNodeText(node: ClickyNode | undefined): string {\n if (!node) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n if (node.source) return node.source;\n if (node.children) return node.children.map(clickyNodeText).join(\"\");\n if (node.items) return node.items.map(clickyNodeText).join(\" \");\n if (node.fields) return node.fields.map((field) => clickyNodeText(field.value)).join(\" \");\n return \"\";\n}\n"],"names":["values"],"mappings":"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"}
1
+ {"version":3,"file":"OperationCommandPage.js","sources":["../../src/rpc/OperationCommandPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport type {\n ClickyCommandRuntime,\n ClickyNode,\n ClickyRow,\n ClickyTableRowClick,\n ClickyTableRowHref,\n} from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { AcceptPicker, type OperationPreviewMode } from \"./AcceptPicker\";\nimport { CommandForm, pathParamNames, submitValue } from \"./CommandForm\";\nimport { CommandOutput } from \"./CommandOutput\";\nimport type { RenderLink } from \"./EndpointList\";\nimport {\n buildInitialParameterValues,\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationActionDialog } from \"./OperationActionDialog\";\nimport { isPositionalParam, type ExecutionResponse, type ResolvedOperation } from \"./types\";\nimport { useOperationById, type OperationsApiClient } from \"./useOperations\";\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 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 hideLockedPathFilters = Boolean(providedOperation),\n className,\n}: OperationCommandPageProps) {\n const lookup = useOperationById(client, providedOperation ? undefined : operationId);\n const operation = providedOperation ?? lookup.operation;\n const isLoading = providedOperation ? false : lookup.isLoading;\n const [accept, setAccept] = useState(\"application/clicky+json\");\n const [previewMode, setPreviewMode] = useState<OperationPreviewMode>(\"hidden\");\n const [isExecuting, setIsExecuting] = useState(false);\n const [result, setResult] = useState<ExecutionResponse | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [submitError, setSubmitError] = useState(\"\");\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 stripRunnerParams(initialValues),\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 () => (operation ? findRelatedOperations(operation, operations, lockedPathValues) : []),\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 <CommandOutput>'s filter bar\n // and pagination footer instead of through a separate OperationQueryFilterBar.\n const [values, setValues] = useState<ParameterValues>(effectiveInitialValues);\n useEffect(() => {\n setValues(effectiveInitialValues);\n setSubmitError(\"\");\n }, [effectiveInitialValues]);\n const debouncedValues = useDebouncedRecord(values, 250);\n\n const lookupQuery = useQuery({\n queryKey: [\"operation-query-lookup\", operation?.method, operation?.path, debouncedValues],\n queryFn: async () => {\n if (!operation) return { filters: {} };\n return (\n (await client.lookupFilters?.(\n operation.path,\n operation.method,\n packParameterValues(debouncedValues, parameters),\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 staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(() => {\n if (!isGet) return { filters: [] };\n return parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues: lockedPathValues,\n hideLocked: hideLockedPathFilters,\n });\n }, [isGet, parameters, values, lookupQuery.data, lockedPathValues, hideLockedPathFilters]);\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 that the\n // auto-submit-on-debounced-change effect and the manual submit button\n // both coordinate against the same \"have I already fired this set of\n // values\" check.\n const lastSubmittedSignature = useRef(\"\");\n\n function handleManualSubmit() {\n if (!operation) return;\n const merged = { ...values, ...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) {\n setSubmitError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`,\n );\n return;\n }\n setSubmitError(\"\");\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(merged));\n void executeOperation(merged);\n }\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: accept },\n );\n setResult(response);\n } catch (err) {\n setResult(null);\n setError(err);\n } finally {\n setIsExecuting(false);\n }\n }\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(pruneParameterValues(effectiveInitialValues));\n void executeOperation(effectiveInitialValues);\n }, [\n accept,\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 }, [isGet, hasAutoRun, debouncedValues, lockedPathValues, parameterSignature]);\n\n const getRowDetailHref = useCallback<ClickyTableRowHref>(\n (row) => {\n if (!detailOperation) return undefined;\n const id = getClickyRowId(row);\n if (!id) return undefined;\n return hrefForOperation(detailOperation, [], { id });\n },\n [detailOperation],\n );\n\n const handleTableRowClick = useCallback<ClickyTableRowClick>(\n (row) => {\n const href = getRowDetailHref(row);\n if (href) onNavigate?.(href);\n },\n [getRowDetailHref, onNavigate],\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 href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading operation...</div>;\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 const preview = buildOperationPreview(operation, effectiveInitialValues, accept, previewMode);\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\">{op.summary || op.operationId || path}</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\">{op.operationId}</p>\n )}\n {op.description && op.description !== op.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{op.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-3\">\n <div>\n <div className=\"mb-1 text-right text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n Accept\n </div>\n <AcceptPicker\n value={accept}\n onChange={setAccept}\n previewMode={previewMode}\n onPreviewModeChange={setPreviewMode}\n />\n </div>\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={accept}\n {...(onNavigate ? { onNavigateAction: onNavigate } : {})}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n\n <section className=\"space-y-3\">\n {method.toUpperCase() === \"GET\" ? (\n parameters.length > 0 ? (\n // Before a result lands the FilterBar lives here so users can\n // fill in path params / required inputs and submit. Once a\n // result is showing AND auto-run is on (sidebar flow), the same\n // filter chips relocate into the DataTable's filter bar via\n // externalFilters, which is the unified placement the user asked\n // for. The two branches share `formConfig.filters` so the values\n // stay in sync.\n !result || !effectiveAutoRun ? (\n <div className=\"space-y-2\">\n <FilterBar\n autoSubmit={effectiveAutoRun}\n filters={formConfig.filters}\n {...(!effectiveAutoRun ? { onApply: () => handleManualSubmit() } : {})}\n applyLabel=\"Execute request\"\n isPending={isExecuting}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n />\n {submitError && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {submitError}\n </div>\n )}\n </div>\n ) : null\n ) : null\n ) : (\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={accept}\n initialValues={effectiveInitialValues}\n />\n </div>\n )}\n\n {preview && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">{preview}</pre>\n )}\n </section>\n\n {error ? (\n <InlineError title={`Failed to load ${path} as ${accept}`} error={error} />\n ) : isExecuting || result ? (\n <div role=\"region\" aria-label=\"Response body\">\n <CommandOutput\n response={result}\n loading={isExecuting}\n loadingMessage=\"Loading execution results…\"\n bare\n {...(detailOperation\n ? {\n getTableRowHref: getRowDetailHref,\n onTableRowClick: handleTableRowClick,\n isTableRowClickable: (row: ClickyRow) => Boolean(getRowDetailHref(row)),\n }\n : {})}\n {...(isGet && effectiveAutoRun && formConfig.filters.length > 0\n ? { externalFilters: formConfig.filters }\n : {})}\n {...(isGet && effectiveAutoRun && dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n />\n </div>\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 = current.path.replace(/\\/+$/, \"\");\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 method === \"GET\" || method === \"POST\" || method === \"PUT\" || method === \"DELETE\";\n })\n .map((related) => {\n const method = related.method.toUpperCase();\n const href = method === \"GET\" ? hrefForOperation(related, [], pathValues) : undefined;\n return {\n operation: related,\n label: operationLabel(related),\n ...(href ? { href } : {}),\n };\n })\n .filter((related) => related.operation.method.toUpperCase() !== \"GET\" || related.href);\n}\n\nfunction findDetailOperation(current: ResolvedOperation, operations: ResolvedOperation[]) {\n const method = current.method.toUpperCase();\n const detailPath = `${current.path.replace(/\\/+$/, \"\")}/{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 hrefForOperation(\n operation: ResolvedOperation,\n args: string[] = [],\n flags: Record<string, string> = {},\n): string | undefined {\n let route = apiPathToRoutePath(operation.path);\n const consumedFlags = new Set<string>();\n\n pathParamNames(operation.path).forEach((name, index) => {\n const value = flags[name] ?? args[index];\n if (!value) return;\n consumedFlags.add(name);\n route = route.replace(`:${name}`, encodeURIComponent(value));\n });\n\n if (route.includes(\":\")) return undefined;\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(flags)) {\n if (value && !consumedFlags.has(key)) search.set(key, value);\n }\n const query = search.toString();\n return query ? `${route}?${query}` : route;\n}\n\nfunction apiPathToRoutePath(path: string): string {\n const cliPath = path\n .trim()\n .replace(/^\\/api\\/v1\\/?/, \"\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n if (!cliPath) return \"/\";\n return `/${cliPath.replace(/\\{([^}]+)\\}/g, \":$1\")}`;\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 buildOperationPreview(\n operation: ResolvedOperation,\n values: ParameterValues,\n accept: string,\n mode: OperationPreviewMode,\n) {\n if (mode === \"hidden\") return \"\";\n if (mode === \"cli\") return buildCliPreview(operation, values);\n return buildCurlPreview(operation, values, accept);\n}\n\nfunction buildCurlPreview(operation: ResolvedOperation, values: ParameterValues, accept: string) {\n const params = operation.operation.parameters ?? [];\n const parts = [`curl -X ${operation.method.toUpperCase()}`];\n if (accept !== \"application/json\") parts.push(`-H \"Accept: ${accept}\"`);\n let url = operation.path;\n const queryParts: string[] = [];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\") {\n url = url.replace(`{${param.name}}`, encodeURIComponent(value));\n } else if (param.in === \"query\") {\n queryParts.push(`${encodeURIComponent(param.name)}=${encodeURIComponent(value)}`);\n }\n }\n if (queryParts.length > 0) url += `?${queryParts.join(\"&\")}`;\n parts.push(`\"${url}\"`);\n return parts.join(\" \");\n}\n\nfunction buildCliPreview(operation: ResolvedOperation, values: ParameterValues) {\n const command = operation.operation[\"x-clicky\"]?.command;\n if (!command) return buildCurlPreview(operation, values, \"application/json\");\n const params = operation.operation.parameters ?? [];\n const positionalNames = new Set(params.filter(isPositionalParam).map((param) => param.name));\n const parts = [command.replaceAll(\"/\", \" \")];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\" || positionalNames.has(param.name)) {\n parts.push(shellQuote(value));\n continue;\n }\n parts.push(`--${param.name}`, shellQuote(value));\n }\n return parts.join(\" \");\n}\n\nfunction shellQuote(value: string) {\n if (/^[a-zA-Z0-9_./:@-]+$/.test(value)) return value;\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\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 getClickyRowId(row: ClickyRow) {\n const candidates = [\"_id\", \"id\", \"ID\", \"guid\", \"GUID\"];\n for (const key of candidates) {\n const value = clickyNodeText(row.cells[key]);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction clickyNodeText(node: ClickyNode | undefined): string {\n if (!node) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n if (node.source) return node.source;\n if (node.children) return node.children.map(clickyNodeText).join(\"\");\n if (node.items) return node.items.map(clickyNodeText).join(\" \");\n if (node.fields) return node.fields.map((field) => clickyNodeText(field.value)).join(\" \");\n return \"\";\n}\n"],"names":["values"],"mappings":"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"}
@@ -176,6 +176,7 @@ function parseExecutionResponse(response, parsed, context) {
176
176
  const exitCode = parseInt(headers["x-exit-code"] ?? (success ? "0" : "1"), 10);
177
177
  const cli = headers["x-cli-command"];
178
178
  const error = headers["x-error"] || clickyError;
179
+ const pagination = paginationFromHeaders(headers);
179
180
  return {
180
181
  success,
181
182
  stdout,
@@ -183,6 +184,8 @@ function parseExecutionResponse(response, parsed, context) {
183
184
  exit_code: Number.isFinite(exitCode) ? exitCode : success ? 0 : 1,
184
185
  contentType: parsed.contentType || headers["content-type"] || "application/json",
185
186
  requestUrl: context.requestUrl,
187
+ responseHeaders: headers,
188
+ ...pagination ? { pagination } : {},
186
189
  ...cli ? { cli } : {},
187
190
  ...error ? { error } : {},
188
191
  ...parsed.blob ? { blob: parsed.blob } : {},
@@ -266,6 +269,21 @@ function responseHeaders(headers) {
266
269
  });
267
270
  return out;
268
271
  }
272
+ function paginationFromHeaders(headers) {
273
+ const pagination = {};
274
+ const total = integerHeader(headers["x-total-count"]);
275
+ const limit = integerHeader(headers["x-page-limit"]);
276
+ const offset = integerHeader(headers["x-page-offset"]);
277
+ if (total !== void 0) pagination.total = total;
278
+ if (limit !== void 0) pagination.limit = limit;
279
+ if (offset !== void 0) pagination.offset = offset;
280
+ return Object.keys(pagination).length > 0 ? pagination : void 0;
281
+ }
282
+ function integerHeader(value) {
283
+ if (value == null || value.trim() === "") return void 0;
284
+ const parsed = parseInt(value, 10);
285
+ return Number.isFinite(parsed) ? parsed : void 0;
286
+ }
269
287
  function shouldParseJson(text, contentType) {
270
288
  const trimmed = text.trim();
271
289
  return trimmed !== "" && (contentType.toLowerCase().includes("json") || trimmed.startsWith("{") || trimmed.startsWith("["));
@@ -1 +1 @@
1
- {"version":3,"file":"apiClient.cjs","sources":["../../src/rpc/apiClient.ts"],"sourcesContent":["import type {\n ExecutionResponse,\n OpenAPISpec,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type OperationApiClientContext = {\n path: string;\n method: string;\n};\n\nexport type OperationDefaultParams = (context: {\n path: string;\n method: string;\n params: Record<string, string>;\n}) => MaybePromise<Record<string, string>>;\n\nexport type OperationHeadersProvider = (\n headers: Headers,\n context: OperationApiClientContext,\n) => MaybePromise<HeadersInit | void>;\n\nexport type CreateOperationsApiClientOptions = {\n baseUrl?: string;\n openApiPath?: string;\n credentials?: RequestCredentials;\n fetch?: typeof fetch;\n prepareHeaders?: OperationHeadersProvider;\n defaultParams?: OperationDefaultParams;\n};\n\nexport class OperationsApiClientError extends Error {\n status: number | undefined;\n method: string | undefined;\n url: string | undefined;\n responseBody: string | undefined;\n responseData: unknown;\n responseHeaders: Record<string, string> | undefined;\n\n constructor(\n message: string,\n options: {\n status?: number;\n method?: string;\n url?: string;\n responseBody?: string;\n responseData?: unknown;\n responseHeaders?: Record<string, string>;\n } = {},\n ) {\n super(message);\n this.name = \"OperationsApiClientError\";\n this.status = options.status;\n this.method = options.method;\n this.url = options.url;\n this.responseBody = options.responseBody;\n this.responseData = options.responseData;\n this.responseHeaders = options.responseHeaders;\n }\n}\n\nexport interface SharedOperationsApiClient extends OperationsApiClient {\n lookupFilterOptions(\n path: string,\n method: string,\n filterKey: string,\n query: string,\n ): Promise<OperationLookupFilter>;\n executeCommandBody(\n path: string,\n body: Record<string, unknown>,\n headers?: Record<string, string>,\n ): Promise<ExecutionResponse>;\n}\n\nexport function createOperationsApiClient(\n options: CreateOperationsApiClientOptions = {},\n): SharedOperationsApiClient {\n const fetcher = options.fetch ?? fetch;\n const openApiPath = options.openApiPath ?? \"/api/openapi.json\";\n\n async function makeHeaders(\n base: HeadersInit | undefined,\n context: OperationApiClientContext,\n ): Promise<Headers> {\n const headers = new Headers(base);\n const prepared = await options.prepareHeaders?.(headers, context);\n return prepared ? new Headers(prepared) : headers;\n }\n\n async function request(\n path: string,\n method: string,\n init: Omit<RequestInit, \"method\" | \"headers\" | \"credentials\"> & {\n headers?: HeadersInit;\n requestUrl?: string;\n } = {},\n ): Promise<Response> {\n const url = joinUrl(options.baseUrl, path);\n const headers = await makeHeaders(init.headers, { path, method });\n return fetcher(url, {\n ...init,\n method,\n headers,\n ...(options.credentials ? { credentials: options.credentials } : {}),\n });\n }\n\n async function getOpenAPISpec(): Promise<OpenAPISpec> {\n const response = await request(openApiPath, \"GET\", {\n headers: { Accept: \"application/json\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) {\n throw errorFromResponse(response, \"GET\", openApiPath, parsed);\n }\n return parsed.data as OpenAPISpec;\n }\n\n async function withDefaults(path: string, method: string, params: Record<string, string>) {\n return (await options.defaultParams?.({ path, method, params })) ?? params;\n }\n\n return {\n getOpenAPISpec,\n\n async executeCommand(path, method, params, headers) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, params);\n const scoped = await withDefaults(resolved.path, upper, resolved.params);\n const accept = headerValue(headers, \"Accept\");\n\n if (upper === \"GET\") {\n const requestUrl = appendQuery(resolved.path, scoped);\n const response = await request(requestUrl, upper, {\n ...(headers ? { headers } : {}),\n requestUrl,\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl,\n });\n }\n\n const response = await request(resolved.path, upper, {\n headers: { \"Content-Type\": \"application/json\", ...(headers ?? {}) },\n body: JSON.stringify(scoped),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl: resolved.path,\n });\n },\n\n async executeCommandBody(path, body, headers) {\n const accept = headerValue(headers, \"Accept\");\n const response = await request(path, \"POST\", {\n headers: { \"Content-Type\": \"application/json\", ...(headers ?? {}) },\n body: JSON.stringify(body),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: \"POST\",\n requestUrl: path,\n });\n },\n\n 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) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, {});\n const queryParams = {\n __lookup: \"filters\",\n __lookup_filter: filterKey,\n __lookup_q: query,\n };\n\n const requestPath = appendQuery(resolved.path, queryParams);\n const response = await request(requestPath, upper, {\n headers: { Accept: \"application/json+clicky\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) throw errorFromResponse(response, upper, requestPath, parsed);\n return ((parsed.data as OperationLookupResponse | undefined)?.filters?.[filterKey] ??\n {}) as OperationLookupFilter;\n },\n };\n}\n\nfunction responseKind(accept?: string): \"json\" | \"text\" | \"blob\" {\n if (!accept) return \"json\";\n const normalized = accept.toLowerCase();\n if (normalized.includes(\"application/pdf\")) return \"blob\";\n if (\n normalized.includes(\"text/\") ||\n normalized.includes(\"application/x-yaml\") ||\n normalized.includes(\"application/yaml\")\n ) {\n return \"text\";\n }\n return \"json\";\n}\n\ntype ParsedBody = {\n data: unknown;\n text: string;\n blob?: Blob;\n contentType: string;\n};\n\nasync function readResponseBody(response: Response, kind: \"json\" | \"text\" | \"blob\"): Promise<ParsedBody> {\n const contentType = response.headers.get(\"Content-Type\") || \"\";\n if (kind === \"blob\") {\n const blob = await response.blob();\n return { data: undefined, text: \"[binary]\", blob, contentType };\n }\n\n const text = await response.text();\n if (kind === \"text\" || !shouldParseJson(text, contentType)) {\n return { data: text, text, contentType };\n }\n\n try {\n return { data: JSON.parse(text) as unknown, text, contentType };\n } catch {\n return { data: text, text, contentType };\n }\n}\n\nfunction parseExecutionResponse(\n response: Response,\n parsed: ParsedBody,\n context: { method: string; requestUrl: string },\n): ExecutionResponse {\n const headers = responseHeaders(response.headers);\n const data = parsed.data;\n const stdout =\n parsed.blob != null\n ? \"[binary]\"\n : typeof data === \"string\"\n ? data\n : parsed.text || JSON.stringify(data, null, 2);\n const clickyEnvelope = isClickyEnvelope(data);\n\n if (!response.ok && !clickyEnvelope) {\n throw errorFromResponse(response, context.method, context.requestUrl, parsed);\n }\n\n const clickyError = errorFromClickyEnvelope(data);\n const successHeader = headers[\"x-execution-success\"];\n const success = successHeader == null ? response.ok && !clickyError : successHeader !== \"false\";\n const exitCode = parseInt(headers[\"x-exit-code\"] ?? (success ? \"0\" : \"1\"), 10);\n const cli = headers[\"x-cli-command\"];\n const error = headers[\"x-error\"] || clickyError;\n\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 ...(cli ? { cli } : {}),\n ...(error ? { error } : {}),\n ...(parsed.blob ? { blob: parsed.blob } : {}),\n ...(parsed.blob == null && typeof data !== \"string\" ? { parsed: data } : {}),\n };\n}\n\nfunction errorFromResponse(\n response: Response,\n method: string,\n url: string,\n parsed: ParsedBody,\n): OperationsApiClientError {\n const headers = responseHeaders(response.headers);\n const message =\n headers[\"x-error\"] ||\n messageFromBody(parsed.data) ||\n `${method} ${url} failed with ${response.status}: ${\n parsed.text || response.statusText\n }`;\n return new OperationsApiClientError(message, {\n status: response.status,\n method,\n url,\n responseBody: parsed.text,\n responseData: parsed.data,\n responseHeaders: headers,\n });\n}\n\nfunction resolvePathParams(\n path: string,\n params: Record<string, string>,\n): { path: string; params: Record<string, string> } {\n const queryParams = { ...params };\n let resolvedPath = path;\n const placeholders = [...path.matchAll(/\\{([^}]+)\\}/g)]\n .map((match) => match[1])\n .filter((name): name is string => Boolean(name));\n const argValues = parseArgsParam(params.args);\n let consumedArgs = false;\n const consumedDirectValues: string[] = [];\n\n for (const [index, name] of placeholders.entries()) {\n const directValue = queryParams[name];\n const fallbackValue = directValue || argValues[index];\n if (!fallbackValue) continue;\n\n resolvedPath = resolvedPath.replace(`{${name}}`, encodeURIComponent(fallbackValue));\n delete queryParams[name];\n if (!directValue && argValues[index]) consumedArgs = true;\n if (directValue) consumedDirectValues[index] = directValue;\n }\n\n const argsDuplicateResolvedPath =\n argValues.length > 0 &&\n argValues.length === consumedDirectValues.filter(Boolean).length &&\n argValues.every((value, index) => value === consumedDirectValues[index]);\n\n if (consumedArgs || argsDuplicateResolvedPath) {\n delete queryParams.args;\n }\n\n return { path: resolvedPath, params: stripRunnerParams(queryParams) };\n}\n\nfunction parseArgsParam(value: string | undefined): string[] {\n if (!value) return [];\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed.toLowerCase() === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited args below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction stripRunnerParams(params: Record<string, string>) {\n const next = { ...params };\n delete next.autoRun;\n delete next.__autoRun;\n return next;\n}\n\nfunction appendQuery(path: string, params: Record<string, string>) {\n const query = new URLSearchParams(pruneParams(params)).toString();\n if (!query) return path;\n return `${path}${path.includes(\"?\") ? \"&\" : \"?\"}${query}`;\n}\n\nfunction pruneParams(params: Record<string, string>) {\n return Object.fromEntries(Object.entries(params).filter(([, value]) => value !== \"\"));\n}\n\nfunction joinUrl(baseUrl: string | undefined, path: string) {\n if (!baseUrl || /^https?:\\/\\//i.test(path)) return path;\n return `${baseUrl.replace(/\\/+$/, \"\")}/${path.replace(/^\\/+/, \"\")}`;\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 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.cjs","sources":["../../src/rpc/apiClient.ts"],"sourcesContent":["import type {\n ExecutionPagination,\n ExecutionResponse,\n OpenAPISpec,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type OperationApiClientContext = {\n path: string;\n method: string;\n};\n\nexport type OperationDefaultParams = (context: {\n path: string;\n method: string;\n params: Record<string, string>;\n}) => MaybePromise<Record<string, string>>;\n\nexport type OperationHeadersProvider = (\n headers: Headers,\n context: OperationApiClientContext,\n) => MaybePromise<HeadersInit | void>;\n\nexport type CreateOperationsApiClientOptions = {\n baseUrl?: string;\n openApiPath?: string;\n credentials?: RequestCredentials;\n fetch?: typeof fetch;\n prepareHeaders?: OperationHeadersProvider;\n defaultParams?: OperationDefaultParams;\n};\n\nexport class OperationsApiClientError extends Error {\n status: number | undefined;\n method: string | undefined;\n url: string | undefined;\n responseBody: string | undefined;\n responseData: unknown;\n responseHeaders: Record<string, string> | undefined;\n\n constructor(\n message: string,\n options: {\n status?: number;\n method?: string;\n url?: string;\n responseBody?: string;\n responseData?: unknown;\n responseHeaders?: Record<string, string>;\n } = {},\n ) {\n super(message);\n this.name = \"OperationsApiClientError\";\n this.status = options.status;\n this.method = options.method;\n this.url = options.url;\n this.responseBody = options.responseBody;\n this.responseData = options.responseData;\n this.responseHeaders = options.responseHeaders;\n }\n}\n\nexport interface SharedOperationsApiClient extends OperationsApiClient {\n lookupFilterOptions(\n path: string,\n method: string,\n filterKey: string,\n query: string,\n ): Promise<OperationLookupFilter>;\n executeCommandBody(\n path: string,\n body: Record<string, unknown>,\n headers?: Record<string, string>,\n ): Promise<ExecutionResponse>;\n}\n\nexport function createOperationsApiClient(\n options: CreateOperationsApiClientOptions = {},\n): SharedOperationsApiClient {\n const fetcher = options.fetch ?? fetch;\n const openApiPath = options.openApiPath ?? \"/api/openapi.json\";\n\n async function makeHeaders(\n base: HeadersInit | undefined,\n context: OperationApiClientContext,\n ): Promise<Headers> {\n const headers = new Headers(base);\n const prepared = await options.prepareHeaders?.(headers, context);\n return prepared ? new Headers(prepared) : headers;\n }\n\n async function request(\n path: string,\n method: string,\n init: Omit<RequestInit, \"method\" | \"headers\" | \"credentials\"> & {\n headers?: HeadersInit;\n requestUrl?: string;\n } = {},\n ): Promise<Response> {\n const url = joinUrl(options.baseUrl, path);\n const headers = await makeHeaders(init.headers, { path, method });\n return fetcher(url, {\n ...init,\n method,\n headers,\n ...(options.credentials ? { credentials: options.credentials } : {}),\n });\n }\n\n async function getOpenAPISpec(): Promise<OpenAPISpec> {\n const response = await request(openApiPath, \"GET\", {\n headers: { Accept: \"application/json\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) {\n throw errorFromResponse(response, \"GET\", openApiPath, parsed);\n }\n return parsed.data as OpenAPISpec;\n }\n\n async function withDefaults(path: string, method: string, params: Record<string, string>) {\n return (await options.defaultParams?.({ path, method, params })) ?? params;\n }\n\n return {\n getOpenAPISpec,\n\n async executeCommand(path, method, params, headers) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, params);\n const scoped = await withDefaults(resolved.path, upper, resolved.params);\n const accept = headerValue(headers, \"Accept\");\n\n if (upper === \"GET\") {\n const requestUrl = appendQuery(resolved.path, scoped);\n const response = await request(requestUrl, upper, {\n ...(headers ? { headers } : {}),\n requestUrl,\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl,\n });\n }\n\n const response = await request(resolved.path, upper, {\n headers: { \"Content-Type\": \"application/json\", ...(headers ?? {}) },\n body: JSON.stringify(scoped),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl: resolved.path,\n });\n },\n\n async executeCommandBody(path, body, headers) {\n const accept = headerValue(headers, \"Accept\");\n const response = await request(path, \"POST\", {\n headers: { \"Content-Type\": \"application/json\", ...(headers ?? {}) },\n body: JSON.stringify(body),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: \"POST\",\n requestUrl: path,\n });\n },\n\n 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) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, {});\n const queryParams = {\n __lookup: \"filters\",\n __lookup_filter: filterKey,\n __lookup_q: query,\n };\n\n const requestPath = appendQuery(resolved.path, queryParams);\n const response = await request(requestPath, upper, {\n headers: { Accept: \"application/json+clicky\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) throw errorFromResponse(response, upper, requestPath, parsed);\n return ((parsed.data as OperationLookupResponse | undefined)?.filters?.[filterKey] ??\n {}) as OperationLookupFilter;\n },\n };\n}\n\nfunction responseKind(accept?: string): \"json\" | \"text\" | \"blob\" {\n if (!accept) return \"json\";\n const normalized = accept.toLowerCase();\n if (normalized.includes(\"application/pdf\")) return \"blob\";\n if (\n normalized.includes(\"text/\") ||\n normalized.includes(\"application/x-yaml\") ||\n normalized.includes(\"application/yaml\")\n ) {\n return \"text\";\n }\n return \"json\";\n}\n\ntype ParsedBody = {\n data: unknown;\n text: string;\n blob?: Blob;\n contentType: string;\n};\n\nasync function readResponseBody(response: Response, kind: \"json\" | \"text\" | \"blob\"): Promise<ParsedBody> {\n const contentType = response.headers.get(\"Content-Type\") || \"\";\n if (kind === \"blob\") {\n const blob = await response.blob();\n return { data: undefined, text: \"[binary]\", blob, contentType };\n }\n\n const text = await response.text();\n if (kind === \"text\" || !shouldParseJson(text, contentType)) {\n return { data: text, text, contentType };\n }\n\n try {\n return { data: JSON.parse(text) as unknown, text, contentType };\n } catch {\n return { data: text, text, contentType };\n }\n}\n\nfunction parseExecutionResponse(\n response: Response,\n parsed: ParsedBody,\n context: { method: string; requestUrl: string },\n): ExecutionResponse {\n const headers = responseHeaders(response.headers);\n const data = parsed.data;\n const stdout =\n parsed.blob != null\n ? \"[binary]\"\n : typeof data === \"string\"\n ? data\n : parsed.text || JSON.stringify(data, null, 2);\n const clickyEnvelope = isClickyEnvelope(data);\n\n if (!response.ok && !clickyEnvelope) {\n throw errorFromResponse(response, context.method, context.requestUrl, parsed);\n }\n\n const clickyError = errorFromClickyEnvelope(data);\n const successHeader = headers[\"x-execution-success\"];\n const success = successHeader == null ? response.ok && !clickyError : successHeader !== \"false\";\n const exitCode = parseInt(headers[\"x-exit-code\"] ?? (success ? \"0\" : \"1\"), 10);\n const cli = headers[\"x-cli-command\"];\n const error = headers[\"x-error\"] || clickyError;\n const pagination = paginationFromHeaders(headers);\n\n return {\n success,\n stdout,\n output: stdout,\n exit_code: Number.isFinite(exitCode) ? exitCode : success ? 0 : 1,\n contentType: parsed.contentType || headers[\"content-type\"] || \"application/json\",\n requestUrl: context.requestUrl,\n responseHeaders: headers,\n ...(pagination ? { pagination } : {}),\n ...(cli ? { cli } : {}),\n ...(error ? { error } : {}),\n ...(parsed.blob ? { blob: parsed.blob } : {}),\n ...(parsed.blob == null && typeof data !== \"string\" ? { parsed: data } : {}),\n };\n}\n\nfunction errorFromResponse(\n response: Response,\n method: string,\n url: string,\n parsed: ParsedBody,\n): OperationsApiClientError {\n const headers = responseHeaders(response.headers);\n const message =\n headers[\"x-error\"] ||\n messageFromBody(parsed.data) ||\n `${method} ${url} failed with ${response.status}: ${\n parsed.text || response.statusText\n }`;\n return new OperationsApiClientError(message, {\n status: response.status,\n method,\n url,\n responseBody: parsed.text,\n responseData: parsed.data,\n responseHeaders: headers,\n });\n}\n\nfunction resolvePathParams(\n path: string,\n params: Record<string, string>,\n): { path: string; params: Record<string, string> } {\n const queryParams = { ...params };\n let resolvedPath = path;\n const placeholders = [...path.matchAll(/\\{([^}]+)\\}/g)]\n .map((match) => match[1])\n .filter((name): name is string => Boolean(name));\n const argValues = parseArgsParam(params.args);\n let consumedArgs = false;\n const consumedDirectValues: string[] = [];\n\n for (const [index, name] of placeholders.entries()) {\n const directValue = queryParams[name];\n const fallbackValue = directValue || argValues[index];\n if (!fallbackValue) continue;\n\n resolvedPath = resolvedPath.replace(`{${name}}`, encodeURIComponent(fallbackValue));\n delete queryParams[name];\n if (!directValue && argValues[index]) consumedArgs = true;\n if (directValue) consumedDirectValues[index] = directValue;\n }\n\n const argsDuplicateResolvedPath =\n argValues.length > 0 &&\n argValues.length === consumedDirectValues.filter(Boolean).length &&\n argValues.every((value, index) => value === consumedDirectValues[index]);\n\n if (consumedArgs || argsDuplicateResolvedPath) {\n delete queryParams.args;\n }\n\n return { path: resolvedPath, params: stripRunnerParams(queryParams) };\n}\n\nfunction parseArgsParam(value: string | undefined): string[] {\n if (!value) return [];\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed.toLowerCase() === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited args below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction stripRunnerParams(params: Record<string, string>) {\n const next = { ...params };\n delete next.autoRun;\n delete next.__autoRun;\n return next;\n}\n\nfunction appendQuery(path: string, params: Record<string, string>) {\n const query = new URLSearchParams(pruneParams(params)).toString();\n if (!query) return path;\n return `${path}${path.includes(\"?\") ? \"&\" : \"?\"}${query}`;\n}\n\nfunction pruneParams(params: Record<string, string>) {\n return Object.fromEntries(Object.entries(params).filter(([, value]) => value !== \"\"));\n}\n\nfunction joinUrl(baseUrl: string | undefined, path: string) {\n if (!baseUrl || /^https?:\\/\\//i.test(path)) return path;\n return `${baseUrl.replace(/\\/+$/, \"\")}/${path.replace(/^\\/+/, \"\")}`;\n}\n\nfunction headerValue(headers: Record<string, string> | undefined, name: string) {\n const wanted = name.toLowerCase();\n for (const [key, value] of Object.entries(headers ?? {})) {\n if (key.toLowerCase() === wanted) return value;\n }\n return undefined;\n}\n\nfunction responseHeaders(headers: Headers): Record<string, string> {\n const out: Record<string, string> = {};\n headers.forEach((value, key) => {\n out[key.toLowerCase()] = value;\n });\n return out;\n}\n\nfunction paginationFromHeaders(headers: Record<string, string>): ExecutionPagination | undefined {\n const pagination: ExecutionPagination = {};\n const total = integerHeader(headers[\"x-total-count\"]);\n const limit = integerHeader(headers[\"x-page-limit\"]);\n const offset = integerHeader(headers[\"x-page-offset\"]);\n\n if (total !== undefined) pagination.total = total;\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n\n return Object.keys(pagination).length > 0 ? pagination : undefined;\n}\n\nfunction integerHeader(value: string | undefined): number | undefined {\n if (value == null || value.trim() === \"\") return undefined;\n const parsed = parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction shouldParseJson(text: string, contentType: string) {\n const trimmed = text.trim();\n return (\n trimmed !== \"\" &&\n (contentType.toLowerCase().includes(\"json\") ||\n trimmed.startsWith(\"{\") ||\n trimmed.startsWith(\"[\"))\n );\n}\n\nfunction isClickyEnvelope(data: unknown): boolean {\n if (!data || typeof data !== \"object\") return false;\n const body = data as Record<string, unknown>;\n return body.version != null && body.node != null && typeof body.node === \"object\";\n}\n\nfunction readClickyText(node: unknown): string | undefined {\n if (!node || typeof node !== \"object\") return undefined;\n const n = node as Record<string, unknown>;\n if (typeof n.plain === \"string\" && n.plain !== \"\") return n.plain;\n if (typeof n.text === \"string\" && n.text !== \"\") return n.text;\n if (Array.isArray(n.children)) {\n for (const child of n.children) {\n const text = readClickyText(child);\n if (text) return text;\n }\n }\n return undefined;\n}\n\nfunction errorFromClickyEnvelope(data: unknown): string | undefined {\n if (!data || typeof data !== \"object\") return undefined;\n const node = (data as Record<string, unknown>).node;\n if (!node || typeof node !== \"object\") return undefined;\n const n = node as Record<string, unknown>;\n if (n.kind !== \"map\" || !Array.isArray(n.fields)) return undefined;\n\n let errorText: string | undefined;\n let failed = false;\n for (const field of n.fields) {\n if (!field || typeof field !== \"object\") continue;\n const f = field as Record<string, unknown>;\n if (f.name === \"Error\") errorText = readClickyText(f.value);\n if (f.name === \"Success\" && readClickyText(f.value) === \"false\") failed = true;\n }\n return failed ? errorText : undefined;\n}\n\nfunction messageFromBody(data: unknown): string | undefined {\n if (!data || typeof data !== \"object\") return undefined;\n const body = data as Record<string, unknown>;\n if (typeof body.error === \"string\" && body.error) return body.error;\n if (typeof body.message === \"string\" && body.message) return body.message;\n return errorFromClickyEnvelope(data);\n}\n"],"names":["response","parsed"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../src/rpc/apiClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,qBAAqB,EAEtB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,KAAK,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3C,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,yBAAyB,KAC/B,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AAEtC,MAAM,MAAM,gCAAgC,GAAG;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACxC,CAAC;AAEF,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;gBAGlD,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACrC;CAWT;AAED,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClC,kBAAkB,CAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/B;AAED,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,gCAAqC,GAC7C,yBAAyB,CAyI3B"}
1
+ {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../src/rpc/apiClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EAEjB,qBAAqB,EAEtB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,KAAK,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3C,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,yBAAyB,KAC/B,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AAEtC,MAAM,MAAM,gCAAgC,GAAG;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACxC,CAAC;AAEF,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;gBAGlD,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACrC;CAWT;AAED,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClC,kBAAkB,CAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/B;AAED,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,gCAAqC,GAC7C,yBAAyB,CAyI3B"}
@@ -174,6 +174,7 @@ function parseExecutionResponse(response, parsed, context) {
174
174
  const exitCode = parseInt(headers["x-exit-code"] ?? (success ? "0" : "1"), 10);
175
175
  const cli = headers["x-cli-command"];
176
176
  const error = headers["x-error"] || clickyError;
177
+ const pagination = paginationFromHeaders(headers);
177
178
  return {
178
179
  success,
179
180
  stdout,
@@ -181,6 +182,8 @@ function parseExecutionResponse(response, parsed, context) {
181
182
  exit_code: Number.isFinite(exitCode) ? exitCode : success ? 0 : 1,
182
183
  contentType: parsed.contentType || headers["content-type"] || "application/json",
183
184
  requestUrl: context.requestUrl,
185
+ responseHeaders: headers,
186
+ ...pagination ? { pagination } : {},
184
187
  ...cli ? { cli } : {},
185
188
  ...error ? { error } : {},
186
189
  ...parsed.blob ? { blob: parsed.blob } : {},
@@ -264,6 +267,21 @@ function responseHeaders(headers) {
264
267
  });
265
268
  return out;
266
269
  }
270
+ function paginationFromHeaders(headers) {
271
+ const pagination = {};
272
+ const total = integerHeader(headers["x-total-count"]);
273
+ const limit = integerHeader(headers["x-page-limit"]);
274
+ const offset = integerHeader(headers["x-page-offset"]);
275
+ if (total !== void 0) pagination.total = total;
276
+ if (limit !== void 0) pagination.limit = limit;
277
+ if (offset !== void 0) pagination.offset = offset;
278
+ return Object.keys(pagination).length > 0 ? pagination : void 0;
279
+ }
280
+ function integerHeader(value) {
281
+ if (value == null || value.trim() === "") return void 0;
282
+ const parsed = parseInt(value, 10);
283
+ return Number.isFinite(parsed) ? parsed : void 0;
284
+ }
267
285
  function shouldParseJson(text, contentType) {
268
286
  const trimmed = text.trim();
269
287
  return trimmed !== "" && (contentType.toLowerCase().includes("json") || trimmed.startsWith("{") || trimmed.startsWith("["));
@@ -1 +1 @@
1
- {"version":3,"file":"apiClient.js","sources":["../../src/rpc/apiClient.ts"],"sourcesContent":["import type {\n ExecutionResponse,\n OpenAPISpec,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type OperationApiClientContext = {\n path: string;\n method: string;\n};\n\nexport type OperationDefaultParams = (context: {\n path: string;\n method: string;\n params: Record<string, string>;\n}) => MaybePromise<Record<string, string>>;\n\nexport type OperationHeadersProvider = (\n headers: Headers,\n context: OperationApiClientContext,\n) => MaybePromise<HeadersInit | void>;\n\nexport type CreateOperationsApiClientOptions = {\n baseUrl?: string;\n openApiPath?: string;\n credentials?: RequestCredentials;\n fetch?: typeof fetch;\n prepareHeaders?: OperationHeadersProvider;\n defaultParams?: OperationDefaultParams;\n};\n\nexport class OperationsApiClientError extends Error {\n status: number | undefined;\n method: string | undefined;\n url: string | undefined;\n responseBody: string | undefined;\n responseData: unknown;\n responseHeaders: Record<string, string> | undefined;\n\n constructor(\n message: string,\n options: {\n status?: number;\n method?: string;\n url?: string;\n responseBody?: string;\n responseData?: unknown;\n responseHeaders?: Record<string, string>;\n } = {},\n ) {\n super(message);\n this.name = \"OperationsApiClientError\";\n this.status = options.status;\n this.method = options.method;\n this.url = options.url;\n this.responseBody = options.responseBody;\n this.responseData = options.responseData;\n this.responseHeaders = options.responseHeaders;\n }\n}\n\nexport interface SharedOperationsApiClient extends OperationsApiClient {\n lookupFilterOptions(\n path: string,\n method: string,\n filterKey: string,\n query: string,\n ): Promise<OperationLookupFilter>;\n executeCommandBody(\n path: string,\n body: Record<string, unknown>,\n headers?: Record<string, string>,\n ): Promise<ExecutionResponse>;\n}\n\nexport function createOperationsApiClient(\n options: CreateOperationsApiClientOptions = {},\n): SharedOperationsApiClient {\n const fetcher = options.fetch ?? fetch;\n const openApiPath = options.openApiPath ?? \"/api/openapi.json\";\n\n async function makeHeaders(\n base: HeadersInit | undefined,\n context: OperationApiClientContext,\n ): Promise<Headers> {\n const headers = new Headers(base);\n const prepared = await options.prepareHeaders?.(headers, context);\n return prepared ? new Headers(prepared) : headers;\n }\n\n async function request(\n path: string,\n method: string,\n init: Omit<RequestInit, \"method\" | \"headers\" | \"credentials\"> & {\n headers?: HeadersInit;\n requestUrl?: string;\n } = {},\n ): Promise<Response> {\n const url = joinUrl(options.baseUrl, path);\n const headers = await makeHeaders(init.headers, { path, method });\n return fetcher(url, {\n ...init,\n method,\n headers,\n ...(options.credentials ? { credentials: options.credentials } : {}),\n });\n }\n\n async function getOpenAPISpec(): Promise<OpenAPISpec> {\n const response = await request(openApiPath, \"GET\", {\n headers: { Accept: \"application/json\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) {\n throw errorFromResponse(response, \"GET\", openApiPath, parsed);\n }\n return parsed.data as OpenAPISpec;\n }\n\n async function withDefaults(path: string, method: string, params: Record<string, string>) {\n return (await options.defaultParams?.({ path, method, params })) ?? params;\n }\n\n return {\n getOpenAPISpec,\n\n async executeCommand(path, method, params, headers) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, params);\n const scoped = await withDefaults(resolved.path, upper, resolved.params);\n const accept = headerValue(headers, \"Accept\");\n\n if (upper === \"GET\") {\n const requestUrl = appendQuery(resolved.path, scoped);\n const response = await request(requestUrl, upper, {\n ...(headers ? { headers } : {}),\n requestUrl,\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl,\n });\n }\n\n const response = await request(resolved.path, upper, {\n headers: { \"Content-Type\": \"application/json\", ...(headers ?? {}) },\n body: JSON.stringify(scoped),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl: resolved.path,\n });\n },\n\n async executeCommandBody(path, body, headers) {\n const accept = headerValue(headers, \"Accept\");\n const response = await request(path, \"POST\", {\n headers: { \"Content-Type\": \"application/json\", ...(headers ?? {}) },\n body: JSON.stringify(body),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: \"POST\",\n requestUrl: path,\n });\n },\n\n 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) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, {});\n const queryParams = {\n __lookup: \"filters\",\n __lookup_filter: filterKey,\n __lookup_q: query,\n };\n\n const requestPath = appendQuery(resolved.path, queryParams);\n const response = await request(requestPath, upper, {\n headers: { Accept: \"application/json+clicky\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) throw errorFromResponse(response, upper, requestPath, parsed);\n return ((parsed.data as OperationLookupResponse | undefined)?.filters?.[filterKey] ??\n {}) as OperationLookupFilter;\n },\n };\n}\n\nfunction responseKind(accept?: string): \"json\" | \"text\" | \"blob\" {\n if (!accept) return \"json\";\n const normalized = accept.toLowerCase();\n if (normalized.includes(\"application/pdf\")) return \"blob\";\n if (\n normalized.includes(\"text/\") ||\n normalized.includes(\"application/x-yaml\") ||\n normalized.includes(\"application/yaml\")\n ) {\n return \"text\";\n }\n return \"json\";\n}\n\ntype ParsedBody = {\n data: unknown;\n text: string;\n blob?: Blob;\n contentType: string;\n};\n\nasync function readResponseBody(response: Response, kind: \"json\" | \"text\" | \"blob\"): Promise<ParsedBody> {\n const contentType = response.headers.get(\"Content-Type\") || \"\";\n if (kind === \"blob\") {\n const blob = await response.blob();\n return { data: undefined, text: \"[binary]\", blob, contentType };\n }\n\n const text = await response.text();\n if (kind === \"text\" || !shouldParseJson(text, contentType)) {\n return { data: text, text, contentType };\n }\n\n try {\n return { data: JSON.parse(text) as unknown, text, contentType };\n } catch {\n return { data: text, text, contentType };\n }\n}\n\nfunction parseExecutionResponse(\n response: Response,\n parsed: ParsedBody,\n context: { method: string; requestUrl: string },\n): ExecutionResponse {\n const headers = responseHeaders(response.headers);\n const data = parsed.data;\n const stdout =\n parsed.blob != null\n ? \"[binary]\"\n : typeof data === \"string\"\n ? data\n : parsed.text || JSON.stringify(data, null, 2);\n const clickyEnvelope = isClickyEnvelope(data);\n\n if (!response.ok && !clickyEnvelope) {\n throw errorFromResponse(response, context.method, context.requestUrl, parsed);\n }\n\n const clickyError = errorFromClickyEnvelope(data);\n const successHeader = headers[\"x-execution-success\"];\n const success = successHeader == null ? response.ok && !clickyError : successHeader !== \"false\";\n const exitCode = parseInt(headers[\"x-exit-code\"] ?? (success ? \"0\" : \"1\"), 10);\n const cli = headers[\"x-cli-command\"];\n const error = headers[\"x-error\"] || clickyError;\n\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 ...(cli ? { cli } : {}),\n ...(error ? { error } : {}),\n ...(parsed.blob ? { blob: parsed.blob } : {}),\n ...(parsed.blob == null && typeof data !== \"string\" ? { parsed: data } : {}),\n };\n}\n\nfunction errorFromResponse(\n response: Response,\n method: string,\n url: string,\n parsed: ParsedBody,\n): OperationsApiClientError {\n const headers = responseHeaders(response.headers);\n const message =\n headers[\"x-error\"] ||\n messageFromBody(parsed.data) ||\n `${method} ${url} failed with ${response.status}: ${\n parsed.text || response.statusText\n }`;\n return new OperationsApiClientError(message, {\n status: response.status,\n method,\n url,\n responseBody: parsed.text,\n responseData: parsed.data,\n responseHeaders: headers,\n });\n}\n\nfunction resolvePathParams(\n path: string,\n params: Record<string, string>,\n): { path: string; params: Record<string, string> } {\n const queryParams = { ...params };\n let resolvedPath = path;\n const placeholders = [...path.matchAll(/\\{([^}]+)\\}/g)]\n .map((match) => match[1])\n .filter((name): name is string => Boolean(name));\n const argValues = parseArgsParam(params.args);\n let consumedArgs = false;\n const consumedDirectValues: string[] = [];\n\n for (const [index, name] of placeholders.entries()) {\n const directValue = queryParams[name];\n const fallbackValue = directValue || argValues[index];\n if (!fallbackValue) continue;\n\n resolvedPath = resolvedPath.replace(`{${name}}`, encodeURIComponent(fallbackValue));\n delete queryParams[name];\n if (!directValue && argValues[index]) consumedArgs = true;\n if (directValue) consumedDirectValues[index] = directValue;\n }\n\n const argsDuplicateResolvedPath =\n argValues.length > 0 &&\n argValues.length === consumedDirectValues.filter(Boolean).length &&\n argValues.every((value, index) => value === consumedDirectValues[index]);\n\n if (consumedArgs || argsDuplicateResolvedPath) {\n delete queryParams.args;\n }\n\n return { path: resolvedPath, params: stripRunnerParams(queryParams) };\n}\n\nfunction parseArgsParam(value: string | undefined): string[] {\n if (!value) return [];\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed.toLowerCase() === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited args below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction stripRunnerParams(params: Record<string, string>) {\n const next = { ...params };\n delete next.autoRun;\n delete next.__autoRun;\n return next;\n}\n\nfunction appendQuery(path: string, params: Record<string, string>) {\n const query = new URLSearchParams(pruneParams(params)).toString();\n if (!query) return path;\n return `${path}${path.includes(\"?\") ? \"&\" : \"?\"}${query}`;\n}\n\nfunction pruneParams(params: Record<string, string>) {\n return Object.fromEntries(Object.entries(params).filter(([, value]) => value !== \"\"));\n}\n\nfunction joinUrl(baseUrl: string | undefined, path: string) {\n if (!baseUrl || /^https?:\\/\\//i.test(path)) return path;\n return `${baseUrl.replace(/\\/+$/, \"\")}/${path.replace(/^\\/+/, \"\")}`;\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 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 {\n ExecutionPagination,\n ExecutionResponse,\n OpenAPISpec,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type OperationApiClientContext = {\n path: string;\n method: string;\n};\n\nexport type OperationDefaultParams = (context: {\n path: string;\n method: string;\n params: Record<string, string>;\n}) => MaybePromise<Record<string, string>>;\n\nexport type OperationHeadersProvider = (\n headers: Headers,\n context: OperationApiClientContext,\n) => MaybePromise<HeadersInit | void>;\n\nexport type CreateOperationsApiClientOptions = {\n baseUrl?: string;\n openApiPath?: string;\n credentials?: RequestCredentials;\n fetch?: typeof fetch;\n prepareHeaders?: OperationHeadersProvider;\n defaultParams?: OperationDefaultParams;\n};\n\nexport class OperationsApiClientError extends Error {\n status: number | undefined;\n method: string | undefined;\n url: string | undefined;\n responseBody: string | undefined;\n responseData: unknown;\n responseHeaders: Record<string, string> | undefined;\n\n constructor(\n message: string,\n options: {\n status?: number;\n method?: string;\n url?: string;\n responseBody?: string;\n responseData?: unknown;\n responseHeaders?: Record<string, string>;\n } = {},\n ) {\n super(message);\n this.name = \"OperationsApiClientError\";\n this.status = options.status;\n this.method = options.method;\n this.url = options.url;\n this.responseBody = options.responseBody;\n this.responseData = options.responseData;\n this.responseHeaders = options.responseHeaders;\n }\n}\n\nexport interface SharedOperationsApiClient extends OperationsApiClient {\n lookupFilterOptions(\n path: string,\n method: string,\n filterKey: string,\n query: string,\n ): Promise<OperationLookupFilter>;\n executeCommandBody(\n path: string,\n body: Record<string, unknown>,\n headers?: Record<string, string>,\n ): Promise<ExecutionResponse>;\n}\n\nexport function createOperationsApiClient(\n options: CreateOperationsApiClientOptions = {},\n): SharedOperationsApiClient {\n const fetcher = options.fetch ?? fetch;\n const openApiPath = options.openApiPath ?? \"/api/openapi.json\";\n\n async function makeHeaders(\n base: HeadersInit | undefined,\n context: OperationApiClientContext,\n ): Promise<Headers> {\n const headers = new Headers(base);\n const prepared = await options.prepareHeaders?.(headers, context);\n return prepared ? new Headers(prepared) : headers;\n }\n\n async function request(\n path: string,\n method: string,\n init: Omit<RequestInit, \"method\" | \"headers\" | \"credentials\"> & {\n headers?: HeadersInit;\n requestUrl?: string;\n } = {},\n ): Promise<Response> {\n const url = joinUrl(options.baseUrl, path);\n const headers = await makeHeaders(init.headers, { path, method });\n return fetcher(url, {\n ...init,\n method,\n headers,\n ...(options.credentials ? { credentials: options.credentials } : {}),\n });\n }\n\n async function getOpenAPISpec(): Promise<OpenAPISpec> {\n const response = await request(openApiPath, \"GET\", {\n headers: { Accept: \"application/json\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) {\n throw errorFromResponse(response, \"GET\", openApiPath, parsed);\n }\n return parsed.data as OpenAPISpec;\n }\n\n async function withDefaults(path: string, method: string, params: Record<string, string>) {\n return (await options.defaultParams?.({ path, method, params })) ?? params;\n }\n\n return {\n getOpenAPISpec,\n\n async executeCommand(path, method, params, headers) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, params);\n const scoped = await withDefaults(resolved.path, upper, resolved.params);\n const accept = headerValue(headers, \"Accept\");\n\n if (upper === \"GET\") {\n const requestUrl = appendQuery(resolved.path, scoped);\n const response = await request(requestUrl, upper, {\n ...(headers ? { headers } : {}),\n requestUrl,\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl,\n });\n }\n\n const response = await request(resolved.path, upper, {\n headers: { \"Content-Type\": \"application/json\", ...(headers ?? {}) },\n body: JSON.stringify(scoped),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: upper,\n requestUrl: resolved.path,\n });\n },\n\n async executeCommandBody(path, body, headers) {\n const accept = headerValue(headers, \"Accept\");\n const response = await request(path, \"POST\", {\n headers: { \"Content-Type\": \"application/json\", ...(headers ?? {}) },\n body: JSON.stringify(body),\n });\n return parseExecutionResponse(response, await readResponseBody(response, responseKind(accept)), {\n method: \"POST\",\n requestUrl: path,\n });\n },\n\n 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) {\n const upper = method.toUpperCase();\n const resolved = resolvePathParams(path, {});\n const queryParams = {\n __lookup: \"filters\",\n __lookup_filter: filterKey,\n __lookup_q: query,\n };\n\n const requestPath = appendQuery(resolved.path, queryParams);\n const response = await request(requestPath, upper, {\n headers: { Accept: \"application/json+clicky\" },\n });\n const parsed = await readResponseBody(response, \"json\");\n if (!response.ok) throw errorFromResponse(response, upper, requestPath, parsed);\n return ((parsed.data as OperationLookupResponse | undefined)?.filters?.[filterKey] ??\n {}) as OperationLookupFilter;\n },\n };\n}\n\nfunction responseKind(accept?: string): \"json\" | \"text\" | \"blob\" {\n if (!accept) return \"json\";\n const normalized = accept.toLowerCase();\n if (normalized.includes(\"application/pdf\")) return \"blob\";\n if (\n normalized.includes(\"text/\") ||\n normalized.includes(\"application/x-yaml\") ||\n normalized.includes(\"application/yaml\")\n ) {\n return \"text\";\n }\n return \"json\";\n}\n\ntype ParsedBody = {\n data: unknown;\n text: string;\n blob?: Blob;\n contentType: string;\n};\n\nasync function readResponseBody(response: Response, kind: \"json\" | \"text\" | \"blob\"): Promise<ParsedBody> {\n const contentType = response.headers.get(\"Content-Type\") || \"\";\n if (kind === \"blob\") {\n const blob = await response.blob();\n return { data: undefined, text: \"[binary]\", blob, contentType };\n }\n\n const text = await response.text();\n if (kind === \"text\" || !shouldParseJson(text, contentType)) {\n return { data: text, text, contentType };\n }\n\n try {\n return { data: JSON.parse(text) as unknown, text, contentType };\n } catch {\n return { data: text, text, contentType };\n }\n}\n\nfunction parseExecutionResponse(\n response: Response,\n parsed: ParsedBody,\n context: { method: string; requestUrl: string },\n): ExecutionResponse {\n const headers = responseHeaders(response.headers);\n const data = parsed.data;\n const stdout =\n parsed.blob != null\n ? \"[binary]\"\n : typeof data === \"string\"\n ? data\n : parsed.text || JSON.stringify(data, null, 2);\n const clickyEnvelope = isClickyEnvelope(data);\n\n if (!response.ok && !clickyEnvelope) {\n throw errorFromResponse(response, context.method, context.requestUrl, parsed);\n }\n\n const clickyError = errorFromClickyEnvelope(data);\n const successHeader = headers[\"x-execution-success\"];\n const success = successHeader == null ? response.ok && !clickyError : successHeader !== \"false\";\n const exitCode = parseInt(headers[\"x-exit-code\"] ?? (success ? \"0\" : \"1\"), 10);\n const cli = headers[\"x-cli-command\"];\n const error = headers[\"x-error\"] || clickyError;\n const pagination = paginationFromHeaders(headers);\n\n return {\n success,\n stdout,\n output: stdout,\n exit_code: Number.isFinite(exitCode) ? exitCode : success ? 0 : 1,\n contentType: parsed.contentType || headers[\"content-type\"] || \"application/json\",\n requestUrl: context.requestUrl,\n responseHeaders: headers,\n ...(pagination ? { pagination } : {}),\n ...(cli ? { cli } : {}),\n ...(error ? { error } : {}),\n ...(parsed.blob ? { blob: parsed.blob } : {}),\n ...(parsed.blob == null && typeof data !== \"string\" ? { parsed: data } : {}),\n };\n}\n\nfunction errorFromResponse(\n response: Response,\n method: string,\n url: string,\n parsed: ParsedBody,\n): OperationsApiClientError {\n const headers = responseHeaders(response.headers);\n const message =\n headers[\"x-error\"] ||\n messageFromBody(parsed.data) ||\n `${method} ${url} failed with ${response.status}: ${\n parsed.text || response.statusText\n }`;\n return new OperationsApiClientError(message, {\n status: response.status,\n method,\n url,\n responseBody: parsed.text,\n responseData: parsed.data,\n responseHeaders: headers,\n });\n}\n\nfunction resolvePathParams(\n path: string,\n params: Record<string, string>,\n): { path: string; params: Record<string, string> } {\n const queryParams = { ...params };\n let resolvedPath = path;\n const placeholders = [...path.matchAll(/\\{([^}]+)\\}/g)]\n .map((match) => match[1])\n .filter((name): name is string => Boolean(name));\n const argValues = parseArgsParam(params.args);\n let consumedArgs = false;\n const consumedDirectValues: string[] = [];\n\n for (const [index, name] of placeholders.entries()) {\n const directValue = queryParams[name];\n const fallbackValue = directValue || argValues[index];\n if (!fallbackValue) continue;\n\n resolvedPath = resolvedPath.replace(`{${name}}`, encodeURIComponent(fallbackValue));\n delete queryParams[name];\n if (!directValue && argValues[index]) consumedArgs = true;\n if (directValue) consumedDirectValues[index] = directValue;\n }\n\n const argsDuplicateResolvedPath =\n argValues.length > 0 &&\n argValues.length === consumedDirectValues.filter(Boolean).length &&\n argValues.every((value, index) => value === consumedDirectValues[index]);\n\n if (consumedArgs || argsDuplicateResolvedPath) {\n delete queryParams.args;\n }\n\n return { path: resolvedPath, params: stripRunnerParams(queryParams) };\n}\n\nfunction parseArgsParam(value: string | undefined): string[] {\n if (!value) return [];\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed.toLowerCase() === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited args below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction stripRunnerParams(params: Record<string, string>) {\n const next = { ...params };\n delete next.autoRun;\n delete next.__autoRun;\n return next;\n}\n\nfunction appendQuery(path: string, params: Record<string, string>) {\n const query = new URLSearchParams(pruneParams(params)).toString();\n if (!query) return path;\n return `${path}${path.includes(\"?\") ? \"&\" : \"?\"}${query}`;\n}\n\nfunction pruneParams(params: Record<string, string>) {\n return Object.fromEntries(Object.entries(params).filter(([, value]) => value !== \"\"));\n}\n\nfunction joinUrl(baseUrl: string | undefined, path: string) {\n if (!baseUrl || /^https?:\\/\\//i.test(path)) return path;\n return `${baseUrl.replace(/\\/+$/, \"\")}/${path.replace(/^\\/+/, \"\")}`;\n}\n\nfunction headerValue(headers: Record<string, string> | undefined, name: string) {\n const wanted = name.toLowerCase();\n for (const [key, value] of Object.entries(headers ?? {})) {\n if (key.toLowerCase() === wanted) return value;\n }\n return undefined;\n}\n\nfunction responseHeaders(headers: Headers): Record<string, string> {\n const out: Record<string, string> = {};\n headers.forEach((value, key) => {\n out[key.toLowerCase()] = value;\n });\n return out;\n}\n\nfunction paginationFromHeaders(headers: Record<string, string>): ExecutionPagination | undefined {\n const pagination: ExecutionPagination = {};\n const total = integerHeader(headers[\"x-total-count\"]);\n const limit = integerHeader(headers[\"x-page-limit\"]);\n const offset = integerHeader(headers[\"x-page-offset\"]);\n\n if (total !== undefined) pagination.total = total;\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n\n return Object.keys(pagination).length > 0 ? pagination : undefined;\n}\n\nfunction integerHeader(value: string | undefined): number | undefined {\n if (value == null || value.trim() === \"\") return undefined;\n const parsed = parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction shouldParseJson(text: string, contentType: string) {\n const trimmed = text.trim();\n return (\n trimmed !== \"\" &&\n (contentType.toLowerCase().includes(\"json\") ||\n trimmed.startsWith(\"{\") ||\n trimmed.startsWith(\"[\"))\n );\n}\n\nfunction isClickyEnvelope(data: unknown): boolean {\n if (!data || typeof data !== \"object\") return false;\n const body = data as Record<string, unknown>;\n return body.version != null && body.node != null && typeof body.node === \"object\";\n}\n\nfunction readClickyText(node: unknown): string | undefined {\n if (!node || typeof node !== \"object\") return undefined;\n const n = node as Record<string, unknown>;\n if (typeof n.plain === \"string\" && n.plain !== \"\") return n.plain;\n if (typeof n.text === \"string\" && n.text !== \"\") return n.text;\n if (Array.isArray(n.children)) {\n for (const child of n.children) {\n const text = readClickyText(child);\n if (text) return text;\n }\n }\n return undefined;\n}\n\nfunction errorFromClickyEnvelope(data: unknown): string | undefined {\n if (!data || typeof data !== \"object\") return undefined;\n const node = (data as Record<string, unknown>).node;\n if (!node || typeof node !== \"object\") return undefined;\n const n = node as Record<string, unknown>;\n if (n.kind !== \"map\" || !Array.isArray(n.fields)) return undefined;\n\n let errorText: string | undefined;\n let failed = false;\n for (const field of n.fields) {\n if (!field || typeof field !== \"object\") continue;\n const f = field as Record<string, unknown>;\n if (f.name === \"Error\") errorText = readClickyText(f.value);\n if (f.name === \"Success\" && readClickyText(f.value) === \"false\") failed = true;\n }\n return failed ? errorText : undefined;\n}\n\nfunction messageFromBody(data: unknown): string | undefined {\n if (!data || typeof data !== \"object\") return undefined;\n const body = data as Record<string, unknown>;\n if (typeof body.error === \"string\" && body.error) return body.error;\n if (typeof body.message === \"string\" && body.message) return body.message;\n return errorFromClickyEnvelope(data);\n}\n"],"names":["response","parsed"],"mappings":"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"}
@@ -29,6 +29,28 @@ function buildInitialParameterValues(parameters, method, lockedValues = {}, init
29
29
  );
30
30
  return { ...values, ...initialValues, ...lockedValues };
31
31
  }
32
+ function dataTablePaginationFromForm(pagination, response) {
33
+ var _a, _b, _c;
34
+ if (!pagination) return void 0;
35
+ const pageSize = positiveInt(pagination.limitValue) ?? ((_a = response == null ? void 0 : response.pagination) == null ? void 0 : _a.limit) ?? 25;
36
+ const offset = nonNegativeInt(pagination.offsetValue) ?? ((_b = response == null ? void 0 : response.pagination) == null ? void 0 : _b.offset) ?? 0;
37
+ const page = Math.floor(offset / pageSize);
38
+ return {
39
+ page,
40
+ pageSize,
41
+ ...((_c = response == null ? void 0 : response.pagination) == null ? void 0 : _c.total) !== void 0 ? { total: response.pagination.total } : {},
42
+ onPageChange: (next) => {
43
+ if (positiveInt(pagination.limitValue) == null) {
44
+ pagination.setLimit(String(pageSize));
45
+ }
46
+ pagination.setOffset(String(Math.max(next, 0) * pageSize));
47
+ },
48
+ onPageSizeChange: (next) => {
49
+ pagination.setLimit(String(next));
50
+ pagination.setOffset("0");
51
+ }
52
+ };
53
+ }
32
54
  function pruneParameterValues(values) {
33
55
  return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== ""));
34
56
  }
@@ -268,6 +290,14 @@ function serializeMultiFilterValue(value) {
268
290
  function splitCommaValues(value) {
269
291
  return value.split(",").map((item) => item.trim()).filter(Boolean);
270
292
  }
293
+ function positiveInt(value) {
294
+ const parsed = parseInt(value ?? "", 10);
295
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : void 0;
296
+ }
297
+ function nonNegativeInt(value) {
298
+ const parsed = parseInt(value ?? "", 10);
299
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : void 0;
300
+ }
271
301
  function lookupOptionsToFieldOptions(filter) {
272
302
  const merged = /* @__PURE__ */ new Map();
273
303
  for (const [value, node] of Object.entries(filter.options ?? {})) {
@@ -297,6 +327,7 @@ function clickyNodeToPlainText(node) {
297
327
  return (node.children ?? []).map((child) => clickyNodeToPlainText(child)).join("");
298
328
  }
299
329
  exports.buildInitialParameterValues = buildInitialParameterValues;
330
+ exports.dataTablePaginationFromForm = dataTablePaginationFromForm;
300
331
  exports.defaultValueForParameter = defaultValueForParameter;
301
332
  exports.packParameterValues = packParameterValues;
302
333
  exports.parametersToFormConfig = parametersToFormConfig;