@formhaus/core 0.11.3 → 0.13.0

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 (44) hide show
  1. package/README.md +1 -0
  2. package/dist/{check-definition-B-YU_XN6.d.ts → check-definition-DuLExofm.d.ts} +2 -2
  3. package/dist/chunk-4IHQINIH.js +3 -0
  4. package/dist/chunk-4IHQINIH.js.map +1 -0
  5. package/dist/chunk-5KV7BDCS.js +2 -0
  6. package/dist/chunk-5KV7BDCS.js.map +1 -0
  7. package/dist/chunk-FQ3GLJTI.js +5 -0
  8. package/dist/chunk-FQ3GLJTI.js.map +1 -0
  9. package/dist/chunk-PZEBYRGE.js +2 -0
  10. package/dist/chunk-PZEBYRGE.js.map +1 -0
  11. package/dist/{chunk-HRT3TFHT.js → chunk-UFYD5LVW.js} +3 -3
  12. package/dist/{chunk-HRT3TFHT.js.map → chunk-UFYD5LVW.js.map} +1 -1
  13. package/dist/chunk-Y33LPJXU.js +2 -0
  14. package/dist/chunk-Y33LPJXU.js.map +1 -0
  15. package/dist/cloud.d.ts +3 -3
  16. package/dist/cloud.js +1 -1
  17. package/dist/{controller-DXb698eH.d.ts → controller-Ds_kbXSU.d.ts} +1 -1
  18. package/dist/default-messages-yS4QtrYi.d.ts +23 -0
  19. package/dist/{definition-PdtKhxBh.d.ts → definition-B4OIy_wH.d.ts} +44 -1
  20. package/dist/i18n.d.ts +60 -0
  21. package/dist/i18n.js +2 -0
  22. package/dist/i18n.js.map +1 -0
  23. package/dist/index.d.ts +11 -12
  24. package/dist/index.js +1 -1
  25. package/dist/internal.d.ts +8 -5
  26. package/dist/internal.js +1 -1
  27. package/dist/internal.js.map +1 -1
  28. package/dist/{runtime-Bmzuud3o.d.ts → runtime-BzYG6cit.d.ts} +17 -5
  29. package/dist/server.d.ts +6 -4
  30. package/dist/server.iife.js +4 -4
  31. package/dist/server.iife.js.map +1 -1
  32. package/dist/server.js +1 -1
  33. package/dist/server.js.map +1 -1
  34. package/dist/validate-field-ND_UxoJU.d.ts +7 -0
  35. package/fixtures/submissions/messages.json +155 -0
  36. package/package.json +6 -1
  37. package/schema/form-definition.schema.json +236 -0
  38. package/schema/form-translation.schema.json +222 -0
  39. package/style.css +5 -1
  40. package/dist/chunk-LK2GLVPK.js +0 -3
  41. package/dist/chunk-LK2GLVPK.js.map +0 -1
  42. package/dist/chunk-PNVVU36P.js +0 -5
  43. package/dist/chunk-PNVVU36P.js.map +0 -1
  44. package/dist/validate-field-dZd5yZAp.d.ts +0 -19
@@ -1,7 +1,8 @@
1
- export { j as CloudCallbacks, k as CloudControllerOptions, l as CloudState, m as cloudStateFor, n as createCloudController, o as initialCloudState } from './controller-DXb698eH.js';
2
- import { F as FormEngine } from './runtime-Bmzuud3o.js';
3
- import './definition-PdtKhxBh.js';
4
- import './validate-field-dZd5yZAp.js';
1
+ export { j as CloudCallbacks, k as CloudControllerOptions, l as CloudState, m as cloudStateFor, n as createCloudController, o as initialCloudState } from './controller-Ds_kbXSU.js';
2
+ import { F as FormEngine } from './runtime-BzYG6cit.js';
3
+ import { k as LabelKey, l as LabelSource } from './definition-B4OIy_wH.js';
4
+ import './default-messages-yS4QtrYi.js';
5
+ import './validate-field-ND_UxoJU.js';
5
6
 
