@businessdash/sdk 0.9.60

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 (268) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +899 -0
  3. package/dist/adapters-revalidate.d.ts +44 -0
  4. package/dist/adapters-revalidate.d.ts.map +1 -0
  5. package/dist/adapters-revalidate.js +68 -0
  6. package/dist/adapters-revalidate.js.map +1 -0
  7. package/dist/alpha.d.ts +21 -0
  8. package/dist/alpha.d.ts.map +1 -0
  9. package/dist/alpha.js +21 -0
  10. package/dist/alpha.js.map +1 -0
  11. package/dist/analytics-core.d.ts +34 -0
  12. package/dist/analytics-core.d.ts.map +1 -0
  13. package/dist/analytics-core.js +138 -0
  14. package/dist/analytics-core.js.map +1 -0
  15. package/dist/analytics-server.d.ts +54 -0
  16. package/dist/analytics-server.d.ts.map +1 -0
  17. package/dist/analytics-server.js +78 -0
  18. package/dist/analytics-server.js.map +1 -0
  19. package/dist/attribution-logo.d.ts +2 -0
  20. package/dist/attribution-logo.d.ts.map +1 -0
  21. package/dist/attribution-logo.js +5 -0
  22. package/dist/attribution-logo.js.map +1 -0
  23. package/dist/auth-handler.d.ts +92 -0
  24. package/dist/auth-handler.d.ts.map +1 -0
  25. package/dist/auth-handler.js +277 -0
  26. package/dist/auth-handler.js.map +1 -0
  27. package/dist/biab-forms.css +484 -0
  28. package/dist/cli.d.ts +46 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +1824 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/client.d.ts +1681 -0
  33. package/dist/client.d.ts.map +1 -0
  34. package/dist/client.js +2845 -0
  35. package/dist/client.js.map +1 -0
  36. package/dist/collections.d.ts +13 -0
  37. package/dist/collections.d.ts.map +1 -0
  38. package/dist/collections.js +13 -0
  39. package/dist/collections.js.map +1 -0
  40. package/dist/contracts.d.ts +14609 -0
  41. package/dist/contracts.d.ts.map +1 -0
  42. package/dist/contracts.js +2428 -0
  43. package/dist/contracts.js.map +1 -0
  44. package/dist/data-model-schema.d.ts +962 -0
  45. package/dist/data-model-schema.d.ts.map +1 -0
  46. package/dist/data-model-schema.js +2295 -0
  47. package/dist/data-model-schema.js.map +1 -0
  48. package/dist/distribution.d.ts +38 -0
  49. package/dist/distribution.d.ts.map +1 -0
  50. package/dist/distribution.js +61 -0
  51. package/dist/distribution.js.map +1 -0
  52. package/dist/element.d.ts +121 -0
  53. package/dist/element.d.ts.map +1 -0
  54. package/dist/element.js +276 -0
  55. package/dist/element.js.map +1 -0
  56. package/dist/enums.d.ts +25 -0
  57. package/dist/enums.d.ts.map +1 -0
  58. package/dist/enums.js +38 -0
  59. package/dist/enums.js.map +1 -0
  60. package/dist/errors.d.ts +195 -0
  61. package/dist/errors.d.ts.map +1 -0
  62. package/dist/errors.js +188 -0
  63. package/dist/errors.js.map +1 -0
  64. package/dist/forms-core/autocomplete.d.ts +37 -0
  65. package/dist/forms-core/autocomplete.d.ts.map +1 -0
  66. package/dist/forms-core/autocomplete.js +82 -0
  67. package/dist/forms-core/autocomplete.js.map +1 -0
  68. package/dist/forms-core/business-function.d.ts +61 -0
  69. package/dist/forms-core/business-function.d.ts.map +1 -0
  70. package/dist/forms-core/business-function.js +149 -0
  71. package/dist/forms-core/business-function.js.map +1 -0
  72. package/dist/forms-core/calculation.d.ts +72 -0
  73. package/dist/forms-core/calculation.d.ts.map +1 -0
  74. package/dist/forms-core/calculation.js +103 -0
  75. package/dist/forms-core/calculation.js.map +1 -0
  76. package/dist/forms-core/controller.d.ts +249 -0
  77. package/dist/forms-core/controller.d.ts.map +1 -0
  78. package/dist/forms-core/controller.js +590 -0
  79. package/dist/forms-core/controller.js.map +1 -0
  80. package/dist/forms-core/elements.d.ts +44 -0
  81. package/dist/forms-core/elements.d.ts.map +1 -0
  82. package/dist/forms-core/elements.js +68 -0
  83. package/dist/forms-core/elements.js.map +1 -0
  84. package/dist/forms-core/email-domains.d.ts +10 -0
  85. package/dist/forms-core/email-domains.d.ts.map +1 -0
  86. package/dist/forms-core/email-domains.js +69 -0
  87. package/dist/forms-core/email-domains.js.map +1 -0
  88. package/dist/forms-core/file-rules.d.ts +51 -0
  89. package/dist/forms-core/file-rules.d.ts.map +1 -0
  90. package/dist/forms-core/file-rules.js +105 -0
  91. package/dist/forms-core/file-rules.js.map +1 -0
  92. package/dist/forms-core/formula.d.ts +114 -0
  93. package/dist/forms-core/formula.d.ts.map +1 -0
  94. package/dist/forms-core/formula.js +1170 -0
  95. package/dist/forms-core/formula.js.map +1 -0
  96. package/dist/forms-core/index.d.ts +24 -0
  97. package/dist/forms-core/index.d.ts.map +1 -0
  98. package/dist/forms-core/index.js +28 -0
  99. package/dist/forms-core/index.js.map +1 -0
  100. package/dist/forms-core/units.d.ts +49 -0
  101. package/dist/forms-core/units.d.ts.map +1 -0
  102. package/dist/forms-core/units.js +255 -0
  103. package/dist/forms-core/units.js.map +1 -0
  104. package/dist/forms-core/us-states.d.ts +14 -0
  105. package/dist/forms-core/us-states.d.ts.map +1 -0
  106. package/dist/forms-core/us-states.js +66 -0
  107. package/dist/forms-core/us-states.js.map +1 -0
  108. package/dist/forms-core/validation.d.ts +266 -0
  109. package/dist/forms-core/validation.d.ts.map +1 -0
  110. package/dist/forms-core/validation.js +850 -0
  111. package/dist/forms-core/validation.js.map +1 -0
  112. package/dist/forms.d.ts +19 -0
  113. package/dist/forms.d.ts.map +1 -0
  114. package/dist/forms.js +29 -0
  115. package/dist/forms.js.map +1 -0
  116. package/dist/gallery-types.d.ts +32 -0
  117. package/dist/gallery-types.d.ts.map +1 -0
  118. package/dist/gallery-types.js +2 -0
  119. package/dist/gallery-types.js.map +1 -0
  120. package/dist/graphql.d.ts +97 -0
  121. package/dist/graphql.d.ts.map +1 -0
  122. package/dist/graphql.js +212 -0
  123. package/dist/graphql.js.map +1 -0
  124. package/dist/index.cjs +19448 -0
  125. package/dist/index.d.cts +19 -0
  126. package/dist/index.d.mts +19 -0
  127. package/dist/index.d.ts +19 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +20 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/marketing-schema.d.ts +216 -0
  132. package/dist/marketing-schema.d.ts.map +1 -0
  133. package/dist/marketing-schema.js +200 -0
  134. package/dist/marketing-schema.js.map +1 -0
  135. package/dist/mcp.d.ts +42 -0
  136. package/dist/mcp.d.ts.map +1 -0
  137. package/dist/mcp.js +87 -0
  138. package/dist/mcp.js.map +1 -0
  139. package/dist/native.d.ts +45 -0
  140. package/dist/native.d.ts.map +1 -0
  141. package/dist/native.js +43 -0
  142. package/dist/native.js.map +1 -0
  143. package/dist/next-revalidate.d.ts +43 -0
  144. package/dist/next-revalidate.d.ts.map +1 -0
  145. package/dist/next-revalidate.js +84 -0
  146. package/dist/next-revalidate.js.map +1 -0
  147. package/dist/parallel-pages.d.ts +102 -0
  148. package/dist/parallel-pages.d.ts.map +1 -0
  149. package/dist/parallel-pages.js +108 -0
  150. package/dist/parallel-pages.js.map +1 -0
  151. package/dist/payment-icons.d.ts +66 -0
  152. package/dist/payment-icons.d.ts.map +1 -0
  153. package/dist/payment-icons.js +160 -0
  154. package/dist/payment-icons.js.map +1 -0
  155. package/dist/proxy.d.ts +67 -0
  156. package/dist/proxy.d.ts.map +1 -0
  157. package/dist/proxy.js +97 -0
  158. package/dist/proxy.js.map +1 -0
  159. package/dist/react-analytics.d.ts +39 -0
  160. package/dist/react-analytics.d.ts.map +1 -0
  161. package/dist/react-analytics.js +59 -0
  162. package/dist/react-analytics.js.map +1 -0
  163. package/dist/react-attribution.d.ts +99 -0
  164. package/dist/react-attribution.d.ts.map +1 -0
  165. package/dist/react-attribution.js +52 -0
  166. package/dist/react-attribution.js.map +1 -0
  167. package/dist/react-marketing.d.ts +181 -0
  168. package/dist/react-marketing.d.ts.map +1 -0
  169. package/dist/react-marketing.js +215 -0
  170. package/dist/react-marketing.js.map +1 -0
  171. package/dist/react.d.ts +727 -0
  172. package/dist/react.d.ts.map +1 -0
  173. package/dist/react.js +2418 -0
  174. package/dist/react.js.map +1 -0
  175. package/dist/reserved-paths.d.ts +24 -0
  176. package/dist/reserved-paths.d.ts.map +1 -0
  177. package/dist/reserved-paths.js +60 -0
  178. package/dist/reserved-paths.js.map +1 -0
  179. package/dist/revalidate-verify.d.ts +30 -0
  180. package/dist/revalidate-verify.d.ts.map +1 -0
  181. package/dist/revalidate-verify.js +74 -0
  182. package/dist/revalidate-verify.js.map +1 -0
  183. package/dist/sdk.d.ts +678 -0
  184. package/dist/sdk.d.ts.map +1 -0
  185. package/dist/sdk.js +801 -0
  186. package/dist/sdk.js.map +1 -0
  187. package/dist/seo.d.ts +218 -0
  188. package/dist/seo.d.ts.map +1 -0
  189. package/dist/seo.js +309 -0
  190. package/dist/seo.js.map +1 -0
  191. package/dist/socials.d.ts +47 -0
  192. package/dist/socials.d.ts.map +1 -0
  193. package/dist/socials.js +172 -0
  194. package/dist/socials.js.map +1 -0
  195. package/dist/static.d.ts +14 -0
  196. package/dist/static.d.ts.map +1 -0
  197. package/dist/static.js +14 -0
  198. package/dist/static.js.map +1 -0
  199. package/dist/url-pattern.d.ts +47 -0
  200. package/dist/url-pattern.d.ts.map +1 -0
  201. package/dist/url-pattern.js +124 -0
  202. package/dist/url-pattern.js.map +1 -0
  203. package/dist/vanilla.d.ts +77 -0
  204. package/dist/vanilla.d.ts.map +1 -0
  205. package/dist/vanilla.js +903 -0
  206. package/dist/vanilla.js.map +1 -0
  207. package/openapi.json +13779 -0
  208. package/package.json +204 -0
  209. package/src/adapters-revalidate.ts +88 -0
  210. package/src/alpha.ts +89 -0
  211. package/src/analytics-core.ts +175 -0
  212. package/src/analytics-server.ts +99 -0
  213. package/src/angular/biab-form.component.ts +1443 -0
  214. package/src/angular/index.ts +26 -0
  215. package/src/attribution-logo.ts +5 -0
  216. package/src/auth-handler.ts +352 -0
  217. package/src/cli.ts +2517 -0
  218. package/src/client.ts +3578 -0
  219. package/src/collections.ts +101 -0
  220. package/src/contracts.ts +3390 -0
  221. package/src/data-model-schema.ts +4042 -0
  222. package/src/distribution.ts +73 -0
  223. package/src/element.ts +321 -0
  224. package/src/enums.ts +65 -0
  225. package/src/errors.ts +338 -0
  226. package/src/forms-core/autocomplete.ts +97 -0
  227. package/src/forms-core/business-function.ts +209 -0
  228. package/src/forms-core/calculation.ts +167 -0
  229. package/src/forms-core/controller.ts +922 -0
  230. package/src/forms-core/elements.ts +86 -0
  231. package/src/forms-core/email-domains.ts +68 -0
  232. package/src/forms-core/file-rules.ts +123 -0
  233. package/src/forms-core/formula.ts +1339 -0
  234. package/src/forms-core/index.ts +122 -0
  235. package/src/forms-core/units.ts +308 -0
  236. package/src/forms-core/us-states.ts +68 -0
  237. package/src/forms-core/validation.ts +1037 -0
  238. package/src/forms.ts +63 -0
  239. package/src/gallery-types.ts +31 -0
  240. package/src/graphql.ts +295 -0
  241. package/src/index.ts +505 -0
  242. package/src/marketing-schema.ts +395 -0
  243. package/src/mcp.ts +108 -0
  244. package/src/native.ts +73 -0
  245. package/src/next-revalidate.ts +124 -0
  246. package/src/parallel-pages.ts +192 -0
  247. package/src/payment-icons.ts +205 -0
  248. package/src/proxy.ts +173 -0
  249. package/src/qwik.tsx +1234 -0
  250. package/src/react-analytics.tsx +76 -0
  251. package/src/react-attribution.tsx +192 -0
  252. package/src/react-marketing.tsx +338 -0
  253. package/src/react.tsx +5495 -0
  254. package/src/reserved-paths.ts +65 -0
  255. package/src/revalidate-verify.ts +98 -0
  256. package/src/sdk.ts +1671 -0
  257. package/src/seo.ts +488 -0
  258. package/src/socials.ts +230 -0
  259. package/src/solid.tsx +1466 -0
  260. package/src/static.ts +21 -0
  261. package/src/styles/biab-forms.css +484 -0
  262. package/src/svelte/BiabForm.svelte +1069 -0
  263. package/src/svelte/context.ts +57 -0
  264. package/src/svelte/index.ts +79 -0
  265. package/src/url-pattern.ts +153 -0
  266. package/src/vanilla.ts +1290 -0
  267. package/src/vue/BiabForm.vue +1538 -0
  268. package/src/vue/index.ts +119 -0
