@formhaus/core 0.12.0 → 0.13.1

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 (45) 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-35SAVPYL.js +2 -0
  4. package/dist/chunk-35SAVPYL.js.map +1 -0
  5. package/dist/chunk-76YV4J3Q.js +3 -0
  6. package/dist/chunk-76YV4J3Q.js.map +1 -0
  7. package/dist/chunk-PBTYUSZR.js +2 -0
  8. package/dist/chunk-PBTYUSZR.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-RN5GQHKN.js +5 -0
  12. package/dist/chunk-RN5GQHKN.js.map +1 -0
  13. package/dist/{chunk-KXLWZLOO.js → chunk-YTUVSJUF.js} +3 -3
  14. package/dist/{chunk-KXLWZLOO.js.map → chunk-YTUVSJUF.js.map} +1 -1
  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 +24 -6
  26. package/dist/internal.js +1 -1
  27. package/dist/internal.js.map +1 -1
  28. package/dist/{runtime-Dn2_UIxt.d.ts → runtime-BN2PuKD7.d.ts} +6 -2
  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/choices.json +3 -8
  36. package/fixtures/submissions/messages.json +155 -0
  37. package/fixtures/submissions/single-step.json +3 -4
  38. package/package.json +6 -1
  39. package/schema/form-definition.schema.json +236 -0
  40. package/schema/form-translation.schema.json +222 -0
  41. package/dist/chunk-OBVVPPVA.js +0 -3
  42. package/dist/chunk-OBVVPPVA.js.map +0 -1
  43. package/dist/chunk-OZ352IOK.js +0 -5
  44. package/dist/chunk-OZ352IOK.js.map +0 -1
  45. package/dist/validate-field-dZd5yZAp.d.ts +0 -19
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-KXLWZLOO.js';import {E}from'./chunk-OBVVPPVA.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 E(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-YTUVSJUF.js';import {u}from'./chunk-76YV4J3Q.js';import {c as c$1}from'./chunk-PZEBYRGE.js';import {c}from'./chunk-35SAVPYL.js';var K={multiselect:"list",checkbox:"flag",switch:"flag",number:"number",file:"file"};function b(e){return [...e.fields??[],...(e.steps??[]).flatMap(n=>n.fields)]}function C(e){return K[e.type]??"text"}function U(e,n){if(!Array.isArray(e.options))return true;let o=new Set(e.options.map(i=>String(i.value)));return (Array.isArray(n)?n:[n]).every(i=>o.has(String(i)))}function z(e,n,o){if(e&&C(e)!==C(n))return false;switch(C(n)){case "list":return Array.isArray(o);case "flag":return typeof o=="boolean";case "number":return typeof o=="number";case "text":return typeof o=="string";default:return e!==void 0}}function _(e,n,o){let i=new Map(o?b(o).map(t=>[t.key,t]):[]),l={};for(let t of b(n)){let s=e[t.key];s!=null&&z(i.get(t.key),t,s)&&U(t,s)&&(l[t.key]=s);}return l}function L(e,n){let o=new Set(b(e).map(t=>t.key)),i={},l=new Set;for(let[t,s]of Object.entries(n))o.has(t)?i[t]=s:l.add(s);return {fields:i,other:[...l]}}function I(e,n,o,i){let l={};for(let t of b(e)){let s=n[t.key]!==void 0&&n[t.key]!==null&&n[t.key]!=="";s&&!(t.key in o)?l[t.key]=b$1:i[t.key]&&(!s||t.key in o)&&(l[t.key]=i[t.key]);}return l}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 q(e,n=[]){return {tone:"error",message:e.message,action:e.action,details:n}}function H(e$1,n){let o=new AbortController,i$1,l=r=>{i$1??(i$1=r.renderToken);let c=i$1===r.renderToken?void 0:i$1;return i({...e$1,version:r.version,renderToken:r.renderToken,firstRenderToken:c})},t=i(e$1),s=e$1.initialForm,f$1=()=>!o.signal.aborted,u=y,m=r=>{u={...u,...r},n.onChange(u);},g$1=r=>m({...r,attempt:u.attempt+1});function E(r){t=l(r);let c=e$1.draftStore?.load(e$1.id,r.version)??null;m({...N(r),revision:u.revision,attempt:u.attempt,initialValues:c});}async function B(r,c){let a$1=u.definition;try{let d$1=await g(e$1,o.signal,r.version);if(!f$1())return;if(d$1.version===void 0||d$1.version<(r.version??0))throw new d(409,"form_updated");let p=a$1?_(c,d$1.definition,a$1):{};t=l(d$1),g$1({definition:d$1.definition,version:d$1.version,settings:f(d$1.settings),initialValues:p,revision:u.revision+1,errors:I(d$1.definition,c,p,r.errors??{}),notice:{tone:"info",message:a,action:null,details:[]}});}catch{f$1()&&g$1({notice:{tone:"error",...c$2(409,"form_updated"),details:[]}});}}async function G(r,c){let a=r instanceof d?r:e(r);if(a.code==="form_updated"&&a.version!==void 0)return B(a,c);if(a.status!==422)return g$1({notice:q(a)});let d$1=a.errors??{},p=u.definition?L(u.definition,d$1):{fields:d$1,other:[]};g$1({errors:p.fields,notice:p.other.length>0?q(a,p.other):null});}return {start(){if(u.loadError&&m({loadError:null}),s){E(s),s=void 0;return}g(e$1,o.signal).then(r=>{f$1()&&E(r);},r=>{f$1()&&(m({loadError:r}),n.onError?.(r));});},dispose(){o.abort();},saveDraft(r){u.definition&&!u.done&&e$1.draftStore?.save(e$1.id,u.version??void 0,j$1(u.definition,r));},again(){m({done:false,errors:{},notice:null,initialValues:null,revision:u.revision+1});},async submit(r,c){u.notice&&m({notice:null});try{let a=await t(r,c);if(!f$1())return;e$1.draftStore?.clear(e$1.id),m({done:!0}),n.onSuccess?.(a);}catch(a){throw f$1()&&(await G(a,r),n.onError?.(a)),a}}}}var M=e=>e.replace(/[^A-Za-z0-9_-]/g,"-");function h(e,n){return `${e?M(e):"fh"}-${M(n)}`}var $='input:not([type="hidden"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';function w(e){return e?.matches($)?e:e?.querySelector($)}function j(e,n){n.scrollIntoView?.({block:"center"}),e.focus({preventScroll:true});}function W(e,n){if(n)return j(n,n);let o=e?.querySelector('[aria-invalid="true"]');o&&j(w(o)??o,o);}function Z(e){let n=e?.ownerDocument.activeElement;return !n||!e?.contains(n)?false:!n.isContentEditable&&!(n.matches("input, select, textarea")&&!["checkbox","radio"].includes(n.type))}function J(e,n){let o=e?.ownerDocument;o&&o.activeElement===o.body&&n?.isConnected&&n.focus();}function Q(e,n,o){let i=e?.querySelector(".fh-form__fields"),l=o&&h(n,o),t=l?i?.querySelector(`[id="${l}"], [id="${l}-error"]`):null;if(l&&!t)return;let s=t?.closest?.(".fh-field")??t??i?.querySelector('[aria-invalid="true"]');(s?.querySelector("input:checked:not(:disabled)")??w(s)??w(i)??e)?.focus();}function X(e,n){let o=Object.keys(n);return o.length===Object.keys(e).length&&o.every(i=>e[i]===n[i])}function Y(e,n){return Object.entries(n).every(([o,i])=>e.errors[o]===i||e.topLevelErrors.includes(i))}function ee(e,n,o){return !n||!X(n,o)||!Y(e,o)}function ne(e,n,...o){return c(c$1,e,n,o)}function ke(e){let n=e;return n.visibility.conditionValues(n.values)}function Se(e){return u(e,"next","autoAdvance")}export{Se as autoAdvance,Z as canMoveFocus,N as cloudStateFor,ke as conditionValues,H as createCloudController,h as fieldDomId,Q as focusField,W as focusProblem,y as initialCloudState,ne as labelFor,J as restoreFocus,ee 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/internal/ids.ts","../src/internal/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","clean","fieldDomId","formId","CONTROLS","firstControl","root","reveal","target","scrollTo","focusProblem","notice","invalid","canMoveFocus","active","restoreFocus","document","focusField","id","chosen","sameErrors","keys","holdsErrors","engine","shouldApplyExternalErrors","labelFor","params","sources","resolveText","DEFAULT_LABELS","conditionValues","internals","autoAdvance","changeStep"],"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","const 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","import { fieldDomId } from './ids';\n\ninterface 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 closest?(selector: string): unknown;\n}\n\ninterface Active {\n matches(selector: string): boolean;\n isContentEditable?: boolean;\n type?: string;\n}\n\ninterface FormRoot extends Focusable {\n ownerDocument: { activeElement: unknown; body: unknown };\n contains(node: never): boolean;\n}\n\ntype Found = Focusable | null | undefined;\n\nconst CONTROLS = 'input:not([type=\"hidden\"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';\n\nfunction firstControl(root: Found): Found {\n return root?.matches(CONTROLS) ? root : root?.querySelector(CONTROLS) as Found;\n}\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 Found;\n if (invalid) reveal(firstControl(invalid) ?? invalid, invalid);\n}\n\nexport function canMoveFocus(form: FormRoot | null | undefined): boolean {\n const active = form?.ownerDocument.activeElement as Active | null | undefined;\n if (!active || !form?.contains(active as never)) return false;\n return !active.isContentEditable && !(active.matches('input, select, textarea') && !['checkbox', 'radio'].includes(active.type!));\n}\n\nexport function restoreFocus(form: FormRoot | null | undefined, target: (Focusable & { isConnected: boolean }) | null): void {\n const document = form?.ownerDocument;\n if (document && document.activeElement === document.body && target?.isConnected) target.focus();\n}\n\nexport function focusField(form: FormRoot | null | undefined, formId: string, key: string | null): void {\n const fields = form?.querySelector('.fh-form__fields') as Found;\n const id = key && fieldDomId(formId, key);\n const chosen = id ? fields?.querySelector(`[id=\"${id}\"], [id=\"${id}-error\"]`) as Found : null;\n if (id && !chosen) return;\n const field = (chosen?.closest?.('.fh-field') ?? chosen ?? fields?.querySelector('[aria-invalid=\"true\"]')) as Found;\n const target = (field?.querySelector('input:checked:not(:disabled)') as Found) ?? firstControl(field) ?? firstControl(fields);\n (target ?? form)?.focus();\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 { canMoveFocus, focusField, focusProblem, restoreFocus } from './focus';\nexport { fieldDomId } from './ids';\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 conditionValues(engine: FormEngine): Record<string, unknown> {\n const internals = engine as unknown as EngineInternals;\n return internals.visibility.conditionValues(internals.values);\n}\n\nexport function autoAdvance(engine: FormEngine): Promise<boolean> {\n return changeStep(engine as unknown as EngineInternals, 'next', 'autoAdvance');\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 {
@@ -26,6 +27,7 @@ interface FormEngineOptions {
26
27
  onBeforeSubmit?: BeforeSubmitFn;
27
28
  onAfterSubmit?: SubmitFn;
28
29
  validators?: Record<string, ValidatorFn>;
30
+ messages?: MessageSource;
29
31
  onStepValidate?: StepValidateFn;
30
32
  onWarning?: (issue: DefinitionIssue) => void;
31
33
  }
@@ -36,8 +38,10 @@ declare class FormEngine<TValues extends object = Record<string, unknown>> {
36
38
  private readonly skipped;
37
39
  private validationEpoch;
38
40
  private operationEpoch;
41
+ private latestOperation;
39
42
  private readonly lifecycle;
40
43
  private readonly validators;
44
+ private readonly messages;
41
45
  private get onStepValidate();
42
46
  private readonly visibility;
43
47
  private readonly subscriptions;
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 Oe=Object.defineProperty,Ae=Object.defineProperties;var Me=Object.getOwnPropertyDescriptors;var qt=Object.getOwnPropertySymbols;var Le=Object.prototype.hasOwnProperty,je=Object.prototype.propertyIsEnumerable;var Ut=(t,e,n)=>e in t?Oe(t,e,{enumerable:true,configurable:true,writable:true,value:n}):t[e]=n,m=(t,e)=>{for(var n in e||(e={}))Le.call(e,n)&&Ut(t,n,e[n]);if(qt)for(var n of qt(e))je.call(e,n)&&Ut(t,n,e[n]);return t},St=(t,e)=>Ae(t,Me(e));var Kt=["eq","neq","in","notIn","notEmpty","gt","gte","lt","lte"];function W(t){return t==null||t===""||Array.isArray(t)&&!t.length}function Te(t){let e=typeof t=="string"&&t.trim()!==""?Number(t):t;return typeof e=="number"&&Number.isFinite(e)?e:void 0}function rt(t,e,n){let r=Te(t);return r!==void 0&&n(r,e)}function wt(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||!W(n):t.gt!==void 0?rt(n,t.gt,(r,i)=>r>i):t.gte!==void 0?rt(n,t.gte,(r,i)=>r>=i):t.lt!==void 0?rt(n,t.lt,(r,i)=>r<i):t.lte!==void 0?rt(n,t.lte,(r,i)=>r<=i):false}var R=class extends Error{constructor(e){super(`Invalid form definition:
3
- ${e.map(n=>n.message).join(`
4
- `)}`),this.name="FormDefinitionError",this.issues=e;}};function Bt(t){return (e,n,r,i)=>m({code:e,severity:t,path:n,message:`${n||"/"}: ${r}.${i?` ${i}.`:""}`},i&&{hint:`${i}.`})}var h=Bt("error"),I=Bt("warning");function it(t){return t.replace(/~/g,"~0").replace(/\//g,"~1")}function Gt(t){return t.severity==="error"}function _(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 Ne(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 Et(t,e){let n=t.toLowerCase();return e.find(r=>r!==t&&Ne(n,r.toLowerCase())<=(r.length>4?2:1))}function J(t,e){let n=Et(t,e);return n!==void 0?`Use ${JSON.stringify(n)}`:e.length?_(e):void 0}var z=Kt;function Pe({suggest:t},e,n){let r=Object.keys(e).filter(a=>a!=="field"),i=r.filter(a=>!z.includes(a)),o=i.map(a=>h("unknown-operator",`${n}/${it(a)}`,`"${a}" is not a condition operator`,t(a,[...z]))),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(h("condition-operator-count",n,a,`Use exactly one of: ${z.join(", ")}`));}return o}function _e(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 [h("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 [h("forward-reference",`${n}/field`,`"${e.field}" belongs to ${a}`,`${r==="route"?"Route":r==="step"?"Step":"Field"} conditions can use fields of ${u}`)]}function xt(t,e){let{condition:n,path:r}=e;return typeof n.field!="string"?[h("missing-property",`${r}/field`,'the condition has no "field"',"Add the key of the field to test")]:[...Pe(t,n,r),..._e(t,e)]}function Ht(t){return t.conditions.flatMap(e=>xt(t,e))}function It(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 Ct(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 Yt(t,e,n=()=>{}){var a,u;let r=(a=t.steps)!=null?a:[],i=r.length?r.flatMap((c,l)=>c.fields.map((d,f)=>({field:d,path:`/steps/${l}/fields/${f}`,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)It(s,c.field,c.path,"field",c.step,c.field.key);return r.forEach((c,l)=>{var d;It(s,c,`/steps/${l}`,"step",l),((d=c.routes)!=null?d:[]).forEach((f,g)=>It(s,f,`/steps/${l}/routes/${g}`,"route",l));for(let f of ["next","back","skip"])Ct(s,c[f],`/steps/${l}/${f}`,l);}),Ct(s,t.submit,"/submit",-1),Ct(s,t.cancel,"/cancel",-1),{definition:t,entries:i,keys:o,keyList:[...o.keys()],conditions:s,validators:e,suggest:n}}function Wt(t,e,n,r){let i=t[n],o=t[r];return i===void 0||o===void 0||i<=o?[]:[h("invalid-range",`${e}/validation/${n}`,`${n} (${i}) is greater than ${r} (${o})`,`Lower ${n} or raise ${r}`)]}function qe(t,e){if(t===void 0)return [];try{return new RegExp(t),[]}catch(n){return [h("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 Ue(t,{field:e,path:n}){let r=e.validation;if(!r)return [];let i=r.matchField;return [...Wt(r,n,"minLength","maxLength"),...Wt(r,n,"min","max"),...qe(r.pattern,n),...i===void 0||t.keys.has(i)?[]:[h("unknown-field",`${n}/validation/matchField`,`"${i}" is not a field key`,t.suggest(i,t.keyList))]]}function Jt(t){return t.entries.flatMap(e=>Ue(t,e))}function Ke({definition:t,entries:e,keys:n}){var s;let r=new Map,i=(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]);},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 Be(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 Ge(t){return Be(Ke(t)).map(e=>h("condition-cycle",t.keys.get(e[0]).path,`show conditions form a cycle: ${e.join(" -> ")}`,"Remove one of the conditions in the cycle"))}function zt(t){return Ge(t)}var Xt="1.0";function Zt({formatVersion:t}){if(t===void 0)return [];let e=typeof t=="string"&&/^[1-9]\d*(\.\d+)?$/.test(t);return e&&parseInt(t)<=parseInt(Xt)?[]:[e?h("unsupported-format-version","/formatVersion",`format ${t} is not supported`,"Upgrade @formhaus/core"):h("invalid-type","/formatVersion","must be a version string",`Use "${Xt}"`)]}var Z=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),He={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 q(t,e,n){return Object.entries(e).flatMap(([r,i])=>{let[o,s]=He[i];return t[r]===void 0||o(t[r])?[]:[h("invalid-type",`${n}/${it(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}`):[h("invalid-type",`${e}/${s}`,`must be ${n}`)]):[h("invalid-type",e,"must be an array",i?"Use [] when there is nothing to list":void 0)]}function X(t,e,n){return typeof t[e]=="string"?[]:[h("missing-property",`${n}/${e}`,`"${e}" must be a string`)]}var $t=(t,e)=>q(t,{field:"string",eq:"scalar",neq:"scalar",in:"list",notIn:"list",notEmpty:"boolean",gt:"number",gte:"number",lt:"number",lte:"number"},e);function Dt(t,e){return [...D(t.show,`${e}/show`,"a condition object",$t),...D(t.showAny,`${e}/showAny`,"a condition object",$t)]}function Rt(t,e){return Z(t)?[...q(t,{label:"string"},e),...D(t.disabled,`${e}/disabled`,"a condition object",$t)]:[]}var Ye=(t,e)=>[...X(t,"value",e),...q(t,{label:"string"},e)],We={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 Je(t,e){return t===void 0?[]:Z(t)?q(t,We,e):[h("invalid-type",e,"must be an object of validation rules")]}function ze(t,e){return t===void 0||Array.isArray(t)&&t.every(r=>typeof r=="string")?[]:[h("invalid-type",e,"must be an array of field keys")]}var Qt=(t,e)=>[...X(t,"key",e),...X(t,"type",e),...q(t,{label:"string",placeholder:"string",helperText:"string"},e),...Dt(t,e),...D(t.options,`${e}/options`,"an option object",Ye),...Je(t.validation,`${e}/validation`),...ze(t.optionsDependsOn,`${e}/optionsDependsOn`)],Xe=(t,e)=>[...t.to===null||typeof t.to=="string"?[]:[h("missing-property",`${e}/to`,'"to" must be a step id or null')],...Dt(t,e)],Ze=(t,e)=>[...X(t,"id",e),...q(t,{title:"string",description:"string"},e),...D(t.fields,`${e}/fields`,"a field object",Qt,true),...Dt(t,e),...D(t.routes,`${e}/routes`,"a route object",Xe),...["next","back","skip"].flatMap(n=>Rt(t[n],`${e}/${n}`))];function te(t){if(!Z(t))return [h("invalid-type","","the form definition must be an object")];let e=Zt(t);return e.length?e:[...D(t.fields,"/fields","a field object",Qt),...D(t.steps,"/steps","a step object",Ze),...Rt(t.submit,"/submit"),...Rt(t.cancel,"/cancel")]}function ee(t){return [...X(t,"id",""),...Z(t.submit)?[]:[h("missing-property","/submit","the submit action is missing",'Add "submit": { "label": "Submit" }')]]}var ot=t=>{var e,n;return !!((e=t.show)!=null&&e.length||(n=t.showAny)!=null&&n.length)};function ne(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&&!ot(o))return r;if(!(s==null||s<=n)&&(r.push(s),!ot(o)&&!ot(t[s])))return r}return n+1<t.length?[...r,n+1]:r}function re(t){let e=new Map(t.map((n,r)=>[n.id,r]));return t.map((n,r)=>{let i=new Set,o=ne(t,e,r);for(;o.length;){let s=o.pop();i.has(s)||(i.add(s),o.push(...ne(t,e,s)),ot(t[s])&&s+1<t.length&&o.push(s+1));}return i})}var Qe=new Set([...Object.getOwnPropertyNames(Object.prototype),"prototype"]);function tn({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(h("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 d=n.slice(s+1).map(y=>y.id),f=l===void 0?`"${u.to}" is not a step id`:`"${u.to}" is not a later step`,g=d.length?`${_(d)}, or null to end the form here`:"Use null to end the form here";e.push(h("route-target",`/steps/${s}/routes/${c}/to`,f,g));})}),e}function en({definition:t,entries:e}){var o;let n=[],r=re((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(d=>d.field.key===u.key&&!i(d,s));Qe.has(u.key)?n.push(h("reserved-key",`${c}/key`,`"${u.key}" is a built-in object property name`,"Rename the field key")):l&&n.push(h("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 ie(t){var r,i;let{definition:e}=t;return [...!!((r=e.fields)!=null&&r.length)&&!!((i=e.steps)!=null&&i.length)?[h("fields-and-steps","",'the definition has both "fields" and "steps"','Move the top-level fields into a step, or remove "steps"')]:[],...tn(t),...en(t)]}var w={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 V(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 U=["checkbox","switch"],tt=["text","email","phone","number","password","select","autocomplete","multiselect","checkbox","radio","switch","file","date","datetime","textarea"],Q=1e4,nn=254,rn=1e3,oe=/^[^\s@]+@[^\s@.]+(?:\.[^\s@.]+)+$/,on=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/,se="\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])",sn=new RegExp(`^${se}$`),an=new RegExp(`^${se}T(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d{1,3})?)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)?$`),un=new Set(["text","phone","password","textarea","autocomplete"]),ln=new Map([["email",[oe,w.email,nn]],["date",[sn,w.date,Q]],["datetime",[an,w.datetime,Q]]]);function cn(t){let[e,n,r]=t.split(/\D/).map(Number);return r<=new Date(new Date(0).setUTCFullYear(e,n,0)).getUTCDate()}var fn=new Set(["password","number","select","radio","file"]);function O(t,e){return typeof e=="string"&&!fn.has(t.type)?e.trim():e}function ae(t,e){let n=O(t,e);if(t.type!=="number"||typeof n!="string"||!on.test(n))return n;let r=Number(n);return Number.isFinite(r)?r:n}var ue=t=>t.optionsFrom?void 0:t.options;function le(t,e){let n=ue(t);return !n||n.some(r=>r.value===e)}function ce(t,e){var r,i,o,s;let n=Math.min(Q,(i=(r=t.validation)==null?void 0:r.maxLength)!=null?i:Q);return e.length<=n?null:(s=(o=t.validation)==null?void 0:o.maxLengthMessage)!=null?s:V("maxLength",{max:n})}function dn(t,e){var r,i;return Array.isArray(e)?e.length>((i=(r=ue(t))==null?void 0:r.length)!=null?i:rn)?w.option:e.every(o=>typeof o=="string"&&o.length<=Q&&le(t,o))?null:w.option:w.options}function st(t,e,n){return typeof e=="string"?ce(t,e):n}function pn(t,e,[n,r,i]){var o;return typeof e!="string"?r:(o=ce(t,e))!=null?o:e.length<=i&&n.test(e)&&(n===oe||cn(e))?null:r}function mn(t,e){return typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e)?null:st(t,e,w.value)}function hn(t,e){return e==null||e===""||t.type==="multiselect"&&Array.isArray(e)&&!e.length}function Vt(t,e){var r;if(hn(t,e))return null;if(U.includes(t.type))return typeof e=="boolean"?null:w.boolean;if(t.type==="number")return typeof e=="number"&&Number.isFinite(e)?null:w.number;if(t.type==="multiselect")return dn(t,e);if(t.type==="file")return st(t,e,w.file);let n=ln.get(t.type);return n?pn(t,e,n):t.type==="select"||t.type==="radio"?(r=st(t,e,w.option))!=null?r:le(t,e)?null:w.option:un.has(t.type)?st(t,e,w.string):mn(t,e)}function fe(t,e){return t.type==="file"||!tt.includes(t.type)?null:Vt(t,e)}var gn=["in","notIn"],yn=["gt","gte","lt","lte"],bn=["text","email","phone","password","textarea","date","datetime","select","radio","autocomplete"];function vn(t){return t.type==="number"?"number":U.includes(t.type)?"boolean":bn.includes(t.type)?"string":void 0}function kn(t,e,n,r){var l;let i=(d,f)=>[I("condition-value-mismatch",r,d,f)];if(e==="notEmpty")return [];if(yn.includes(e))return t.type!=="multiselect"&&!U.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 d=e==="neq"||e==="notIn"?"always":"never";return i(`"${t.key}" holds a list of values, so "${e}" ${d} matches it`,"Use notEmpty, or a select or radio field")}let o=gn.includes(e)&&Array.isArray(n)?n:[n],s=vn(t),a=s&&o.find(d=>typeof d!==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(d=>d.value):null,c=u&&o.find(d=>!u.includes(d));return u&&c!==void 0?i(`${JSON.stringify(c)} is not an option of "${t.key}"`,_(u)):[]}function Fn(t,e){let{condition:n,path:r}=e;if(xt(t,e).length)return [];let i=z.find(o=>o in n);return kn(t.keys.get(n.field).field,i,n[i],`${r}/${i}`)}function Sn({field:t,path:e}){if(!["select","radio","multiselect"].includes(t.type))return [];if(!Array.isArray(t.options))return t.optionsFrom?[]:[I("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?[]:[I("default-not-in-options",`${e}/defaultValue`,`${JSON.stringify(i)} is not an option of "${t.key}"`,_(n))]}function wn(t,{field:e,path:n}){var d;let r=(d=e.validation)!=null?d:{},i=(f,g,y)=>I("rule-not-applicable",`${n}/validation/${f}`,g,y),o=tt.includes(e.type),s=e.type==="number",a=o&&!s?["min","max"].filter(f=>r[f]!==void 0):[],u=o&&["number","checkbox","switch"].includes(e.type)?["minLength","maxLength"].filter(f=>r[f]!==void 0):[],c=[...a.map(f=>i(f,`"${f}" applies to number fields only`,`Use ${f}Length to limit text length`)),...u.map(f=>i(f,`"${f}" does not apply to ${e.type} fields`,s?"Use min and max for numbers":`Remove ${f}`))],{validators:l}=t;return r.validator!==void 0&&l&&!Object.prototype.hasOwnProperty.call(l,r.validator)&&c.push(I("unknown-validator",`${n}/validation/validator`,`the validator "${r.validator}" is not registered`,'Pass it in the "validators" option')),c}function En(t,e){var o;let{field:n,path:r}=e,i=tt.includes(n.type)?void 0:Et(n.type,tt);return [...i===void 0?[]:[I("unknown-field-type",`${r}/type`,`"${n.type}" is not a built-in field type`,`Use "${i}", or register a component for "${n.type}"`)],...Sn(e),...wn(t,e),...((o=n.optionsDependsOn)!=null?o:[]).flatMap((s,a)=>t.keys.has(s)?[]:[I("unknown-field",`${r}/optionsDependsOn/${a}`,`"${s}" is not a field key`,J(s,t.keyList))])]}function xn({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 d=e.findIndex(y=>y.id===l),f=e[d+1],g=(c=(u=e[d])==null?void 0:u.routes)==null?void 0:c.some(y=>{var F,x;return !((F=y.show)!=null&&F.length)&&!((x=y.showAny)!=null&&x.length)});!f||!s.has(f.id)||g||o.push(I("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||!e[1])&&o.push(I("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 de(t){return [...typeof t.definition.title=="string"?[]:[I("missing-property","/title",'"title" must be a string',"Add a title for host UI and editors")],...t.conditions.flatMap(e=>Fn(t,e)),...t.entries.flatMap(e=>En(t,e)),...xn(t)]}function Ot(t,{validators:e,suggest:n,warnings:r}={}){let i=te(t);if(i.length)return i;let o=Yt(t,e,n);return [...ee(t),...ie(o),...Ht(o),...Jt(o),...zt(o),...r?r(o):[]]}function pe(t){return Ot(t)}function at(t,e={}){return Ot(t,{validators:e.validators,suggest:J,warnings:de})}function ut(t,e){let n=Ot(t,{suggest:J});if(n.length)throw new R(n);return t}function lt(t){var e,n;return [...(e=t.show)!=null?e:[],...(n=t.showAny)!=null?n:[]].map(r=>r.field)}function ct(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 At=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 ft(t,e){try{await e();}catch(n){throw new At(t,n)}}function me(t){return t.visibleSteps.map(e=>e.id).join(`
5
- `)}function et(t,e){let n=me(t),r=Object.keys(e).filter(i=>e[i]!==void 0).map(i=>[i,t.values[i]]);return ()=>me(t)!==n||r.some(([i,o])=>!Object.is(t.values[i],o))}function C(t,e){var r,i;let n=o=>wt(o,e);return ((r=t.show)!=null?r:[]).every(n)&&(!((i=t.showAny)!=null&&i.length)||t.showAny.some(n))}function In(t,e){return W(t)||t===false&&U.includes(e.type)}function he(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:V(`min${e}`,{min:i,unit:r});if(o!==void 0&&t>o)return (a=n[`max${e}Message`])!=null?a:V(`max${e}`,{max:o,unit:r})}function Cn(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:V("pattern")}catch(r){return}}function B(t,e,n,r){var l,d,f,g,y;let i=O(t,e),o=(l=t.validation)!=null?l:{},s=(d=o.matchFieldMessage)!=null?d:V("matchField");if(In(i,t))return o.required?typeof o.required=="string"?o.required:V("required"):o.matchField!==void 0&&!W(n[o.matchField])?s:null;let a=fe(t,i);if(a)return a;let u=typeof i=="string"||Array.isArray(i)?he(i.length,"Length",o,Array.isArray(i)?"items":void 0):typeof i=="number"?he(i,"",o):void 0,c=o.matchField!==void 0&&i!==n[o.matchField]?s:void 0;return ((y=(f=u!=null?u:Cn(i,o))!=null?f:c)!=null?y:o.validator?(g=r==null?void 0:r[o.validator])==null?void 0:g.call(r,i,n):void 0)||null}function j(t,e,n){return dt(t.fields,e,n)}function dt(t,e,n){let r={};for(let i of t){if(!C(i,e))continue;let o=B(i,e[i.key],e,n);o&&(r[i.key]=o);}return r}function N(t,e,n=false,r=[]){let{state:i}=t,o=t.errors,s={},a=[...r];for(let[c,l]of Object.entries(e))t.visibility.activeField(c,t.values)?s[c]=l:a.push(l);n&&(i.serverErrors=s,i.serverFormErrors=a),i.errors=m(m({},i.serverErrors),s),i.topLevelErrors=n?a:[...i.serverFormErrors,...a];let u=n&&ge(t,s);t.notify({fieldKeys:L(o,t.errors),structureChanged:u});}function ge(t,e){let n=t.visibleSteps.findIndex(r=>r.fields.some(i=>e[i.key]!==void 0));return n<0||n===t.currentStepIndex?false:(t.state.currentStepIndex=n,true)}function pt(t,e,n=false){n&&delete t.state.serverErrors[e];let r=t.state.serverErrors[e];r===void 0?delete t.errors[e]:t.errors[e]=r;}function G(t,e){for(let n of e)delete t.state.serverErrors[n];}function ye(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||B(i,t.values[i.key],T(t),t.validators)||(pt(t,i.key),n.push(i.key));return n}function mt(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 G(t,n),n}function T(t){return H(t)}function $n(t,e){for(let n of [...t.skipped.values()].flat())delete e[n];return e}function nt(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,j(s,T(t),t.validators));else Object.assign(r,dt((o=t.definition.fields)!=null?o:[],T(t),t.validators));t.state.errors=m(m({},t.state.serverErrors),r);let i=e&&ge(t,r);return t.notify({fieldKeys:L(n,r),structureChanged:i}),r}function be(t,e){let n=t.visibility.activeField(e,t.values);if(!n)return null;let r=t.errors[e],i=B(n,t.values[e],T(t),t.validators);i?t.errors[e]=i:pt(t,e,true);let o=Object.is(r,t.errors[e])?[]:[e];return t.notify({fieldKeys:o}),i}function H(t){let e=m({},t.visibility.conditionValues(t.values));for(let n of Object.keys(e)){let r=t.visibility.activeField(n,t.values);r&&(e[n]=O(r,e[n]));}return $n(t,e)}function ve(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.serverErrors={},t.state.serverFormErrors=[],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 Mt(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(!C(c,o)){u++;continue}i.push(c),Object.assign(o,Fe(c,e,o));let l=(a=c.routes)==null?void 0:a.find(d=>{var f;return C(d,o)&&(d.to===null||((f=r.get(d.to))!=null?f:-1)>u&&C(n[r.get(d.to)],o))});if((l==null?void 0:l.to)===null)break;u=l?r.get(l.to):u+1;}return i}function ke(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 Fe(t,e,n){let r=m({},n);for(let o of t.fields)r[o.key]=O(o,e[o.key]);let i={};for(let o of t.fields)C(o,r)&&e[o.key]!==void 0&&(i[o.key]=O(o,e[o.key]));return i}function Se(t){let e=null,n=[],r={},i=o=>{var u,c;if(e===o)return;e=o,n=Mt(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,Fe(l,o,s));r=s;};return {invalidate(){e=null;},steps(o){return i(o),n},values(o){return i(o),r}}}function we(t){var r,i;let e=(i=(r=t.currentStep)==null?void 0:r.fields)!=null?i:[],n=m({},t.values);for(let{key:o}of e)delete n[o];return Object.assign(n,K(e))}function Lt(t){return Mt(t.definition,we(t))[t.currentStepIndex+1]}function ht(t){let e=t.currentStep,n=e.fields.map(({key:i})=>i);t.state.values=we(t);for(let i of n)delete t.errors[i];G(t,n),t.skipped.set(e.id,n),G(t,t.visibility.reconcileHidden(t.values,t.errors)),t.visibility.markChanged(true,true);let r=mt(t);return t.notify({fieldKeys:[...n,...r],structureChanged:true,valuesChanged:true}),n}function gt(t){let e=t.currentStep;e&&t.skipped.delete(e.id);}function Ee(t,e){return t.state.currentStepIndex=e,t.notify({structureChanged:true}),ht(t)}function jt(t){return !!t&&Object.getPrototypeOf(t)===Object.prototype&&t.ok===false}function Rn(t,e,n){let r={},i=typeof e.errors=="object"&&e.errors?e.errors:{};for(let[s,a]of Object.entries(i)){let u=Array.isArray(a)?a.join(" "):a;typeof u=="string"&&Object.is(t.values[s],n[s])&&(r[s]=u);}let o=Array.isArray(e.formErrors)?e.formErrors.filter(s=>typeof s=="string"):[];N(t,r,true,o);}async function yt(t,e,n=false){if(t.submitting||t.stepValidating)return false;n||gt(t);let r=m({},t.lifecycle),i=false,o=t.validationEpoch,s=++t.operationEpoch,a=H(t),u=et(t,a),c=()=>o!==t.validationEpoch||s!==t.operationEpoch||u();t.state.submitting=true,t.notify();try{if(c()||Object.keys(nt(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(nt(t,!0)).length>0||c())return !1;a=H(t);}i=!0;let l=[...t.skipped.keys()],d=m({},t.values),f=t.state.serverErrors,g=await e(a,[...l]),y=jt(g);return s!==t.operationEpoch?!y:y?(Rn(t,g,d),!1):(t.state.serverErrors===f&&N(t,{},!0),await ft("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 xe(t){let e=t.currentStep;if(!e)return true;let n=j(e,T(t),t.validators);if(Object.keys(n).length===0)return false;let r=t.errors;return t.state.errors=m(m({},r),n),t.notify({fieldKeys:L(r,t.errors)}),true}function Ie(t,e){t.validationEpoch++,t.state.currentStepIndex=e,t.notify({structureChanged:true});}async function Ce(t,e){var l;if(!t.isMultiStep||t.stepValidating||t.submitting||!((l=t.currentStep)!=null&&l.skip))return false;if(Lt(t))return bt(t,"next","skip");let n=t.currentStep;if(!e||!n)return false;let r=t.values,i=m({},t.errors),o=m({},t.state.serverErrors),s,a=ht(t),u=t.values,c=et(t,m({},u));try{return await yt(t,async(d,f)=>{let g=t.operationEpoch,y=await e(d,f),F=jt(y);return (!F||g===t.operationEpoch)&&(s=F),y},!0)}finally{s!==false&&t.values===u&&!c()&&(t.state.values=r,s===void 0&&(t.state.serverErrors=o),t.state.errors=m(m({},s?{}:i),t.errors),t.skipped.delete(n.id),t.notify({fieldKeys:a,structureChanged:true,valuesChanged:true}));}}async function bt(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&&gt(t),o&&xe(t))return false;let s=m({},t.lifecycle),a=t.onStepValidate,u=false,l=t.currentStepIndex+(e==="next"?1:-1),d=r?Lt(t):t.visibleSteps[l];if(!d)return false;let f={fromStepId:i.id,toStepId:d.id,reason:n,values:m({},T(t))},g=t.validationEpoch,y=++t.operationEpoch,F=et(t,f.values),x=()=>{var k;return g!==t.validationEpoch||y!==t.operationEpoch||((k=t.currentStep)==null?void 0:k.id)!==i.id||F()};t.state.stepValidating=true,t.notify();try{if(x())return !1;if(o&&a){let k=await a(i.id,f.values);if(x())return !1;if(k&&Object.keys(k).length>0)return N(t,k),!1}if(s.onBeforeStepChange){let k=await s.onBeforeStepChange(f);if(x()||k===!1)return !1}return x()||o&&xe(t)?!1:(u=!0,r&&ht(t),Ie(t,l),await ft("afterStepChange",()=>{var k;return (k=s.onAfterStepChange)==null?void 0:k.call(s,f)}),!0)}catch(k){if(!u&&x())return false;throw k}finally{y===t.operationEpoch&&(t.state.stepValidating=false,t.notify());}}function $e(t,e){if(!t.isMultiStep)return;let n=t.visibility.findStepIndex(e,t.values,t.currentStepIndex);n===t.currentStepIndex?t.notify():n!==null&&Ie(t,n);}function Re(t,e){return t.add(e),()=>t.delete(e)}function De(){let t=0,e=0,n=new Set,r=new Set,i=new Map,o=new Map;return {subscribe:s=>Re(n,s),getSnapshot:()=>t,subscribeStructure:s=>Re(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 d of (c=o.get(l))!=null?c:[])d();}if(a){e++;for(let l of r)l();}t++;for(let l of n)l();}}}function Dn(t,e){try{if(process.env.NODE_ENV!=="production")return at(t,{validators:e})}catch(n){if(!(n instanceof ReferenceError))throw n}}function Ve(t,e,n){var s,a;let r=(s=Dn(t,n))!=null?s:pe(t),i=r.filter(Gt);if(i.length)throw new R(i);let o=(a=e.onWarning)!=null?a:(u=>console.warn(`[formhaus] ${u.message}`));for(let u of r)o(u);}function Tt(t,e){var n;for(let r of lt(t)){let i=(n=e.get(r))!=null?n:new Set;i.add(t),e.set(r,i);}}function vt(t){var F,x,k;let e=ct(t),n=new Map,r=new Set,i=Se(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,[...(F=n.get(p.key))!=null?F:[],p]),Tt(p,o);for(let p of (x=t.steps)!=null?x:[]){for(let b of p.fields)a.set(b,p);Tt(p,s);for(let b of (k=p.routes)!=null?k:[])for(let v of lt(b))r.add(v);}let d=()=>{var p;return ((p=t.steps)!=null?p:[]).length>0},f=(p,b)=>C(p,i.values(b)),g=(p,b)=>{let v=a.get(p);return !v||i.steps(b).includes(v)};function y(p,b){var $,A,Y;if(!u)return l;if(u=false,!d())return l.visibleSteps=[],l.currentStep=null,l.visibleFields=(($=t.fields)!=null?$:[]).filter(P=>f(P,p)),l;let v=l.visibleSteps=i.steps(p),S=l.currentStep=(Y=(A=v[b])!=null?A:v[v.length-1])!=null?Y:null;return l.visibleFields=S?S.fields.filter(P=>f(P,p)):[],l}return {allFields:e,conditionValues:i.values,state:y,markChanged(p,b){(p||b)&&i.invalidate(),p&&(u=true),(p||b)&&(c=true);},getCanGoNext(p,b,v){let S=y(p,b).currentStep;if(!c)return l.canGoNext;c=false;let $=S?j(S,i.values(p),v):{};return l.canGoNext=d()&&Object.keys($).length===0},findStepIndex(p,b,v){let S=y(b,v).visibleSteps.findIndex($=>$.fields.some(A=>A.key===p));return S===-1?null:S},affectsStructure(p,b){return r.has(p)||o.has(p)||s.has(p)||b.size>0},activeField(p,b){var v;return (v=n.get(p))==null?void 0:v.find(S=>g(S,b)&&f(S,b))},reconcileHidden(p,b){var P,Pt;i.invalidate();let v=[...new Set([...o.keys(),...s.keys()])],S=new Set(v),$=new Set,A=E=>p[E]!==void 0||b[E]!==void 0,Y=E=>{delete p[E],delete b[E],i.invalidate(),$.add(E),!S.has(E)&&(S.add(E),v.push(E));};for(let E=0;E<v.length;E++){let Ft=v[E];S.delete(Ft);for(let M of (P=o.get(Ft))!=null?P:[])g(M,p)&&!f(M,p)&&A(M.key)&&Y(M.key);for(let M of (Pt=s.get(Ft))!=null?Pt:[])if(!f(M,p))for(let _t of M.fields)A(_t.key)&&Y(_t.key);}return $}}}var kt=class{constructor(e,n,r){this.definition=e;this.skipped=new Map;this.validationEpoch=0;this.operationEpoch=0;this.subscriptions=De();var o;this.lifecycle=r!=null?r:{},this.validators=(o=r==null?void 0:r.validators)!=null?o:{},Ve(e,this.lifecycle,this.validators),this.visibility=vt(e);let i=K(this.visibility.allFields,n);this.state={values:i,errors:{},topLevelErrors:[],serverErrors:{},serverFormErrors:[],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 stepErrors(){let e={};for(let n of this.visibleSteps){let r=n.fields.map(i=>i.key).filter(i=>this.errors[i]!==void 0);r.length>0&&(e[n.id]=r);}return e}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];r[e]=n,pt(this.internals,e,s);for(let[g,y]of this.skipped)s&&y.includes(e)&&this.skipped.delete(g);let u=this.visibility.reconcileHidden(r,i);G(this.internals,u);let c=ye(this.internals,e),l=new Set([...u,...c]);(s||a!==i[e])&&l.add(e);let d=s||u.size>0,f=d&&this.visibility.affectsStructure(e,u);if(o&&f){this.visibility.markChanged(true,true),this.state.currentStepIndex=ke(o,this.visibleSteps,this.currentStepIndex);for(let g of mt(this.internals))l.add(g);}this.notify({fieldKeys:l,structureChanged:f,valuesChanged:d});}setErrors(e){N(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 bt(this.internals,"next")}back(){return bt(this.internals,"back")}skip(e){return Ce(this.internals,e)}submit(e){return yt(this.internals,e)}isStepSkipped(e){return this.skipped.has(e)}validate(){return nt(this.internals)}validateField(e){return be(this.internals,e)}getSubmitValues(){return H(this.internals)}goToStepWithField(e){$e(this.internals,e);}reset(e){ve(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 Vn='Pass the values object as the second argument, not the request body with "values" and "skippedSteps".',On=()=>null,Nt=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);function An(t,e,n){var a;let r=n!==null&&typeof n=="object"&&!Array.isArray(n)?n:{},i=vt(t),o=[...new Set(e.map(({key:u})=>u))].filter(u=>Nt(r,u)),s={values:{},active:new Map};for(let u=0;u<=e.length;u++){let c={};for(let f of o)c[f]=ae((a=s.active.get(f))!=null?a:e.find(g=>g.key===f),r[f]);let l=new Map;for(let f of o){let g=i.activeField(f,c);g&&l.set(f,g);}let d=o.every(f=>l.get(f)===s.active.get(f));if(s={values:c,active:l},d)break}return s}function Mn({values:t,active:e}){let n=new Map;for(let[r,i]of e){let o=Vt(i,t[r]);o&&n.set(r,o);}return n}function Ln(t,e){var i;let n=o=>o.map(s=>e.has(s.key)?St(m({},s),{validation:void 0}):s),r=(i=t.steps)==null?void 0:i.map(o=>St(m({},o),{fields:n(o.fields)}));return m(m(m({},t),t.fields&&{fields:n(t.fields)}),r&&{steps:r})}function jn(t,e={}){let n={};for(let{validation:r}of t)r!=null&&r.validator&&(n[r.validator]=On);return m(m({},n),e)}function Tn(t,e){return e===null||typeof e!="object"||!Nt(e,"values")?false:!t.some(n=>n.key==="values"||n.key==="skippedSteps")}function Nn(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)&&Ee(t,r);}}function Pn(t,e,n={}){ut(t);let r=ct(t),i=An(t,r,e),o=Mn(i),s={validators:jn(r,n.validators),onWarning:()=>{}},a=new kt(Ln(t,o),i.values,s);Nn(a,n.skippedSteps);let u=a.validate(),c=a.getSubmitValues();for(let[l,d]of o)Nt(c,l)&&(u[l]=d);return Tn(r,e)&&(u.values=Vn),{values:c,errors:u}}exports.FormDefinitionError=R;exports.checkDefinition=at;exports.parseDefinition=ut;exports.validateSubmission=Pn;return exports;})({});//# sourceMappingURL=server.iife.js.map
2
+ var At=Object.defineProperty,Lt=Object.defineProperties;var jt=Object.getOwnPropertyDescriptors;var Ke=Object.getOwnPropertySymbols;var Tt=Object.prototype.hasOwnProperty,Pt=Object.prototype.propertyIsEnumerable;var _e=(e,t,n)=>t in e?At(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n,m=(e,t)=>{for(var n in t||(t={}))Tt.call(t,n)&&_e(e,n,t[n]);if(Ke)for(var n of Ke(t))Pt.call(t,n)&&_e(e,n,t[n]);return e},Se=(e,t)=>Lt(e,jt(t));var qe=["eq","neq","in","notIn","notEmpty","gt","gte","lt","lte"];function z(e){return e==null||e===""||Array.isArray(e)&&!e.length}function Nt(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=Nt(e);return r!==void 0&&n(r,t)}function we(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||!z(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 $=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 h=Ue("error"),E=Ue("warning");function re(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}function Be(e){return e.severity==="error"}function K(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 Kt(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 xe(e,t){let n=e.toLowerCase();return t.find(r=>r!==e&&Kt(n,r.toLowerCase())<=(r.length>4?2:1))}function J(e,t){let n=xe(e,t);return n!==void 0?`Use ${JSON.stringify(n)}`:t.length?K(t):void 0}var X=qe;function _t({suggest:e},t,n){let r=Object.keys(t).filter(a=>a!=="field"),s=r.filter(a=>!X.includes(a)),i=s.map(a=>h("unknown-operator",`${n}/${re(a)}`,`"${a}" is not a condition operator`,e(a,[...X]))),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(h("condition-operator-count",n,a,`Use exactly one of: ${X.join(", ")}`));}return i}function qt(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 [h("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 [h("forward-reference",`${n}/field`,`"${t.field}" belongs to ${a}`,`${r==="route"?"Route":r==="step"?"Step":"Field"} conditions can use fields of ${u}`)]}function Ee(e,t){let{condition:n,path:r}=t;return typeof n.field!="string"?[h("missing-property",`${r}/field`,'the condition has no "field"',"Add the key of the field to test")]:[..._t(e,n,r),...qt(e,t)]}function Ge(e){return e.conditions.flatMap(t=>Ee(e,t))}function Ie(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 Ce(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)Ie(o,c.field,c.path,"field",c.step,c.field.key);return r.forEach((c,l)=>{var d;Ie(o,c,`/steps/${l}`,"step",l),((d=c.routes)!=null?d:[]).forEach((f,g)=>Ie(o,f,`/steps/${l}/routes/${g}`,"route",l));for(let f of ["next","back","skip"])Ce(o,c[f],`/steps/${l}/${f}`,l);}),Ce(o,e.submit,"/submit",-1),Ce(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?[]:[h("invalid-range",`${t}/validation/${n}`,`${n} (${s}) is greater than ${r} (${i})`,`Lower ${n} or raise ${r}`)]}function Ut(e,t){if(e===void 0)return [];try{return new RegExp(e),[]}catch(n){return [h("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 Bt(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"),...Ut(r.pattern,n),...s===void 0||e.keys.has(s)?[]:[h("unknown-field",`${n}/validation/matchField`,`"${s}" is not a field key`,e.suggest(s,e.keyList))]]}function Ye(e){return e.entries.flatMap(t=>Bt(e,t))}function Gt({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 Ht(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 Wt(e){return Ht(Gt(e)).map(t=>h("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 Wt(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?h("unsupported-format-version","/formatVersion",`format ${e} is not supported`,"Upgrade @formhaus/core"):h("invalid-type","/formatVersion","must be a version string",`Use "${Je}"`)]}var Q=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Yt={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 _(e,t,n){return Object.entries(t).flatMap(([r,s])=>{let[i,o]=Yt[s];return e[r]===void 0||i(e[r])?[]:[h("invalid-type",`${n}/${re(r)}`,`"${r}" must be ${o}`)]})}function M(e,t,n,r,s=false){return e==null&&!s?[]:Array.isArray(e)?e.flatMap((i,o)=>Q(i)?r(i,`${t}/${o}`):[h("invalid-type",`${t}/${o}`,`must be ${n}`)]):[h("invalid-type",t,"must be an array",s?"Use [] when there is nothing to list":void 0)]}function Z(e,t,n){return typeof e[t]=="string"?[]:[h("missing-property",`${n}/${t}`,`"${t}" must be a string`)]}var Re=(e,t)=>_(e,{field:"string",eq:"scalar",neq:"scalar",in:"list",notIn:"list",notEmpty:"boolean",gt:"number",gte:"number",lt:"number",lte:"number"},t);function Me(e,t){return [...M(e.show,`${t}/show`,"a condition object",Re),...M(e.showAny,`${t}/showAny`,"a condition object",Re)]}function $e(e,t){return Q(e)?[..._(e,{label:"string"},t),...M(e.disabled,`${t}/disabled`,"a condition object",Re)]:[]}var zt=(e,t)=>[...Z(e,"value",t),..._(e,{label:"string"},t)],Jt={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 Xt(e,t){return e===void 0?[]:Q(e)?_(e,Jt,t):[h("invalid-type",t,"must be an object of validation rules")]}function Zt(e,t){return e===void 0||Array.isArray(e)&&e.every(r=>typeof r=="string")?[]:[h("invalid-type",t,"must be an array of field keys")]}var Ze=(e,t)=>[...Z(e,"key",t),...Z(e,"type",t),..._(e,{label:"string",placeholder:"string",helperText:"string"},t),...Me(e,t),...M(e.options,`${t}/options`,"an option object",zt),...Xt(e.validation,`${t}/validation`),...Zt(e.optionsDependsOn,`${t}/optionsDependsOn`)],Qt=(e,t)=>[...e.to===null||typeof e.to=="string"?[]:[h("missing-property",`${t}/to`,'"to" must be a step id or null')],...Me(e,t)],en=(e,t)=>[...Z(e,"id",t),..._(e,{title:"string",description:"string"},t),...M(e.fields,`${t}/fields`,"a field object",Ze,true),...Me(e,t),...M(e.routes,`${t}/routes`,"a route object",Qt),...["next","back","skip"].flatMap(n=>$e(e[n],`${t}/${n}`))];function Qe(e){if(!Q(e))return [h("invalid-type","","the form definition must be an object")];let t=Xe(e);return t.length?t:[...M(e.fields,"/fields","a field object",Ze),...M(e.steps,"/steps","a step object",en),...$e(e.submit,"/submit"),...$e(e.cancel,"/cancel")]}function et(e){return [...Z(e,"id",""),...Q(e.submit)?[]:[h("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 tn=new Set([...Object.getOwnPropertyNames(Object.prototype),"prototype"]);function nn({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(h("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(y=>y.id),f=l===void 0?`"${u.to}" is not a step id`:`"${u.to}" is not a later step`,g=d.length?`${K(d)}, or null to end the form here`:"Use null to end the form here";t.push(h("route-target",`/steps/${o}/routes/${c}/to`,f,g));})}),t}function rn({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));tn.has(u.key)?n.push(h("reserved-key",`${c}/key`,`"${u.key}" is a built-in object property name`,"Rename the field key")):l&&n.push(h("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)?[h("fields-and-steps","",'the definition has both "fields" and "steps"','Move the top-level fields into a step, or remove "steps"')]:[],...nn(e),...rn(e)]}var sn=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 on(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 D(...e){return (t,n,r)=>on(sn,t,n,e,r)}var q=["checkbox","switch"],U=["text","email","phone","number","password","select","autocomplete","multiselect","checkbox","radio","switch","file","date","datetime","textarea"],ee=1e4,an=254,un=1e3,it=/^[^\s@]+@[^\s@.]+(?:\.[^\s@.]+)+$/,ln=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/,ot="\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])",cn=new RegExp(`^${ot}$`),fn=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)?$`),dn=new Set(["text","phone","password","textarea","autocomplete"]),pn=new Map([["email",[it,"email",an]],["date",[cn,"date",ee]],["datetime",[fn,"datetime",ee]]]);function mn(e){let[t,n,r]=e.split(/\D/).map(Number);return r<=new Date(new Date(0).setUTCFullYear(t,n,0)).getUTCDate()}var gn=new Set(["password","number","select","radio","file"]);function O(e,t){return typeof t=="string"&&!gn.has(e.type)?t.trim():t}function at(e,t){if(Array.isArray(t)&&t.length===0&&e.type!=="multiselect"&&U.includes(e.type))return;let n=O(e,t);if(e.type!=="number"||typeof n!="string"||!ln.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(ee,(i=(s=e.validation)==null?void 0:s.maxLength)!=null?i:ee);return t.length<=r?null:(a=(o=e.validation)==null?void 0:o.maxLengthMessage)!=null?a:n("maxLength",{max:r})}function yn(e,t,n){var s,i;return Array.isArray(t)?t.length>((i=(s=ut(e))==null?void 0:s.length)!=null?i:un)?n("option"):t.every(o=>typeof o=="string"&&o.length<=ee&&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 hn(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||mn(t))?null:i(r)}function bn(e,t,n){return typeof t=="boolean"||typeof t=="number"&&Number.isFinite(t)?null:ie(e,t,"value",n)}function vn(e,t){return t==null||t===""||e.type==="multiselect"&&Array.isArray(t)&&!t.length}function De(e,t,n=D()){var i;if(vn(e,t))return null;let r=(o,a={})=>n(o,a,e);if(q.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 yn(e,t,r);if(e.type==="file")return ie(e,t,"file",r);let s=pn.get(e.type);return s?hn(e,t,s,r):e.type==="select"||e.type==="radio"?(i=ie(e,t,"option",r))!=null?i:lt(e,t)?null:r("option"):dn.has(e.type)?ie(e,t,"string",r):bn(e,t,r)}function ft(e,t,n){return e.type==="file"||!U.includes(e.type)?null:De(e,t,n)}var Fn=["in","notIn"],kn=["gt","gte","lt","lte"],Sn=["text","email","phone","password","textarea","date","datetime","select","radio","autocomplete"];function wn(e){return e.type==="number"?"number":q.includes(e.type)?"boolean":Sn.includes(e.type)?"string":void 0}function xn(e,t,n,r){var l;let s=(d,f)=>[E("condition-value-mismatch",r,d,f)];if(t==="notEmpty")return [];if(kn.includes(t))return e.type!=="multiselect"&&!q.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=Fn.includes(t)&&Array.isArray(n)?n:[n],o=wn(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}"`,K(u)):[]}function En(e,t){let{condition:n,path:r}=t;if(Ee(e,t).length)return [];let s=X.find(i=>i in n);return xn(e.keys.get(n.field).field,s,n[s],`${r}/${s}`)}function In({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}"`,K(n))]}function Cn(e,{field:t,path:n}){var d;let r=(d=t.validation)!=null?d:{},s=(f,g,y)=>E("rule-not-applicable",`${n}/validation/${f}`,g,y),i=U.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 Rn(e,t){var i;let{field:n,path:r}=t,s=U.includes(n.type)?void 0:xe(n.type,U);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}"`)],...In(t),...Cn(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`,J(o,e.keyList))])]}function $n({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(y=>y.id===l),f=t[d+1],g=(c=(u=t[d])==null?void 0:u.routes)==null?void 0:c.some(y=>{var b,x;return !((b=y.show)!=null&&b.length)&&!((x=y.showAny)!=null&&x.length)});!f||!o.has(f.id)||g||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=>En(e,t)),...e.entries.flatMap(t=>Rn(e,t)),...$n(e)]}function Oe(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 Oe(e)}function oe(e,t={}){return Oe(e,{validators:t.validators,suggest:J,warnings:dt})}function ae(e,t){let n=Oe(e,{suggest:J});if(n.length)throw new $(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 B(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 R(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 fe(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 gt(e,t){let n=m({},t);return ()=>R(n,e.values)}function I(e,t){var r,s;let n=i=>we(i,t);return ((r=e.show)!=null?r:[]).every(n)&&(!((s=e.showAny)!=null&&s.length)||e.showAny.some(n))}function Mn(e,t){return z(e)||e===false&&q.includes(t.type)}function yt(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 Dn(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 On(e,t,n,r){if(typeof e=="number")return yt(e,"",t,(i,o)=>r(i,o,n));if(typeof e!="string"&&!Array.isArray(e))return;let s=Array.isArray(e)?"Items":"Length";return yt(e.length,"Length",t,(i,o)=>r(`${i}${s}`,o,n))}function G(e,t,n,r,s){var l,d,f,g,y;let i=O(e,t),o=(l=e.validation)!=null?l:{},a=D(s),u=()=>{var b;return (b=o.matchFieldMessage)!=null?b:a("matchField",{},e)};if(Mn(i,e))return o.required?typeof o.required=="string"?o.required:a("required",{},e):o.matchField!==void 0&&!z(n[o.matchField])?u():null;let c=ft(e,i,a);return c||((y=(f=(d=On(i,o,e,a))!=null?d:Dn(i,o,()=>a("pattern",{},e)))!=null?f:o.matchField!==void 0&&i!==n[o.matchField]?u():void 0)!=null?y:o.validator?(g=r==null?void 0:r[o.validator])==null?void 0:g.call(r,i,n):void 0)||null}function j(e,t,n,r){return de(e.fields,t,n,r)}function de(e,t,n,r){let s={};for(let i of e){if(!I(i,t))continue;let o=G(i,t[i.key],t,n,r);o&&(s[i.key]=o);}return s}function P(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&&ht(e,o);e.notify({fieldKeys:R(i,e.errors),structureChanged:u});}function ht(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 pe(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 V(e,t){for(let n of t)delete e.state.serverErrors[n];}function bt(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||G(s,e.values[s.key],T(e),e.validators,e.messages)||(pe(e,s.key),n.push(s.key));return n}function H(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 V(e,n),n}function T(e){return W(e)}function Vn(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,j(o,T(e),e.validators,e.messages));else Object.assign(r,de((i=e.definition.fields)!=null?i:[],T(e),e.validators,e.messages));e.state.errors=m(m({},e.state.serverErrors),r);let s=t&&ht(e,r);return e.notify({fieldKeys:R(n,r),structureChanged:s}),r}function vt(e,t){let n=e.visibility.activeField(t,e.values);if(!n)return null;let r=e.errors[t],s=G(n,e.values[t],T(e),e.validators,e.messages);s?e.errors[t]=s:pe(e,t,true);let i=Object.is(r,e.errors[t])?[]:[t];return e.notify({fieldKeys:i}),s}function W(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]=O(r,t[n]));}return Vn(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=B(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=R(n,e.values),o=new Set([...i,...R(r,e.errors),...s]);e.notify({fieldKeys:o,structureChanged:true,valuesChanged:i.size>0});}function St(e,t){return wt(e,t).steps}function wt(e,t){var o,a,u;let n=(o=e.steps)!=null?o:[],r=new Map(n.map((c,l)=>[c.id,l])),s=[],i={};n.length||kt({fields:(a=e.fields)!=null?a:[]},t,i);for(let c=0;c<n.length;){let l=n[c];if(!I(l,i)){c++;continue}s.push(l),kt(l,t,i);let d=(u=l.routes)==null?void 0:u.find(f=>{var g;return I(f,i)&&(f.to===null||((g=r.get(f.to))!=null?g:-1)>c&&I(n[r.get(f.to)],i))});if((d==null?void 0:d.to)===null)break;c=d?r.get(d.to):c+1;}return {steps:s,values:i}}function me(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=e.fields.map(({key:i})=>[i,Object.prototype.hasOwnProperty.call(n,i),n[i]]);for(let i of e.fields)n[i.key]=O(i,t[i.key]);let s=e.fields.filter(i=>I(i,n)&&t[i.key]!==void 0);for(let[i,o,a]of r)o?n[i]=a:delete n[i];for(let i of s)n[i.key]=O(i,t[i.key]);}function xt(e){let t=null,n=[],r={},s=i=>{t!==i&&(t=i,{steps:n,values:r}=wt(e,i));};return {invalidate(){t=null;},steps(i){return s(i),n},values(i){return s(i),r}}}function Et(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,B(t))}function Ae(e){return St(e.definition,Et(e))[e.currentStepIndex+1]}function ge(e){let t=e.currentStep,n=t.fields.map(({key:s})=>s);e.state.values=Et(e);for(let s of n)delete e.errors[s];V(e,n),e.skipped.set(t.id,n),V(e,e.visibility.reconcileHidden(e.values,e.errors)),e.visibility.markChanged(true,true);let r=H(e);return e.notify({fieldKeys:[...n,...r],structureChanged:true,valuesChanged:true}),n}function ye(e){let t=e.currentStep;t&&e.skipped.delete(t.id);}function It(e,t){return e.state.currentStepIndex=t,e.notify({structureChanged:true}),ge(e)}function Le(e){return !!e&&Object.getPrototypeOf(e)===Object.prototype&&e.ok===false}function An(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"):[];P(e,r,true,i);}async function he(e,t,n=false){if(e.submitting||e.stepValidating)return false;n||ye(e);let r=m({},e.lifecycle),s=false,i=e.validationEpoch,o=e.latestOperation=++e.operationEpoch,a=W(e),u=fe(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 b=await r.onBeforeSubmit(a);if(c()||b===!1)return !1}if(c())return !1;if(r.onBeforeSubmit){if(Object.keys(te(e,!0)).length>0||c())return !1;a=W(e);}s=!0;let l=[...e.skipped.keys()],d=m({},e.values),f=e.state.serverErrors,g=await t(a,[...l]),y=Le(g);return o!==e.operationEpoch?!y:y?(An(e,g,d),!1):(e.state.serverErrors===f&&P(e,{},!0),await ce("afterSubmit",()=>{var b;return (b=r.onAfterSubmit)==null?void 0:b.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 Ct(e){let t=e.currentStep;if(!t)return true;let n=j(t,T(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:R(r,e.errors)}),true}function Rt(e,t){e.validationEpoch++,e.state.currentStepIndex=t,e.notify({structureChanged:true});}async function $t(e,t){var d;if(!e.isMultiStep||e.stepValidating||e.submitting||!((d=e.currentStep)!=null&&d.skip))return false;if(Ae(e))return be(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;ge(e);let a=e.values,u=gt(e,a),c=he(e,async(f,g)=>{let y=await t(f,g),b=Le(y);return (!b||l===e.operationEpoch)&&(o=b),y},true),l=e.latestOperation;try{return await c}finally{if(o!==false&&l===e.latestOperation&&e.values===a){let f=e.visibleSteps,g=u(),y=e.values;e.state.values=m({},r);for(let b of g)delete e.values[b],delete s[b],delete i[b],b in y&&(e.values[b]=y[b]);o===void 0&&(e.state.serverErrors=i),e.state.errors=m(m({},o?{}:s),e.errors),e.skipped.delete(n.id),V(e,e.visibility.reconcileHidden(e.values,e.errors)),e.visibility.markChanged(true,true),e.state.currentStepIndex=me(f,e.visibleSteps,e.currentStepIndex),H(e),e.notify({fieldKeys:Object.keys(m(m(m({},r),y),s)),structureChanged:true,valuesChanged:true});}}}async function be(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&&ye(e),i&&Ct(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({},T(e))},g=e.validationEpoch,y=e.latestOperation=++e.operationEpoch,b=fe(e,f.values),x=()=>{var k;return g!==e.validationEpoch||y!==e.operationEpoch||((k=e.currentStep)==null?void 0:k.id)!==s.id||b()};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 P(e,k),!1}if(o.onBeforeStepChange){let k=await o.onBeforeStepChange(f);if(x()||k===!1)return !1}return x()||i&&Ct(e)?!1:(u=!0,r&&ge(e),Rt(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{y===e.operationEpoch&&(e.state.stepValidating=false,e.notify());}}function Mt(e,t){if(!e.isMultiStep)return;let n=e.visibility.findStepIndex(t,e.values,e.currentStepIndex);n===e.currentStepIndex?e.notify():n!==null&&Rt(e,n);}function Dt(e,t){return e.add(t),()=>e.delete(t)}function Ot(){let e=0,t=0,n=new Set,r=new Set,s=new Map,i=new Map;return {subscribe:o=>Dt(n,o),getSnapshot:()=>e,subscribeStructure:o=>Dt(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 Ln(e,t){try{if(process.env.NODE_ENV!=="production")return oe(e,{validators:t})}catch(n){if(!(n instanceof ReferenceError))throw n}}function Vt(e,t,n){var o,a;let r=(o=Ln(e,n))!=null?o:pt(e),s=r.filter(Be);if(s.length)throw new $(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 ve(e){var b,x,k;let t=le(e),n=new Map,r=new Set,s=xt(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,[...(b=n.get(p.key))!=null?b:[],p]),je(p,i);for(let p of (x=e.steps)!=null?x:[]){for(let v of p.fields)a.set(v,p);je(p,o);for(let v of (k=p.routes)!=null?k:[])for(let F of ue(v))r.add(F);}let d=()=>{var p;return ((p=e.steps)!=null?p:[]).length>0},f=(p,v)=>I(p,s.values(v)),g=(p,v)=>{let F=a.get(p);return !F||s.steps(v).includes(F)};function y(p,v){var C,A,Y;if(!u)return l;if(u=false,!d())return l.visibleSteps=[],l.currentStep=null,l.visibleFields=((C=e.fields)!=null?C:[]).filter(N=>f(N,p)),l;let F=l.visibleSteps=s.steps(p),S=l.currentStep=(Y=(A=F[v])!=null?A:F[F.length-1])!=null?Y:null;return l.visibleFields=S?S.fields.filter(N=>f(N,p)):[],l}return {allFields:t,conditionValues:s.values,state:y,markChanged(p,v){p&&(u=true),(p||v)&&(c=true);},getCanGoNext(p,v,F){let S=y(p,v).currentStep;if(!c)return l.canGoNext;c=false;let C=S?j(S,s.values(p),F):{};return l.canGoNext=d()&&Object.keys(C).length===0},findStepIndex(p,v,F){let S=y(v,F).visibleSteps.findIndex(C=>C.fields.some(A=>A.key===p));return S===-1?null:S},affectsStructure(p,v){return r.has(p)||i.has(p)||o.has(p)||v.size>0},activeField(p,v){var F;return (F=n.get(p))==null?void 0:F.find(S=>g(S,v)&&f(S,v))},reconcileHidden(p,v){var N,Pe;s.invalidate();let F=[...new Set([...i.keys(),...o.keys()])],S=new Set(F),C=new Set,A=w=>p[w]!==void 0||v[w]!==void 0,Y=w=>{delete p[w],delete v[w],s.invalidate(),C.add(w),!S.has(w)&&(S.add(w),F.push(w));};for(let w=0;w<F.length;w++){let ke=F[w];S.delete(ke);for(let L of (N=i.get(ke))!=null?N:[])g(L,p)&&!f(L,p)&&A(L.key)&&Y(L.key);for(let L of (Pe=o.get(ke))!=null?Pe:[])if(!f(L,p))for(let Ne of L.fields)A(Ne.key)&&Y(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.latestOperation=0;this.subscriptions=Ot();var i;this.lifecycle=r!=null?r:{},this.validators=(i=r==null?void 0:r.validators)!=null?i:{},Vt(t,this.lifecycle,this.validators),this.messages=D(r==null?void 0:r.messages,t.messages),this.visibility=ve(t);let s=B(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=Object.create(null);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,pe(this.internals,t,o);for(let[g,y]of this.skipped)o&&y.includes(t)&&this.skipped.delete(g);let u=this.visibility.reconcileHidden(r,s);V(this.internals,u);let c=bt(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=me(i,this.visibleSteps,this.currentStepIndex);for(let g of H(this.internals))l.add(g);}this.notify({fieldKeys:l,structureChanged:f,valuesChanged:d});}setErrors(t){P(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 be(this.internals,"next")}back(){return be(this.internals,"back")}skip(t){return $t(this.internals,t)}submit(t){return he(this.internals,t)}isStepSkipped(t){return this.skipped.has(t)}validate(){return te(this.internals)}validateField(t){return vt(this.internals,t)}getSubmitValues(){return W(this.internals)}goToStepWithField(t){Mt(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 jn='Pass the values object as the second argument, not the request body with "values" and "skippedSteps".',Tn=()=>null,Te=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function Pn(e,t,n){var a;let r=n!==null&&typeof n=="object"&&!Array.isArray(n)?n:{},s=ve(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){let g=at((a=o.active.get(f))!=null?a:t.find(y=>y.key===f),r[f]);g!==void 0&&(c[f]=g);}let l=new Map;for(let f of i){let g=s.activeField(f,c);g&&l.set(f,g);}let d=i.every(f=>l.get(f)===o.active.get(f));if(o={values:c,active:l},d)break}return o}function Nn({values:e,active:t},n){let r=new Map;for(let[s,i]of t){let o=De(i,e[s],n);o&&r.set(s,o);}return r}function Kn(e,t){var s;let n=i=>i.map(o=>t.has(o.key)?Se(m({},o),{validation:void 0}):o),r=(s=e.steps)==null?void 0:s.map(i=>Se(m({},i),{fields:n(i.fields)}));return m(m(m({},e),e.fields&&{fields:n(e.fields)}),r&&{steps:r})}function _n(e,t={}){let n={};for(let{validation:r}of e)r!=null&&r.validator&&(n[r.validator]=Tn);return m(m({},n),t)}function qn(e,t){return t===null||typeof t!="object"||!Te(t,"values")?false:!e.some(n=>n.key==="values"||n.key==="skippedSteps")}function Un(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)&&It(e,r);}}function Bn(e,t,n={}){ae(e);let r=le(e),s=Pn(e,r,t),i=D(n.messages,e.messages),o=Nn(s,i),a={validators:_n(r,n.validators),messages:i,onWarning:()=>{}},u=new Fe(Kn(e,o),s.values,a);Un(u,n.skippedSteps);let c=u.validate(),l=u.getSubmitValues();for(let[d,f]of o)Te(l,d)&&(c[d]=f);return qn(r,t)&&(c.values=jn),{values:l,errors:c}}exports.FormDefinitionError=$;exports.checkDefinition=oe;exports.parseDefinition=ae;exports.validateSubmission=Bn;return exports;})({});//# sourceMappingURL=server.iife.js.map
6
6
  //# sourceMappingURL=server.iife.js.map