6
7
  interface Searchable {
7
8
  querySelector(selector: string): unknown;
@@ -19,7 +20,9 @@ declare function focusProblem(root: Searchable | null, notice?: Focusable | null
19
20
 
20
21
  declare function shouldApplyExternalErrors(engine: FormEngine, previous: Record<string, string> | undefined, next: Record<string, string>): boolean;
21
22
 
23
+ declare function labelFor(key: LabelKey, params: Record<string, unknown>, ...sources: (LabelSource | undefined)[]): string;
24
+
22
25
  declare function autoAdvance(engine: FormEngine): Promise<boolean>;
23
26
  declare function fieldDomId(formId: string | undefined, key: string): string;
24
27
 
25
- export { autoAdvance, fieldDomId, focusProblem, shouldApplyExternalErrors };
28
+ export { autoAdvance, fieldDomId, focusProblem, labelFor, shouldApplyExternalErrors };
package/dist/internal.js CHANGED
@@ -1,2 +1,2 @@
1
- import {f,i,j,g,d,e,a,c,b as b$1}from'./chunk-HRT3TFHT.js';import {C}from'./chunk-LK2GLVPK.js';var G={multiselect:"list",checkbox:"flag",switch:"flag",number:"number",file:"file"};function y(e){return [...e.fields??[],...(e.steps??[]).flatMap(n=>n.fields)]}function h(e){return G[e.type]??"text"}function L(e,n){if(!Array.isArray(e.options))return true;let r=new Set(e.options.map(i=>String(i.value)));return (Array.isArray(n)?n:[n]).every(i=>r.has(String(i)))}function $(e,n,r){if(e&&h(e)!==h(n))return false;switch(h(n)){case "list":return Array.isArray(r);case "flag":return typeof r=="boolean";case "number":return typeof r=="number";case "text":return typeof r=="string";default:return e!==void 0}}function O(e,n,r){let i=new Map(r?y(r).map(o=>[o.key,o]):[]),a={};for(let o of y(n)){let u=e[o.key];u!=null&&$(i.get(o.key),o,u)&&L(o,u)&&(a[o.key]=u);}return a}function P(e,n){let r=new Set(y(e).map(o=>o.key)),i={},a=new Set;for(let[o,u]of Object.entries(n))r.has(o)?i[o]=u:a.add(u);return {fields:i,other:[...a]}}function V(e,n,r,i){let a={};for(let o of y(e)){let u=n[o.key]!==void 0&&n[o.key]!==null&&n[o.key]!=="";u&&!(o.key in r)?a[o.key]=b$1:i[o.key]&&(!u||o.key in r)&&(a[o.key]=i[o.key]);}return a}var b={definition:null,version:null,settings:{},loadError:null,errors:{},notice:null,initialValues:null,revision:0,attempt:0,done:false};function N(e){return e?{...b,definition:e.definition,version:e.version??null,settings:f(e.settings)}:b}function T(e,n=[]){return {tone:"error",message:e.message,action:e.action,details:n}}function z(e$1,n){let r=new AbortController,i$1,a$1=t=>{i$1??(i$1=t.renderToken);let c=i$1===t.renderToken?void 0:i$1;return i({...e$1,version:t.version,renderToken:t.renderToken,firstRenderToken:c})},o=i(e$1),u=e$1.initialForm,m=()=>!r.signal.aborted,s=b,f$1=t=>{s={...s,...t},n.onChange(s);},p=t=>f$1({...t,attempt:s.attempt+1});function w(t){o=a$1(t);let c=e$1.draftStore?.load(e$1.id,t.version)??null;f$1({...N(t),revision:s.revision,attempt:s.attempt,initialValues:c});}async function j$1(t,c$1){let l=s.definition;try{let d$1=await g(e$1,r.signal,t.version);if(!m())return;if(d$1.version===void 0||d$1.version<(t.version??0))throw new d(409,"form_updated");let g$1=l?O(c$1,d$1.definition,l):{};o=a$1(d$1),p({definition:d$1.definition,version:d$1.version,settings:f(d$1.settings),initialValues:g$1,revision:s.revision+1,errors:V(d$1.definition,c$1,g$1,t.errors??{}),notice:{tone:"info",message:a,action:null,details:[]}});}catch{m()&&p({notice:{tone:"error",...c(409,"form_updated"),details:[]}});}}async function q(t,c){let l=t instanceof d?t:e(t);if(l.code==="form_updated"&&l.version!==void 0)return j$1(l,c);if(l.status!==422)return p({notice:T(l)});let d$1=l.errors??{},g=s.definition?P(s.definition,d$1):{fields:d$1,other:[]};p({errors:g.fields,notice:g.other.length>0?T(l,g.other):null});}return {start(){if(s.loadError&&f$1({loadError:null}),u){w(u),u=void 0;return}g(e$1,r.signal).then(t=>{m()&&w(t);},t=>{m()&&(f$1({loadError:t}),n.onError?.(t));});},dispose(){r.abort();},saveDraft(t){s.definition&&!s.done&&e$1.draftStore?.save(e$1.id,s.version??void 0,j(s.definition,t));},again(){f$1({done:false,errors:{},notice:null,initialValues:null,revision:s.revision+1});},async submit(t,c){s.notice&&f$1({notice:null});try{let l=await o(t,c);if(!m())return;e$1.draftStore?.clear(e$1.id),f$1({done:!0}),n.onSuccess?.(l);}catch(l){throw m()&&(await q(l,t),n.onError?.(l)),l}}}}var _='input:not([type="hidden"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';function I(e,n){n.scrollIntoView?.({block:"center"}),e.focus({preventScroll:true});}function B(e,n){if(n)return I(n,n);let r=e?.querySelector('[aria-invalid="true"]');r&&I(r.matches(_)?r:r.querySelector(_)??r,r);}function H(e,n){let r=Object.keys(n);return r.length===Object.keys(e).length&&r.every(i=>e[i]===n[i])}function U(e,n){return Object.entries(n).every(([r,i])=>e.errors[r]===i||e.topLevelErrors.includes(i))}function W(e,n,r){return !n||!H(n,r)||!U(e,r)}function se(e){return C(e,"next","autoAdvance")}var M=e=>e.replace(/[^A-Za-z0-9_-]/g,"-");function le(e,n){return `${e?M(e):"fh"}-${M(n)}`}export{se as autoAdvance,N as cloudStateFor,z as createCloudController,le as fieldDomId,B as focusProblem,b as initialCloudState,W as shouldApplyExternalErrors};//# sourceMappingURL=internal.js.map
1
+ import {f,i,j as j$1,g,d,e,a,c as c$2,b as b$1}from'./chunk-UFYD5LVW.js';import {u}from'./chunk-4IHQINIH.js';import {c as c$1}from'./chunk-PZEBYRGE.js';import {c}from'./chunk-5KV7BDCS.js';var G={multiselect:"list",checkbox:"flag",switch:"flag",number:"number",file:"file"};function b(e){return [...e.fields??[],...(e.steps??[]).flatMap(n=>n.fields)]}function h(e){return G[e.type]??"text"}function K(e,n){if(!Array.isArray(e.options))return true;let r=new Set(e.options.map(i=>String(i.value)));return (Array.isArray(n)?n:[n]).every(i=>r.has(String(i)))}function U(e,n,r){if(e&&h(e)!==h(n))return false;switch(h(n)){case "list":return Array.isArray(r);case "flag":return typeof r=="boolean";case "number":return typeof r=="number";case "text":return typeof r=="string";default:return e!==void 0}}function T(e,n,r){let i=new Map(r?b(r).map(o=>[o.key,o]):[]),a={};for(let o of b(n)){let u=e[o.key];u!=null&&U(i.get(o.key),o,u)&&K(o,u)&&(a[o.key]=u);}return a}function V(e,n){let r=new Set(b(e).map(o=>o.key)),i={},a=new Set;for(let[o,u]of Object.entries(n))r.has(o)?i[o]=u:a.add(u);return {fields:i,other:[...a]}}function L(e,n,r,i){let a={};for(let o of b(e)){let u=n[o.key]!==void 0&&n[o.key]!==null&&n[o.key]!=="";u&&!(o.key in r)?a[o.key]=b$1:i[o.key]&&(!u||o.key in r)&&(a[o.key]=i[o.key]);}return a}var y={definition:null,version:null,settings:{},loadError:null,errors:{},notice:null,initialValues:null,revision:0,attempt:0,done:false};function N(e){return e?{...y,definition:e.definition,version:e.version??null,settings:f(e.settings)}:y}function _(e,n=[]){return {tone:"error",message:e.message,action:e.action,details:n}}function $(e$1,n){let r=new AbortController,i$1,a$1=t=>{i$1??(i$1=t.renderToken);let c=i$1===t.renderToken?void 0:i$1;return i({...e$1,version:t.version,renderToken:t.renderToken,firstRenderToken:c})},o=i(e$1),u=e$1.initialForm,m=()=>!r.signal.aborted,s=y,f$1=t=>{s={...s,...t},n.onChange(s);},p=t=>f$1({...t,attempt:s.attempt+1});function w(t){o=a$1(t);let c=e$1.draftStore?.load(e$1.id,t.version)??null;f$1({...N(t),revision:s.revision,attempt:s.attempt,initialValues:c});}async function q(t,c){let l=s.definition;try{let d$1=await g(e$1,r.signal,t.version);if(!m())return;if(d$1.version===void 0||d$1.version<(t.version??0))throw new d(409,"form_updated");let g$1=l?T(c,d$1.definition,l):{};o=a$1(d$1),p({definition:d$1.definition,version:d$1.version,settings:f(d$1.settings),initialValues:g$1,revision:s.revision+1,errors:L(d$1.definition,c,g$1,t.errors??{}),notice:{tone:"info",message:a,action:null,details:[]}});}catch{m()&&p({notice:{tone:"error",...c$2(409,"form_updated"),details:[]}});}}async function B(t,c){let l=t instanceof d?t:e(t);if(l.code==="form_updated"&&l.version!==void 0)return q(l,c);if(l.status!==422)return p({notice:_(l)});let d$1=l.errors??{},g=s.definition?V(s.definition,d$1):{fields:d$1,other:[]};p({errors:g.fields,notice:g.other.length>0?_(l,g.other):null});}return {start(){if(s.loadError&&f$1({loadError:null}),u){w(u),u=void 0;return}g(e$1,r.signal).then(t=>{m()&&w(t);},t=>{m()&&(f$1({loadError:t}),n.onError?.(t));});},dispose(){r.abort();},saveDraft(t){s.definition&&!s.done&&e$1.draftStore?.save(e$1.id,s.version??void 0,j$1(s.definition,t));},again(){f$1({done:false,errors:{},notice:null,initialValues:null,revision:s.revision+1});},async submit(t,c){s.notice&&f$1({notice:null});try{let l=await o(t,c);if(!m())return;e$1.draftStore?.clear(e$1.id),f$1({done:!0}),n.onSuccess?.(l);}catch(l){throw m()&&(await B(l,t),n.onError?.(l)),l}}}}var I='input:not([type="hidden"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';function M(e,n){n.scrollIntoView?.({block:"center"}),e.focus({preventScroll:true});}function z(e,n){if(n)return M(n,n);let r=e?.querySelector('[aria-invalid="true"]');r&&M(r.matches(I)?r:r.querySelector(I)??r,r);}function H(e,n){let r=Object.keys(n);return r.length===Object.keys(e).length&&r.every(i=>e[i]===n[i])}function W(e,n){return Object.entries(n).every(([r,i])=>e.errors[r]===i||e.topLevelErrors.includes(i))}function Z(e,n,r){return !n||!H(n,r)||!W(e,r)}function J(e,n,...r){return c(c$1,e,n,r)}function fe(e){return u(e,"next","autoAdvance")}var j=e=>e.replace(/[^A-Za-z0-9_-]/g,"-");function me(e,n){return `${e?j(e):"fh"}-${j(n)}`}export{fe as autoAdvance,N as cloudStateFor,$ as createCloudController,me as fieldDomId,z as focusProblem,y as initialCloudState,J as labelFor,Z as shouldApplyExternalErrors};//# sourceMappingURL=internal.js.map
2
2
  //# sourceMappingURL=internal.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cloud/carry.ts","../src/cloud/controller.ts","../src/cloud/focus.ts","../src/engine/external-errors.ts","../src/internal/index.ts"],"names":["SHAPES","fieldsOf","definition","step","shapeOf","field","allowed","value","options","option","item","fits","previous","next","carryValues","values","before","kept","splitErrors","errors","known","fields","other","key","message","updatedErrors","sent","rejected","answered","ANSWER_AGAIN","initialCloudState","cloudStateFor","form","parseSettings","errorNotice","error","details","createCloudController","callbacks","controller","firstRenderToken","submitterFor","first","createSubmitter","submitter","initial","alive","state","update","patch","report","show","draft","refresh","fetchForm","CloudError","FORM_UPDATED_MESSAGE","failureFor","fail","cloud","networkError","split","draftValues","skippedSteps","submission","CONTROLS","reveal","target","scrollTo","focusProblem","root","notice","invalid","sameErrors","keys","holdsErrors","engine","shouldApplyExternalErrors","autoAdvance","changeStep","clean","fieldDomId","formId"],"mappings":"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","file":"internal.js","sourcesContent":["import type { FormDefinition, FormField } from '../types';\nimport { ANSWER_AGAIN } from './failures';\n\nconst SHAPES: Record<string, string> = {\n multiselect: 'list',\n checkbox: 'flag',\n switch: 'flag',\n number: 'number',\n file: 'file',\n};\n\nfunction fieldsOf(definition: FormDefinition): FormField[] {\n return [...(definition.fields ?? []), ...(definition.steps ?? []).flatMap((step) => step.fields)];\n}\n\nfunction shapeOf(field: FormField): string {\n return SHAPES[field.type] ?? 'text';\n}\n\nfunction allowed(field: FormField, value: unknown): boolean {\n if (!Array.isArray(field.options)) return true;\n const options = new Set(field.options.map((option) => String(option.value)));\n return (Array.isArray(value) ? value : [value]).every((item) => options.has(String(item)));\n}\n\nfunction fits(previous: FormField | undefined, next: FormField, value: unknown): boolean {\n if (previous && shapeOf(previous) !== shapeOf(next)) return false;\n switch (shapeOf(next)) {\n case 'list': return Array.isArray(value);\n case 'flag': return typeof value === 'boolean';\n case 'number': return typeof value === 'number';\n case 'text': return typeof value === 'string';\n default: return previous !== undefined;\n }\n}\n\nexport function carryValues(\n values: Record<string, unknown>,\n next: FormDefinition,\n previous?: FormDefinition,\n): Record<string, unknown> {\n const before = new Map(previous ? fieldsOf(previous).map((field) => [field.key, field]) : []);\n const kept: Record<string, unknown> = {};\n for (const field of fieldsOf(next)) {\n const value = values[field.key];\n if (value === undefined || value === null) continue;\n if (fits(before.get(field.key), field, value) && allowed(field, value)) kept[field.key] = value;\n }\n return kept;\n}\n\nexport function splitErrors(definition: FormDefinition, errors: Record<string, string>) {\n const known = new Set(fieldsOf(definition).map((field) => field.key));\n const fields: Record<string, string> = {};\n const other = new Set<string>();\n for (const [key, message] of Object.entries(errors)) {\n if (known.has(key)) fields[key] = message;\n else other.add(message);\n }\n return { fields, other: [...other] };\n}\n\nexport function updatedErrors(\n next: FormDefinition,\n sent: Record<string, unknown>,\n kept: Record<string, unknown>,\n rejected: Record<string, string>,\n): Record<string, string> {\n const errors: Record<string, string> = {};\n for (const field of fieldsOf(next)) {\n const answered = sent[field.key] !== undefined && sent[field.key] !== null && sent[field.key] !== '';\n if (answered && !(field.key in kept)) errors[field.key] = ANSWER_AGAIN;\n else if (rejected[field.key] && (!answered || field.key in kept)) errors[field.key] = rejected[field.key];\n }\n return errors;\n}\n","import type { FormDefinition } from '../types';\nimport { carryValues, splitErrors, updatedErrors } from './carry';\nimport { createSubmitter, fetchForm, type CloudClientOptions, type CloudSubmission } from './client';\nimport { draftValues, type DraftStore } from './draft';\nimport { parseSettings, type CloudSettings, type PublishedForm } from './envelope';\nimport { CloudError, networkError } from './error';\nimport { FORM_UPDATED_MESSAGE, failureFor, type CloudAction } from './failures';\n\nexport interface CloudNotice {\n tone: 'error' | 'info';\n message: string;\n action: CloudAction;\n details: string[];\n}\n\nexport interface CloudState {\n definition: FormDefinition | null;\n version: number | null;\n settings: CloudSettings;\n loadError: Error | null;\n errors: Record<string, string>;\n notice: CloudNotice | null;\n initialValues: Record<string, unknown> | null;\n revision: number;\n attempt: number;\n done: boolean;\n}\n\nexport interface CloudCallbacks {\n onChange(state: CloudState): void;\n onSuccess?(submission: CloudSubmission): void;\n onError?(error: unknown): void;\n}\n\nexport interface CloudControllerOptions extends CloudClientOptions {\n initialForm?: PublishedForm;\n extraBody?: () => Record<string, unknown>;\n draftStore?: DraftStore;\n}\n\nexport const initialCloudState: CloudState = {\n definition: null, version: null, settings: {}, loadError: null, errors: {}, notice: null,\n initialValues: null, revision: 0, attempt: 0, done: false,\n};\n\nexport function cloudStateFor(form?: PublishedForm): CloudState {\n if (!form) return initialCloudState;\n return { ...initialCloudState, definition: form.definition, version: form.version ?? null, settings: parseSettings(form.settings) };\n}\n\nfunction errorNotice(error: CloudError, details: string[] = []): CloudNotice {\n return { tone: 'error', message: error.message, action: error.action, details };\n}\n\nexport function createCloudController(options: CloudControllerOptions, callbacks: CloudCallbacks) {\n const controller = new AbortController();\n let firstRenderToken: string | undefined;\n const submitterFor = (form: PublishedForm) => {\n firstRenderToken ??= form.renderToken;\n const first = firstRenderToken === form.renderToken ? undefined : firstRenderToken;\n return createSubmitter({ ...options, version: form.version, renderToken: form.renderToken, firstRenderToken: first });\n };\n let submitter = createSubmitter(options);\n let initial = options.initialForm;\n const alive = () => !controller.signal.aborted;\n let state = initialCloudState;\n const update = (patch: Partial<CloudState>) => {\n state = { ...state, ...patch };\n callbacks.onChange(state);\n };\n const report = (patch: Partial<CloudState>) => update({ ...patch, attempt: state.attempt + 1 });\n\n function show(form: PublishedForm) {\n submitter = submitterFor(form);\n const draft = options.draftStore?.load(options.id, form.version) ?? null;\n update({ ...cloudStateFor(form), revision: state.revision, attempt: state.attempt, initialValues: draft });\n }\n\n async function refresh(error: CloudError, sent: Record<string, unknown>) {\n const before = state.definition;\n try {\n const next = await fetchForm(options, controller.signal, error.version);\n if (!alive()) return;\n if (next.version === undefined || next.version < (error.version ?? 0)) throw new CloudError(409, 'form_updated');\n const kept = before ? carryValues(sent, next.definition, before) : {};\n submitter = submitterFor(next);\n report({\n definition: next.definition,\n version: next.version,\n settings: parseSettings(next.settings),\n initialValues: kept,\n revision: state.revision + 1,\n errors: updatedErrors(next.definition, sent, kept, error.errors ?? {}),\n notice: { tone: 'info', message: FORM_UPDATED_MESSAGE, action: null, details: [] },\n });\n } catch {\n if (alive()) report({ notice: { tone: 'error', ...failureFor(409, 'form_updated'), details: [] } });\n }\n }\n\n async function fail(error: unknown, values: Record<string, unknown>) {\n const cloud = error instanceof CloudError ? error : networkError(error);\n if (cloud.code === 'form_updated' && cloud.version !== undefined) return refresh(cloud, values);\n if (cloud.status !== 422) return report({ notice: errorNotice(cloud) });\n const errors = cloud.errors ?? {};\n const split = state.definition ? splitErrors(state.definition, errors) : { fields: errors, other: [] };\n report({ errors: split.fields, notice: split.other.length > 0 ? errorNotice(cloud, split.other) : null });\n }\n\n return {\n start() {\n if (state.loadError) update({ loadError: null });\n if (initial) {\n show(initial);\n initial = undefined;\n return;\n }\n fetchForm(options, controller.signal).then(\n (form) => { if (alive()) show(form); },\n (error: Error) => {\n if (!alive()) return;\n update({ loadError: error });\n callbacks.onError?.(error);\n },\n );\n },\n dispose() {\n controller.abort();\n },\n saveDraft(values: Record<string, unknown>) {\n if (state.definition && !state.done) options.draftStore?.save(options.id, state.version ?? undefined, draftValues(state.definition, values));\n },\n again() {\n update({ done: false, errors: {}, notice: null, initialValues: null, revision: state.revision + 1 });\n },\n async submit(values: Record<string, unknown>, skippedSteps?: string[]) {\n if (state.notice) update({ notice: null });\n try {\n const submission = await submitter(values, skippedSteps);\n if (!alive()) return;\n options.draftStore?.clear(options.id);\n update({ done: true });\n callbacks.onSuccess?.(submission);\n } catch (error) {\n if (!alive()) throw error;\n await fail(error, values);\n callbacks.onError?.(error);\n throw error;\n }\n },\n };\n}\n","interface Searchable {\n querySelector(selector: string): unknown;\n}\n\ninterface Focusable extends Searchable {\n focus(options?: { preventScroll?: boolean }): void;\n scrollIntoView?(options?: { block?: 'center' | 'nearest' }): void;\n matches(selector: string): boolean;\n}\n\nconst CONTROLS = 'input:not([type=\"hidden\"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';\n\nfunction reveal(target: Focusable, scrollTo: Focusable): void {\n scrollTo.scrollIntoView?.({ block: 'center' });\n target.focus({ preventScroll: true });\n}\n\nexport function focusProblem(root: Searchable | null, notice?: Focusable | null): void {\n if (notice) return reveal(notice, notice);\n const invalid = root?.querySelector('[aria-invalid=\"true\"]') as Focusable | null | undefined;\n if (invalid) reveal(invalid.matches(CONTROLS) ? invalid : (invalid.querySelector(CONTROLS) as Focusable | null) ?? invalid, invalid);\n}\n","import type { FormEngine } from './runtime';\n\nfunction sameErrors(previous: Record<string, string>, next: Record<string, string>): boolean {\n const keys = Object.keys(next);\n return keys.length === Object.keys(previous).length && keys.every((key) => previous[key] === next[key]);\n}\n\nfunction holdsErrors(engine: FormEngine, errors: Record<string, string>): boolean {\n return Object.entries(errors).every(([key, message]) => (\n engine.errors[key] === message || engine.topLevelErrors.includes(message)\n ));\n}\n\nexport function shouldApplyExternalErrors(\n engine: FormEngine,\n previous: Record<string, string> | undefined,\n next: Record<string, string>,\n): boolean {\n return !previous || !sameErrors(previous, next) || !holdsErrors(engine, next);\n}\n","export { cloudStateFor, createCloudController, initialCloudState, type CloudCallbacks, type CloudControllerOptions, type CloudState } from '../cloud/controller';\nexport { focusProblem } from '../cloud/focus';\nexport { shouldApplyExternalErrors } from '../engine/external-errors';\nimport type { FormEngine } from '../engine';\nimport { changeStep } from '../engine/navigation';\nimport type { EngineInternals } from '../engine/runtime-internals';\n\nexport function autoAdvance(engine: FormEngine): Promise<boolean> {\n return changeStep(engine as unknown as EngineInternals, 'next', 'autoAdvance');\n}\n\nconst clean = (value: string) => value.replace(/[^A-Za-z0-9_-]/g, '-');\n\nexport function fieldDomId(formId: string | undefined, key: string): string {\n return `${formId ? clean(formId) : 'fh'}-${clean(key)}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/cloud/carry.ts","../src/cloud/controller.ts","../src/cloud/focus.ts","../src/engine/external-errors.ts","../src/i18n/labels.ts","../src/internal/index.ts"],"names":["SHAPES","fieldsOf","definition","step","shapeOf","field","allowed","value","options","option","item","fits","previous","next","carryValues","values","before","kept","splitErrors","errors","known","fields","other","key","message","updatedErrors","sent","rejected","answered","ANSWER_AGAIN","initialCloudState","cloudStateFor","form","parseSettings","errorNotice","error","details","createCloudController","callbacks","controller","firstRenderToken","submitterFor","first","createSubmitter","submitter","initial","alive","state","update","patch","report","show","draft","refresh","fetchForm","CloudError","FORM_UPDATED_MESSAGE","failureFor","fail","cloud","networkError","split","draftValues","skippedSteps","submission","CONTROLS","reveal","target","scrollTo","focusProblem","root","notice","invalid","sameErrors","keys","holdsErrors","engine","shouldApplyExternalErrors","labelFor","params","sources","resolveText","DEFAULT_LABELS","autoAdvance","changeStep","clean","fieldDomId","formId"],"mappings":"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","file":"internal.js","sourcesContent":["import type { FormDefinition, FormField } from '../types';\nimport { ANSWER_AGAIN } from './failures';\n\nconst SHAPES: Record<string, string> = {\n multiselect: 'list',\n checkbox: 'flag',\n switch: 'flag',\n number: 'number',\n file: 'file',\n};\n\nfunction fieldsOf(definition: FormDefinition): FormField[] {\n return [...(definition.fields ?? []), ...(definition.steps ?? []).flatMap((step) => step.fields)];\n}\n\nfunction shapeOf(field: FormField): string {\n return SHAPES[field.type] ?? 'text';\n}\n\nfunction allowed(field: FormField, value: unknown): boolean {\n if (!Array.isArray(field.options)) return true;\n const options = new Set(field.options.map((option) => String(option.value)));\n return (Array.isArray(value) ? value : [value]).every((item) => options.has(String(item)));\n}\n\nfunction fits(previous: FormField | undefined, next: FormField, value: unknown): boolean {\n if (previous && shapeOf(previous) !== shapeOf(next)) return false;\n switch (shapeOf(next)) {\n case 'list': return Array.isArray(value);\n case 'flag': return typeof value === 'boolean';\n case 'number': return typeof value === 'number';\n case 'text': return typeof value === 'string';\n default: return previous !== undefined;\n }\n}\n\nexport function carryValues(\n values: Record<string, unknown>,\n next: FormDefinition,\n previous?: FormDefinition,\n): Record<string, unknown> {\n const before = new Map(previous ? fieldsOf(previous).map((field) => [field.key, field]) : []);\n const kept: Record<string, unknown> = {};\n for (const field of fieldsOf(next)) {\n const value = values[field.key];\n if (value === undefined || value === null) continue;\n if (fits(before.get(field.key), field, value) && allowed(field, value)) kept[field.key] = value;\n }\n return kept;\n}\n\nexport function splitErrors(definition: FormDefinition, errors: Record<string, string>) {\n const known = new Set(fieldsOf(definition).map((field) => field.key));\n const fields: Record<string, string> = {};\n const other = new Set<string>();\n for (const [key, message] of Object.entries(errors)) {\n if (known.has(key)) fields[key] = message;\n else other.add(message);\n }\n return { fields, other: [...other] };\n}\n\nexport function updatedErrors(\n next: FormDefinition,\n sent: Record<string, unknown>,\n kept: Record<string, unknown>,\n rejected: Record<string, string>,\n): Record<string, string> {\n const errors: Record<string, string> = {};\n for (const field of fieldsOf(next)) {\n const answered = sent[field.key] !== undefined && sent[field.key] !== null && sent[field.key] !== '';\n if (answered && !(field.key in kept)) errors[field.key] = ANSWER_AGAIN;\n else if (rejected[field.key] && (!answered || field.key in kept)) errors[field.key] = rejected[field.key];\n }\n return errors;\n}\n","import type { FormDefinition } from '../types';\nimport { carryValues, splitErrors, updatedErrors } from './carry';\nimport { createSubmitter, fetchForm, type CloudClientOptions, type CloudSubmission } from './client';\nimport { draftValues, type DraftStore } from './draft';\nimport { parseSettings, type CloudSettings, type PublishedForm } from './envelope';\nimport { CloudError, networkError } from './error';\nimport { FORM_UPDATED_MESSAGE, failureFor, type CloudAction } from './failures';\n\nexport interface CloudNotice {\n tone: 'error' | 'info';\n message: string;\n action: CloudAction;\n details: string[];\n}\n\nexport interface CloudState {\n definition: FormDefinition | null;\n version: number | null;\n settings: CloudSettings;\n loadError: Error | null;\n errors: Record<string, string>;\n notice: CloudNotice | null;\n initialValues: Record<string, unknown> | null;\n revision: number;\n attempt: number;\n done: boolean;\n}\n\nexport interface CloudCallbacks {\n onChange(state: CloudState): void;\n onSuccess?(submission: CloudSubmission): void;\n onError?(error: unknown): void;\n}\n\nexport interface CloudControllerOptions extends CloudClientOptions {\n initialForm?: PublishedForm;\n extraBody?: () => Record<string, unknown>;\n draftStore?: DraftStore;\n}\n\nexport const initialCloudState: CloudState = {\n definition: null, version: null, settings: {}, loadError: null, errors: {}, notice: null,\n initialValues: null, revision: 0, attempt: 0, done: false,\n};\n\nexport function cloudStateFor(form?: PublishedForm): CloudState {\n if (!form) return initialCloudState;\n return { ...initialCloudState, definition: form.definition, version: form.version ?? null, settings: parseSettings(form.settings) };\n}\n\nfunction errorNotice(error: CloudError, details: string[] = []): CloudNotice {\n return { tone: 'error', message: error.message, action: error.action, details };\n}\n\nexport function createCloudController(options: CloudControllerOptions, callbacks: CloudCallbacks) {\n const controller = new AbortController();\n let firstRenderToken: string | undefined;\n const submitterFor = (form: PublishedForm) => {\n firstRenderToken ??= form.renderToken;\n const first = firstRenderToken === form.renderToken ? undefined : firstRenderToken;\n return createSubmitter({ ...options, version: form.version, renderToken: form.renderToken, firstRenderToken: first });\n };\n let submitter = createSubmitter(options);\n let initial = options.initialForm;\n const alive = () => !controller.signal.aborted;\n let state = initialCloudState;\n const update = (patch: Partial<CloudState>) => {\n state = { ...state, ...patch };\n callbacks.onChange(state);\n };\n const report = (patch: Partial<CloudState>) => update({ ...patch, attempt: state.attempt + 1 });\n\n function show(form: PublishedForm) {\n submitter = submitterFor(form);\n const draft = options.draftStore?.load(options.id, form.version) ?? null;\n update({ ...cloudStateFor(form), revision: state.revision, attempt: state.attempt, initialValues: draft });\n }\n\n async function refresh(error: CloudError, sent: Record<string, unknown>) {\n const before = state.definition;\n try {\n const next = await fetchForm(options, controller.signal, error.version);\n if (!alive()) return;\n if (next.version === undefined || next.version < (error.version ?? 0)) throw new CloudError(409, 'form_updated');\n const kept = before ? carryValues(sent, next.definition, before) : {};\n submitter = submitterFor(next);\n report({\n definition: next.definition,\n version: next.version,\n settings: parseSettings(next.settings),\n initialValues: kept,\n revision: state.revision + 1,\n errors: updatedErrors(next.definition, sent, kept, error.errors ?? {}),\n notice: { tone: 'info', message: FORM_UPDATED_MESSAGE, action: null, details: [] },\n });\n } catch {\n if (alive()) report({ notice: { tone: 'error', ...failureFor(409, 'form_updated'), details: [] } });\n }\n }\n\n async function fail(error: unknown, values: Record<string, unknown>) {\n const cloud = error instanceof CloudError ? error : networkError(error);\n if (cloud.code === 'form_updated' && cloud.version !== undefined) return refresh(cloud, values);\n if (cloud.status !== 422) return report({ notice: errorNotice(cloud) });\n const errors = cloud.errors ?? {};\n const split = state.definition ? splitErrors(state.definition, errors) : { fields: errors, other: [] };\n report({ errors: split.fields, notice: split.other.length > 0 ? errorNotice(cloud, split.other) : null });\n }\n\n return {\n start() {\n if (state.loadError) update({ loadError: null });\n if (initial) {\n show(initial);\n initial = undefined;\n return;\n }\n fetchForm(options, controller.signal).then(\n (form) => { if (alive()) show(form); },\n (error: Error) => {\n if (!alive()) return;\n update({ loadError: error });\n callbacks.onError?.(error);\n },\n );\n },\n dispose() {\n controller.abort();\n },\n saveDraft(values: Record<string, unknown>) {\n if (state.definition && !state.done) options.draftStore?.save(options.id, state.version ?? undefined, draftValues(state.definition, values));\n },\n again() {\n update({ done: false, errors: {}, notice: null, initialValues: null, revision: state.revision + 1 });\n },\n async submit(values: Record<string, unknown>, skippedSteps?: string[]) {\n if (state.notice) update({ notice: null });\n try {\n const submission = await submitter(values, skippedSteps);\n if (!alive()) return;\n options.draftStore?.clear(options.id);\n update({ done: true });\n callbacks.onSuccess?.(submission);\n } catch (error) {\n if (!alive()) throw error;\n await fail(error, values);\n callbacks.onError?.(error);\n throw error;\n }\n },\n };\n}\n","interface Searchable {\n querySelector(selector: string): unknown;\n}\n\ninterface Focusable extends Searchable {\n focus(options?: { preventScroll?: boolean }): void;\n scrollIntoView?(options?: { block?: 'center' | 'nearest' }): void;\n matches(selector: string): boolean;\n}\n\nconst CONTROLS = 'input:not([type=\"hidden\"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';\n\nfunction reveal(target: Focusable, scrollTo: Focusable): void {\n scrollTo.scrollIntoView?.({ block: 'center' });\n target.focus({ preventScroll: true });\n}\n\nexport function focusProblem(root: Searchable | null, notice?: Focusable | null): void {\n if (notice) return reveal(notice, notice);\n const invalid = root?.querySelector('[aria-invalid=\"true\"]') as Focusable | null | undefined;\n if (invalid) reveal(invalid.matches(CONTROLS) ? invalid : (invalid.querySelector(CONTROLS) as Focusable | null) ?? invalid, invalid);\n}\n","import type { FormEngine } from './runtime';\n\nfunction sameErrors(previous: Record<string, string>, next: Record<string, string>): boolean {\n const keys = Object.keys(next);\n return keys.length === Object.keys(previous).length && keys.every((key) => previous[key] === next[key]);\n}\n\nfunction holdsErrors(engine: FormEngine, errors: Record<string, string>): boolean {\n return Object.entries(errors).every(([key, message]) => (\n engine.errors[key] === message || engine.topLevelErrors.includes(message)\n ));\n}\n\nexport function shouldApplyExternalErrors(\n engine: FormEngine,\n previous: Record<string, string> | undefined,\n next: Record<string, string>,\n): boolean {\n return !previous || !sameErrors(previous, next) || !holdsErrors(engine, next);\n}\n","import type { LabelKey, LabelSource } from '../types';\nimport { resolveText } from '../validation/default-messages';\nimport { DEFAULT_LABELS } from './nodes';\n\nexport function labelFor(key: LabelKey, params: Record<string, unknown>, ...sources: (LabelSource | undefined)[]): string {\n return resolveText(DEFAULT_LABELS, key, params, sources);\n}\n","export { cloudStateFor, createCloudController, initialCloudState, type CloudCallbacks, type CloudControllerOptions, type CloudState } from '../cloud/controller';\nexport { focusProblem } from '../cloud/focus';\nexport { shouldApplyExternalErrors } from '../engine/external-errors';\nexport { labelFor } from '../i18n/labels';\nimport type { FormEngine } from '../engine';\nimport { changeStep } from '../engine/navigation';\nimport type { EngineInternals } from '../engine/runtime-internals';\n\nexport function autoAdvance(engine: FormEngine): Promise<boolean> {\n return changeStep(engine as unknown as EngineInternals, 'next', 'autoAdvance');\n}\n\nconst clean = (value: string) => value.replace(/[^A-Za-z0-9_-]/g, '-');\n\nexport function fieldDomId(formId: string | undefined, key: string): string {\n return `${formId ? clean(formId) : 'fh'}-${clean(key)}`;\n}\n"]}
@@ -1,5 +1,6 @@
1
- import { f as FormDefinition, a as FormStep, F as FormField } from './definition-PdtKhxBh.js';
2
- import { V as ValidatorFn, D as DefinitionIssue } from './validate-field-dZd5yZAp.js';
1
+ import { g as FormDefinition, a as FormStep, F as FormField } from './definition-B4OIy_wH.js';
2
+ import { M as MessageSource, D as DefinitionIssue } from './default-messages-yS4QtrYi.js';
3
+ import { V as ValidatorFn } from './validate-field-ND_UxoJU.js';
3
4
 
4
5
  type StepValidateFn = (stepId: string, values: Record<string, unknown>) => Promise<Record<string, string> | null | void>;
5
6
  interface StepChangeContext {
@@ -12,12 +13,21 @@ type BeforeStepChangeFn = (context: StepChangeContext) => boolean | void | Promi
12
13
  type AfterStepChangeFn = (context: StepChangeContext) => void | Promise<void>;
13
14
  type BeforeSubmitFn = (values: Record<string, unknown>) => boolean | void | Promise<boolean | void>;
14
15
  type SubmitFn = (values: Record<string, unknown>, skippedSteps: string[]) => void | Promise<void>;
16
+ type SubmitResult = {
17
+ ok: true;
18
+ } | {
19
+ ok: false;
20
+ errors?: Record<string, string>;
21
+ formErrors?: string[];
22
+ };
23
+ type SubmitHandler = (values: Record<string, unknown>, skippedSteps: string[]) => void | SubmitResult | Promise<void | SubmitResult>;
15
24
  interface FormEngineOptions {
16
25
  onBeforeStepChange?: BeforeStepChangeFn;
17
26
  onAfterStepChange?: AfterStepChangeFn;
18
27
  onBeforeSubmit?: BeforeSubmitFn;
19
28
  onAfterSubmit?: SubmitFn;
20
29
  validators?: Record<string, ValidatorFn>;
30
+ messages?: MessageSource;
21
31
  onStepValidate?: StepValidateFn;
22
32
  onWarning?: (issue: DefinitionIssue) => void;
23
33
  }
@@ -30,6 +40,7 @@ declare class FormEngine<TValues extends object = Record<string, unknown>> {
30
40
  private operationEpoch;
31
41
  private readonly lifecycle;
32
42
  private readonly validators;
43
+ private readonly messages;
33
44
  private get onStepValidate();
34
45
  private readonly visibility;
35
46
  private readonly subscriptions;
@@ -48,6 +59,7 @@ declare class FormEngine<TValues extends object = Record<string, unknown>> {
48
59
  get isFirstStep(): boolean;
49
60
  get isLastStep(): boolean;
50
61
  get canGoNext(): boolean;
62
+ get stepErrors(): Record<string, string[]>;
51
63
  get progress(): {
52
64
  current: number;
53
65
  total: number;
@@ -64,8 +76,8 @@ declare class FormEngine<TValues extends object = Record<string, unknown>> {
64
76
  cancelPendingActions(): void;
65
77
  next(): Promise<boolean>;
66
78
  back(): Promise<boolean>;
67
- skip(submit?: SubmitFn): Promise<boolean>;
68
- submit(handler: SubmitFn): Promise<boolean>;
79
+ skip(submit?: SubmitHandler): Promise<boolean>;
80
+ submit(handler: SubmitHandler): Promise<boolean>;
69
81
  isStepSkipped(stepId: string): boolean;
70
82
  validate(): Record<string, string>;
71
83
  validateField(key: string): string | null;
@@ -77,4 +89,4 @@ declare class FormEngine<TValues extends object = Record<string, unknown>> {
77
89
  private notify;
78
90
  }
79
91
 
80
- export { type AfterStepChangeFn as A, type BeforeStepChangeFn as B, FormEngine as F, type StepChangeContext as S, type BeforeSubmitFn as a, type FormEngineOptions as b, type StepValidateFn as c, type SubmitFn as d };
92
+ export { type AfterStepChangeFn as A, type BeforeStepChangeFn as B, FormEngine as F, type StepChangeContext as S, type BeforeSubmitFn as a, type FormEngineOptions as b, type StepValidateFn as c, type SubmitFn as d, type SubmitHandler as e, type SubmitResult as f };
package/dist/server.d.ts CHANGED
@@ -1,11 +1,13 @@
1
- export { C as CheckDefinitionOptions, c as checkDefinition, p as parseDefinition } from './check-definition-B-YU_XN6.js';
2
- import { V as ValidatorFn } from './validate-field-dZd5yZAp.js';
3
- export { D as DefinitionIssue, a as DefinitionIssueCode, F as FormDefinitionError } from './validate-field-dZd5yZAp.js';
4
- import { f as FormDefinition } from './definition-PdtKhxBh.js';
1
+ export { C as CheckDefinitionOptions, c as checkDefinition, p as parseDefinition } from './check-definition-DuLExofm.js';
2
+ import { M as MessageSource } from './default-messages-yS4QtrYi.js';
3
+ export { D as DefinitionIssue, a as DefinitionIssueCode, F as FormDefinitionError } from './default-messages-yS4QtrYi.js';
4
+ import { g as FormDefinition } from './definition-B4OIy_wH.js';
5
+ import { V as ValidatorFn } from './validate-field-ND_UxoJU.js';
5
6
 
6
7
  interface SubmissionOptions {
7
8
  skippedSteps?: string[];
8
9
  validators?: Record<string, ValidatorFn>;
10
+ messages?: MessageSource;
9
11
  }
10
12
  interface SubmissionResult {
11
13
  values: Record<string, unknown>;
@@ -1,6 +1,6 @@
1
1
  var Formhaus=(function(exports){'use strict';typeof console==="undefined"&&(globalThis.console={log:function(){},warn:function(){},error:function(){}});
2
- var De=Object.defineProperty,Re=Object.defineProperties;var Ve=Object.getOwnPropertyDescriptors;var Nt=Object.getOwnPropertySymbols;var Oe=Object.prototype.hasOwnProperty,Me=Object.prototype.propertyIsEnumerable;var Pt=(t,e,n)=>e in t?De(t,e,{enumerable:true,configurable:true,writable:true,value:n}):t[e]=n,h=(t,e)=>{for(var n in e||(e={}))Oe.call(e,n)&&Pt(t,n,e[n]);if(Nt)for(var n of Nt(e))Me.call(e,n)&&Pt(t,n,e[n]);return t},kt=(t,e)=>Re(t,Ve(e));var _t=["eq","neq","in","notIn","notEmpty","gt","gte","lt","lte"];function Y(t){return t==null||t===""||Array.isArray(t)&&!t.length}function Ae(t){let e=typeof t=="string"&&t.trim()!==""?Number(t):t;return typeof e=="number"&&Number.isFinite(e)?e:void 0}function et(t,e,n){let r=Ae(t);return r!==void 0&&n(r,e)}function St(t,e){let n=e[t.field];return t.eq!==void 0?n===t.eq:t.neq!==void 0?n!==t.neq:t.in!==void 0?t.in.includes(n):t.notIn!==void 0?!t.notIn.includes(n):t.notEmpty!==void 0?!t.notEmpty||!Y(n):t.gt!==void 0?et(n,t.gt,(r,i)=>r>i):t.gte!==void 0?et(n,t.gte,(r,i)=>r>=i):t.lt!==void 0?et(n,t.lt,(r,i)=>r<i):t.lte!==void 0?et(n,t.lte,(r,i)=>r<=i):false}var $=class extends Error{constructor(e){super(`Invalid form definition:
3
- ${e.map(n=>n.message).join(`
4
- `)}`),this.name="FormDefinitionError",this.issues=e;}};function qt(t){return (e,n,r,i)=>h({code:e,severity:t,path:n,message:`${n||"/"}: ${r}.${i?` ${i}.`:""}`},i&&{hint:`${i}.`})}var m=qt("error"),E=qt("warning");function nt(t){return t.replace(/~/g,"~0").replace(/\//g,"~1")}function Kt(t){return t.severity==="error"}function P(t){if(t.length===1)return `Use ${JSON.stringify(t[0])}`;let e=t.slice(0,10).map(n=>JSON.stringify(n)).join(", ");return t.length>10?`Use one of: ${e}, ...`:`Use one of: ${e}`}function Le(t,e){let n=Array.from({length:e.length+1},(r,i)=>i);for(let r=1;r<=t.length;r++){let i=[r];for(let o=1;o<=e.length;o++)i[o]=Math.min(n[o]+1,i[o-1]+1,n[o-1]+(t[r-1]===e[o-1]?0:1));n=i;}return n[e.length]}function vt(t,e){let n=t.toLowerCase();return e.find(r=>r!==t&&Le(n,r.toLowerCase())<=(r.length>4?2:1))}function W(t,e){let n=vt(t,e);return n!==void 0?`Use ${JSON.stringify(n)}`:e.length?P(e):void 0}var H=_t;function Te({suggest:t},e,n){let r=Object.keys(e).filter(a=>a!=="field"),i=r.filter(a=>!H.includes(a)),o=i.map(a=>m("unknown-operator",`${n}/${nt(a)}`,`"${a}" is not a condition operator`,t(a,[...H]))),s=r.length-i.length;if(s!==1&&!(s===0&&i.length)){let a=s?`the condition has ${s} operators`:"the condition has no operator";o.push(m("condition-operator-count",n,a,`Use exactly one of: ${H.join(", ")}`));}return o}function je(t,{condition:e,path:n,owner:r,step:i,key:o}){let s=t.keys.get(e.field);if(!s){let c=t.keyList.filter(l=>l!==o);return [m("unknown-field",`${n}/field`,`"${e.field}" is not a field key`,t.suggest(e.field,c))]}if(i<0||r==="action")return [];let a=r==="step"?"this or a later step":"a later step";if(s.step<i||r!=="step"&&s.step===i)return [];let u=r==="step"?"earlier steps":"this or an earlier step";return [m("forward-reference",`${n}/field`,`"${e.field}" belongs to ${a}`,`${r==="route"?"Route":r==="step"?"Step":"Field"} conditions can use fields of ${u}`)]}function wt(t,e){let{condition:n,path:r}=e;return typeof n.field!="string"?[m("missing-property",`${r}/field`,'the condition has no "field"',"Add the key of the field to test")]:[...Te(t,n,r),...je(t,e)]}function Ut(t){return t.conditions.flatMap(e=>wt(t,e))}function xt(t,e,n,r,i,o){var s;for(let a of ["show","showAny"])((s=e[a])!=null?s:[]).forEach((u,c)=>t.push({condition:u,path:`${n}/${a}/${c}`,owner:r,step:i,key:o}));}function Et(t,e,n,r){var i;(e?(i=e.disabled)!=null?i:[]:[]).forEach((o,s)=>t.push({condition:o,path:`${n}/disabled/${s}`,owner:"action",step:r}));}function Bt(t,e,n=()=>{}){var a,u;let r=(a=t.steps)!=null?a:[],i=r.length?r.flatMap((c,l)=>c.fields.map((f,d)=>({field:f,path:`/steps/${l}/fields/${d}`,step:l}))):((u=t.fields)!=null?u:[]).map((c,l)=>({field:c,path:`/fields/${l}`,step:-1})),o=new Map;for(let c of i)o.has(c.field.key)||o.set(c.field.key,c);let s=[];for(let c of i)xt(s,c.field,c.path,"field",c.step,c.field.key);return r.forEach((c,l)=>{var f;xt(s,c,`/steps/${l}`,"step",l),((f=c.routes)!=null?f:[]).forEach((d,g)=>xt(s,d,`/steps/${l}/routes/${g}`,"route",l));for(let d of ["next","back","skip"])Et(s,c[d],`/steps/${l}/${d}`,l);}),Et(s,t.submit,"/submit",-1),Et(s,t.cancel,"/cancel",-1),{definition:t,entries:i,keys:o,keyList:[...o.keys()],conditions:s,validators:e,suggest:n}}function Gt(t,e,n,r){let i=t[n],o=t[r];return i===void 0||o===void 0||i<=o?[]:[m("invalid-range",`${e}/validation/${n}`,`${n} (${i}) is greater than ${r} (${o})`,`Lower ${n} or raise ${r}`)]}function Ne(t,e){if(t===void 0)return [];try{return new RegExp(t),[]}catch(n){return [m("invalid-pattern",`${e}/validation/pattern`,`${JSON.stringify(t)} is not a valid regular expression`,"Fix the pattern or escape special characters with a backslash")]}}function Pe(t,{field:e,path:n}){let r=e.validation;if(!r)return [];let i=r.matchField;return [...Gt(r,n,"minLength","maxLength"),...Gt(r,n,"min","max"),...Ne(r.pattern,n),...i===void 0||t.keys.has(i)?[]:[m("unknown-field",`${n}/validation/matchField`,`"${i}" is not a field key`,t.suggest(i,t.keyList))]]}function Yt(t){return t.entries.flatMap(e=>Pe(t,e))}function _e({definition:t,entries:e,keys:n}){var s;let r=new Map,i=(a,u)=>{var l;let c=u.filter(f=>n.has(f));if(c.length)for(let f of a)r.set(f,[...(l=r.get(f))!=null?l:[],...c]);},o=a=>{var u,c;return [...(u=a.show)!=null?u:[],...(c=a.showAny)!=null?c:[]].map(l=>l.field)};for(let{field:a}of e)i([a.key],o(a));for(let a of (s=t.steps)!=null?s:[])i(a.fields.map(u=>u.key),o(a));return r}function qe(t){var r;let e=new Map,n=[];for(let i of t.keys()){if(e.has(i))continue;e.set(i,true);let o=[[i,0]];for(;o.length>0;){let s=o[o.length-1],a=(r=t.get(s[0]))==null?void 0:r[s[1]++];if(a===void 0)e.set(s[0],false),o.pop();else if(e.get(a)){let u=o.map(([c])=>c);n.push([...u.slice(u.indexOf(a)),a]);}else e.has(a)||(e.set(a,true),o.push([a,0]));}}return n}function Ke(t){return qe(_e(t)).map(e=>m("condition-cycle",t.keys.get(e[0]).path,`show conditions form a cycle: ${e.join(" -> ")}`,"Remove one of the conditions in the cycle"))}function Wt(t){return Ke(t)}var Ht="1.0";function Jt({formatVersion:t}){if(t===void 0)return [];let e=typeof t=="string"&&/^[1-9]\d*(\.\d+)?$/.test(t);return e&&parseInt(t)<=parseInt(Ht)?[]:[e?m("unsupported-format-version","/formatVersion",`format ${t} is not supported`,"Upgrade @formhaus/core"):m("invalid-type","/formatVersion","must be a version string",`Use "${Ht}"`)]}var z=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),Ue={string:[t=>typeof t=="string","a string"],number:[t=>typeof t=="number"&&Number.isFinite(t),"a number"],boolean:[t=>typeof t=="boolean","true or false"],requirement:[t=>["boolean","string"].includes(typeof t),"true, false or a message string"],scalar:[t=>["string","number","boolean"].includes(typeof t),"a string, number or boolean"],list:[t=>Array.isArray(t)&&t.every(e=>["string","number"].includes(typeof e)),"an array of strings or numbers"]};function _(t,e,n){return Object.entries(e).flatMap(([r,i])=>{let[o,s]=Ue[i];return t[r]===void 0||o(t[r])?[]:[m("invalid-type",`${n}/${nt(r)}`,`"${r}" must be ${s}`)]})}function D(t,e,n,r,i=false){return t==null&&!i?[]:Array.isArray(t)?t.flatMap((o,s)=>z(o)?r(o,`${e}/${s}`):[m("invalid-type",`${e}/${s}`,`must be ${n}`)]):[m("invalid-type",e,"must be an array",i?"Use [] when there is nothing to list":void 0)]}function J(t,e,n){return typeof t[e]=="string"?[]:[m("missing-property",`${n}/${e}`,`"${e}" must be a string`)]}var It=(t,e)=>_(t,{field:"string",eq:"scalar",neq:"scalar",in:"list",notIn:"list",notEmpty:"boolean",gt:"number",gte:"number",lt:"number",lte:"number"},e);function $t(t,e){return [...D(t.show,`${e}/show`,"a condition object",It),...D(t.showAny,`${e}/showAny`,"a condition object",It)]}function Ct(t,e){return z(t)?[..._(t,{label:"string"},e),...D(t.disabled,`${e}/disabled`,"a condition object",It)]:[]}var Be=(t,e)=>[...J(t,"value",e),..._(t,{label:"string"},e)],Ge={required:"requirement",minLength:"number",maxLength:"number",min:"number",max:"number",pattern:"string",matchField:"string",validator:"string",minLengthMessage:"string",maxLengthMessage:"string",minMessage:"string",maxMessage:"string",patternMessage:"string",matchFieldMessage:"string"};function Ye(t,e){return t===void 0?[]:z(t)?_(t,Ge,e):[m("invalid-type",e,"must be an object of validation rules")]}function We(t,e){return t===void 0||Array.isArray(t)&&t.every(r=>typeof r=="string")?[]:[m("invalid-type",e,"must be an array of field keys")]}var zt=(t,e)=>[...J(t,"key",e),...J(t,"type",e),..._(t,{label:"string",placeholder:"string",helperText:"string"},e),...$t(t,e),...D(t.options,`${e}/options`,"an option object",Be),...Ye(t.validation,`${e}/validation`),...We(t.optionsDependsOn,`${e}/optionsDependsOn`)],He=(t,e)=>[...t.to===null||typeof t.to=="string"?[]:[m("missing-property",`${e}/to`,'"to" must be a step id or null')],...$t(t,e)],Je=(t,e)=>[...J(t,"id",e),..._(t,{title:"string",description:"string"},e),...D(t.fields,`${e}/fields`,"a field object",zt,true),...$t(t,e),...D(t.routes,`${e}/routes`,"a route object",He),...["next","back","skip"].flatMap(n=>Ct(t[n],`${e}/${n}`))];function Xt(t){if(!z(t))return [m("invalid-type","","the form definition must be an object")];let e=Jt(t);return e.length?e:[...D(t.fields,"/fields","a field object",zt),...D(t.steps,"/steps","a step object",Je),...Ct(t.submit,"/submit"),...Ct(t.cancel,"/cancel")]}function Zt(t){return [...J(t,"id",""),...z(t.submit)?[]:[m("missing-property","/submit","the submit action is missing",'Add "submit": { "label": "Submit" }')]]}var rt=t=>{var e,n;return !!((e=t.show)!=null&&e.length||(n=t.showAny)!=null&&n.length)};function Qt(t,e,n){var i;let r=[];for(let o of (i=t[n].routes)!=null?i:[]){let s=o.to===null?null:e.get(o.to);if(s===null&&!rt(o))return r;if(!(s==null||s<=n)&&(r.push(s),!rt(o)&&!rt(t[s])))return r}return n+1<t.length?[...r,n+1]:r}function te(t){let e=new Map(t.map((n,r)=>[n.id,r]));return t.map((n,r)=>{let i=new Set,o=Qt(t,e,r);for(;o.length;){let s=o.pop();i.has(s)||(i.add(s),o.push(...Qt(t,e,s)),rt(t[s])&&s+1<t.length&&o.push(s+1));}return i})}var ze=new Set([...Object.getOwnPropertyNames(Object.prototype),"prototype"]);function Xe({definition:t}){var i;let e=[],n=(i=t.steps)!=null?i:[],r=new Map;return n.forEach((o,s)=>{let a=r.get(o.id);a===void 0?r.set(o.id,s):e.push(m("duplicate-step-id",`/steps/${s}/id`,`step id "${o.id}" is already used by /steps/${a}`,"Give each step a unique id"));}),n.forEach((o,s)=>{var a;return ((a=o.routes)!=null?a:[]).forEach((u,c)=>{if(u.to===null)return;let l=r.get(u.to);if(l!==void 0&&l>s)return;let f=n.slice(s+1).map(b=>b.id),d=l===void 0?`"${u.to}" is not a step id`:`"${u.to}" is not a later step`,g=f.length?`${P(f)}, or null to end the form here`:"Use null to end the form here";e.push(m("route-target",`/steps/${s}/routes/${c}/to`,d,g));})}),e}function Ze({definition:t,entries:e}){var o;let n=[],r=te((o=t.steps)!=null?o:[]),i=(s,a)=>{var u;return s.step!==a.step&&!((u=r[s.step])!=null&&u.has(a.step))};return e.forEach((s,a)=>{let{field:u,path:c}=s,l=e.slice(0,a).find(f=>f.field.key===u.key&&!i(f,s));ze.has(u.key)?n.push(m("reserved-key",`${c}/key`,`"${u.key}" is a built-in object property name`,"Rename the field key")):l&&n.push(m("duplicate-key",`${c}/key`,`key "${u.key}" is already used by ${l.path} on the same path`,"Rename one of the fields, or move them to route branches that never meet"));}),n}function ee(t){var r,i;let{definition:e}=t;return [...!!((r=e.fields)!=null&&r.length)&&!!((i=e.steps)!=null&&i.length)?[m("fields-and-steps","",'the definition has both "fields" and "steps"','Move the top-level fields into a step, or remove "steps"')]:[],...Xe(t),...Ze(t)]}var v={email:"Enter a valid email",number:"Enter a number",boolean:"Must be true or false",option:"Select one of the available options",options:"Must be a list of available options",string:"Must be text",date:"Enter a valid date",datetime:"Enter a valid date and time",file:"Must be a file reference",value:"Invalid value"};function R(t,e){var n,r;switch(t){case "required":return "This field is required";case "minLength":return `Must be at least ${e==null?void 0:e.min} ${(n=e==null?void 0:e.unit)!=null?n:"characters"}`;case "maxLength":return `Must be at most ${e==null?void 0:e.max} ${(r=e==null?void 0:e.unit)!=null?r:"characters"}`;case "min":return `Must be at least ${e==null?void 0:e.min}`;case "max":return `Must be at most ${e==null?void 0:e.max}`;case "pattern":return "Invalid format";case "matchField":return "Fields must match";default:return "Invalid value"}}var q=["checkbox","switch"],Z=["text","email","phone","number","password","select","autocomplete","multiselect","checkbox","radio","switch","file","date","datetime","textarea"],X=1e4,Qe=254,tn=1e3,ne=/^[^\s@]+@[^\s@.]+(?:\.[^\s@.]+)+$/,en=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/,re="\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])",nn=new RegExp(`^${re}$`),rn=new RegExp(`^${re}T(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d{1,3})?)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)?$`),on=new Set(["text","phone","password","textarea","autocomplete"]),sn=new Map([["email",[ne,v.email,Qe]],["date",[nn,v.date,X]],["datetime",[rn,v.datetime,X]]]);function an(t){let[e,n,r]=t.split(/\D/).map(Number);return r<=new Date(new Date(0).setUTCFullYear(e,n,0)).getUTCDate()}var un=new Set(["password","number","select","radio","file"]);function V(t,e){return typeof e=="string"&&!un.has(t.type)?e.trim():e}function ie(t,e){let n=V(t,e);if(t.type!=="number"||typeof n!="string"||!en.test(n))return n;let r=Number(n);return Number.isFinite(r)?r:n}var oe=t=>t.optionsFrom?void 0:t.options;function se(t,e){let n=oe(t);return !n||n.some(r=>r.value===e)}function ae(t,e){var r,i,o,s;let n=Math.min(X,(i=(r=t.validation)==null?void 0:r.maxLength)!=null?i:X);return e.length<=n?null:(s=(o=t.validation)==null?void 0:o.maxLengthMessage)!=null?s:R("maxLength",{max:n})}function ln(t,e){var r,i;return Array.isArray(e)?e.length>((i=(r=oe(t))==null?void 0:r.length)!=null?i:tn)?v.option:e.every(o=>typeof o=="string"&&o.length<=X&&se(t,o))?null:v.option:v.options}function it(t,e,n){return typeof e=="string"?ae(t,e):n}function cn(t,e,[n,r,i]){var o;return typeof e!="string"?r:(o=ae(t,e))!=null?o:e.length<=i&&n.test(e)&&(n===ne||an(e))?null:r}function fn(t,e){return typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e)?null:it(t,e,v.value)}function dn(t,e){return e==null||e===""||t.type==="multiselect"&&Array.isArray(e)&&!e.length}function Dt(t,e){var r;if(dn(t,e))return null;if(q.includes(t.type))return typeof e=="boolean"?null:v.boolean;if(t.type==="number")return typeof e=="number"&&Number.isFinite(e)?null:v.number;if(t.type==="multiselect")return ln(t,e);if(t.type==="file")return it(t,e,v.file);let n=sn.get(t.type);return n?cn(t,e,n):t.type==="select"||t.type==="radio"?(r=it(t,e,v.option))!=null?r:se(t,e)?null:v.option:on.has(t.type)?it(t,e,v.string):fn(t,e)}function ue(t,e){return t.type==="file"||!Z.includes(t.type)?null:Dt(t,e)}var pn=["in","notIn"],mn=["gt","gte","lt","lte"],hn=["text","email","phone","password","textarea","date","datetime","select","radio","autocomplete"];function gn(t){return t.type==="number"?"number":q.includes(t.type)?"boolean":hn.includes(t.type)?"string":void 0}function yn(t,e,n,r){var l;let i=(f,d)=>[E("condition-value-mismatch",r,f,d)];if(e==="notEmpty")return [];if(mn.includes(e))return t.type!=="multiselect"&&!q.includes(t.type)?[]:i(`"${t.key}" is a ${t.type} field, so "${e}" never matches it`,"Compare a number, text, radio or select field");if(t.type==="multiselect"){let f=e==="neq"||e==="notIn"?"always":"never";return i(`"${t.key}" holds a list of values, so "${e}" ${f} matches it`,"Use notEmpty, or a select or radio field")}let o=pn.includes(e)&&Array.isArray(n)?n:[n],s=gn(t),a=s&&o.find(f=>typeof f!==s);if(s&&a!==void 0)return i(`${JSON.stringify(a)} is a ${typeof a}, but "${t.key}" holds a ${s}`,`Use a ${s} value`);let u=s==="string"&&!t.optionsFrom&&((l=t.options)!=null&&l.length)?t.options.map(f=>f.value):null,c=u&&o.find(f=>!u.includes(f));return u&&c!==void 0?i(`${JSON.stringify(c)} is not an option of "${t.key}"`,P(u)):[]}function bn(t,e){let{condition:n,path:r}=e;if(wt(t,e).length)return [];let i=H.find(o=>o in n);return yn(t.keys.get(n.field).field,i,n[i],`${r}/${i}`)}function Fn({field:t,path:e}){if(!["select","radio","multiselect"].includes(t.type))return [];if(!Array.isArray(t.options))return t.optionsFrom?[]:[E("missing-options",`${e}/options`,`the ${t.type} field "${t.key}" has no options`,'Add "options" or "optionsFrom"')];let n=t.options.map(o=>o.value),r=t.type==="multiselect"&&Array.isArray(t.defaultValue)?t.defaultValue:[t.defaultValue],i=t.defaultValue===void 0||!n.length||t.optionsFrom?void 0:r.find(o=>!n.includes(o));return i===void 0?[]:[E("default-not-in-options",`${e}/defaultValue`,`${JSON.stringify(i)} is not an option of "${t.key}"`,P(n))]}function kn(t,{field:e,path:n}){var f;let r=(f=e.validation)!=null?f:{},i=(d,g,b)=>E("rule-not-applicable",`${n}/validation/${d}`,g,b),o=Z.includes(e.type),s=e.type==="number",a=o&&!s?["min","max"].filter(d=>r[d]!==void 0):[],u=o&&["number","checkbox","switch"].includes(e.type)?["minLength","maxLength"].filter(d=>r[d]!==void 0):[],c=[...a.map(d=>i(d,`"${d}" applies to number fields only`,`Use ${d}Length to limit text length`)),...u.map(d=>i(d,`"${d}" does not apply to ${e.type} fields`,s?"Use min and max for numbers":`Remove ${d}`))],{validators:l}=t;return r.validator!==void 0&&l&&!Object.prototype.hasOwnProperty.call(l,r.validator)&&c.push(E("unknown-validator",`${n}/validation/validator`,`the validator "${r.validator}" is not registered`,'Pass it in the "validators" option')),c}function Sn(t,e){var o;let{field:n,path:r}=e,i=Z.includes(n.type)?void 0:vt(n.type,Z);return [...i===void 0?[]:[E("unknown-field-type",`${r}/type`,`"${n.type}" is not a built-in field type`,`Use "${i}", or register a component for "${n.type}"`)],...Fn(e),...kn(t,e),...((o=n.optionsDependsOn)!=null?o:[]).flatMap((s,a)=>t.keys.has(s)?[]:[E("unknown-field",`${r}/optionsDependsOn/${a}`,`"${s}" is not a field key`,W(s,t.keyList))])]}function vn({definition:t}){var n;let e=(n=t.steps)!=null?n:[];return e.flatMap((r,i)=>{var a,u,c;let o=[],s=new Set(((a=r.routes)!=null?a:[]).map(l=>l.to).filter(l=>l!==null));for(let l of s){let f=e.findIndex(b=>b.id===l),d=e[f+1],g=(c=(u=e[f])==null?void 0:u.routes)==null?void 0:c.some(b=>{var O,x;return !((O=b.show)!=null&&O.length)&&!((x=b.showAny)!=null&&x.length)});!d||!s.has(d.id)||g||o.push(E("route-fallthrough",`/steps/${f}`,`branch "${l}" from "${r.id}" continues into the sibling branch "${d.id}"`,`Add an unconditional route on "${l}" to the step where the branches meet`));}return r.skip&&(r.next===false||!e[1])&&o.push(E("skip-unreachable",`/steps/${i}/skip`,`step "${r.id}" has "skip" but no Continue button or later step`,'Remove "skip", or remove "next": false')),o})}function le(t){return [...typeof t.definition.title=="string"?[]:[E("missing-property","/title",'"title" must be a string',"Add a title for host UI and editors")],...t.conditions.flatMap(e=>bn(t,e)),...t.entries.flatMap(e=>Sn(t,e)),...vn(t)]}function Rt(t,{validators:e,suggest:n,warnings:r}={}){let i=Xt(t);if(i.length)return i;let o=Bt(t,e,n);return [...Zt(t),...ee(o),...Ut(o),...Yt(o),...Wt(o),...r?r(o):[]]}function ce(t){return Rt(t)}function ot(t,e={}){return Rt(t,{validators:e.validators,suggest:W,warnings:le})}function st(t,e){let n=Rt(t,{suggest:W});if(n.length)throw new $(n);return t}function at(t){var e,n;return [...(e=t.show)!=null?e:[],...(n=t.showAny)!=null?n:[]].map(r=>r.field)}function ut(t){var e,n;return (e=t.steps)!=null&&e.length?t.steps.flatMap(r=>r.fields):(n=t.fields)!=null?n:[]}function K(t,e){let n={};for(let i of t)i.defaultValue!==void 0&&(n[i.key]=i.defaultValue);let r=e!=null?e:{};for(let i of Object.keys(r))i!=="__proto__"&&(n[i]=r[i]);return n}function L(t,e){let n=new Set([...Object.keys(t),...Object.keys(e)]);return new Set([...n].filter(r=>!Object.is(t[r],e[r])))}var Vt=class extends Error{constructor(n,r){super(`The action completed, but ${n} failed: ${r instanceof Error?r.message:String(r)}`);this.phase=n;this.committed=true;this.name="FormLifecycleError",this.cause=r;}};async function lt(t,e){try{await e();}catch(n){throw new Vt(t,n)}}function fe(t){return t.visibleSteps.map(e=>e.id).join(`
5
- `)}function Q(t,e){let n=fe(t),r=Object.keys(e).filter(i=>e[i]!==void 0).map(i=>[i,t.values[i]]);return ()=>fe(t)!==n||r.some(([i,o])=>!Object.is(t.values[i],o))}function I(t,e){var r,i;let n=o=>St(o,e);return ((r=t.show)!=null?r:[]).every(n)&&(!((i=t.showAny)!=null&&i.length)||t.showAny.some(n))}function wn(t,e){return Y(t)||t===false&&q.includes(e.type)}function de(t,e,n,r){var s,a;let i=n[`min${e}`],o=n[`max${e}`];if(i!==void 0&&t<i)return (s=n[`min${e}Message`])!=null?s:R(`min${e}`,{min:i,unit:r});if(o!==void 0&&t>o)return (a=n[`max${e}Message`])!=null?a:R(`max${e}`,{max:o,unit:r})}function xn(t,e){var n;if(e.pattern!==void 0)try{return new RegExp(e.pattern).test(String(t))?void 0:(n=e.patternMessage)!=null?n:R("pattern")}catch(r){return}}function U(t,e,n,r){var l,f,d,g,b;let i=V(t,e),o=(l=t.validation)!=null?l:{},s=(f=o.matchFieldMessage)!=null?f:R("matchField");if(wn(i,t))return o.required?typeof o.required=="string"?o.required:R("required"):o.matchField!==void 0&&!Y(n[o.matchField])?s:null;let a=ue(t,i);if(a)return a;let u=typeof i=="string"||Array.isArray(i)?de(i.length,"Length",o,Array.isArray(i)?"items":void 0):typeof i=="number"?de(i,"",o):void 0,c=o.matchField!==void 0&&i!==n[o.matchField]?s:void 0;return ((b=(d=u!=null?u:xn(i,o))!=null?d:c)!=null?b:o.validator?(g=r==null?void 0:r[o.validator])==null?void 0:g.call(r,i,n):void 0)||null}function T(t,e,n){return ct(t.fields,e,n)}function ct(t,e,n){let r={};for(let i of t){if(!I(i,e))continue;let o=U(i,e[i.key],e,n);o&&(r[i.key]=o);}return r}function ft(t,e,n=false){let r=t.errors;t.state.errors={},t.state.topLevelErrors=[];for(let[o,s]of Object.entries(e))t.visibility.activeField(o,t.values)?t.errors[o]=s:t.topLevelErrors.push(s);let i=n&&pe(t,e);t.notify({fieldKeys:L(r,t.errors),structureChanged:i});}function pe(t,e){let n=Object.keys(e).find(i=>t.errors[i]!==void 0),r=n&&t.isMultiStep?t.visibility.findStepIndex(n,t.values,t.currentStepIndex):null;return r===null||r===t.currentStepIndex?false:(t.state.currentStepIndex=r,true)}function me(t,e){var r;let n=[];for(let i of t.visibility.allFields)((r=i.validation)==null?void 0:r.matchField)!==e||t.errors[i.key]===void 0||U(i,t.values[i.key],j(t),t.validators)||(delete t.errors[i.key],n.push(i.key));return n}function dt(t){let e=new Set(t.visibleSteps.flatMap(r=>r.fields.map(i=>i.key))),n=Object.keys(t.errors).filter(r=>!e.has(r));for(let r of n)delete t.errors[r];return n}function j(t){return B(t)}function En(t,e){for(let n of [...t.skipped.values()].flat())delete e[n];return e}function tt(t,e=false){var o;let n=t.errors,r={};if(t.isMultiStep)for(let s of t.visibleSteps)t.skipped.has(s.id)||Object.assign(r,T(s,j(t),t.validators));else Object.assign(r,ct((o=t.definition.fields)!=null?o:[],j(t),t.validators));t.state.errors=r;let i=e&&pe(t,r);return t.notify({fieldKeys:L(n,r),structureChanged:i}),r}function he(t,e){let n=t.visibility.activeField(e,t.values);if(!n)return null;let r=t.errors[e],i=U(n,t.values[e],j(t),t.validators);i?t.errors[e]=i:delete t.errors[e];let o=Object.is(r,t.errors[e])?[]:[e];return t.notify({fieldKeys:o}),i}function B(t){let e=h({},t.visibility.conditionValues(t.values));for(let n of Object.keys(e)){let r=t.visibility.activeField(n,t.values);r&&(e[n]=V(r,e[n]));}return En(t,e)}function ge(t,e){let n=t.values,r=t.errors,i=Object.keys(t.fieldLoading);t.validationEpoch++,t.operationEpoch++,t.state.submitting=false,t.state.values=K(t.visibility.allFields,e),t.state.errors={},t.state.topLevelErrors=[],t.state.fieldLoading={},t.state.stepValidating=false,t.state.currentStepIndex=0,t.skipped.clear(),t.visibility.reconcileHidden(t.values,t.errors);let o=L(n,t.values),s=new Set([...o,...L(r,t.errors),...i]);t.notify({fieldKeys:s,structureChanged:true,valuesChanged:o.size>0});}function Ot(t,e){var s,a;let n=(s=t.steps)!=null?s:[],r=new Map(n.map((u,c)=>[u.id,c])),i=[],o={};for(let u=0;u<n.length;){let c=n[u];if(!I(c,o)){u++;continue}i.push(c),Object.assign(o,be(c,e,o));let l=(a=c.routes)==null?void 0:a.find(f=>{var d;return I(f,o)&&(f.to===null||((d=r.get(f.to))!=null?d:-1)>u&&I(n[r.get(f.to)],o))});if((l==null?void 0:l.to)===null)break;u=l?r.get(l.to):u+1;}return i}function ye(t,e,n){var s;let r=(s=t[n])!=null?s:t[t.length-1],i=e.findIndex(a=>a.id===(r==null?void 0:r.id));if(i!==-1)return i;let o=new Map(e.map((a,u)=>[a.id,u]));for(let a=Math.min(n-1,t.length-1);a>=0;a--){let u=o.get(t[a].id);if(u!==void 0)return u}return 0}function be(t,e,n){let r=h({},n);for(let o of t.fields)r[o.key]=V(o,e[o.key]);let i={};for(let o of t.fields)I(o,r)&&e[o.key]!==void 0&&(i[o.key]=V(o,e[o.key]));return i}function Fe(t){let e=null,n=[],r={},i=o=>{var u,c;if(e===o)return;e=o,n=Ot(t,o);let s={},a=(u=t.steps)!=null&&u.length?n:[{fields:(c=t.fields)!=null?c:[]}];for(let l of a)Object.assign(s,be(l,o,s));r=s;};return {invalidate(){e=null;},steps(o){return i(o),n},values(o){return i(o),r}}}function ke(t){var r,i;let e=(i=(r=t.currentStep)==null?void 0:r.fields)!=null?i:[],n=h({},t.values);for(let{key:o}of e)delete n[o];return Object.assign(n,K(e))}function Mt(t){return Ot(t.definition,ke(t))[t.currentStepIndex+1]}function pt(t){let e=t.currentStep,n=e.fields.map(({key:i})=>i);t.state.values=ke(t);for(let i of n)delete t.errors[i];t.skipped.set(e.id,n),t.visibility.reconcileHidden(t.values,t.errors),t.visibility.markChanged(true,true);let r=dt(t);return t.notify({fieldKeys:[...n,...r],structureChanged:true,valuesChanged:true}),n}function mt(t){let e=t.currentStep;e&&t.skipped.delete(e.id);}function Se(t,e){return t.state.currentStepIndex=e,t.notify({structureChanged:true}),pt(t)}async function ht(t,e,n=false){if(t.submitting||t.stepValidating)return false;n||mt(t);let r=h({},t.lifecycle),i=false,o=t.validationEpoch,s=++t.operationEpoch,a=B(t),u=Q(t,a),c=()=>o!==t.validationEpoch||s!==t.operationEpoch||u();t.state.submitting=true,t.notify();try{if(c()||Object.keys(tt(t,!0)).length>0||c())return !1;if(r.onBeforeSubmit){let f=await r.onBeforeSubmit(a);if(c()||f===!1)return !1}if(c())return !1;if(r.onBeforeSubmit){if(Object.keys(tt(t,!0)).length>0||c())return !1;a=B(t);}i=!0;let l=[...t.skipped.keys()];return await e(a,[...l]),s!==t.operationEpoch||await lt("afterSubmit",()=>{var f;return (f=r.onAfterSubmit)==null?void 0:f.call(r,a,l)}),!0}catch(l){if(!i&&c())return false;throw l}finally{s===t.operationEpoch&&(t.state.submitting=false,t.notify());}}function ve(t){let e=t.currentStep;if(!e)return true;let n=T(e,j(t),t.validators);if(Object.keys(n).length===0)return false;let r=h({},t.errors);return Object.assign(t.errors,n),t.notify({fieldKeys:L(r,t.errors)}),true}function we(t,e){t.validationEpoch++,t.state.currentStepIndex=e,t.notify({structureChanged:true});}async function xe(t,e){var c;if(!t.isMultiStep||t.stepValidating||t.submitting||!((c=t.currentStep)!=null&&c.skip))return false;if(Mt(t))return gt(t,"next","skip");let n=t.currentStep;if(!e||!n)return false;let r=t.values,i=h({},t.errors),o=false,s=pt(t),a=t.values,u=Q(t,h({},a));try{return await ht(t,async(l,f)=>{await e(l,f),o=!0;},!0)}finally{!o&&t.values===a&&!u()&&(t.state.values=r,t.state.errors=h(h({},i),t.errors),t.skipped.delete(n.id),t.notify({fieldKeys:s,structureChanged:true,valuesChanged:true}));}}async function gt(t,e,n=e){let r=n==="skip";if(!t.isMultiStep||t.stepValidating||t.submitting||!r&&(e==="next"?t.isLastStep:t.isFirstStep))return false;let i=t.currentStep,o=e==="next"&&!r;if(o&&mt(t),o&&ve(t))return false;let s=h({},t.lifecycle),a=t.onStepValidate,u=false,l=t.currentStepIndex+(e==="next"?1:-1),f=r?Mt(t):t.visibleSteps[l];if(!f)return false;let d={fromStepId:i.id,toStepId:f.id,reason:n,values:h({},j(t))},g=t.validationEpoch,b=++t.operationEpoch,O=Q(t,d.values),x=()=>{var k;return g!==t.validationEpoch||b!==t.operationEpoch||((k=t.currentStep)==null?void 0:k.id)!==i.id||O()};t.state.stepValidating=true,t.notify();try{if(x())return !1;if(o&&a){let k=await a(i.id,d.values);if(x())return !1;if(k&&Object.keys(k).length>0)return ft(t,k),!1}if(s.onBeforeStepChange){let k=await s.onBeforeStepChange(d);if(x()||k===!1)return !1}return x()||o&&ve(t)?!1:(u=!0,r&&pt(t),we(t,l),await lt("afterStepChange",()=>{var k;return (k=s.onAfterStepChange)==null?void 0:k.call(s,d)}),!0)}catch(k){if(!u&&x())return false;throw k}finally{b===t.operationEpoch&&(t.state.stepValidating=false,t.notify());}}function Ee(t,e){if(!t.isMultiStep)return;let n=t.visibility.findStepIndex(e,t.values,t.currentStepIndex);n===t.currentStepIndex?t.notify():n!==null&&we(t,n);}function Ie(t,e){return t.add(e),()=>t.delete(e)}function Ce(){let t=0,e=0,n=new Set,r=new Set,i=new Map,o=new Map;return {subscribe:s=>Ie(n,s),getSnapshot:()=>t,subscribeStructure:s=>Ie(r,s),getStructureSnapshot:()=>e,getFieldSnapshot:s=>{var a;return (a=i.get(s))!=null?a:0},subscribeField(s,a){var c;let u=(c=o.get(s))!=null?c:new Set;return u.add(a),o.set(s,u),()=>{u.delete(a),u.size===0&&o.delete(s);}},notify({fieldKeys:s=[],structureChanged:a=false}={}){var u,c;for(let l of new Set(s)){i.set(l,((u=i.get(l))!=null?u:0)+1);for(let f of (c=o.get(l))!=null?c:[])f();}if(a){e++;for(let l of r)l();}t++;for(let l of n)l();}}}function In(t,e){try{if(process.env.NODE_ENV!=="production")return ot(t,{validators:e})}catch(n){if(!(n instanceof ReferenceError))throw n}}function $e(t,e,n){var s,a;let r=(s=In(t,n))!=null?s:ce(t),i=r.filter(Kt);if(i.length)throw new $(i);let o=(a=e.onWarning)!=null?a:(u=>console.warn(`[formhaus] ${u.message}`));for(let u of r)o(u);}function At(t,e){var n;for(let r of at(t)){let i=(n=e.get(r))!=null?n:new Set;i.add(t),e.set(r,i);}}function yt(t){var O,x,k;let e=ut(t),n=new Map,r=new Set,i=Fe(t),o=new Map,s=new Map,a=new Map,u=true,c=true,l={visibleSteps:[],currentStep:null,visibleFields:[],canGoNext:false};for(let p of e)n.set(p.key,[...(O=n.get(p.key))!=null?O:[],p]),At(p,o);for(let p of (x=t.steps)!=null?x:[]){for(let y of p.fields)a.set(y,p);At(p,s);for(let y of (k=p.routes)!=null?k:[])for(let F of at(y))r.add(F);}let f=()=>{var p;return ((p=t.steps)!=null?p:[]).length>0},d=(p,y)=>I(p,i.values(y)),g=(p,y)=>{let F=a.get(p);return !F||i.steps(y).includes(F)};function b(p,y){var C,M,G;if(!u)return l;if(u=false,!f())return l.visibleSteps=[],l.currentStep=null,l.visibleFields=((C=t.fields)!=null?C:[]).filter(N=>d(N,p)),l;let F=l.visibleSteps=i.steps(p),S=l.currentStep=(G=(M=F[y])!=null?M:F[F.length-1])!=null?G:null;return l.visibleFields=S?S.fields.filter(N=>d(N,p)):[],l}return {allFields:e,conditionValues:i.values,state:b,markChanged(p,y){(p||y)&&i.invalidate(),p&&(u=true),(p||y)&&(c=true);},getCanGoNext(p,y,F){let S=b(p,y).currentStep;if(!c)return l.canGoNext;c=false;let C=S?T(S,i.values(p),F):{};return l.canGoNext=f()&&Object.keys(C).length===0},findStepIndex(p,y,F){let S=b(y,F).visibleSteps.findIndex(C=>C.fields.some(M=>M.key===p));return S===-1?null:S},affectsStructure(p,y){return r.has(p)||o.has(p)||s.has(p)||y.size>0},activeField(p,y){var F;return (F=n.get(p))==null?void 0:F.find(S=>g(S,y)&&d(S,y))},reconcileHidden(p,y){var N,Tt;i.invalidate();let F=[...new Set([...o.keys(),...s.keys()])],S=new Set(F),C=new Set,M=w=>p[w]!==void 0||y[w]!==void 0,G=w=>{delete p[w],delete y[w],i.invalidate(),C.add(w),!S.has(w)&&(S.add(w),F.push(w));};for(let w=0;w<F.length;w++){let Ft=F[w];S.delete(Ft);for(let A of (N=o.get(Ft))!=null?N:[])g(A,p)&&!d(A,p)&&M(A.key)&&G(A.key);for(let A of (Tt=s.get(Ft))!=null?Tt:[])if(!d(A,p))for(let jt of A.fields)M(jt.key)&&G(jt.key);}return C}}}var bt=class{constructor(e,n,r){this.definition=e;this.skipped=new Map;this.validationEpoch=0;this.operationEpoch=0;this.subscriptions=Ce();var o;this.lifecycle=r!=null?r:{},this.validators=(o=r==null?void 0:r.validators)!=null?o:{},$e(e,this.lifecycle,this.validators),this.visibility=yt(e);let i=K(this.visibility.allFields,n);this.state={values:i,errors:{},topLevelErrors:[],currentStepIndex:0,fieldLoading:{},stepValidating:false,submitting:false},this.visibility.reconcileHidden(i,this.state.errors);}get onStepValidate(){return this.lifecycle.onStepValidate}get values(){return this.state.values}get errors(){return this.state.errors}get topLevelErrors(){return this.state.topLevelErrors}get currentStepIndex(){return this.state.currentStepIndex}get fieldLoading(){return this.state.fieldLoading}get stepValidating(){return this.state.stepValidating}get submitting(){return this.state.submitting}get isMultiStep(){var e;return ((e=this.definition.steps)!=null?e:[]).length>0}get visibleSteps(){return this.view.visibleSteps}get currentStep(){return this.view.currentStep}get visibleFields(){return this.view.visibleFields}get isFirstStep(){return this.currentStepIndex===0}get isLastStep(){return this.currentStepIndex>=this.visibleSteps.length-1}get canGoNext(){return this.visibility.getCanGoNext(this.state.values,this.currentStepIndex,this.validators)}get progress(){let e=this.visibleSteps.length;return {current:Math.min(this.currentStepIndex+1,e),total:e}}subscribe(e){return this.subscriptions.subscribe(e)}getSnapshot(){return this.subscriptions.getSnapshot()}subscribeField(e,n){return this.subscriptions.subscribeField(e,n)}getFieldSnapshot(e){return this.subscriptions.getFieldSnapshot(e)}subscribeStructure(e){return this.subscriptions.subscribeStructure(e)}getStructureSnapshot(){return this.subscriptions.getStructureSnapshot()}setValue(e,n){let{values:r,errors:i}=this.state,o=this.isMultiStep?this.visibleSteps:null,s=!Object.is(r[e],n),a=i[e]!==void 0;r[e]=n,delete i[e];for(let[g,b]of this.skipped)s&&b.includes(e)&&this.skipped.delete(g);let u=this.visibility.reconcileHidden(r,i),c=me(this.internals,e),l=new Set([...u,...c]);(s||a)&&l.add(e);let f=s||u.size>0,d=f&&this.visibility.affectsStructure(e,u);if(o&&d){this.visibility.markChanged(true,true),this.state.currentStepIndex=ye(o,this.visibleSteps,this.currentStepIndex);for(let g of dt(this.internals))l.add(g);}this.notify({fieldKeys:l,structureChanged:d,valuesChanged:f});}setErrors(e){ft(this.internals,e,true);}setFieldLoading(e,n){let r=this.state.fieldLoading[e]===true;n?this.state.fieldLoading[e]=true:delete this.state.fieldLoading[e],this.notify({fieldKeys:r===n?[]:[e]});}cancelPendingActions(){this.validationEpoch++,this.operationEpoch++,this.state.stepValidating=false,this.state.submitting=false,this.notify();}next(){return gt(this.internals,"next")}back(){return gt(this.internals,"back")}skip(e){return xe(this.internals,e)}submit(e){return ht(this.internals,e)}isStepSkipped(e){return this.skipped.has(e)}validate(){return tt(this.internals)}validateField(e){return he(this.internals,e)}getSubmitValues(){return B(this.internals)}goToStepWithField(e){Ee(this.internals,e);}reset(e){ge(this.internals,e);}get view(){return this.visibility.state(this.state.values,this.currentStepIndex)}get internals(){return this}notify(e={}){this.visibility.markChanged(!!e.structureChanged,!!e.valuesChanged),this.subscriptions.notify(e);}};var Cn='Pass the values object as the second argument, not the request body with "values" and "skippedSteps".',$n=()=>null,Lt=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);function Dn(t,e,n){var a;let r=n!==null&&typeof n=="object"&&!Array.isArray(n)?n:{},i=yt(t),o=[...new Set(e.map(({key:u})=>u))].filter(u=>Lt(r,u)),s={values:{},active:new Map};for(let u=0;u<=e.length;u++){let c={};for(let d of o)c[d]=ie((a=s.active.get(d))!=null?a:e.find(g=>g.key===d),r[d]);let l=new Map;for(let d of o){let g=i.activeField(d,c);g&&l.set(d,g);}let f=o.every(d=>l.get(d)===s.active.get(d));if(s={values:c,active:l},f)break}return s}function Rn({values:t,active:e}){let n=new Map;for(let[r,i]of e){let o=Dt(i,t[r]);o&&n.set(r,o);}return n}function Vn(t,e){var i;let n=o=>o.map(s=>e.has(s.key)?kt(h({},s),{validation:void 0}):s),r=(i=t.steps)==null?void 0:i.map(o=>kt(h({},o),{fields:n(o.fields)}));return h(h(h({},t),t.fields&&{fields:n(t.fields)}),r&&{steps:r})}function On(t,e={}){let n={};for(let{validation:r}of t)r!=null&&r.validator&&(n[r.validator]=$n);return h(h({},n),e)}function Mn(t,e){return e===null||typeof e!="object"||!Lt(e,"values")?false:!t.some(n=>n.key==="values"||n.key==="skippedSteps")}function An(t,e){if(!Array.isArray(e))return;let n=new Set(e);for(let r=0;r<t.visibleSteps.length;r++){let i=t.visibleSteps[r];i.skip&&n.has(i.id)&&Se(t,r);}}function Ln(t,e,n={}){st(t);let r=ut(t),i=Dn(t,r,e),o=Rn(i),s={validators:On(r,n.validators),onWarning:()=>{}},a=new bt(Vn(t,o),i.values,s);An(a,n.skippedSteps);let u=a.validate(),c=a.getSubmitValues();for(let[l,f]of o)Lt(c,l)&&(u[l]=f);return Mn(r,e)&&(u.values=Cn),{values:c,errors:u}}exports.FormDefinitionError=$;exports.checkDefinition=ot;exports.parseDefinition=st;exports.validateSubmission=Ln;return exports;})({});//# sourceMappingURL=server.iife.js.map
2
+ var Vt=Object.defineProperty,Ot=Object.defineProperties;var At=Object.getOwnPropertyDescriptors;var Ke=Object.getOwnPropertySymbols;var Lt=Object.prototype.hasOwnProperty,jt=Object.prototype.propertyIsEnumerable;var _e=(e,t,n)=>t in e?Vt(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n,m=(e,t)=>{for(var n in t||(t={}))Lt.call(t,n)&&_e(e,n,t[n]);if(Ke)for(var n of Ke(t))jt.call(t,n)&&_e(e,n,t[n]);return e},ke=(e,t)=>Ot(e,At(t));var qe=["eq","neq","in","notIn","notEmpty","gt","gte","lt","lte"];function W(e){return e==null||e===""||Array.isArray(e)&&!e.length}function Tt(e){let t=typeof e=="string"&&e.trim()!==""?Number(e):e;return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ne(e,t,n){let r=Tt(e);return r!==void 0&&n(r,t)}function Se(e,t){let n=t[e.field];return e.eq!==void 0?n===e.eq:e.neq!==void 0?n!==e.neq:e.in!==void 0?e.in.includes(n):e.notIn!==void 0?!e.notIn.includes(n):e.notEmpty!==void 0?!e.notEmpty||!W(n):e.gt!==void 0?ne(n,e.gt,(r,s)=>r>s):e.gte!==void 0?ne(n,e.gte,(r,s)=>r>=s):e.lt!==void 0?ne(n,e.lt,(r,s)=>r<s):e.lte!==void 0?ne(n,e.lte,(r,s)=>r<=s):false}var R=class extends Error{constructor(t){super(`Invalid form definition:
3
+ ${t.map(n=>n.message).join(`
4
+ `)}`),this.name="FormDefinitionError",this.issues=t;}};function Ue(e){return (t,n,r,s)=>m({code:t,severity:e,path:n,message:`${n||"/"}: ${r}.${s?` ${s}.`:""}`},s&&{hint:`${s}.`})}var g=Ue("error"),E=Ue("warning");function re(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}function Be(e){return e.severity==="error"}function N(e){if(e.length===1)return `Use ${JSON.stringify(e[0])}`;let t=e.slice(0,10).map(n=>JSON.stringify(n)).join(", ");return e.length>10?`Use one of: ${t}, ...`:`Use one of: ${t}`}function Pt(e,t){let n=Array.from({length:t.length+1},(r,s)=>s);for(let r=1;r<=e.length;r++){let s=[r];for(let i=1;i<=t.length;i++)s[i]=Math.min(n[i]+1,s[i-1]+1,n[i-1]+(e[r-1]===t[i-1]?0:1));n=s;}return n[t.length]}function we(e,t){let n=e.toLowerCase();return t.find(r=>r!==e&&Pt(n,r.toLowerCase())<=(r.length>4?2:1))}function Y(e,t){let n=we(e,t);return n!==void 0?`Use ${JSON.stringify(n)}`:t.length?N(t):void 0}var z=qe;function Nt({suggest:e},t,n){let r=Object.keys(t).filter(a=>a!=="field"),s=r.filter(a=>!z.includes(a)),i=s.map(a=>g("unknown-operator",`${n}/${re(a)}`,`"${a}" is not a condition operator`,e(a,[...z]))),o=r.length-s.length;if(o!==1&&!(o===0&&s.length)){let a=o?`the condition has ${o} operators`:"the condition has no operator";i.push(g("condition-operator-count",n,a,`Use exactly one of: ${z.join(", ")}`));}return i}function Kt(e,{condition:t,path:n,owner:r,step:s,key:i}){let o=e.keys.get(t.field);if(!o){let c=e.keyList.filter(l=>l!==i);return [g("unknown-field",`${n}/field`,`"${t.field}" is not a field key`,e.suggest(t.field,c))]}if(s<0||r==="action")return [];let a=r==="step"?"this or a later step":"a later step";if(o.step<s||r!=="step"&&o.step===s)return [];let u=r==="step"?"earlier steps":"this or an earlier step";return [g("forward-reference",`${n}/field`,`"${t.field}" belongs to ${a}`,`${r==="route"?"Route":r==="step"?"Step":"Field"} conditions can use fields of ${u}`)]}function xe(e,t){let{condition:n,path:r}=t;return typeof n.field!="string"?[g("missing-property",`${r}/field`,'the condition has no "field"',"Add the key of the field to test")]:[...Nt(e,n,r),...Kt(e,t)]}function Ge(e){return e.conditions.flatMap(t=>xe(e,t))}function Ee(e,t,n,r,s,i){var o;for(let a of ["show","showAny"])((o=t[a])!=null?o:[]).forEach((u,c)=>e.push({condition:u,path:`${n}/${a}/${c}`,owner:r,step:s,key:i}));}function Ie(e,t,n,r){var s;(t?(s=t.disabled)!=null?s:[]:[]).forEach((i,o)=>e.push({condition:i,path:`${n}/disabled/${o}`,owner:"action",step:r}));}function He(e,t,n=()=>{}){var a,u;let r=(a=e.steps)!=null?a:[],s=r.length?r.flatMap((c,l)=>c.fields.map((d,f)=>({field:d,path:`/steps/${l}/fields/${f}`,step:l}))):((u=e.fields)!=null?u:[]).map((c,l)=>({field:c,path:`/fields/${l}`,step:-1})),i=new Map;for(let c of s)i.has(c.field.key)||i.set(c.field.key,c);let o=[];for(let c of s)Ee(o,c.field,c.path,"field",c.step,c.field.key);return r.forEach((c,l)=>{var d;Ee(o,c,`/steps/${l}`,"step",l),((d=c.routes)!=null?d:[]).forEach((f,y)=>Ee(o,f,`/steps/${l}/routes/${y}`,"route",l));for(let f of ["next","back","skip"])Ie(o,c[f],`/steps/${l}/${f}`,l);}),Ie(o,e.submit,"/submit",-1),Ie(o,e.cancel,"/cancel",-1),{definition:e,entries:s,keys:i,keyList:[...i.keys()],conditions:o,validators:t,suggest:n}}function We(e,t,n,r){let s=e[n],i=e[r];return s===void 0||i===void 0||s<=i?[]:[g("invalid-range",`${t}/validation/${n}`,`${n} (${s}) is greater than ${r} (${i})`,`Lower ${n} or raise ${r}`)]}function _t(e,t){if(e===void 0)return [];try{return new RegExp(e),[]}catch(n){return [g("invalid-pattern",`${t}/validation/pattern`,`${JSON.stringify(e)} is not a valid regular expression`,"Fix the pattern or escape special characters with a backslash")]}}function qt(e,{field:t,path:n}){let r=t.validation;if(!r)return [];let s=r.matchField;return [...We(r,n,"minLength","maxLength"),...We(r,n,"min","max"),..._t(r.pattern,n),...s===void 0||e.keys.has(s)?[]:[g("unknown-field",`${n}/validation/matchField`,`"${s}" is not a field key`,e.suggest(s,e.keyList))]]}function Ye(e){return e.entries.flatMap(t=>qt(e,t))}function Ut({definition:e,entries:t,keys:n}){var o;let r=new Map,s=(a,u)=>{var l;let c=u.filter(d=>n.has(d));if(c.length)for(let d of a)r.set(d,[...(l=r.get(d))!=null?l:[],...c]);},i=a=>{var u,c;return [...(u=a.show)!=null?u:[],...(c=a.showAny)!=null?c:[]].map(l=>l.field)};for(let{field:a}of t)s([a.key],i(a));for(let a of (o=e.steps)!=null?o:[])s(a.fields.map(u=>u.key),i(a));return r}function Bt(e){var r;let t=new Map,n=[];for(let s of e.keys()){if(t.has(s))continue;t.set(s,true);let i=[[s,0]];for(;i.length>0;){let o=i[i.length-1],a=(r=e.get(o[0]))==null?void 0:r[o[1]++];if(a===void 0)t.set(o[0],false),i.pop();else if(t.get(a)){let u=i.map(([c])=>c);n.push([...u.slice(u.indexOf(a)),a]);}else t.has(a)||(t.set(a,true),i.push([a,0]));}}return n}function Gt(e){return Bt(Ut(e)).map(t=>g("condition-cycle",e.keys.get(t[0]).path,`show conditions form a cycle: ${t.join(" -> ")}`,"Remove one of the conditions in the cycle"))}function ze(e){return Gt(e)}var Je="1.0";function Xe({formatVersion:e}){if(e===void 0)return [];let t=typeof e=="string"&&/^[1-9]\d*(\.\d+)?$/.test(e);return t&&parseInt(e)<=parseInt(Je)?[]:[t?g("unsupported-format-version","/formatVersion",`format ${e} is not supported`,"Upgrade @formhaus/core"):g("invalid-type","/formatVersion","must be a version string",`Use "${Je}"`)]}var X=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ht={string:[e=>typeof e=="string","a string"],number:[e=>typeof e=="number"&&Number.isFinite(e),"a number"],boolean:[e=>typeof e=="boolean","true or false"],requirement:[e=>["boolean","string"].includes(typeof e),"true, false or a message string"],scalar:[e=>["string","number","boolean"].includes(typeof e),"a string, number or boolean"],list:[e=>Array.isArray(e)&&e.every(t=>["string","number"].includes(typeof t)),"an array of strings or numbers"]};function K(e,t,n){return Object.entries(t).flatMap(([r,s])=>{let[i,o]=Ht[s];return e[r]===void 0||i(e[r])?[]:[g("invalid-type",`${n}/${re(r)}`,`"${r}" must be ${o}`)]})}function $(e,t,n,r,s=false){return e==null&&!s?[]:Array.isArray(e)?e.flatMap((i,o)=>X(i)?r(i,`${t}/${o}`):[g("invalid-type",`${t}/${o}`,`must be ${n}`)]):[g("invalid-type",t,"must be an array",s?"Use [] when there is nothing to list":void 0)]}function J(e,t,n){return typeof e[t]=="string"?[]:[g("missing-property",`${n}/${t}`,`"${t}" must be a string`)]}var Ce=(e,t)=>K(e,{field:"string",eq:"scalar",neq:"scalar",in:"list",notIn:"list",notEmpty:"boolean",gt:"number",gte:"number",lt:"number",lte:"number"},t);function $e(e,t){return [...$(e.show,`${t}/show`,"a condition object",Ce),...$(e.showAny,`${t}/showAny`,"a condition object",Ce)]}function Re(e,t){return X(e)?[...K(e,{label:"string"},t),...$(e.disabled,`${t}/disabled`,"a condition object",Ce)]:[]}var Wt=(e,t)=>[...J(e,"value",t),...K(e,{label:"string"},t)],Yt={required:"requirement",minLength:"number",maxLength:"number",min:"number",max:"number",pattern:"string",matchField:"string",validator:"string",minLengthMessage:"string",maxLengthMessage:"string",minMessage:"string",maxMessage:"string",patternMessage:"string",matchFieldMessage:"string"};function zt(e,t){return e===void 0?[]:X(e)?K(e,Yt,t):[g("invalid-type",t,"must be an object of validation rules")]}function Jt(e,t){return e===void 0||Array.isArray(e)&&e.every(r=>typeof r=="string")?[]:[g("invalid-type",t,"must be an array of field keys")]}var Ze=(e,t)=>[...J(e,"key",t),...J(e,"type",t),...K(e,{label:"string",placeholder:"string",helperText:"string"},t),...$e(e,t),...$(e.options,`${t}/options`,"an option object",Wt),...zt(e.validation,`${t}/validation`),...Jt(e.optionsDependsOn,`${t}/optionsDependsOn`)],Xt=(e,t)=>[...e.to===null||typeof e.to=="string"?[]:[g("missing-property",`${t}/to`,'"to" must be a step id or null')],...$e(e,t)],Zt=(e,t)=>[...J(e,"id",t),...K(e,{title:"string",description:"string"},t),...$(e.fields,`${t}/fields`,"a field object",Ze,true),...$e(e,t),...$(e.routes,`${t}/routes`,"a route object",Xt),...["next","back","skip"].flatMap(n=>Re(e[n],`${t}/${n}`))];function Qe(e){if(!X(e))return [g("invalid-type","","the form definition must be an object")];let t=Xe(e);return t.length?t:[...$(e.fields,"/fields","a field object",Ze),...$(e.steps,"/steps","a step object",Zt),...Re(e.submit,"/submit"),...Re(e.cancel,"/cancel")]}function et(e){return [...J(e,"id",""),...X(e.submit)?[]:[g("missing-property","/submit","the submit action is missing",'Add "submit": { "label": "Submit" }')]]}var se=e=>{var t,n;return !!((t=e.show)!=null&&t.length||(n=e.showAny)!=null&&n.length)};function tt(e,t,n){var s;let r=[];for(let i of (s=e[n].routes)!=null?s:[]){let o=i.to===null?null:t.get(i.to);if(o===null&&!se(i))return r;if(!(o==null||o<=n)&&(r.push(o),!se(i)&&!se(e[o])))return r}return n+1<e.length?[...r,n+1]:r}function nt(e){let t=new Map(e.map((n,r)=>[n.id,r]));return e.map((n,r)=>{let s=new Set,i=tt(e,t,r);for(;i.length;){let o=i.pop();s.has(o)||(s.add(o),i.push(...tt(e,t,o)),se(e[o])&&o+1<e.length&&i.push(o+1));}return s})}var Qt=new Set([...Object.getOwnPropertyNames(Object.prototype),"prototype"]);function en({definition:e}){var s;let t=[],n=(s=e.steps)!=null?s:[],r=new Map;return n.forEach((i,o)=>{let a=r.get(i.id);a===void 0?r.set(i.id,o):t.push(g("duplicate-step-id",`/steps/${o}/id`,`step id "${i.id}" is already used by /steps/${a}`,"Give each step a unique id"));}),n.forEach((i,o)=>{var a;return ((a=i.routes)!=null?a:[]).forEach((u,c)=>{if(u.to===null)return;let l=r.get(u.to);if(l!==void 0&&l>o)return;let d=n.slice(o+1).map(h=>h.id),f=l===void 0?`"${u.to}" is not a step id`:`"${u.to}" is not a later step`,y=d.length?`${N(d)}, or null to end the form here`:"Use null to end the form here";t.push(g("route-target",`/steps/${o}/routes/${c}/to`,f,y));})}),t}function tn({definition:e,entries:t}){var i;let n=[],r=nt((i=e.steps)!=null?i:[]),s=(o,a)=>{var u;return o.step!==a.step&&!((u=r[o.step])!=null&&u.has(a.step))};return t.forEach((o,a)=>{let{field:u,path:c}=o,l=t.slice(0,a).find(d=>d.field.key===u.key&&!s(d,o));Qt.has(u.key)?n.push(g("reserved-key",`${c}/key`,`"${u.key}" is a built-in object property name`,"Rename the field key")):l&&n.push(g("duplicate-key",`${c}/key`,`key "${u.key}" is already used by ${l.path} on the same path`,"Rename one of the fields, or move them to route branches that never meet"));}),n}function rt(e){var r,s;let{definition:t}=e;return [...!!((r=t.fields)!=null&&r.length)&&!!((s=t.steps)!=null&&s.length)?[g("fields-and-steps","",'the definition has both "fields" and "steps"','Move the top-level fields into a step, or remove "steps"')]:[],...en(e),...tn(e)]}var nn=Object.freeze({required:"This field is required",minLength:"Must be at least {min} characters",maxLength:"Must be at most {max} characters",minItems:"Must be at least {min} items",maxItems:"Must be at most {max} items",min:"Must be at least {min}",max:"Must be at most {max}",pattern:"Invalid format",matchField:"Fields must match",email:"Enter a valid email",number:"Enter a number",date:"Enter a valid date",datetime:"Enter a valid date and time",option:"Select one of the available options",options:"Must be a list of available options",boolean:"Must be true or false",string:"Must be text",file:"Must be a file reference",value:"Invalid value"});function st(e,t){return e.replace(/\{(\w+)\}/g,(n,r)=>Object.prototype.hasOwnProperty.call(t,r)?String(t[r]):n)}function rn(e,t,n,r,...s){for(let i of r){let o=typeof i=="function"?i(t,n,...s):i==null?void 0:i[t];if(o&&typeof o=="string")return typeof i=="function"?o:st(o,n)}return st(e[t],n)}function M(...e){return (t,n,r)=>rn(nn,t,n,e,r)}var _=["checkbox","switch"],Q=["text","email","phone","number","password","select","autocomplete","multiselect","checkbox","radio","switch","file","date","datetime","textarea"],Z=1e4,sn=254,on=1e3,it=/^[^\s@]+@[^\s@.]+(?:\.[^\s@.]+)+$/,an=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/,ot="\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])",un=new RegExp(`^${ot}$`),ln=new RegExp(`^${ot}T(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d{1,3})?)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)?$`),cn=new Set(["text","phone","password","textarea","autocomplete"]),fn=new Map([["email",[it,"email",sn]],["date",[un,"date",Z]],["datetime",[ln,"datetime",Z]]]);function dn(e){let[t,n,r]=e.split(/\D/).map(Number);return r<=new Date(new Date(0).setUTCFullYear(t,n,0)).getUTCDate()}var pn=new Set(["password","number","select","radio","file"]);function D(e,t){return typeof t=="string"&&!pn.has(e.type)?t.trim():t}function at(e,t){let n=D(e,t);if(e.type!=="number"||typeof n!="string"||!an.test(n))return n;let r=Number(n);return Number.isFinite(r)?r:n}var ut=e=>e.optionsFrom?void 0:e.options;function lt(e,t){let n=ut(e);return !n||n.some(r=>r.value===t)}function ct(e,t,n){var s,i,o,a;let r=Math.min(Z,(i=(s=e.validation)==null?void 0:s.maxLength)!=null?i:Z);return t.length<=r?null:(a=(o=e.validation)==null?void 0:o.maxLengthMessage)!=null?a:n("maxLength",{max:r})}function mn(e,t,n){var s,i;return Array.isArray(t)?t.length>((i=(s=ut(e))==null?void 0:s.length)!=null?i:on)?n("option"):t.every(o=>typeof o=="string"&&o.length<=Z&&lt(e,o))?null:n("option"):n("options")}function ie(e,t,n,r){return typeof t=="string"?ct(e,t,r):r(n)}function gn(e,t,[n,r,s],i){var o;return typeof t!="string"?i(r):(o=ct(e,t,i))!=null?o:t.length<=s&&n.test(t)&&(n===it||dn(t))?null:i(r)}function yn(e,t,n){return typeof t=="boolean"||typeof t=="number"&&Number.isFinite(t)?null:ie(e,t,"value",n)}function hn(e,t){return t==null||t===""||e.type==="multiselect"&&Array.isArray(t)&&!t.length}function Me(e,t,n=M()){var i;if(hn(e,t))return null;let r=(o,a={})=>n(o,a,e);if(_.includes(e.type))return typeof t=="boolean"?null:r("boolean");if(e.type==="number")return typeof t=="number"&&Number.isFinite(t)?null:r("number");if(e.type==="multiselect")return mn(e,t,r);if(e.type==="file")return ie(e,t,"file",r);let s=fn.get(e.type);return s?gn(e,t,s,r):e.type==="select"||e.type==="radio"?(i=ie(e,t,"option",r))!=null?i:lt(e,t)?null:r("option"):cn.has(e.type)?ie(e,t,"string",r):yn(e,t,r)}function ft(e,t,n){return e.type==="file"||!Q.includes(e.type)?null:Me(e,t,n)}var bn=["in","notIn"],Fn=["gt","gte","lt","lte"],vn=["text","email","phone","password","textarea","date","datetime","select","radio","autocomplete"];function kn(e){return e.type==="number"?"number":_.includes(e.type)?"boolean":vn.includes(e.type)?"string":void 0}function Sn(e,t,n,r){var l;let s=(d,f)=>[E("condition-value-mismatch",r,d,f)];if(t==="notEmpty")return [];if(Fn.includes(t))return e.type!=="multiselect"&&!_.includes(e.type)?[]:s(`"${e.key}" is a ${e.type} field, so "${t}" never matches it`,"Compare a number, text, radio or select field");if(e.type==="multiselect"){let d=t==="neq"||t==="notIn"?"always":"never";return s(`"${e.key}" holds a list of values, so "${t}" ${d} matches it`,"Use notEmpty, or a select or radio field")}let i=bn.includes(t)&&Array.isArray(n)?n:[n],o=kn(e),a=o&&i.find(d=>typeof d!==o);if(o&&a!==void 0)return s(`${JSON.stringify(a)} is a ${typeof a}, but "${e.key}" holds a ${o}`,`Use a ${o} value`);let u=o==="string"&&!e.optionsFrom&&((l=e.options)!=null&&l.length)?e.options.map(d=>d.value):null,c=u&&i.find(d=>!u.includes(d));return u&&c!==void 0?s(`${JSON.stringify(c)} is not an option of "${e.key}"`,N(u)):[]}function wn(e,t){let{condition:n,path:r}=t;if(xe(e,t).length)return [];let s=z.find(i=>i in n);return Sn(e.keys.get(n.field).field,s,n[s],`${r}/${s}`)}function xn({field:e,path:t}){if(!["select","radio","multiselect"].includes(e.type))return [];if(!Array.isArray(e.options))return e.optionsFrom?[]:[E("missing-options",`${t}/options`,`the ${e.type} field "${e.key}" has no options`,'Add "options" or "optionsFrom"')];let n=e.options.map(i=>i.value),r=e.type==="multiselect"&&Array.isArray(e.defaultValue)?e.defaultValue:[e.defaultValue],s=e.defaultValue===void 0||!n.length||e.optionsFrom?void 0:r.find(i=>!n.includes(i));return s===void 0?[]:[E("default-not-in-options",`${t}/defaultValue`,`${JSON.stringify(s)} is not an option of "${e.key}"`,N(n))]}function En(e,{field:t,path:n}){var d;let r=(d=t.validation)!=null?d:{},s=(f,y,h)=>E("rule-not-applicable",`${n}/validation/${f}`,y,h),i=Q.includes(t.type),o=t.type==="number",a=i&&!o?["min","max"].filter(f=>r[f]!==void 0):[],u=i&&["number","checkbox","switch"].includes(t.type)?["minLength","maxLength"].filter(f=>r[f]!==void 0):[],c=[...a.map(f=>s(f,`"${f}" applies to number fields only`,`Use ${f}Length to limit text length`)),...u.map(f=>s(f,`"${f}" does not apply to ${t.type} fields`,o?"Use min and max for numbers":`Remove ${f}`))],{validators:l}=e;return r.validator!==void 0&&l&&!Object.prototype.hasOwnProperty.call(l,r.validator)&&c.push(E("unknown-validator",`${n}/validation/validator`,`the validator "${r.validator}" is not registered`,'Pass it in the "validators" option')),c}function In(e,t){var i;let{field:n,path:r}=t,s=Q.includes(n.type)?void 0:we(n.type,Q);return [...s===void 0?[]:[E("unknown-field-type",`${r}/type`,`"${n.type}" is not a built-in field type`,`Use "${s}", or register a component for "${n.type}"`)],...xn(t),...En(e,t),...((i=n.optionsDependsOn)!=null?i:[]).flatMap((o,a)=>e.keys.has(o)?[]:[E("unknown-field",`${r}/optionsDependsOn/${a}`,`"${o}" is not a field key`,Y(o,e.keyList))])]}function Cn({definition:e}){var n;let t=(n=e.steps)!=null?n:[];return t.flatMap((r,s)=>{var a,u,c;let i=[],o=new Set(((a=r.routes)!=null?a:[]).map(l=>l.to).filter(l=>l!==null));for(let l of o){let d=t.findIndex(h=>h.id===l),f=t[d+1],y=(c=(u=t[d])==null?void 0:u.routes)==null?void 0:c.some(h=>{var v,x;return !((v=h.show)!=null&&v.length)&&!((x=h.showAny)!=null&&x.length)});!f||!o.has(f.id)||y||i.push(E("route-fallthrough",`/steps/${d}`,`branch "${l}" from "${r.id}" continues into the sibling branch "${f.id}"`,`Add an unconditional route on "${l}" to the step where the branches meet`));}return r.skip&&(r.next===false||!t[1])&&i.push(E("skip-unreachable",`/steps/${s}/skip`,`step "${r.id}" has "skip" but no Continue button or later step`,'Remove "skip", or remove "next": false')),i})}function dt(e){return [...typeof e.definition.title=="string"?[]:[E("missing-property","/title",'"title" must be a string',"Add a title for host UI and editors")],...e.conditions.flatMap(t=>wn(e,t)),...e.entries.flatMap(t=>In(e,t)),...Cn(e)]}function De(e,{validators:t,suggest:n,warnings:r}={}){let s=Qe(e);if(s.length)return s;let i=He(e,t,n);return [...et(e),...rt(i),...Ge(i),...Ye(i),...ze(i),...r?r(i):[]]}function pt(e){return De(e)}function oe(e,t={}){return De(e,{validators:t.validators,suggest:Y,warnings:dt})}function ae(e,t){let n=De(e,{suggest:Y});if(n.length)throw new R(n);return e}function ue(e){var t,n;return [...(t=e.show)!=null?t:[],...(n=e.showAny)!=null?n:[]].map(r=>r.field)}function le(e){var t,n;return (t=e.steps)!=null&&t.length?e.steps.flatMap(r=>r.fields):(n=e.fields)!=null?n:[]}function q(e,t){let n={};for(let s of e)s.defaultValue!==void 0&&(n[s.key]=s.defaultValue);let r=t!=null?t:{};for(let s of Object.keys(r))s!=="__proto__"&&(n[s]=r[s]);return n}function A(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);return new Set([...n].filter(r=>!Object.is(e[r],t[r])))}var Ve=class extends Error{constructor(n,r){super(`The action completed, but ${n} failed: ${r instanceof Error?r.message:String(r)}`);this.phase=n;this.committed=true;this.name="FormLifecycleError",this.cause=r;}};async function ce(e,t){try{await t();}catch(n){throw new Ve(e,n)}}function mt(e){return e.visibleSteps.map(t=>t.id).join(`
5
+ `)}function ee(e,t){let n=mt(e),r=Object.keys(t).filter(s=>t[s]!==void 0).map(s=>[s,e.values[s]]);return ()=>mt(e)!==n||r.some(([s,i])=>!Object.is(e.values[s],i))}function I(e,t){var r,s;let n=i=>Se(i,t);return ((r=e.show)!=null?r:[]).every(n)&&(!((s=e.showAny)!=null&&s.length)||e.showAny.some(n))}function Rn(e,t){return W(e)||e===false&&_.includes(t.type)}function gt(e,t,n,r){var o,a;let s=n[`min${t}`],i=n[`max${t}`];if(s!==void 0&&e<s)return (o=n[`min${t}Message`])!=null?o:r("min",{min:s});if(i!==void 0&&e>i)return (a=n[`max${t}Message`])!=null?a:r("max",{max:i})}function $n(e,t,n){var r;if(t.pattern!==void 0)try{return new RegExp(t.pattern).test(String(e))?void 0:(r=t.patternMessage)!=null?r:n()}catch(s){return}}function Mn(e,t,n,r){if(typeof e=="number")return gt(e,"",t,(i,o)=>r(i,o,n));if(typeof e!="string"&&!Array.isArray(e))return;let s=Array.isArray(e)?"Items":"Length";return gt(e.length,"Length",t,(i,o)=>r(`${i}${s}`,o,n))}function U(e,t,n,r,s){var l,d,f,y,h;let i=D(e,t),o=(l=e.validation)!=null?l:{},a=M(s),u=()=>{var v;return (v=o.matchFieldMessage)!=null?v:a("matchField",{},e)};if(Rn(i,e))return o.required?typeof o.required=="string"?o.required:a("required",{},e):o.matchField!==void 0&&!W(n[o.matchField])?u():null;let c=ft(e,i,a);return c||((h=(f=(d=Mn(i,o,e,a))!=null?d:$n(i,o,()=>a("pattern",{},e)))!=null?f:o.matchField!==void 0&&i!==n[o.matchField]?u():void 0)!=null?h:o.validator?(y=r==null?void 0:r[o.validator])==null?void 0:y.call(r,i,n):void 0)||null}function L(e,t,n,r){return fe(e.fields,t,n,r)}function fe(e,t,n,r){let s={};for(let i of e){if(!I(i,t))continue;let o=U(i,t[i.key],t,n,r);o&&(s[i.key]=o);}return s}function T(e,t,n=false,r=[]){let{state:s}=e,i=e.errors,o={},a=[...r];for(let[c,l]of Object.entries(t))e.visibility.activeField(c,e.values)?o[c]=l:a.push(l);n&&(s.serverErrors=o,s.serverFormErrors=a),s.errors=m(m({},s.serverErrors),o),s.topLevelErrors=n?a:[...s.serverFormErrors,...a];let u=n&&yt(e,o);e.notify({fieldKeys:A(i,e.errors),structureChanged:u});}function yt(e,t){let n=e.visibleSteps.findIndex(r=>r.fields.some(s=>t[s.key]!==void 0));return n<0||n===e.currentStepIndex?false:(e.state.currentStepIndex=n,true)}function de(e,t,n=false){n&&delete e.state.serverErrors[t];let r=e.state.serverErrors[t];r===void 0?delete e.errors[t]:e.errors[t]=r;}function B(e,t){for(let n of t)delete e.state.serverErrors[n];}function ht(e,t){var r;let n=[];for(let s of e.visibility.allFields)((r=s.validation)==null?void 0:r.matchField)!==t||e.errors[s.key]===void 0||U(s,e.values[s.key],j(e),e.validators,e.messages)||(de(e,s.key),n.push(s.key));return n}function pe(e){let t=new Set(e.visibleSteps.flatMap(r=>r.fields.map(s=>s.key))),n=Object.keys(e.errors).filter(r=>!t.has(r));for(let r of n)delete e.errors[r];return B(e,n),n}function j(e){return G(e)}function Dn(e,t){for(let n of [...e.skipped.values()].flat())delete t[n];return t}function te(e,t=false){var i;let n=e.errors,r={};if(e.isMultiStep)for(let o of e.visibleSteps)e.skipped.has(o.id)||Object.assign(r,L(o,j(e),e.validators,e.messages));else Object.assign(r,fe((i=e.definition.fields)!=null?i:[],j(e),e.validators,e.messages));e.state.errors=m(m({},e.state.serverErrors),r);let s=t&&yt(e,r);return e.notify({fieldKeys:A(n,r),structureChanged:s}),r}function bt(e,t){let n=e.visibility.activeField(t,e.values);if(!n)return null;let r=e.errors[t],s=U(n,e.values[t],j(e),e.validators,e.messages);s?e.errors[t]=s:de(e,t,true);let i=Object.is(r,e.errors[t])?[]:[t];return e.notify({fieldKeys:i}),s}function G(e){let t=m({},e.visibility.conditionValues(e.values));for(let n of Object.keys(t)){let r=e.visibility.activeField(n,e.values);r&&(t[n]=D(r,t[n]));}return Dn(e,t)}function Ft(e,t){let n=e.values,r=e.errors,s=Object.keys(e.fieldLoading);e.validationEpoch++,e.operationEpoch++,e.state.submitting=false,e.state.values=q(e.visibility.allFields,t),e.state.errors={},e.state.topLevelErrors=[],e.state.serverErrors={},e.state.serverFormErrors=[],e.state.fieldLoading={},e.state.stepValidating=false,e.state.currentStepIndex=0,e.skipped.clear(),e.visibility.reconcileHidden(e.values,e.errors);let i=A(n,e.values),o=new Set([...i,...A(r,e.errors),...s]);e.notify({fieldKeys:o,structureChanged:true,valuesChanged:i.size>0});}function Oe(e,t){var o,a;let n=(o=e.steps)!=null?o:[],r=new Map(n.map((u,c)=>[u.id,c])),s=[],i={};for(let u=0;u<n.length;){let c=n[u];if(!I(c,i)){u++;continue}s.push(c),Object.assign(i,kt(c,t,i));let l=(a=c.routes)==null?void 0:a.find(d=>{var f;return I(d,i)&&(d.to===null||((f=r.get(d.to))!=null?f:-1)>u&&I(n[r.get(d.to)],i))});if((l==null?void 0:l.to)===null)break;u=l?r.get(l.to):u+1;}return s}function vt(e,t,n){var o;let r=(o=e[n])!=null?o:e[e.length-1],s=t.findIndex(a=>a.id===(r==null?void 0:r.id));if(s!==-1)return s;let i=new Map(t.map((a,u)=>[a.id,u]));for(let a=Math.min(n-1,e.length-1);a>=0;a--){let u=i.get(e[a].id);if(u!==void 0)return u}return 0}function kt(e,t,n){let r=m({},n);for(let i of e.fields)r[i.key]=D(i,t[i.key]);let s={};for(let i of e.fields)I(i,r)&&t[i.key]!==void 0&&(s[i.key]=D(i,t[i.key]));return s}function St(e){let t=null,n=[],r={},s=i=>{var u,c;if(t===i)return;t=i,n=Oe(e,i);let o={},a=(u=e.steps)!=null&&u.length?n:[{fields:(c=e.fields)!=null?c:[]}];for(let l of a)Object.assign(o,kt(l,i,o));r=o;};return {invalidate(){t=null;},steps(i){return s(i),n},values(i){return s(i),r}}}function wt(e){var r,s;let t=(s=(r=e.currentStep)==null?void 0:r.fields)!=null?s:[],n=m({},e.values);for(let{key:i}of t)delete n[i];return Object.assign(n,q(t))}function Ae(e){return Oe(e.definition,wt(e))[e.currentStepIndex+1]}function me(e){let t=e.currentStep,n=t.fields.map(({key:s})=>s);e.state.values=wt(e);for(let s of n)delete e.errors[s];B(e,n),e.skipped.set(t.id,n),B(e,e.visibility.reconcileHidden(e.values,e.errors)),e.visibility.markChanged(true,true);let r=pe(e);return e.notify({fieldKeys:[...n,...r],structureChanged:true,valuesChanged:true}),n}function ge(e){let t=e.currentStep;t&&e.skipped.delete(t.id);}function xt(e,t){return e.state.currentStepIndex=t,e.notify({structureChanged:true}),me(e)}function Le(e){return !!e&&Object.getPrototypeOf(e)===Object.prototype&&e.ok===false}function Vn(e,t,n){let r={},s=typeof t.errors=="object"&&t.errors?t.errors:{};for(let[o,a]of Object.entries(s)){let u=Array.isArray(a)?a.join(" "):a;typeof u=="string"&&Object.is(e.values[o],n[o])&&(r[o]=u);}let i=Array.isArray(t.formErrors)?t.formErrors.filter(o=>typeof o=="string"):[];T(e,r,true,i);}async function ye(e,t,n=false){if(e.submitting||e.stepValidating)return false;n||ge(e);let r=m({},e.lifecycle),s=false,i=e.validationEpoch,o=++e.operationEpoch,a=G(e),u=ee(e,a),c=()=>i!==e.validationEpoch||o!==e.operationEpoch||u();e.state.submitting=true,e.notify();try{if(c()||Object.keys(te(e,!0)).length>0||c())return !1;if(r.onBeforeSubmit){let v=await r.onBeforeSubmit(a);if(c()||v===!1)return !1}if(c())return !1;if(r.onBeforeSubmit){if(Object.keys(te(e,!0)).length>0||c())return !1;a=G(e);}s=!0;let l=[...e.skipped.keys()],d=m({},e.values),f=e.state.serverErrors,y=await t(a,[...l]),h=Le(y);return o!==e.operationEpoch?!h:h?(Vn(e,y,d),!1):(e.state.serverErrors===f&&T(e,{},!0),await ce("afterSubmit",()=>{var v;return (v=r.onAfterSubmit)==null?void 0:v.call(r,a,l)}),!0)}catch(l){if(!s&&c())return false;throw l}finally{o===e.operationEpoch&&(e.state.submitting=false,e.notify());}}function Et(e){let t=e.currentStep;if(!t)return true;let n=L(t,j(e),e.validators,e.messages);if(Object.keys(n).length===0)return false;let r=e.errors;return e.state.errors=m(m({},r),n),e.notify({fieldKeys:A(r,e.errors)}),true}function It(e,t){e.validationEpoch++,e.state.currentStepIndex=t,e.notify({structureChanged:true});}async function Ct(e,t){var l;if(!e.isMultiStep||e.stepValidating||e.submitting||!((l=e.currentStep)!=null&&l.skip))return false;if(Ae(e))return he(e,"next","skip");let n=e.currentStep;if(!t||!n)return false;let r=e.values,s=m({},e.errors),i=m({},e.state.serverErrors),o,a=me(e),u=e.values,c=ee(e,m({},u));try{return await ye(e,async(d,f)=>{let y=e.operationEpoch,h=await t(d,f),v=Le(h);return (!v||y===e.operationEpoch)&&(o=v),h},!0)}finally{o!==false&&e.values===u&&!c()&&(e.state.values=r,o===void 0&&(e.state.serverErrors=i),e.state.errors=m(m({},o?{}:s),e.errors),e.skipped.delete(n.id),e.notify({fieldKeys:a,structureChanged:true,valuesChanged:true}));}}async function he(e,t,n=t){let r=n==="skip";if(!e.isMultiStep||e.stepValidating||e.submitting||!r&&(t==="next"?e.isLastStep:e.isFirstStep))return false;let s=e.currentStep,i=t==="next"&&!r;if(i&&ge(e),i&&Et(e))return false;let o=m({},e.lifecycle),a=e.onStepValidate,u=false,l=e.currentStepIndex+(t==="next"?1:-1),d=r?Ae(e):e.visibleSteps[l];if(!d)return false;let f={fromStepId:s.id,toStepId:d.id,reason:n,values:m({},j(e))},y=e.validationEpoch,h=++e.operationEpoch,v=ee(e,f.values),x=()=>{var k;return y!==e.validationEpoch||h!==e.operationEpoch||((k=e.currentStep)==null?void 0:k.id)!==s.id||v()};e.state.stepValidating=true,e.notify();try{if(x())return !1;if(i&&a){let k=await a(s.id,f.values);if(x())return !1;if(k&&Object.keys(k).length>0)return T(e,k),!1}if(o.onBeforeStepChange){let k=await o.onBeforeStepChange(f);if(x()||k===!1)return !1}return x()||i&&Et(e)?!1:(u=!0,r&&me(e),It(e,l),await ce("afterStepChange",()=>{var k;return (k=o.onAfterStepChange)==null?void 0:k.call(o,f)}),!0)}catch(k){if(!u&&x())return false;throw k}finally{h===e.operationEpoch&&(e.state.stepValidating=false,e.notify());}}function Rt(e,t){if(!e.isMultiStep)return;let n=e.visibility.findStepIndex(t,e.values,e.currentStepIndex);n===e.currentStepIndex?e.notify():n!==null&&It(e,n);}function $t(e,t){return e.add(t),()=>e.delete(t)}function Mt(){let e=0,t=0,n=new Set,r=new Set,s=new Map,i=new Map;return {subscribe:o=>$t(n,o),getSnapshot:()=>e,subscribeStructure:o=>$t(r,o),getStructureSnapshot:()=>t,getFieldSnapshot:o=>{var a;return (a=s.get(o))!=null?a:0},subscribeField(o,a){var c;let u=(c=i.get(o))!=null?c:new Set;return u.add(a),i.set(o,u),()=>{u.delete(a),u.size===0&&i.delete(o);}},notify({fieldKeys:o=[],structureChanged:a=false}={}){var u,c;for(let l of new Set(o)){s.set(l,((u=s.get(l))!=null?u:0)+1);for(let d of (c=i.get(l))!=null?c:[])d();}if(a){t++;for(let l of r)l();}e++;for(let l of n)l();}}}function On(e,t){try{if(process.env.NODE_ENV!=="production")return oe(e,{validators:t})}catch(n){if(!(n instanceof ReferenceError))throw n}}function Dt(e,t,n){var o,a;let r=(o=On(e,n))!=null?o:pt(e),s=r.filter(Be);if(s.length)throw new R(s);let i=(a=t.onWarning)!=null?a:(u=>console.warn(`[formhaus] ${u.message}`));for(let u of r)i(u);}function je(e,t){var n;for(let r of ue(e)){let s=(n=t.get(r))!=null?n:new Set;s.add(e),t.set(r,s);}}function be(e){var v,x,k;let t=le(e),n=new Map,r=new Set,s=St(e),i=new Map,o=new Map,a=new Map,u=true,c=true,l={visibleSteps:[],currentStep:null,visibleFields:[],canGoNext:false};for(let p of t)n.set(p.key,[...(v=n.get(p.key))!=null?v:[],p]),je(p,i);for(let p of (x=e.steps)!=null?x:[]){for(let b of p.fields)a.set(b,p);je(p,o);for(let b of (k=p.routes)!=null?k:[])for(let F of ue(b))r.add(F);}let d=()=>{var p;return ((p=e.steps)!=null?p:[]).length>0},f=(p,b)=>I(p,s.values(b)),y=(p,b)=>{let F=a.get(p);return !F||s.steps(b).includes(F)};function h(p,b){var C,V,H;if(!u)return l;if(u=false,!d())return l.visibleSteps=[],l.currentStep=null,l.visibleFields=((C=e.fields)!=null?C:[]).filter(P=>f(P,p)),l;let F=l.visibleSteps=s.steps(p),S=l.currentStep=(H=(V=F[b])!=null?V:F[F.length-1])!=null?H:null;return l.visibleFields=S?S.fields.filter(P=>f(P,p)):[],l}return {allFields:t,conditionValues:s.values,state:h,markChanged(p,b){(p||b)&&s.invalidate(),p&&(u=true),(p||b)&&(c=true);},getCanGoNext(p,b,F){let S=h(p,b).currentStep;if(!c)return l.canGoNext;c=false;let C=S?L(S,s.values(p),F):{};return l.canGoNext=d()&&Object.keys(C).length===0},findStepIndex(p,b,F){let S=h(b,F).visibleSteps.findIndex(C=>C.fields.some(V=>V.key===p));return S===-1?null:S},affectsStructure(p,b){return r.has(p)||i.has(p)||o.has(p)||b.size>0},activeField(p,b){var F;return (F=n.get(p))==null?void 0:F.find(S=>y(S,b)&&f(S,b))},reconcileHidden(p,b){var P,Pe;s.invalidate();let F=[...new Set([...i.keys(),...o.keys()])],S=new Set(F),C=new Set,V=w=>p[w]!==void 0||b[w]!==void 0,H=w=>{delete p[w],delete b[w],s.invalidate(),C.add(w),!S.has(w)&&(S.add(w),F.push(w));};for(let w=0;w<F.length;w++){let ve=F[w];S.delete(ve);for(let O of (P=i.get(ve))!=null?P:[])y(O,p)&&!f(O,p)&&V(O.key)&&H(O.key);for(let O of (Pe=o.get(ve))!=null?Pe:[])if(!f(O,p))for(let Ne of O.fields)V(Ne.key)&&H(Ne.key);}return C}}}var Fe=class{constructor(t,n,r){this.definition=t;this.skipped=new Map;this.validationEpoch=0;this.operationEpoch=0;this.subscriptions=Mt();var i;this.lifecycle=r!=null?r:{},this.validators=(i=r==null?void 0:r.validators)!=null?i:{},Dt(t,this.lifecycle,this.validators),this.messages=M(r==null?void 0:r.messages,t.messages),this.visibility=be(t);let s=q(this.visibility.allFields,n);this.state={values:s,errors:{},topLevelErrors:[],serverErrors:{},serverFormErrors:[],currentStepIndex:0,fieldLoading:{},stepValidating:false,submitting:false},this.visibility.reconcileHidden(s,this.state.errors);}get onStepValidate(){return this.lifecycle.onStepValidate}get values(){return this.state.values}get errors(){return this.state.errors}get topLevelErrors(){return this.state.topLevelErrors}get currentStepIndex(){return this.state.currentStepIndex}get fieldLoading(){return this.state.fieldLoading}get stepValidating(){return this.state.stepValidating}get submitting(){return this.state.submitting}get isMultiStep(){var t;return ((t=this.definition.steps)!=null?t:[]).length>0}get visibleSteps(){return this.view.visibleSteps}get currentStep(){return this.view.currentStep}get visibleFields(){return this.view.visibleFields}get isFirstStep(){return this.currentStepIndex===0}get isLastStep(){return this.currentStepIndex>=this.visibleSteps.length-1}get canGoNext(){return this.visibility.getCanGoNext(this.state.values,this.currentStepIndex,this.validators)}get stepErrors(){let t={};for(let n of this.visibleSteps){let r=n.fields.map(s=>s.key).filter(s=>this.errors[s]!==void 0);r.length>0&&(t[n.id]=r);}return t}get progress(){let t=this.visibleSteps.length;return {current:Math.min(this.currentStepIndex+1,t),total:t}}subscribe(t){return this.subscriptions.subscribe(t)}getSnapshot(){return this.subscriptions.getSnapshot()}subscribeField(t,n){return this.subscriptions.subscribeField(t,n)}getFieldSnapshot(t){return this.subscriptions.getFieldSnapshot(t)}subscribeStructure(t){return this.subscriptions.subscribeStructure(t)}getStructureSnapshot(){return this.subscriptions.getStructureSnapshot()}setValue(t,n){let{values:r,errors:s}=this.state,i=this.isMultiStep?this.visibleSteps:null,o=!Object.is(r[t],n),a=s[t];r[t]=n,de(this.internals,t,o);for(let[y,h]of this.skipped)o&&h.includes(t)&&this.skipped.delete(y);let u=this.visibility.reconcileHidden(r,s);B(this.internals,u);let c=ht(this.internals,t),l=new Set([...u,...c]);(o||a!==s[t])&&l.add(t);let d=o||u.size>0,f=d&&this.visibility.affectsStructure(t,u);if(i&&f){this.visibility.markChanged(true,true),this.state.currentStepIndex=vt(i,this.visibleSteps,this.currentStepIndex);for(let y of pe(this.internals))l.add(y);}this.notify({fieldKeys:l,structureChanged:f,valuesChanged:d});}setErrors(t){T(this.internals,t,true);}setFieldLoading(t,n){let r=this.state.fieldLoading[t]===true;n?this.state.fieldLoading[t]=true:delete this.state.fieldLoading[t],this.notify({fieldKeys:r===n?[]:[t]});}cancelPendingActions(){this.validationEpoch++,this.operationEpoch++,this.state.stepValidating=false,this.state.submitting=false,this.notify();}next(){return he(this.internals,"next")}back(){return he(this.internals,"back")}skip(t){return Ct(this.internals,t)}submit(t){return ye(this.internals,t)}isStepSkipped(t){return this.skipped.has(t)}validate(){return te(this.internals)}validateField(t){return bt(this.internals,t)}getSubmitValues(){return G(this.internals)}goToStepWithField(t){Rt(this.internals,t);}reset(t){Ft(this.internals,t);}get view(){return this.visibility.state(this.state.values,this.currentStepIndex)}get internals(){return this}notify(t={}){this.visibility.markChanged(!!t.structureChanged,!!t.valuesChanged),this.subscriptions.notify(t);}};var An='Pass the values object as the second argument, not the request body with "values" and "skippedSteps".',Ln=()=>null,Te=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function jn(e,t,n){var a;let r=n!==null&&typeof n=="object"&&!Array.isArray(n)?n:{},s=be(e),i=[...new Set(t.map(({key:u})=>u))].filter(u=>Te(r,u)),o={values:{},active:new Map};for(let u=0;u<=t.length;u++){let c={};for(let f of i)c[f]=at((a=o.active.get(f))!=null?a:t.find(y=>y.key===f),r[f]);let l=new Map;for(let f of i){let y=s.activeField(f,c);y&&l.set(f,y);}let d=i.every(f=>l.get(f)===o.active.get(f));if(o={values:c,active:l},d)break}return o}function Tn({values:e,active:t},n){let r=new Map;for(let[s,i]of t){let o=Me(i,e[s],n);o&&r.set(s,o);}return r}function Pn(e,t){var s;let n=i=>i.map(o=>t.has(o.key)?ke(m({},o),{validation:void 0}):o),r=(s=e.steps)==null?void 0:s.map(i=>ke(m({},i),{fields:n(i.fields)}));return m(m(m({},e),e.fields&&{fields:n(e.fields)}),r&&{steps:r})}function Nn(e,t={}){let n={};for(let{validation:r}of e)r!=null&&r.validator&&(n[r.validator]=Ln);return m(m({},n),t)}function Kn(e,t){return t===null||typeof t!="object"||!Te(t,"values")?false:!e.some(n=>n.key==="values"||n.key==="skippedSteps")}function _n(e,t){if(!Array.isArray(t))return;let n=new Set(t);for(let r=0;r<e.visibleSteps.length;r++){let s=e.visibleSteps[r];s.skip&&n.has(s.id)&&xt(e,r);}}function qn(e,t,n={}){ae(e);let r=le(e),s=jn(e,r,t),i=M(n.messages,e.messages),o=Tn(s,i),a={validators:Nn(r,n.validators),messages:i,onWarning:()=>{}},u=new Fe(Pn(e,o),s.values,a);_n(u,n.skippedSteps);let c=u.validate(),l=u.getSubmitValues();for(let[d,f]of o)Te(l,d)&&(c[d]=f);return Kn(r,t)&&(c.values=An),{values:l,errors:c}}exports.FormDefinitionError=R;exports.checkDefinition=oe;exports.parseDefinition=ae;exports.validateSubmission=qn;return exports;})({});//# sourceMappingURL=server.iife.js.map
6
6
  //# sourceMappingURL=server.iife.js.map