@@ -0,0 +1,590 @@
1
+ /**
2
+ * createFormController — the framework-agnostic observable store that drives
3
+ * every `<BiabForm>` binding (React / Vue / Svelte / Solid / Qwik / Angular /
4
+ * web-component / vanilla).
5
+ *
6
+ * It owns ALL of the form's runtime state and behaviour:
7
+ * - working values (+ seeded defaults), condition-aware visible fields,
8
+ * - field-level validation errors (mirrored from the server's rules),
9
+ * - multi-step ("consecutive") navigation + progress,
10
+ * - concurrent-reveal gating inside groups,
11
+ * - submission lifecycle (submitting / result),
12
+ * - file uploads via the SDK.
13
+ *
14
+ * Bindings stay dumb: subscribe to `snapshot()`, render by field `type` using
15
+ * the `biab-*` class convention (light DOM, no shadow root, so consumer CSS
16
+ * cascades), and call `setValue` / `next` / `back` / `submit` / `uploadFile` /
17
+ * `reset`. The store is a tiny subscribe/notify observable — no framework
18
+ * reactivity primitives leak in.
19
+ *
20
+ * Data flows entirely through the SDK: it calls `client.forms.schema(slug)` to
21
+ * load and `client.forms.submit(slug, data, opts)` to submit, so auth, caching,
22
+ * revalidation, HMAC, retries, and CRM fan-out all stay invisible inside
23
+ * biab-dev. SSR callers can hand a pre-fetched schema instead of a client.
24
+ */
25
+ import { functionsToEvalOptions, } from "./business-function.js";
26
+ import { computeCalculation } from "./calculation.js";
27
+ import { FORM_WIDE_MAX_FILES } from "./file-rules.js";
28
+ import { concurrentRevealCount, evalCondition, findMissingRequired, isNodeVisible, seedInitialData, toSubmissionPayload, } from "./validation.js";
29
+ export function isPendingFileValue(v) {
30
+ return (!!v && typeof v === "object" && v.pending === true);
31
+ }
32
+ /** Walk the field tree and collect every `file_upload` node. */
33
+ function collectFileFields(nodes) {
34
+ const out = [];
35
+ const walk = (ns) => {
36
+ for (const n of ns) {
37
+ if (n.type === "file_upload")
38
+ out.push(n);
39
+ const kids = n.children;
40
+ if (kids)
41
+ walk(kids);
42
+ }
43
+ };
44
+ walk(nodes);
45
+ return out;
46
+ }
47
+ /**
48
+ * `uploadFile` is optional on `BiabFormsClient`, and legitimately so: a
49
+ * same-origin proxy that forwards only `schema` and `submit` is a valid client,
50
+ * and that is exactly what the starter templates ship so the bearer key never
51
+ * reaches the browser. A form with a file field needs more than that.
52
+ *
53
+ * Resolving it here turns the failure into one sentence naming the cause, at
54
+ * the moment of upload. Previously the controller called it unguarded — under
55
+ * the old typing that was invisible, and a proxy client hit
56
+ * `client.forms.uploadFile is not a function` from inside a submit handler.
57
+ */
58
+ function requireUploadFile(client) {
59
+ const upload = client.forms.uploadFile;
60
+ if (!upload) {
61
+ throw new Error("createFormController: this form has a file field, but the configured client does not implement `forms.uploadFile`.");
62
+ }
63
+ return upload.bind(client.forms);
64
+ }
65
+ // ─────────────────────────────────────────────────────────────────────────────
66
+ // Implementation
67
+ // ─────────────────────────────────────────────────────────────────────────────
68
+ const DEFAULT_SETTINGS = {
69
+ animation: "none",
70
+ isConsecutive: false,
71
+ showProgress: false,
72
+ progressStyle: "steps",
73
+ };
74
+ function resolveSettings(settings) {
75
+ return {
76
+ animation: settings?.animation ?? DEFAULT_SETTINGS.animation,
77
+ isConsecutive: settings?.isConsecutive ?? DEFAULT_SETTINGS.isConsecutive,
78
+ showProgress: settings?.showProgress ?? DEFAULT_SETTINGS.showProgress,
79
+ progressStyle: settings?.progressStyle ?? DEFAULT_SETTINGS.progressStyle,
80
+ ...(settings?.exitConfirm ? { exitConfirm: settings.exitConfirm } : {}),
81
+ };
82
+ }
83
+ /**
84
+ * Compute the step partition. Single-page → one step of all fields; consecutive
85
+ * → each top-level node is its own step (mirrors FormPreview's `steps`).
86
+ *
87
+ * A page whose `conditionRule` is currently false is DROPPED rather than left
88
+ * empty, so "Next" skips straight past it and the progress indicator loses its
89
+ * entry. Every renderer reads `stepCount` / `steps` from here, so this one
90
+ * change gives React, Svelte, Vue, Angular, Solid, Qwik and vanilla the same
91
+ * behaviour as the dashboard.
92
+ */
93
+ function computeSteps(fields, isConsecutive, data) {
94
+ if (!isConsecutive)
95
+ return [fields];
96
+ return fields.filter((f) => isNodeVisible(f, data)).map((f) => [f]);
97
+ }
98
+ export function createFormController(options) {
99
+ if (!options.client && !options.schema) {
100
+ throw new Error("createFormController: provide a `client` (with `slug`) or a pre-fetched `schema`.");
101
+ }
102
+ if (options.client && !options.slug && !options.schema?.slug) {
103
+ throw new Error("createFormController: `slug` is required when loading via `client`.");
104
+ }
105
+ const client = options.client;
106
+ const slug = options.slug ?? options.schema?.slug ?? "";
107
+ // ── Mutable internal state (never exposed directly) ──────────────────────
108
+ let status = "idle";
109
+ let loadError = null;
110
+ let schema = options.schema ?? null;
111
+ let fields = [];
112
+ let settings = DEFAULT_SETTINGS;
113
+ let values = {};
114
+ let errors = {};
115
+ let step = 0;
116
+ let forward = true;
117
+ let submitting = false;
118
+ let uploadingCount = 0;
119
+ let result = null;
120
+ let destroyed = false;
121
+ let cachedSnapshot = null;
122
+ const subscribers = new Set();
123
+ // `calculation` field support: derived once per schema adopt.
124
+ let calcFields = [];
125
+ let calcFunctionsById = {};
126
+ let calcEvalOptions = {};
127
+ /** Walk the field tree and collect every `calculation` node. */
128
+ function collectCalcFields(nodes) {
129
+ const out = [];
130
+ const walk = (ns) => {
131
+ for (const n of ns) {
132
+ if (n.type === "calculation")
133
+ out.push(n);
134
+ const kids = n.children;
135
+ if (kids)
136
+ walk(kids);
137
+ }
138
+ };
139
+ walk(nodes);
140
+ return out;
141
+ }
142
+ /** Recompute every `calculation` field into `vals`. Non-sensitive only — a
143
+ * sensitive function has no published def, so it resolves to null here and
144
+ * the server computes the authoritative value on submit. Idempotent. */
145
+ function applyCalcs(vals) {
146
+ if (calcFields.length === 0)
147
+ return vals;
148
+ let changed = false;
149
+ const next = { ...vals };
150
+ for (const f of calcFields) {
151
+ const cfg = f
152
+ .calculationConfig;
153
+ if (!cfg)
154
+ continue;
155
+ const r = computeCalculation(cfg, (id) => next[id], {
156
+ functionsById: calcFunctionsById,
157
+ evalOptions: calcEvalOptions,
158
+ });
159
+ const val = r.ok ? r.value : null;
160
+ if (JSON.stringify(next[f.id] ?? null) !== JSON.stringify(val ?? null)) {
161
+ next[f.id] = val;
162
+ changed = true;
163
+ }
164
+ }
165
+ return changed ? next : vals;
166
+ }
167
+ // ── Snapshot building ────────────────────────────────────────────────────
168
+ function buildSnapshot() {
169
+ const steps = computeSteps(fields, settings.isConsecutive, values);
170
+ const stepCount = Math.max(steps.length, 1);
171
+ const safeStep = Math.min(Math.max(step, 0), stepCount - 1);
172
+ const visibleFields = settings.isConsecutive
173
+ ? (steps[safeStep] ?? [])
174
+ : fields;
175
+ const stepFields = steps[safeStep] ?? [];
176
+ const canAdvance = findMissingRequired(stepFields, values).length === 0;
177
+ const canSubmit = findMissingRequired(fields, values).length === 0;
178
+ const errorList = Object.values(errors);
179
+ const progress = stepCount > 0 ? (safeStep + 1) / stepCount : 0;
180
+ return {
181
+ status,
182
+ loadError,
183
+ schema,
184
+ fieldDefs: (schema?.fields ?? []),
185
+ fields,
186
+ settings,
187
+ orgIcon: schema?.orgIcon ?? null,
188
+ title: schema?.title ?? null,
189
+ description: schema?.description ?? null,
190
+ values,
191
+ errors,
192
+ errorList,
193
+ steps,
194
+ step: safeStep,
195
+ stepCount,
196
+ isFirstStep: safeStep === 0,
197
+ isLastStep: safeStep === stepCount - 1,
198
+ visibleFields,
199
+ progress,
200
+ progressPercent: Math.round(progress * 100),
201
+ canAdvance,
202
+ canSubmit,
203
+ forward,
204
+ submitting,
205
+ uploading: uploadingCount > 0,
206
+ result,
207
+ submitted: result?.ok === true,
208
+ };
209
+ }
210
+ function notify() {
211
+ if (destroyed)
212
+ return;
213
+ cachedSnapshot = buildSnapshot();
214
+ for (const cb of subscribers)
215
+ cb(cachedSnapshot);
216
+ }
217
+ function snapshot() {
218
+ if (!cachedSnapshot)
219
+ cachedSnapshot = buildSnapshot();
220
+ return cachedSnapshot;
221
+ }
222
+ // ── Error helpers ────────────────────────────────────────────────────────
223
+ function setErrorsFromMissing(missing) {
224
+ const next = {};
225
+ for (const m of missing) {
226
+ next[m.id] = {
227
+ id: m.id,
228
+ label: m.label,
229
+ message: `${m.label} is required.`,
230
+ };
231
+ }
232
+ errors = next;
233
+ }
234
+ // ── Field tree extraction ────────────────────────────────────────────────
235
+ function adoptSchema(loaded) {
236
+ schema = loaded;
237
+ // The published schema's `fields` carries the full nested tree (layout
238
+ // nodes, condition_block, or_condition, children, output `key`).
239
+ fields = (loaded.fields ?? []);
240
+ settings = resolveSettings(loaded.settings);
241
+ // Build the calculation context from the schema's (non-sensitive) functions.
242
+ calcFields = collectCalcFields(fields);
243
+ calcFunctionsById = {};
244
+ const bySlug = {};
245
+ for (const fn of loaded.businessFunctions ?? []) {
246
+ const def = {
247
+ slug: fn.slug,
248
+ inputs: fn.inputs,
249
+ outputs: fn.outputs,
250
+ };
251
+ calcFunctionsById[fn.id] = def;
252
+ bySlug[fn.slug.toUpperCase()] = def;
253
+ }
254
+ calcEvalOptions = functionsToEvalOptions(bySlug);
255
+ values = applyCalcs(seedInitialData(fields));
256
+ errors = {};
257
+ step = 0;
258
+ forward = true;
259
+ result = null;
260
+ status = "ready";
261
+ loadError = null;
262
+ }
263
+ // ── Public methods ─────────────────────────────────────────────────────
264
+ async function load() {
265
+ // Revive on (re)load. `load()` is idempotent and "safe to call again",
266
+ // and React StrictMode runs effects mount → cleanup → mount: the cleanup
267
+ // calls `destroy()` (sets `destroyed = true`), so the remount's `load()`
268
+ // must reset the flag or it would bail here and the form would hang on
269
+ // "loading" forever — even after the schema fetch returns 200. A genuine
270
+ // unmount never calls `load()` again, so reviving here is safe.
271
+ destroyed = false;
272
+ // Pre-fetched schema path: adopt synchronously.
273
+ if (options.schema && status === "idle") {
274
+ adoptSchema(options.schema);
275
+ notify();
276
+ return;
277
+ }
278
+ if (!client) {
279
+ // No client and no (further) schema — nothing to load.
280
+ if (schema && status !== "ready") {
281
+ adoptSchema(schema);
282
+ notify();
283
+ }
284
+ return;
285
+ }
286
+ status = "loading";
287
+ loadError = null;
288
+ notify();
289
+ try {
290
+ const loaded = await client.forms.schema(slug);
291
+ if (destroyed)
292
+ return;
293
+ adoptSchema(loaded);
294
+ notify();
295
+ }
296
+ catch (err) {
297
+ if (destroyed)
298
+ return;
299
+ status = "error";
300
+ loadError =
301
+ err instanceof Error ? err.message : "Failed to load the form schema.";
302
+ notify();
303
+ }
304
+ }
305
+ function subscribe(callback) {
306
+ subscribers.add(callback);
307
+ return () => {
308
+ subscribers.delete(callback);
309
+ };
310
+ }
311
+ function setValue(id, value) {
312
+ // Recompute calc fields after the change so derived values stay live and
313
+ // flow into the submission + downstream conditions.
314
+ values = applyCalcs({ ...values, [id]: value });
315
+ if (errors[id]) {
316
+ const { [id]: _removed, ...rest } = errors;
317
+ errors = rest;
318
+ }
319
+ notify();
320
+ }
321
+ function validate() {
322
+ const missing = findMissingRequired(fields, values);
323
+ setErrorsFromMissing(missing);
324
+ notify();
325
+ return missing;
326
+ }
327
+ function next() {
328
+ const steps = computeSteps(fields, settings.isConsecutive, values);
329
+ const stepCount = Math.max(steps.length, 1);
330
+ const safeStep = Math.min(Math.max(step, 0), stepCount - 1);
331
+ if (safeStep >= stepCount - 1)
332
+ return;
333
+ const stepFields = steps[safeStep] ?? [];
334
+ const missing = findMissingRequired(stepFields, values);
335
+ if (missing.length > 0) {
336
+ setErrorsFromMissing(missing);
337
+ notify();
338
+ return;
339
+ }
340
+ errors = {};
341
+ forward = true;
342
+ step = safeStep + 1;
343
+ notify();
344
+ }
345
+ function back() {
346
+ const safeStep = Math.max(step, 0);
347
+ if (safeStep <= 0)
348
+ return;
349
+ forward = false;
350
+ step = safeStep - 1;
351
+ errors = {};
352
+ notify();
353
+ }
354
+ function goToStep(index) {
355
+ const steps = computeSteps(fields, settings.isConsecutive, values);
356
+ const stepCount = Math.max(steps.length, 1);
357
+ const target = Math.min(Math.max(index, 0), stepCount - 1);
358
+ forward = target >= step;
359
+ step = target;
360
+ notify();
361
+ }
362
+ async function submit(callOptions) {
363
+ // Validate the WHOLE form (not just the visible step).
364
+ const missing = findMissingRequired(fields, values);
365
+ if (missing.length > 0) {
366
+ setErrorsFromMissing(missing);
367
+ const failure = {
368
+ ok: false,
369
+ status: 0,
370
+ reason: "client_validation_failed",
371
+ message: `Please complete the required field${missing.length === 1 ? "" : "s"}: ${missing.map((m) => m.label).join(", ")}`,
372
+ issues: missing.map((m) => ({
373
+ fieldId: m.id,
374
+ label: m.label,
375
+ reason: "required",
376
+ message: `${m.label} is required.`,
377
+ })),
378
+ };
379
+ result = failure;
380
+ notify();
381
+ options.onError?.(failure);
382
+ return failure;
383
+ }
384
+ if (!client) {
385
+ const failure = {
386
+ ok: false,
387
+ status: 0,
388
+ reason: "network_error",
389
+ message: "createFormController: a `client` is required to submit. Pass one in options.",
390
+ };
391
+ result = failure;
392
+ notify();
393
+ options.onError?.(failure);
394
+ return failure;
395
+ }
396
+ // Form-wide file cap — at most FORM_WIDE_MAX_FILES across all file fields.
397
+ const fileFields = collectFileFields(fields);
398
+ const totalFiles = fileFields.reduce((n, f) => n +
399
+ (Array.isArray(values[f.id]) ? values[f.id].length : 0), 0);
400
+ if (totalFiles > FORM_WIDE_MAX_FILES) {
401
+ const over = fileFields.filter((f) => Array.isArray(values[f.id]) && values[f.id].length > 0);
402
+ const issues = over.map((f) => ({
403
+ fieldId: f.id,
404
+ label: f.label ?? "Files",
405
+ reason: "max",
406
+ message: `At most ${FORM_WIDE_MAX_FILES} files total.`,
407
+ }));
408
+ setErrorsFromMissing(over.map((f) => ({ id: f.id, label: f.label ?? "Files" })));
409
+ const failure = {
410
+ ok: false,
411
+ status: 0,
412
+ reason: "client_validation_failed",
413
+ message: `Please attach at most ${FORM_WIDE_MAX_FILES} files in total.`,
414
+ issues,
415
+ };
416
+ result = failure;
417
+ notify();
418
+ options.onError?.(failure);
419
+ return failure;
420
+ }
421
+ errors = {};
422
+ submitting = true;
423
+ notify();
424
+ // Flush DEFERRED uploads: every buffered PendingFileValue is uploaded now
425
+ // and replaced by its FormFileValue. A failed upload aborts the submit and
426
+ // surfaces as a field error rather than silently dropping the file.
427
+ const uploadIssues = [];
428
+ for (const f of fileFields) {
429
+ const arr = Array.isArray(values[f.id])
430
+ ? values[f.id]
431
+ : [];
432
+ const pending = arr.filter(isPendingFileValue);
433
+ if (pending.length === 0)
434
+ continue;
435
+ const done = arr.filter((e) => !isPendingFileValue(e));
436
+ for (const p of pending) {
437
+ try {
438
+ uploadingCount += 1;
439
+ notify();
440
+ done.push(await requireUploadFile(client)(slug, f.id, p.file, {
441
+ filename: p.name,
442
+ }));
443
+ }
444
+ catch (err) {
445
+ uploadIssues.push({
446
+ fieldId: f.id,
447
+ label: f.label ?? "Files",
448
+ reason: "type",
449
+ message: err instanceof Error
450
+ ? err.message
451
+ : `Couldn't upload a file for ${f.label}.`,
452
+ });
453
+ }
454
+ finally {
455
+ uploadingCount = Math.max(uploadingCount - 1, 0);
456
+ }
457
+ }
458
+ values = { ...values, [f.id]: done };
459
+ }
460
+ if (uploadIssues.length > 0) {
461
+ submitting = false;
462
+ const next = {};
463
+ for (const issue of uploadIssues) {
464
+ if (issue.fieldId) {
465
+ next[issue.fieldId] = {
466
+ id: issue.fieldId,
467
+ label: issue.label,
468
+ message: issue.message,
469
+ };
470
+ }
471
+ }
472
+ errors = next;
473
+ const failure = {
474
+ ok: false,
475
+ status: 0,
476
+ reason: "network_error",
477
+ message: "Some files couldn't be uploaded — please retry.",
478
+ issues: uploadIssues,
479
+ };
480
+ result = failure;
481
+ notify();
482
+ options.onError?.(failure);
483
+ return failure;
484
+ }
485
+ // Re-key by the published output key for the wire contract (server also
486
+ // accepts the legacy `id`).
487
+ const payload = toSubmissionPayload(fields, values);
488
+ const merged = {
489
+ ...options.submitOptions,
490
+ ...callOptions,
491
+ };
492
+ let res;
493
+ try {
494
+ res = await client.forms.submit(slug, payload, merged);
495
+ }
496
+ catch (err) {
497
+ // `forms.submit` is designed never to throw for an expected failure;
498
+ // this guards against an unexpected transport error.
499
+ res = {
500
+ ok: false,
501
+ status: 0,
502
+ reason: "network_error",
503
+ message: err instanceof Error ? err.message : "The submission failed.",
504
+ };
505
+ }
506
+ if (destroyed)
507
+ return res;
508
+ submitting = false;
509
+ result = res;
510
+ // Surface server-side field issues back onto `errors` for inline display.
511
+ if (!res.ok && res.issues && res.issues.length > 0) {
512
+ const next = {};
513
+ for (const issue of res.issues) {
514
+ if (!issue.fieldId)
515
+ continue;
516
+ next[issue.fieldId] = {
517
+ id: issue.fieldId,
518
+ label: issue.label,
519
+ message: issue.message,
520
+ };
521
+ }
522
+ errors = next;
523
+ }
524
+ notify();
525
+ if (res.ok)
526
+ options.onSuccess?.(res);
527
+ else
528
+ options.onError?.(res);
529
+ return res;
530
+ }
531
+ async function uploadFile(fieldId, file, opts) {
532
+ if (!client) {
533
+ throw new Error("createFormController: a `client` is required to upload files.");
534
+ }
535
+ uploadingCount += 1;
536
+ notify();
537
+ try {
538
+ const uploaded = await requireUploadFile(client)(slug, fieldId, file, opts);
539
+ if (destroyed)
540
+ return uploaded;
541
+ const existing = Array.isArray(values[fieldId])
542
+ ? values[fieldId]
543
+ : [];
544
+ values = { ...values, [fieldId]: [...existing, uploaded] };
545
+ if (errors[fieldId]) {
546
+ const { [fieldId]: _removed, ...rest } = errors;
547
+ errors = rest;
548
+ }
549
+ return uploaded;
550
+ }
551
+ finally {
552
+ uploadingCount = Math.max(uploadingCount - 1, 0);
553
+ if (!destroyed)
554
+ notify();
555
+ }
556
+ }
557
+ function reset() {
558
+ values = seedInitialData(fields);
559
+ errors = {};
560
+ step = 0;
561
+ forward = true;
562
+ result = null;
563
+ submitting = false;
564
+ notify();
565
+ }
566
+ function destroy() {
567
+ destroyed = true;
568
+ subscribers.clear();
569
+ }
570
+ // Seed an initial snapshot so `snapshot()` is valid pre-load.
571
+ cachedSnapshot = buildSnapshot();
572
+ return {
573
+ load,
574
+ snapshot,
575
+ subscribe,
576
+ setValue,
577
+ next,
578
+ back,
579
+ goToStep,
580
+ submit,
581
+ uploadFile,
582
+ validate,
583
+ reset,
584
+ destroy,
585
+ };
586
+ }
587
+ // Re-export the condition primitives bindings commonly need when they render
588
+ // the tree themselves (e.g. deciding whether to show a condition_block child).
589
+ export { concurrentRevealCount, evalCondition, findMissingRequired, isNodeVisible, seedInitialData, };
590
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/forms-core/controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Small, framework-free helpers the bindings share when rendering elements.
3
+ *
4
+ * Anything here would otherwise be copy-pasted into React, Svelte, Vue, Angular,
5
+ * Solid, Qwik and vanilla — and then drift. The dashboard renderer keeps its own
6
+ * copy of the threshold only because it can't import from the SDK; the values
7
+ * are deliberately identical.
8
+ */
9
+ /**
10
+ * Past this many options a dropdown grows a search affordance on its own.
11
+ * Scrolling a long list to find one entry is the worse default, and an author
12
+ * shouldn't have to notice their list got long. Mirrors `SEARCHABLE_THRESHOLD`
13
+ * in the dashboard builder's `constants.tsx`.
14
+ */
15
+ export declare const SEARCHABLE_THRESHOLD = 10;
16
+ /** Should this dropdown offer search? Either the author asked for it (the
17
+ * ComboBox card sets `display: "combobox"`) or the list is long enough. */
18
+ export declare function shouldSearchOptions(optionCount: number, display?: string): boolean;
19
+ /**
20
+ * Where BIAB serves icon art.
21
+ *
22
+ * The `icon_select` element stores an icon NAME, and rendering it back needs the
23
+ * icon set. The SDK deliberately doesn't bundle one: it's ~1,600 icons, and
24
+ * three of the bindings can't import a React package anyway. Names resolve to
25
+ * `<img src="…/api/icons/<name>.svg">`, so the platform stays the single source
26
+ * of truth for what a name means.
27
+ *
28
+ * Override with `NEXT_PUBLIC_BIAB_ORIGIN` when pointing a consumer app at a
29
+ * non-production BIAB.
30
+ */
31
+ export declare const BIAB_ICON_BASE: string;
32
+ /** SVG URL for one icon name. */
33
+ export declare function iconUrl(name: string): string;
34
+ /** The lazily-fetched icon-name index (only needed when an author hasn't
35
+ * curated `iconConfig.allowedIcons`). */
36
+ export declare const ICON_INDEX_URL: string;
37
+ /** Narrow an icon list by a search query, capped so the grid never mounts
38
+ * thousands of nodes at once. */
39
+ export declare function filterIconNames(names: readonly string[], query: string, limit?: number): string[];
40
+ /** Fetch the icon-name index. Resolves to `[]` on any failure — a missing index
41
+ * leaves the picker's grid empty, which is recoverable; throwing here would
42
+ * take the whole form down. */
43
+ export declare function fetchIconNames(): Promise<string[]>;
44
+ //# sourceMappingURL=elements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../../src/forms-core/elements.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;4EAC4E;AAC5E,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAET;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,EAAE,MAUzB,CAAC;AAEL,iCAAiC;AACjC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;0CAC0C;AAC1C,eAAO,MAAM,cAAc,QAAgC,CAAC;AAE5D;kCACkC;AAClC,wBAAgB,eAAe,CAC9B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,KAAK,SAAM,GACT,MAAM,EAAE,CAMV;AAED;;gCAEgC;AAChC,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CASxD"}