@w6w/embed 0.2.1 → 0.2.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/README.md +22 -5
  2. package/dist/ConfirmModal-Pv2-A_3U.js +186 -0
  3. package/dist/ConfirmModal-Pv2-A_3U.js.map +1 -0
  4. package/dist/{CreateFunctionModal-DRsFx-FB.js → CreateFunctionModal-DScxp_LN.js} +25 -25
  5. package/dist/{CreateFunctionModal-DRsFx-FB.js.map → CreateFunctionModal-DScxp_LN.js.map} +1 -1
  6. package/dist/{DocumentFormModal-BExK1V-B.js → DocumentFormModal-Br4s8wmi.js} +5 -5
  7. package/dist/{DocumentFormModal-BExK1V-B.js.map → DocumentFormModal-Br4s8wmi.js.map} +1 -1
  8. package/dist/ImportSpecModal-Cpzp8ndt.js +251 -0
  9. package/dist/ImportSpecModal-Cpzp8ndt.js.map +1 -0
  10. package/dist/ModelRoutesManager-1Ac5wcas.js +345 -0
  11. package/dist/ModelRoutesManager-1Ac5wcas.js.map +1 -0
  12. package/dist/WorkflowEditor-CmhXHRxi.js +1109 -0
  13. package/dist/WorkflowEditor-CmhXHRxi.js.map +1 -0
  14. package/dist/apps-ItBvnWX3.js +92 -0
  15. package/dist/apps-ItBvnWX3.js.map +1 -0
  16. package/dist/{callables-3mFrMVG_.js → callables-tOlflvbl.js} +11 -11
  17. package/dist/{callables-3mFrMVG_.js.map → callables-tOlflvbl.js.map} +1 -1
  18. package/dist/chrome/ConfirmModal.d.ts +4 -1
  19. package/dist/chrome/DangerZone.d.ts +4 -3
  20. package/dist/chrome/ExecutionProfileHeader.d.ts +3 -3
  21. package/dist/chrome/JsonToggle.d.ts +29 -20
  22. package/dist/chrome/Modal.d.ts +3 -1
  23. package/dist/chrome/RightRail.d.ts +6 -1
  24. package/dist/chrome/VersionHistoryModal.d.ts +2 -0
  25. package/dist/chrome/index.d.ts +1 -0
  26. package/dist/chrome/workspace.d.ts +36 -1
  27. package/dist/coerce-input-DFJ4n_wc.js +150 -0
  28. package/dist/coerce-input-DFJ4n_wc.js.map +1 -0
  29. package/dist/connections-CzsCyIxY.js +119 -0
  30. package/dist/connections-CzsCyIxY.js.map +1 -0
  31. package/dist/credentials-Cn92LGhJ.js +171 -0
  32. package/dist/credentials-Cn92LGhJ.js.map +1 -0
  33. package/dist/data-stores-UeQvwVCa.js +170 -0
  34. package/dist/data-stores-UeQvwVCa.js.map +1 -0
  35. package/dist/document-sources-DNmBojx6.js +169 -0
  36. package/dist/document-sources-DNmBojx6.js.map +1 -0
  37. package/dist/draft/use-workflow-draft.d.ts +2 -0
  38. package/dist/draft.mjs +2 -2
  39. package/dist/editor/BindingBanner.d.ts +13 -0
  40. package/dist/editor/CallableEditorFrame.d.ts +7 -0
  41. package/dist/editor/EndpointCards.d.ts +4 -1
  42. package/dist/editor/PublishControl.d.ts +19 -0
  43. package/dist/editor/PublishTooltip.d.ts +7 -0
  44. package/dist/editor/SetupIncompleteBanner.d.ts +12 -0
  45. package/dist/editor/StartingStateModal.d.ts +14 -0
  46. package/dist/editor/TargetSelector.d.ts +15 -0
  47. package/dist/editor/TargetSelector.types.d.ts +2 -0
  48. package/dist/editor/WorkflowSettingsModal.d.ts +6 -1
  49. package/dist/editor/WorkflowVariablesEditor.d.ts +6 -0
  50. package/dist/editor/definition.d.ts +6 -0
  51. package/dist/editor/json-apply.d.ts +29 -0
  52. package/dist/editor/step-problems-feed.d.ts +5 -0
  53. package/dist/editor/types.d.ts +2 -2
  54. package/dist/editor-apps-DkkC7wOQ.js +152 -0
  55. package/dist/editor-apps-DkkC7wOQ.js.map +1 -0
  56. package/dist/editor-tools-BR27RGto.js +1683 -0
  57. package/dist/editor-tools-BR27RGto.js.map +1 -0
  58. package/dist/editor.mjs +1 -1
  59. package/dist/editors.mjs +855 -650
  60. package/dist/editors.mjs.map +1 -1
  61. package/dist/{endpoints-B2ynbZo-.js → endpoints-DSRo1Lc5.js} +113 -107
  62. package/dist/endpoints-DSRo1Lc5.js.map +1 -0
  63. package/dist/fields-DvS8XZFc.js +21 -0
  64. package/dist/fields-DvS8XZFc.js.map +1 -0
  65. package/dist/forms/ModelBudgetsManager.d.ts +9 -0
  66. package/dist/forms/ModelRoutesManager.d.ts +14 -0
  67. package/dist/forms.d.ts +4 -0
  68. package/dist/forms.mjs +611 -212
  69. package/dist/forms.mjs.map +1 -1
  70. package/dist/{rail-settings-XYGToh00.js → import-bindings-EUtxZ9Ti.js} +90 -24
  71. package/dist/import-bindings-EUtxZ9Ti.js.map +1 -0
  72. package/dist/index.mjs +154 -117
  73. package/dist/index.mjs.map +1 -1
  74. package/dist/lib/binding-problems.d.ts +42 -0
  75. package/dist/lib/code-rail.d.ts +4 -2
  76. package/dist/lib/history-query.d.ts +45 -0
  77. package/dist/lib/import-bindings.d.ts +89 -0
  78. package/dist/lib/index.d.ts +4 -0
  79. package/dist/lib/invoke-error.d.ts +1 -0
  80. package/dist/lib/rail-settings.d.ts +1 -1
  81. package/dist/lib/sdk-snippets.d.ts +1 -1
  82. package/dist/lib/setup-incomplete.d.ts +22 -0
  83. package/dist/lib/starting-data.d.ts +31 -0
  84. package/dist/lib/state-panel.d.ts +29 -0
  85. package/dist/lib/target-fields.d.ts +11 -15
  86. package/dist/lib/trigger-preview.d.ts +1 -0
  87. package/dist/lib/workflow-live-run.d.ts +93 -8
  88. package/dist/lib/workflow-nodes.d.ts +5 -0
  89. package/dist/lib/workflow-validity.d.ts +65 -16
  90. package/dist/lib/workflow-variables.d.ts +1 -1
  91. package/dist/lib/workflow-version.d.ts +2 -0
  92. package/dist/lib.mjs +86 -69
  93. package/dist/lists/ConnectionDependents.d.ts +31 -0
  94. package/dist/lists/ConnectionDetail.d.ts +4 -1
  95. package/dist/lists/ConnectionList.d.ts +4 -1
  96. package/dist/lists/CredentialDetail.d.ts +15 -0
  97. package/dist/lists/CredentialList.d.ts +14 -0
  98. package/dist/lists/DataStoreList.d.ts +17 -0
  99. package/dist/lists/DataStoreView.d.ts +19 -0
  100. package/dist/lists/Logs.d.ts +19 -0
  101. package/dist/lists/ModelCatalog.d.ts +12 -0
  102. package/dist/lists/ModelUsage.d.ts +12 -0
  103. package/dist/lists.d.ts +14 -0
  104. package/dist/lists.mjs +1766 -609
  105. package/dist/lists.mjs.map +1 -1
  106. package/dist/models-bAayQPJ_.js +270 -0
  107. package/dist/models-bAayQPJ_.js.map +1 -0
  108. package/dist/{project-context-BiCjv_E3.js → project-context-Tvp-La7A.js} +3 -3
  109. package/dist/{project-context-BiCjv_E3.js.map → project-context-Tvp-La7A.js.map} +1 -1
  110. package/dist/rail/ConnectionsTool.d.ts +2 -0
  111. package/dist/rail/HistoryTool.d.ts +2 -0
  112. package/dist/rail/StartingStateTool.d.ts +2 -0
  113. package/dist/rail/settings-sections.d.ts +4 -1
  114. package/dist/rail.mjs +4 -4
  115. package/dist/repos/agents-studio-agents.d.ts +52 -0
  116. package/dist/repos/agents-studio-assets.d.ts +68 -0
  117. package/dist/repos/connections.d.ts +30 -12
  118. package/dist/repos/constants.d.ts +12 -0
  119. package/dist/repos/credentials.d.ts +83 -0
  120. package/dist/repos/data-stores.d.ts +84 -0
  121. package/dist/repos/endpoints.d.ts +9 -3
  122. package/dist/repos/fields.d.ts +34 -0
  123. package/dist/repos/functions.d.ts +7 -5
  124. package/dist/repos/history.d.ts +9 -0
  125. package/dist/repos/index.d.ts +7 -0
  126. package/dist/repos/models.d.ts +289 -0
  127. package/dist/repos/spec-export.d.ts +3 -3
  128. package/dist/repos/spec-import.d.ts +30 -1
  129. package/dist/repos/step-tests.d.ts +2 -0
  130. package/dist/repos/webhook-listen.d.ts +35 -0
  131. package/dist/repos/workflows.d.ts +105 -2
  132. package/dist/repos.mjs +655 -176
  133. package/dist/repos.mjs.map +1 -1
  134. package/dist/setup-incomplete-BHs3Lpfy.js +199 -0
  135. package/dist/setup-incomplete-BHs3Lpfy.js.map +1 -0
  136. package/dist/{slug-C4ktDPdy.js → slug-BVdgiP_L.js} +64 -60
  137. package/dist/slug-BVdgiP_L.js.map +1 -0
  138. package/dist/{spec-export-Cf3VQSQS.js → spec-export-DGy5ijps.js} +73 -60
  139. package/dist/spec-export-DGy5ijps.js.map +1 -0
  140. package/dist/spec-import-SWOonsNr.js +116 -0
  141. package/dist/spec-import-SWOonsNr.js.map +1 -0
  142. package/dist/{step-tests-CivICmTq.js → step-tests-B4E4W3ly.js} +8 -7
  143. package/dist/step-tests-B4E4W3ly.js.map +1 -0
  144. package/dist/theme-context-E2ZhlXDX.js +6 -0
  145. package/dist/theme-context-E2ZhlXDX.js.map +1 -0
  146. package/dist/theme-context.d.ts +2 -0
  147. package/dist/{use-callable-draft-zHLpcr-b.js → use-callable-draft-DCauHt5o.js} +23 -23
  148. package/dist/{use-callable-draft-zHLpcr-b.js.map → use-callable-draft-DCauHt5o.js.map} +1 -1
  149. package/dist/use-workflow-draft-l3P5KZzw.js +338 -0
  150. package/dist/use-workflow-draft-l3P5KZzw.js.map +1 -0
  151. package/dist/{workflow-blank-DyL3_RUA.js → workflow-blank-DFpGObrn.js} +6 -6
  152. package/dist/{workflow-blank-DyL3_RUA.js.map → workflow-blank-DFpGObrn.js.map} +1 -1
  153. package/dist/workflows-BZN4Hyz1.js +623 -0
  154. package/dist/workflows-BZN4Hyz1.js.map +1 -0
  155. package/package.json +3 -2
  156. package/src/styles.css +155 -7
  157. package/dist/ConfirmModal-RLbZT5_k.js +0 -181
  158. package/dist/ConfirmModal-RLbZT5_k.js.map +0 -1
  159. package/dist/ImportSpecModal-BDQIf6rg.js +0 -136
  160. package/dist/ImportSpecModal-BDQIf6rg.js.map +0 -1
  161. package/dist/WorkflowEditor-DlbVv6Fs.js +0 -854
  162. package/dist/WorkflowEditor-DlbVv6Fs.js.map +0 -1
  163. package/dist/apps-1FNUwbGv.js +0 -77
  164. package/dist/apps-1FNUwbGv.js.map +0 -1
  165. package/dist/coerce-input-BicYr7nc.js +0 -139
  166. package/dist/coerce-input-BicYr7nc.js.map +0 -1
  167. package/dist/connections-CjjYeRqb.js +0 -78
  168. package/dist/connections-CjjYeRqb.js.map +0 -1
  169. package/dist/document-sources-C0grrtdq.js +0 -86
  170. package/dist/document-sources-C0grrtdq.js.map +0 -1
  171. package/dist/editor-apps-BdenSV1o.js +0 -95
  172. package/dist/editor-apps-BdenSV1o.js.map +0 -1
  173. package/dist/editor-tools-RxmY5iyi.js +0 -1279
  174. package/dist/editor-tools-RxmY5iyi.js.map +0 -1
  175. package/dist/endpoints-B2ynbZo-.js.map +0 -1
  176. package/dist/rail-settings-XYGToh00.js.map +0 -1
  177. package/dist/slug-C4ktDPdy.js.map +0 -1
  178. package/dist/spec-export-Cf3VQSQS.js.map +0 -1
  179. package/dist/spec-import-CjmxyZDR.js +0 -465
  180. package/dist/spec-import-CjmxyZDR.js.map +0 -1
  181. package/dist/step-tests-CivICmTq.js.map +0 -1
  182. package/dist/trigger-preview-VPkrryDl.js +0 -120
  183. package/dist/trigger-preview-VPkrryDl.js.map +0 -1
  184. package/dist/use-workflow-draft-DzAyUeA6.js +0 -316
  185. package/dist/use-workflow-draft-DzAyUeA6.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentFormModal-BExK1V-B.js","sources":["../src/forms/DocumentFormModal.tsx"],"sourcesContent":["/**\n * Create/edit modal for a document (internal: not exported from `@w6w/embed/forms`). Content is\n * stored verbatim in whatever format is selected, with no parsing or validation. The key is\n * immutable once set, so an edit never sends it.\n */\nimport { ApiError } from \"@w6w/sdk\";\nimport type { Doc, DocFormat } from \"@w6w/sdk\";\nimport { CodeEditor, JsonEditor, YamlEditor, useEnterSubmit } from \"@w6w/ui\";\nimport { useState } from \"react\";\nimport { Modal } from \"../chrome/Modal.tsx\";\nimport { useCreateDocumentMutation, useUpdateDocumentMutation } from \"../repos/documents.ts\";\n\nconst FORMATS: readonly DocFormat[] = [\"text\", \"markdown\", \"yaml\", \"html\", \"json\"];\n\nexport function DocumentFormModal(props: {\n initial?: Doc;\n /** The resolved project, or `null` (none yet): a save is refused, never sent project-less. */\n project: string | null;\n onClose: () => void;\n onSaved: () => void;\n}) {\n const isEdit = !!props.initial;\n const [key, setKey] = useState(props.initial?.key ?? \"\");\n const [format, setFormat] = useState<DocFormat>(props.initial?.format ?? \"text\");\n const [content, setContent] = useState(props.initial?.content ?? \"\");\n const [description, setDescription] = useState(props.initial?.description ?? \"\");\n const [error, setError] = useState<string | null>(null);\n\n const createMut = useCreateDocumentMutation();\n const updateMut = useUpdateDocumentMutation();\n const saving = createMut.isPending || updateMut.isPending;\n\n function save() {\n setError(null);\n if (props.project == null) {\n setError(\"No project selected: nothing was saved.\");\n return;\n }\n const onSettled = {\n onSuccess: () => props.onSaved(),\n onError: (e: unknown) => setError(e instanceof ApiError ? e.message : (e as Error).message),\n };\n if (props.initial) {\n updateMut.mutate(\n { id: props.initial.id, patch: { content, format, description }, project: props.project },\n onSettled,\n );\n return;\n }\n createMut.mutate(\n { input: { key: key.trim(), content, format, description }, project: props.project },\n onSettled,\n );\n }\n\n const enterSubmit = useEnterSubmit(save, { enabled: !!key.trim() && !saving });\n\n return (\n <Modal\n title={props.initial ? `Edit ${props.initial.key}` : \"Add document\"}\n onClose={props.onClose}\n >\n <div className=\"modal-body\">\n <label className=\"field\">\n <span>Key</span>\n <input\n type=\"text\"\n value={key}\n disabled={isEdit}\n onChange={(e) => setKey(e.target.value)}\n placeholder=\"e.g. welcome-email\"\n {...enterSubmit}\n />\n {!isEdit && <span className=\"hint\">A unique name to reference this document by.</span>}\n </label>\n\n <label className=\"field\">\n <span>Format</span>\n <select value={format} onChange={(e) => setFormat(e.target.value as DocFormat)}>\n {FORMATS.map((f) => (\n <option key={f} value={f}>\n {f}\n </option>\n ))}\n </select>\n </label>\n\n {/* A `div`, not a `label`: none of JsonEditor/YamlEditor/CodeEditor render a native\n control for a label to name; each carries its own `aria-label` instead. */}\n <div className=\"field\">\n <span>Content</span>\n {format === \"json\" ? (\n <JsonEditor value={content} onChange={setContent} aria-label=\"Content\" />\n ) : format === \"yaml\" ? (\n <YamlEditor value={content} onChange={setContent} aria-label=\"Content\" />\n ) : (\n <CodeEditor value={content} onChange={setContent} aria-label=\"Content\" />\n )}\n </div>\n\n <label className=\"field\">\n <span>Description</span>\n <input\n type=\"text\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Optional\"\n {...enterSubmit}\n />\n </label>\n\n {error && <div className=\"result error\">{error}</div>}\n </div>\n <div className=\"modal-actions\">\n <button type=\"button\" className=\"btn ghost\" onClick={props.onClose}>\n Cancel\n </button>\n <button type=\"button\" className=\"btn\" disabled={!key.trim() || saving} onClick={save}>\n {saving ? \"Saving…\" : isEdit ? \"Save changes\" : \"Save document\"}\n </button>\n </div>\n </Modal>\n );\n}\n"],"names":["FORMATS","DocumentFormModal","props","isEdit","key","setKey","useState","_a","format","setFormat","_b","content","setContent","_c","description","setDescription","_d","error","setError","createMut","useCreateDocumentMutation","updateMut","useUpdateDocumentMutation","saving","save","onSettled","e","ApiError","enterSubmit","useEnterSubmit","jsxs","Modal","jsx","f","JsonEditor","YamlEditor","CodeEditor"],"mappings":"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"}
1
+ {"version":3,"file":"DocumentFormModal-Br4s8wmi.js","sources":["../src/forms/DocumentFormModal.tsx"],"sourcesContent":["/**\n * Create/edit modal for a document (internal: not exported from `@w6w/embed/forms`). Content is\n * stored verbatim in whatever format is selected, with no parsing or validation. The key is\n * immutable once set, so an edit never sends it.\n */\nimport { ApiError } from \"@w6w/sdk\";\nimport type { Doc, DocFormat } from \"@w6w/sdk\";\nimport { CodeEditor, JsonEditor, YamlEditor, useEnterSubmit } from \"@w6w/ui\";\nimport { useState } from \"react\";\nimport { Modal } from \"../chrome/Modal.tsx\";\nimport { useCreateDocumentMutation, useUpdateDocumentMutation } from \"../repos/documents.ts\";\n\nconst FORMATS: readonly DocFormat[] = [\"text\", \"markdown\", \"yaml\", \"html\", \"json\"];\n\nexport function DocumentFormModal(props: {\n initial?: Doc;\n /** The resolved project, or `null` (none yet): a save is refused, never sent project-less. */\n project: string | null;\n onClose: () => void;\n onSaved: () => void;\n}) {\n const isEdit = !!props.initial;\n const [key, setKey] = useState(props.initial?.key ?? \"\");\n const [format, setFormat] = useState<DocFormat>(props.initial?.format ?? \"text\");\n const [content, setContent] = useState(props.initial?.content ?? \"\");\n const [description, setDescription] = useState(props.initial?.description ?? \"\");\n const [error, setError] = useState<string | null>(null);\n\n const createMut = useCreateDocumentMutation();\n const updateMut = useUpdateDocumentMutation();\n const saving = createMut.isPending || updateMut.isPending;\n\n function save() {\n setError(null);\n if (props.project == null) {\n setError(\"No project selected: nothing was saved.\");\n return;\n }\n const onSettled = {\n onSuccess: () => props.onSaved(),\n onError: (e: unknown) => setError(e instanceof ApiError ? e.message : (e as Error).message),\n };\n if (props.initial) {\n updateMut.mutate(\n { id: props.initial.id, patch: { content, format, description }, project: props.project },\n onSettled,\n );\n return;\n }\n createMut.mutate(\n { input: { key: key.trim(), content, format, description }, project: props.project },\n onSettled,\n );\n }\n\n const enterSubmit = useEnterSubmit(save, { enabled: !!key.trim() && !saving });\n\n return (\n <Modal\n title={props.initial ? `Edit ${props.initial.key}` : \"Add document\"}\n onClose={props.onClose}\n >\n <div className=\"modal-body\">\n <label className=\"field\">\n <span>Key</span>\n <input\n type=\"text\"\n value={key}\n disabled={isEdit}\n onChange={(e) => setKey(e.target.value)}\n placeholder=\"e.g. welcome-email\"\n {...enterSubmit}\n />\n {!isEdit && <span className=\"hint\">A unique name to reference this document by.</span>}\n </label>\n\n <label className=\"field\">\n <span>Format</span>\n <select value={format} onChange={(e) => setFormat(e.target.value as DocFormat)}>\n {FORMATS.map((f) => (\n <option key={f} value={f}>\n {f}\n </option>\n ))}\n </select>\n </label>\n\n {/* A `div`, not a `label`: none of JsonEditor/YamlEditor/CodeEditor render a native\n control for a label to name; each carries its own `aria-label` instead. */}\n <div className=\"field\">\n <span>Content</span>\n {format === \"json\" ? (\n <JsonEditor value={content} onChange={setContent} aria-label=\"Content\" />\n ) : format === \"yaml\" ? (\n <YamlEditor value={content} onChange={setContent} aria-label=\"Content\" />\n ) : (\n <CodeEditor value={content} onChange={setContent} aria-label=\"Content\" />\n )}\n </div>\n\n <label className=\"field\">\n <span>Description</span>\n <input\n type=\"text\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Optional\"\n {...enterSubmit}\n />\n </label>\n\n {error && <div className=\"result error\">{error}</div>}\n </div>\n <div className=\"modal-actions\">\n <button type=\"button\" className=\"btn ghost\" onClick={props.onClose}>\n Cancel\n </button>\n <button type=\"button\" className=\"btn\" disabled={!key.trim() || saving} onClick={save}>\n {saving ? \"Saving…\" : isEdit ? \"Save changes\" : \"Save document\"}\n </button>\n </div>\n </Modal>\n );\n}\n"],"names":["FORMATS","DocumentFormModal","props","isEdit","key","setKey","useState","_a","format","setFormat","_b","content","setContent","_c","description","setDescription","_d","error","setError","createMut","useCreateDocumentMutation","updateMut","useUpdateDocumentMutation","saving","save","onSettled","e","ApiError","enterSubmit","useEnterSubmit","jsxs","Modal","jsx","f","JsonEditor","YamlEditor","CodeEditor"],"mappings":"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"}
@@ -0,0 +1,251 @@
1
+ import { jsxs as i, jsx as t } from "react/jsx-runtime";
2
+ import { p as R, g as F, j as x, w as L, k as D, s as J, b as U, t as B } from "./import-bindings-EUtxZ9Ti.js";
3
+ import { ApiError as I } from "@w6w/sdk";
4
+ import { JsonEditor as G, AddConnectionModal as H } from "@w6w/ui";
5
+ import { useState as p } from "react";
6
+ import { b as K, c as V } from "./spec-import-SWOonsNr.js";
7
+ import { M as q } from "./ConfirmModal-Pv2-A_3U.js";
8
+ const z = {
9
+ function: "functions",
10
+ endpoint: "endpoints",
11
+ workflow: "workflows"
12
+ }, Q = {
13
+ function: {
14
+ json: "functions-import-json",
15
+ submit: "functions-import-submit",
16
+ unresolved: "functions-import-unresolved",
17
+ goto: "functions-import-goto"
18
+ },
19
+ endpoint: {
20
+ json: "endpoints-import-json",
21
+ submit: "endpoints-import-submit",
22
+ unresolved: "endpoints-import-unresolved",
23
+ goto: "endpoints-import-goto"
24
+ },
25
+ workflow: {
26
+ json: "workflows-import-json",
27
+ submit: "workflows-import-submit",
28
+ unresolved: "workflows-import-unresolved",
29
+ goto: "workflows-import-goto"
30
+ }
31
+ };
32
+ function te(a) {
33
+ const { kind: s } = a, d = z[s], f = Q[s], [v, P] = p(""), [N, r] = p(null), [m, k] = p(null), [l, c] = p(null), [C, y] = p(null), h = K(a.project, a.listKeys), b = V(a.project), { parsed: g, blockedReason: u } = R(v, s), j = l !== null, w = !j || !F(l) || u !== null || h.isPending;
34
+ function S(e) {
35
+ P(e), k(null), r(null), c(null);
36
+ }
37
+ function E() {
38
+ u !== null || g === null || b.isPending || (r(null), b.mutate(g, {
39
+ onSuccess: (e) => c(U(e.dependencies)),
40
+ onError: (e) => {
41
+ c(null), r(e instanceof I ? e.message : String(e));
42
+ }
43
+ }));
44
+ }
45
+ function M(e) {
46
+ e && e.text().then(S, (n) => r(String(n)));
47
+ }
48
+ function $(e) {
49
+ a.onClose(), a.onOpenImported(s, e);
50
+ }
51
+ function T() {
52
+ l === null || u !== null || g === null || h.isPending || (r(null), k(null), h.mutate(
53
+ { document: g, selections: B(l) },
54
+ {
55
+ onSuccess: (e) => {
56
+ if (e.references.every((o) => o.resolved)) {
57
+ $(e.callable.id);
58
+ return;
59
+ }
60
+ k({
61
+ callableId: e.callable.id,
62
+ references: e.references.filter((o) => !o.resolved)
63
+ });
64
+ },
65
+ onError: (e) => r(e instanceof I ? e.message : String(e))
66
+ }
67
+ ));
68
+ }
69
+ function A(e) {
70
+ const n = e.selection;
71
+ return n.mode === "bind" ? `bind:${n.target}` : n.mode;
72
+ }
73
+ function O(e, n) {
74
+ c((o) => o && (n === "unconfigured" ? D(o, e.key) : n === "create" ? x(o, e.key, e.createName) : J(o, e.key, n.slice(5))));
75
+ }
76
+ return /* @__PURE__ */ i(q, { title: `Import ${s}`, onClose: a.onClose, wide: !0, children: [
77
+ /* @__PURE__ */ i("div", { className: "modal-body", children: [
78
+ /* @__PURE__ */ i("p", { className: "muted small", children: [
79
+ "Paste a portable ",
80
+ s,
81
+ " spec document (exported via",
82
+ " ",
83
+ /* @__PURE__ */ i("code", { children: [
84
+ "GET /",
85
+ d,
86
+ "/:id/spec"
87
+ ] }),
88
+ "). A fresh id is minted here; connection references are re-bound to whatever this account already has connected, and anything that couldn't be re-bound is reported below."
89
+ ] }),
90
+ /* @__PURE__ */ t("div", { "data-testid": f.json, children: /* @__PURE__ */ t(
91
+ G,
92
+ {
93
+ value: v,
94
+ onChange: S,
95
+ minHeight: "320px",
96
+ "aria-label": `${s} spec document JSON`
97
+ }
98
+ ) }),
99
+ /* @__PURE__ */ i("label", { className: "muted small", children: [
100
+ "Or choose a ",
101
+ /* @__PURE__ */ t("code", { children: ".json" }),
102
+ " file:",
103
+ " ",
104
+ /* @__PURE__ */ t(
105
+ "input",
106
+ {
107
+ type: "file",
108
+ accept: ".json,application/json",
109
+ "data-testid": `${d}-import-file`,
110
+ onChange: (e) => {
111
+ var n;
112
+ return M((n = e.target.files) == null ? void 0 : n[0]);
113
+ }
114
+ }
115
+ )
116
+ ] }),
117
+ u && v !== "" && /* @__PURE__ */ t("p", { className: "muted small", children: u }),
118
+ N && /* @__PURE__ */ t("div", { className: "result error", children: N }),
119
+ l && l.length === 0 && /* @__PURE__ */ i("p", { className: "muted small", "data-testid": `${d}-import-nodeps`, children: [
120
+ "This ",
121
+ s,
122
+ " has no dependencies."
123
+ ] }),
124
+ l && l.length > 0 && /* @__PURE__ */ t("ul", { className: "list", "data-testid": `${d}-import-rows`, children: l.map((e) => /* @__PURE__ */ i("li", { "data-testid": `${d}-import-row-${e.key}`, children: [
125
+ /* @__PURE__ */ t("code", { children: e.dep.name }),
126
+ " ",
127
+ /* @__PURE__ */ i("span", { className: "muted", children: [
128
+ "(",
129
+ e.dep.kind,
130
+ ")"
131
+ ] }),
132
+ " ",
133
+ e.dep.dynamic ? /* @__PURE__ */ t("span", { className: "muted small", children: "Dynamic store name — configure it manually after import." }) : null,
134
+ /* @__PURE__ */ i(
135
+ "select",
136
+ {
137
+ value: A(e),
138
+ onChange: (n) => O(e, n.target.value),
139
+ "aria-label": `Configure ${e.dep.name}`,
140
+ children: [
141
+ /* @__PURE__ */ t("option", { value: "unconfigured", children: "Leave unconfigured" }),
142
+ !e.dep.dynamic && e.options.map((n) => /* @__PURE__ */ i(
143
+ "option",
144
+ {
145
+ value: `bind:${n.id}`,
146
+ disabled: n.compatible === !1,
147
+ title: n.reason,
148
+ children: [
149
+ n.label,
150
+ n.compatible === !1 && n.reason ? ` — ${n.reason}` : ""
151
+ ]
152
+ },
153
+ n.id
154
+ )),
155
+ e.dep.kind === "store" && e.dep.canCreate && !e.dep.dynamic && /* @__PURE__ */ t("option", { value: "create", children: "Create new" })
156
+ ]
157
+ }
158
+ ),
159
+ e.selection.mode === "create" && /* @__PURE__ */ t(
160
+ "input",
161
+ {
162
+ type: "text",
163
+ value: e.selection.name,
164
+ "aria-label": `New name for ${e.dep.name}`,
165
+ onChange: (n) => c((o) => o && x(o, e.key, n.target.value))
166
+ }
167
+ ),
168
+ e.dep.kind === "connection" && e.dep.app && /* @__PURE__ */ t("button", { type: "button", className: "btn ghost", onClick: () => y(e), children: "Add connection" })
169
+ ] }, e.key)) }),
170
+ C && /* @__PURE__ */ t(
171
+ H,
172
+ {
173
+ initialAppId: C.dep.app,
174
+ onClose: () => y(null),
175
+ onCreated: ({ connectionId: e }) => {
176
+ const n = C.key;
177
+ c(
178
+ (o) => o && L(o, n, e, e)
179
+ ), y(null);
180
+ }
181
+ }
182
+ ),
183
+ m && /* @__PURE__ */ i("div", { className: "result", "data-testid": f.unresolved, children: [
184
+ /* @__PURE__ */ i("p", { children: [
185
+ "The ",
186
+ s,
187
+ " was created, but ",
188
+ m.references.length,
189
+ " reference",
190
+ m.references.length === 1 ? "" : "s",
191
+ " could not be resolved:"
192
+ ] }),
193
+ /* @__PURE__ */ t("ul", { className: "list", children: m.references.map((e) => /* @__PURE__ */ i("li", { children: [
194
+ /* @__PURE__ */ t("code", { children: e.path }),
195
+ " ",
196
+ /* @__PURE__ */ i("span", { className: "muted", children: [
197
+ "(",
198
+ e.kind,
199
+ ")"
200
+ ] }),
201
+ e.reason && /* @__PURE__ */ i("span", { className: "muted", children: [
202
+ " — ",
203
+ e.reason
204
+ ] })
205
+ ] }, e.path)) }),
206
+ /* @__PURE__ */ i(
207
+ "button",
208
+ {
209
+ type: "button",
210
+ className: "btn",
211
+ "data-testid": f.goto,
212
+ onClick: () => $(m.callableId),
213
+ children: [
214
+ "Open the created ",
215
+ s
216
+ ]
217
+ }
218
+ )
219
+ ] })
220
+ ] }),
221
+ /* @__PURE__ */ i("div", { className: "modal-actions", children: [
222
+ /* @__PURE__ */ t("button", { type: "button", className: "btn ghost", onClick: a.onClose, children: "Cancel" }),
223
+ !j && /* @__PURE__ */ t(
224
+ "button",
225
+ {
226
+ type: "button",
227
+ className: "btn",
228
+ "data-testid": `${d}-import-next`,
229
+ disabled: u !== null || b.isPending,
230
+ onClick: E,
231
+ children: b.isPending ? "Checking…" : "Next"
232
+ }
233
+ ),
234
+ /* @__PURE__ */ t(
235
+ "button",
236
+ {
237
+ type: "button",
238
+ className: "btn",
239
+ "data-testid": f.submit,
240
+ disabled: w,
241
+ onClick: T,
242
+ children: h.isPending ? "Importing…" : "Create"
243
+ }
244
+ )
245
+ ] })
246
+ ] });
247
+ }
248
+ export {
249
+ te as I
250
+ };
251
+ //# sourceMappingURL=ImportSpecModal-Cpzp8ndt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImportSpecModal-Cpzp8ndt.js","sources":["../src/chrome/ImportSpecModal.tsx"],"sourcesContent":["import {\n type ImportRow,\n type SpecImportKind,\n type SpecImportListKeys,\n buildRows,\n parseImportPaste,\n rowsReady,\n setBind,\n setCreateName,\n setUnconfigured,\n toSelections,\n withCreatedConnection,\n} from \"@w6w/embed/lib\";\nimport { ApiError } from \"@w6w/sdk\";\nimport { AddConnectionModal, JsonEditor } from \"@w6w/ui\";\nimport { useState } from \"react\";\nimport {\n type SpecImportReferenceReport,\n useImportSpecMutation,\n useSpecPreviewMutation,\n} from \"../repos/spec-import.ts\";\nimport { Modal } from \"./Modal.tsx\";\n\n/** The list route segment for each kind — `goto()`'s `<collection>/<id>` nav target. */\nconst COLLECTION: Record<SpecImportKind, \"functions\" | \"endpoints\" | \"workflows\"> = {\n function: \"functions\",\n endpoint: \"endpoints\",\n workflow: \"workflows\",\n};\n\n/**\n * P2's `<collection>-import-*` testid scheme, spelled out literally per kind rather than built by\n * string interpolation — so the Functions arm's four testids stay the exact byte strings\n * `functions-page-guards.test.cjs` (IM1–IM3) already asserts against, verifiable by a plain\n * substring search over this file rather than only by running the browser suite.\n */\nconst TESTIDS: Record<\n SpecImportKind,\n { json: string; submit: string; unresolved: string; goto: string }\n> = {\n function: {\n json: \"functions-import-json\",\n submit: \"functions-import-submit\",\n unresolved: \"functions-import-unresolved\",\n goto: \"functions-import-goto\",\n },\n endpoint: {\n json: \"endpoints-import-json\",\n submit: \"endpoints-import-submit\",\n unresolved: \"endpoints-import-unresolved\",\n goto: \"endpoints-import-goto\",\n },\n workflow: {\n json: \"workflows-import-json\",\n submit: \"workflows-import-submit\",\n unresolved: \"workflows-import-unresolved\",\n goto: \"workflows-import-goto\",\n },\n};\n\n/**\n * Import modal for the Functions, Endpoints and Workflows lists (T1.2.1, generalizing T3.2.1's\n * Functions-only `ImportFunctionModal`): paste a portable spec document (rfcs/function.md), POST\n * it to `/spec/import` and either land in the created resource's editor (every reference resolved)\n * or stay open with the unresolved-reference report (A5).\n *\n * **P1 — one parameterized component, not three.** The Function-specific surface was four strings,\n * one nav target and a testid prefix — forking it into three siblings would duplicate the state\n * machine below for no gain. The `kind` prop drives all of it: `parseImportPaste`'s expected kind,\n * the title/copy, the `goto()` navigation target (`<collection>/<id>`), and every testid (P2 — the\n * four `functions-import-*` ones this file used to hardcode keep matching byte-for-byte; see\n * `TESTIDS` above for why they are spelled out literally per kind rather than interpolated).\n *\n * Mirrors `FunctionIdentityModal.tsx` (note 3 — same studio-local `Modal`,\n * same `ApiError.message` handling, same \"the row was created, hand the\n * operator the id\" shape as `onCreated`) but is a structurally PARALLEL,\n * distinct trigger — not a second \"create a resource and land in its editor\"\n * flow built on top of it. It owns its own navigation (unlike the identity\n * modal, which reports back to the list) because A5's \"created but\n * partially resolved\" outcome has nowhere else to render the report: the\n * modal has to stay mounted to show it, so it is also the one place that can\n * decide whether and when to leave the list route.\n *\n * **A `201` whose `references` carry any `resolved: false` entry is NOT\n * \"done\" (A5)** — the near-miss this exists to kill is \"201 ⇒ close and\n * navigate\", which would hide exactly the unresolved-reference report the\n * intake asks for.\n */\nexport interface ImportSpecModalProps {\n kind: SpecImportKind;\n /** The host's current project (only the workflow list key reads it). */\n project: string | undefined;\n /** The three list query keys, injected by the host. */\n listKeys: SpecImportListKeys;\n /** Navigate to the imported row; the modal closes itself first. */\n onOpenImported: (kind: SpecImportKind, id: string) => void;\n onClose: () => void;\n}\n\nexport function ImportSpecModal(props: ImportSpecModalProps) {\n const { kind } = props;\n const collection = COLLECTION[kind];\n const testids = TESTIDS[kind];\n const [text, setText] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [unresolved, setUnresolved] = useState<{\n callableId: string;\n references: SpecImportReferenceReport[];\n } | null>(null);\n // Two steps: \"paste\" (parse → explicit Next → ONE preview request) then \"configure\" (rows).\n const [rows, setRows] = useState<ImportRow[] | null>(null);\n const [addingFor, setAddingFor] = useState<ImportRow | null>(null);\n const importMut = useImportSpecMutation(props.project, props.listKeys);\n const previewMut = useSpecPreviewMutation(props.project);\n\n const { parsed, blockedReason } = parseImportPaste(text, kind);\n const configuring = rows !== null;\n // Create is enabled ONLY after a successful preview (never a verbatim post).\n const disabled =\n !configuring || !rowsReady(rows) || blockedReason !== null || importMut.isPending;\n\n function edit(next: string) {\n setText(next);\n setUnresolved(null);\n setError(null);\n setRows(null);\n }\n\n function next() {\n if (blockedReason !== null || parsed === null || previewMut.isPending) return;\n setError(null);\n previewMut.mutate(parsed as Record<string, unknown>, {\n onSuccess: (res) => setRows(buildRows(res.dependencies)),\n onError: (e) => {\n setRows(null);\n setError(e instanceof ApiError ? e.message : String(e));\n },\n });\n }\n\n function onFile(file: File | undefined) {\n if (!file) return;\n file.text().then(edit, (e) => setError(String(e)));\n }\n\n function goto(id: string) {\n props.onClose();\n props.onOpenImported(kind, id);\n }\n\n function submit() {\n // Defensive, not decorative: a forced click (e.g. `dispatchEvent`) on a\n // disabled button must still issue zero requests (A3, IM1(a)/(b)).\n if (rows === null || blockedReason !== null || parsed === null || importMut.isPending) return;\n setError(null);\n setUnresolved(null);\n // The parsed paste plus EVERY row's selection (`unconfigured` included).\n importMut.mutate(\n { document: parsed as Record<string, unknown>, selections: toSelections(rows) },\n {\n onSuccess: (result) => {\n const allResolved = result.references.every((r) => r.resolved);\n if (allResolved) {\n goto(result.callable.id);\n return;\n }\n // Kept open (A5): the resource WAS created, but at least one\n // reference did not bind — report every unresolved entry, and give\n // the operator an explicit way to still reach the row.\n setUnresolved({\n callableId: result.callable.id,\n references: result.references.filter((r) => !r.resolved),\n });\n },\n onError: (e) => setError(e instanceof ApiError ? e.message : String(e)),\n },\n );\n }\n\n function selectValue(row: ImportRow): string {\n const s = row.selection;\n return s.mode === \"bind\" ? `bind:${s.target}` : s.mode;\n }\n\n function onPick(row: ImportRow, value: string) {\n setRows((cur) => {\n if (!cur) return cur;\n if (value === \"unconfigured\") return setUnconfigured(cur, row.key);\n if (value === \"create\") return setCreateName(cur, row.key, row.createName);\n return setBind(cur, row.key, value.slice(\"bind:\".length));\n });\n }\n\n return (\n <Modal title={`Import ${kind}`} onClose={props.onClose} wide>\n <div className=\"modal-body\">\n <p className=\"muted small\">\n Paste a portable {kind} spec document (exported via{\" \"}\n <code>GET /{collection}/:id/spec</code>\n ). A fresh id is minted here; connection references are re-bound to whatever this account\n already has connected, and anything that couldn't be re-bound is reported below.\n </p>\n\n <div data-testid={testids.json}>\n <JsonEditor\n value={text}\n onChange={edit}\n minHeight=\"320px\"\n aria-label={`${kind} spec document JSON`}\n />\n </div>\n\n <label className=\"muted small\">\n Or choose a <code>.json</code> file:{\" \"}\n <input\n type=\"file\"\n accept=\".json,application/json\"\n data-testid={`${collection}-import-file`}\n onChange={(e) => onFile(e.target.files?.[0])}\n />\n </label>\n\n {blockedReason && text !== \"\" && <p className=\"muted small\">{blockedReason}</p>}\n {error && <div className=\"result error\">{error}</div>}\n\n {rows && rows.length === 0 && (\n <p className=\"muted small\" data-testid={`${collection}-import-nodeps`}>\n This {kind} has no dependencies.\n </p>\n )}\n {rows && rows.length > 0 && (\n <ul className=\"list\" data-testid={`${collection}-import-rows`}>\n {rows.map((row) => (\n <li key={row.key} data-testid={`${collection}-import-row-${row.key}`}>\n <code>{row.dep.name}</code> <span className=\"muted\">({row.dep.kind})</span>{\" \"}\n {row.dep.dynamic ? (\n <span className=\"muted small\">\n Dynamic store name — configure it manually after import.\n </span>\n ) : null}\n <select\n value={selectValue(row)}\n onChange={(e) => onPick(row, e.target.value)}\n aria-label={`Configure ${row.dep.name}`}\n >\n <option value=\"unconfigured\">Leave unconfigured</option>\n {!row.dep.dynamic &&\n row.options.map((o) => (\n <option\n key={o.id}\n value={`bind:${o.id}`}\n disabled={o.compatible === false}\n title={o.reason}\n >\n {o.label}\n {o.compatible === false && o.reason ? ` — ${o.reason}` : \"\"}\n </option>\n ))}\n {row.dep.kind === \"store\" && row.dep.canCreate && !row.dep.dynamic && (\n <option value=\"create\">Create new</option>\n )}\n </select>\n {row.selection.mode === \"create\" && (\n <input\n type=\"text\"\n value={row.selection.name}\n aria-label={`New name for ${row.dep.name}`}\n onChange={(e) =>\n setRows((cur) => (cur ? setCreateName(cur, row.key, e.target.value) : cur))\n }\n />\n )}\n {row.dep.kind === \"connection\" && row.dep.app && (\n <button type=\"button\" className=\"btn ghost\" onClick={() => setAddingFor(row)}>\n Add connection\n </button>\n )}\n </li>\n ))}\n </ul>\n )}\n {addingFor && (\n <AddConnectionModal\n initialAppId={addingFor.dep.app}\n onClose={() => setAddingFor(null)}\n onCreated={({ connectionId }) => {\n // Append the new connection as an option and bind the row to it (no re-preview).\n const key = addingFor.key;\n setRows((cur) =>\n cur ? withCreatedConnection(cur, key, connectionId, connectionId) : cur,\n );\n setAddingFor(null);\n }}\n />\n )}\n\n {unresolved && (\n <div className=\"result\" data-testid={testids.unresolved}>\n <p>\n The {kind} was created, but {unresolved.references.length} reference\n {unresolved.references.length === 1 ? \"\" : \"s\"} could not be resolved:\n </p>\n <ul className=\"list\">\n {unresolved.references.map((r) => (\n <li key={r.path}>\n <code>{r.path}</code> <span className=\"muted\">({r.kind})</span>\n {r.reason && <span className=\"muted\"> — {r.reason}</span>}\n </li>\n ))}\n </ul>\n <button\n type=\"button\"\n className=\"btn\"\n data-testid={testids.goto}\n onClick={() => goto(unresolved.callableId)}\n >\n Open the created {kind}\n </button>\n </div>\n )}\n </div>\n\n <div className=\"modal-actions\">\n <button type=\"button\" className=\"btn ghost\" onClick={props.onClose}>\n Cancel\n </button>\n {!configuring && (\n <button\n type=\"button\"\n className=\"btn\"\n data-testid={`${collection}-import-next`}\n disabled={blockedReason !== null || previewMut.isPending}\n onClick={next}\n >\n {previewMut.isPending ? \"Checking…\" : \"Next\"}\n </button>\n )}\n <button\n type=\"button\"\n className=\"btn\"\n data-testid={testids.submit}\n disabled={disabled}\n onClick={submit}\n >\n {importMut.isPending ? \"Importing…\" : \"Create\"}\n </button>\n </div>\n </Modal>\n );\n}\n"],"names":["COLLECTION","TESTIDS","ImportSpecModal","props","kind","collection","testids","text","setText","useState","error","setError","unresolved","setUnresolved","rows","setRows","addingFor","setAddingFor","importMut","useImportSpecMutation","previewMut","useSpecPreviewMutation","parsed","blockedReason","parseImportPaste","configuring","disabled","rowsReady","edit","next","res","buildRows","ApiError","onFile","file","e","goto","id","submit","toSelections","result","r","selectValue","row","s","onPick","value","cur","setUnconfigured","setCreateName","setBind","jsxs","Modal","jsx","JsonEditor","_a","o","AddConnectionModal","connectionId","key","withCreatedConnection"],"mappings":"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"}