@formhaus/core 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{check-definition-DuLExofm.d.ts → check-definition-DyiWqhEV.d.ts} +3 -3
- package/dist/chunk-5WADJMJJ.js +2 -0
- package/dist/chunk-5WADJMJJ.js.map +1 -0
- package/dist/chunk-5YPOS62Y.js +3 -0
- package/dist/chunk-5YPOS62Y.js.map +1 -0
- package/dist/chunk-CW5ZWCSD.js +2 -0
- package/dist/chunk-CW5ZWCSD.js.map +1 -0
- package/dist/chunk-QMT7RJ4T.js +3 -0
- package/dist/chunk-QMT7RJ4T.js.map +1 -0
- package/dist/chunk-QVA6DLYS.js +2 -0
- package/dist/chunk-QVA6DLYS.js.map +1 -0
- package/dist/chunk-REIX6ART.js +2 -0
- package/dist/chunk-REIX6ART.js.map +1 -0
- package/dist/chunk-TMO47L42.js +5 -0
- package/dist/chunk-TMO47L42.js.map +1 -0
- package/dist/cloud.d.ts +3 -3
- package/dist/cloud.js +1 -1
- package/dist/{controller-Ds_kbXSU.d.ts → controller-BJVYkMHT.d.ts} +1 -1
- package/dist/default-messages-E-nZe4Tc.d.ts +10 -0
- package/dist/{definition-B4OIy_wH.d.ts → definition-o4Y0OY6y.d.ts} +53 -6
- package/dist/fix.d.ts +38 -0
- package/dist/fix.js +3 -0
- package/dist/fix.js.map +1 -0
- package/dist/i18n.d.ts +4 -3
- package/dist/i18n.js +1 -1
- package/dist/i18n.js.map +1 -1
- package/dist/{runtime-BN2PuKD7.d.ts → index-BNGgMIbC.d.ts} +20 -6
- package/dist/index.d.ts +67 -11
- package/dist/index.js +1 -1
- package/dist/internal.d.ts +28 -8
- package/dist/internal.js +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/issues-Dua58e1J.d.ts +14 -0
- package/dist/server.d.ts +5 -5
- package/dist/server.iife.js +3 -3
- package/dist/server.iife.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/{validate-field-ND_UxoJU.d.ts → validate-field-CRR6GQBA.d.ts} +2 -2
- package/fixtures/submissions/choices.json +6 -26
- package/fixtures/submissions/groups.json +649 -0
- package/fixtures/submissions/messages.json +4 -16
- package/fixtures/submissions/show-conditions.json +2 -7
- package/fixtures/submissions/skip-routes.json +1 -3
- package/fixtures/submissions/skip.json +3 -9
- package/fixtures/submissions/special-types.json +2 -6
- package/package.json +10 -6
- package/schema/form-definition.schema.json +380 -19
- package/schema/form-translation.schema.json +79 -1
- package/style.css +103 -82
- package/dist/chunk-35SAVPYL.js +0 -2
- package/dist/chunk-35SAVPYL.js.map +0 -1
- package/dist/chunk-76YV4J3Q.js +0 -3
- package/dist/chunk-76YV4J3Q.js.map +0 -1
- package/dist/chunk-PBTYUSZR.js +0 -2
- package/dist/chunk-PBTYUSZR.js.map +0 -1
- package/dist/chunk-PZEBYRGE.js +0 -2
- package/dist/chunk-PZEBYRGE.js.map +0 -1
- package/dist/chunk-RN5GQHKN.js +0 -5
- package/dist/chunk-RN5GQHKN.js.map +0 -1
- package/dist/chunk-YTUVSJUF.js +0 -3
- package/dist/chunk-YTUVSJUF.js.map +0 -1
- package/dist/default-messages-yS4QtrYi.d.ts +0 -23
package/dist/internal.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
export { j as CloudCallbacks, k as CloudControllerOptions, l as CloudState, m as cloudStateFor, n as createCloudController, o as initialCloudState } from './controller-
|
|
2
|
-
import { F as
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import './
|
|
1
|
+
export { j as CloudCallbacks, k as CloudControllerOptions, l as CloudState, m as cloudStateFor, n as createCloudController, o as initialCloudState } from './controller-BJVYkMHT.js';
|
|
2
|
+
import { l as FormDefinition, r as LabelSource, F as FormGroup, q as LabelKey } from './definition-o4Y0OY6y.js';
|
|
3
|
+
import { F as FormEngine, S as SourceContext } from './index-BNGgMIbC.js';
|
|
4
|
+
export { i as itemLimits } from './index-BNGgMIbC.js';
|
|
5
|
+
import './issues-Dua58e1J.js';
|
|
6
|
+
import './default-messages-E-nZe4Tc.js';
|
|
7
|
+
import './validate-field-CRR6GQBA.js';
|
|
6
8
|
|
|
7
9
|
interface Searchable {
|
|
8
10
|
querySelector(selector: string): unknown;
|
|
@@ -29,15 +31,33 @@ declare function canMoveFocus(form: FormRoot | null | undefined): boolean;
|
|
|
29
31
|
declare function restoreFocus(form: FormRoot | null | undefined, target: (Focusable & {
|
|
30
32
|
isConnected: boolean;
|
|
31
33
|
}) | null): void;
|
|
32
|
-
declare function focusField(form: FormRoot | null | undefined,
|
|
34
|
+
declare function focusField(form: FormRoot | null | undefined, id: string | null): void;
|
|
35
|
+
declare function focusItem(document: {
|
|
36
|
+
getElementById(id: string): unknown;
|
|
37
|
+
}, root: Searchable | null | undefined, formId: string, group: string, index: number, added: boolean, definition?: FormDefinition): void;
|
|
33
38
|
|
|
34
|
-
declare function fieldDomId(formId: string | undefined, key: string): string;
|
|
39
|
+
declare function fieldDomId(formId: string | undefined, key: string, definition?: FormDefinition): string;
|
|
40
|
+
declare function itemDomId(formId: string | undefined, group: string, index: number, field?: string, definition?: FormDefinition): string;
|
|
41
|
+
|
|
42
|
+
declare function itemTitle(group: FormGroup, index: number, ...labels: (LabelSource | undefined)[]): string;
|
|
43
|
+
declare function errorDomId(engine: FormEngine, formId: string, key: string): string;
|
|
44
|
+
interface ErrorEntry {
|
|
45
|
+
key: string;
|
|
46
|
+
id: string;
|
|
47
|
+
label: string;
|
|
48
|
+
message: string;
|
|
49
|
+
}
|
|
50
|
+
declare function errorEntries(engine: FormEngine, formId: string, ...labels: (LabelSource | undefined)[]): ErrorEntry[];
|
|
51
|
+
declare function itemHasContent(engine: FormEngine, key: string, index: number): boolean;
|
|
35
52
|
|
|
36
53
|
declare function shouldApplyExternalErrors(engine: FormEngine, previous: Record<string, string> | undefined, next: Record<string, string>): boolean;
|
|
37
54
|
|
|
38
55
|
declare function labelFor(key: LabelKey, params: Record<string, unknown>, ...sources: (LabelSource | undefined)[]): string;
|
|
39
56
|
|
|
57
|
+
declare function browserSources(): SourceContext;
|
|
58
|
+
declare function applySources(engine: FormEngine, initialValues?: Record<string, unknown>): void;
|
|
59
|
+
|
|
40
60
|
declare function conditionValues(engine: FormEngine): Record<string, unknown>;
|
|
41
61
|
declare function autoAdvance(engine: FormEngine): Promise<boolean>;
|
|
42
62
|
|
|
43
|
-
export { autoAdvance, canMoveFocus, conditionValues, fieldDomId, focusField, focusProblem, labelFor, restoreFocus, shouldApplyExternalErrors };
|
|
63
|
+
export { type ErrorEntry, applySources, autoAdvance, browserSources, canMoveFocus, conditionValues, errorDomId, errorEntries, fieldDomId, focusField, focusItem, focusProblem, itemDomId, itemHasContent, itemTitle, labelFor, restoreFocus, shouldApplyExternalErrors };
|
package/dist/internal.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {f,i,j as
|
|
1
|
+
import {f,i,j,g as g$1,d,e as e$1,a,c as c$1,b as b$3}from'./chunk-5YPOS62Y.js';import {e}from'./chunk-CW5ZWCSD.js';export{r as itemLimits}from'./chunk-CW5ZWCSD.js';import {c}from'./chunk-REIX6ART.js';import {g as g$2,b as b$2}from'./chunk-QVA6DLYS.js';import {E as E$1,D as D$1,v,n,b as b$1,z as z$1,r}from'./chunk-5WADJMJJ.js';var ie={multiselect:"list",checkbox:"flag",switch:"flag",number:"number",file:"file",group:"list"};function F(e){return r([...e.fields??[],...(e.steps??[]).flatMap(n=>n.fields)])}function C(e){return ie[e.type]??"text"}function se(e,n){if(!Array.isArray(e.options))return true;let t=new Set(e.options.map(r=>String(r.value)));return (Array.isArray(n)?n:[n]).every(r=>t.has(String(r)))}function le(e,n,t){if(e&&C(e)!==C(n))return false;switch(C(n)){case "list":return Array.isArray(t);case "flag":return typeof t=="boolean";case "number":return typeof t=="number";case "text":return typeof t=="string";default:return e!==void 0}}function W(e,n,t){let r=new Map(t?F(t).map(o=>[o.key,o]):[]),i={};for(let o of F(n)){let s=e[o.key];s!=null&&le(r.get(o.key),o,s)&&se(o,s)&&(i[o.key]=s);}return i}function z(e,n){let t=F(e),r={},i=new Set;for(let[o,s]of Object.entries(n))t.some(u=>u.key===o||u.type==="group"&&z$1(u.key,o))?r[o]=s:i.add(s);return {fields:r,other:[...i]}}function Z(e,n,t,r){let i={};for(let o of F(e)){let s=n[o.key]!==void 0&&n[o.key]!==null&&n[o.key]!=="";s&&!(o.key in t)?i[o.key]=b$3:r[o.key]&&(!s||o.key in t)&&(i[o.key]=r[o.key]);}return i}var h={definition:null,version:null,settings:{},loadError:null,errors:{},notice:null,initialValues:null,revision:0,attempt:0,done:false};function X(e){return e?{...h,definition:e.definition,version:e.version??null,settings:f(e.settings)}:h}function Q(e,n=[]){return {tone:"error",message:e.message,action:e.action,details:n}}function ue(e,n){let t=new AbortController,r,i$1=l=>{r??(r=l.renderToken);let f=r===l.renderToken?void 0:r;return i({...e,version:l.version,renderToken:l.renderToken,firstRenderToken:f})},o=i(e),s=e.initialForm,u=()=>!t.signal.aborted,a$1=h,m=l=>{a$1={...a$1,...l},n.onChange(a$1);},y=l=>m({...l,attempt:a$1.attempt+1});function I(l){o=i$1(l);let f=e.draftStore?.load(e.id,l.version)??null;m({...X(l),revision:a$1.revision,attempt:a$1.attempt,initialValues:f});}async function re(l,f$1){let c=a$1.definition;try{let d$1=await g$1(e,t.signal,l.version);if(!u())return;if(d$1.version===void 0||d$1.version<(l.version??0))throw new d(409,"form_updated");let p=c?W(f$1,d$1.definition,c):{};o=i$1(d$1),y({definition:d$1.definition,version:d$1.version,settings:f(d$1.settings),initialValues:p,revision:a$1.revision+1,errors:Z(d$1.definition,f$1,p,l.errors??{}),notice:{tone:"info",message:a,action:null,details:[]}});}catch{u()&&y({notice:{tone:"error",...c$1(409,"form_updated"),details:[]}});}}async function oe(l,f){let c=l instanceof d?l:e$1(l);if(c.code==="form_updated"&&c.version!==void 0)return re(c,f);if(c.status!==422)return y({notice:Q(c)});let d$1=c.errors??{},p=a$1.definition?z(a$1.definition,d$1):{fields:d$1,other:[]};y({errors:p.fields,notice:p.other.length>0?Q(c,p.other):null});}return {start(){if(a$1.loadError&&m({loadError:null}),s){I(s),s=void 0;return}g$1(e,t.signal).then(l=>{u()&&I(l);},l=>{u()&&(m({loadError:l}),n.onError?.(l));});},dispose(){t.abort();},saveDraft(l){a$1.definition&&!a$1.done&&e.draftStore?.save(e.id,a$1.version??void 0,j(a$1.definition,l));},again(){m({done:false,errors:{},notice:null,initialValues:null,revision:a$1.revision+1});},async submit(l,f){a$1.notice&&m({notice:null});try{let c=await o(l,f);if(!u())return;e.draftStore?.clear(e.id),m({done:!0}),n.onSuccess?.(c);}catch(c){throw u()&&(await oe(c,l),n.onError?.(c)),c}}}}var g=e=>e.replace(/[^\w-]/g,"-"),Y=new WeakMap;function ae(e){let n=2166136261;for(let t of e)n=Math.imul(n^t.codePointAt(0),16777619)>>>0;return n.toString(36)}function ce(e){let n=Y.get(e);if(n)return n;n=new Map;let t=new Set,r=[...new Set(b$2(e).map(i=>i.key))].sort((i,o)=>+(g(o)===o)-+(g(i)===i)||(i<o?-1:1));for(let i of r){let o=g(i);for(let s=i;t.has(o);s=o)o=`${g(i)}-${ae(s)}`;t.add(o),n.set(i,o);}return Y.set(e,n),n}function S(e,n,t){return `${e?g(e):"fh"}-${(t&&ce(t).get(n))??g(n)}`}function b(e,n,t,r,i){return `${S(e,n,i)}--${t}${r===void 0?"":`--${g(r)}`}`}var D='input:not([type="hidden"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';function R(e){return e?.matches(".fh-group")?e.querySelector(".fh-group__add")??e.querySelector(D):e?.matches(D)?e:e?.querySelector(D)}function de(e,n){n.scrollIntoView?.({block:"center"}),e.focus({preventScroll:true});}function fe(e,n){let t=n??e?.querySelector('[aria-invalid="true"]');t&&de(n??R(t)??t,t);}function me(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 ge(e,n){let t=e?.ownerDocument;t&&t.activeElement===t.body&&n?.isConnected&&n.focus();}function pe(e,n){let t=e?.querySelector(".fh-form__fields"),r=n?t?.querySelector(`[id="${n}"], [id="${n}-error"]`):null;if(n&&!r)return;let i=r?.closest?.(".fh-field, .fh-group")??r??t?.querySelector('[aria-invalid="true"]');((!i?.matches(".fh-group")&&i?.querySelector("input:checked:not(:disabled)")||R(i)||R(t))??e)?.focus();}function be(e,n,t,r,i,o,s){let u=e.getElementById(b(t,r,i,void 0,s));((o?u?.closest?.(".fh-group__item")?.querySelector("input, select, textarea"):u)??n?.querySelector(".fh-group__add")??e.getElementById(b(t,r,i-1,void 0,s)))?.focus();}function A(e,n,...t){return E$1(c,e,n,t)}var E=e=>e.e;function ee(e,n,...t){let r={label:e.label,index:n+1};return e.itemLabel?D$1(e.itemLabel,r):A("itemLabel",r,...t)}function ne(e,n,t){let r=E(e).parse(t);return r?b(n,...r,e.definition):S(n,t,e.definition)}function ye(e$1,n,...t){let{errors:r,values:i}=e$1,o=e$1.isMultiStep?e$1.visibleSteps.flatMap(s=>s.fields):e$1.definition.fields??[];return e(o,r,i).flatMap(s=>{let u=E(e$1).l(s,i),a=u?.field??E(e$1).s(s,i);if(!a)return [];let m=u?`${a.label} (${ee(u.group,u.index,...t)})`:a.label;return [{key:s,id:ne(e$1,n,s),label:m,message:r[s]}]})}function Fe(e,n$1,t){let r=E(e).groups.find(o=>o.key===n$1),i=v(e.values[n$1])[t];return !r||!n(i)?false:r.fields.some(({key:o,defaultValue:s})=>{let u=typeof i[o]=="string"?i[o].trim():i[o];return !b$1(u)&&u!==false&&JSON.stringify(u)!==JSON.stringify(s)})}function he(e,n){let t=Object.keys(n);return t.length===Object.keys(e).length&&t.every(r=>e[r]===n[r])}function Se(e,n){return Object.entries(n).every(([t,r])=>e.errors[t]===r||e.topLevelErrors.includes(r))}function Ee(e,n,t){return !n||!he(n,t)||!Se(e,t)}function ve(e){return e.navigator.userAgentData?.mobile?"mobile":e.matchMedia("(pointer: coarse)").matches?e.matchMedia("(min-width: 600px) and (min-height: 600px)").matches?"tablet":"mobile":"desktop"}function te(){let e=globalThis,{location:n,document:t,navigator:r}=e;return {get search(){return n.search},get href(){return n.href},get referrer(){return t.referrer},get pageTitle(){return t.title},get language(){return r.language},get timezone(){return Intl.DateTimeFormat().resolvedOptions().timeZone},get device(){return ve(e)}}}function ke(e,n){let t=g$2(e.definition,te(),n),r=Object.keys(t);if(r.length){e.e.seed(t);for(let i of r)e.setValue(i,t[i]);}}function Xe(e){let n=e;return n.e.y(n.values)}function Ye(e){return e.b("autoAdvance")}export{ke as applySources,Ye as autoAdvance,te as browserSources,me as canMoveFocus,X as cloudStateFor,Xe as conditionValues,ue as createCloudController,ne as errorDomId,ye as errorEntries,S as fieldDomId,pe as focusField,be as focusItem,fe as focusProblem,h as initialCloudState,b as itemDomId,Fe as itemHasContent,ee as itemTitle,A as labelFor,ge as restoreFocus,Ee as shouldApplyExternalErrors};//# sourceMappingURL=internal.js.map
|
|
2
2
|
//# sourceMappingURL=internal.js.map
|
package/dist/internal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"sources":["../src/cloud/carry.ts","../src/cloud/controller.ts","../src/internal/ids.ts","../src/internal/focus.ts","../src/i18n/labels.ts","../src/internal/items.ts","../src/engine/external-errors.ts","../src/internal/sources.ts","../src/internal/index.ts"],"names":["SHAPES","fieldsOf","definition","valueFields","step","shapeOf","field","allowed","value","options","option","item","fits","previous","next","carryValues","values","before","kept","splitErrors","errors","known","fields","other","key","message","splitPath","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","cache","hash","text","char","idsOf","ids","taken","keys","getAllFields","a","b","id","seed","fieldDomId","formId","itemDomId","group","index","CONTROLS","firstControl","root","reveal","target","scrollTo","focusProblem","notice","invalid","canMoveFocus","active","restoreFocus","document","focusField","chosen","focusItem","added","labelFor","params","sources","resolveText","DEFAULT_LABELS","visibility","engine","itemTitle","labels","formatText","errorDomId","path","errorEntries","nodes","errorKeys","activeItem","activeField","label","itemHasContent","candidate","itemsOf","isEntry","name","defaultValue","isBlank","sameErrors","holdsErrors","shouldApplyExternalErrors","device","browser","browserSources","location","navigator","applySources","initialValues","resolveSources","conditionValues","internals","autoAdvance","advance"],"mappings":"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","file":"internal.js","sourcesContent":["import type { FormDefinition, FormField } from '../types';\nimport { splitPath, valueFields } from '../visibility/nodes';\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 group: 'list',\n};\n\nfunction fieldsOf(definition: FormDefinition): FormField[] {\n return valueFields([...(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':\n return Array.isArray(value);\n case 'flag':\n return typeof value === 'boolean';\n case 'number':\n return typeof value === 'number';\n case 'text':\n return typeof value === 'string';\n default:\n return previous !== undefined;\n }\n}\n\nexport function carryValues(values: Record<string, unknown>, next: FormDefinition, previous?: FormDefinition): 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 = fieldsOf(definition);\n const fields: Record<string, string> = {};\n const other = new Set<string>();\n for (const [key, message] of Object.entries(errors)) {\n if (known.some((field) => field.key === key || (field.type === 'group' && splitPath(field.key, 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,\n version: null,\n settings: {},\n loadError: null,\n errors: {},\n notice: null,\n initialValues: null,\n revision: 0,\n attempt: 0,\n 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) => {\n if (alive()) show(form);\n },\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)\n 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","import { getAllFields } from '../engine/engine-utils';\nimport type { FormDefinition } from '../types';\n\nconst clean = (value: string) => value.replace(/[^\\w-]/g, '-');\nconst cache = new WeakMap<FormDefinition, Map<string, string>>();\n\nfunction hash(text: string): string {\n let value = 0x811c9dc5;\n for (const char of text) value = Math.imul(value ^ char.codePointAt(0)!, 0x01000193) >>> 0;\n return value.toString(36);\n}\n\nfunction idsOf(definition: FormDefinition): Map<string, string> {\n let ids = cache.get(definition);\n if (ids) return ids;\n ids = new Map();\n const taken = new Set<string>();\n const keys = [...new Set(getAllFields(definition).map((field) => field.key))].sort(\n (a, b) => +(clean(b) === b) - +(clean(a) === a) || (a < b ? -1 : 1),\n );\n for (const key of keys) {\n let id = clean(key);\n for (let seed = key; taken.has(id); seed = id) id = `${clean(key)}-${hash(seed)}`;\n taken.add(id);\n ids.set(key, id);\n }\n cache.set(definition, ids);\n return ids;\n}\n\nexport function fieldDomId(formId: string | undefined, key: string, definition?: FormDefinition): string {\n return `${formId ? clean(formId) : 'fh'}-${(definition && idsOf(definition).get(key)) ?? clean(key)}`;\n}\n\nexport function itemDomId(formId: string | undefined, group: string, index: number, field?: string, definition?: FormDefinition): string {\n return `${fieldDomId(formId, group, definition)}--${index}${field === undefined ? '' : `--${clean(field)}`}`;\n}\n","import type { FormDefinition } from '../types';\nimport { itemDomId } 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 if (root?.matches('.fh-group')) return (root.querySelector('.fh-group__add') as Found) ?? (root.querySelector(CONTROLS) as 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 const invalid = notice ?? (root?.querySelector('[aria-invalid=\"true\"]') as Found);\n if (invalid) reveal(notice ?? 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, id: string | null): void {\n const fields = form?.querySelector('.fh-form__fields') as Found;\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, .fh-group') ?? chosen ?? fields?.querySelector('[aria-invalid=\"true\"]')) as Found;\n const target =\n (!field?.matches('.fh-group') && (field?.querySelector('input:checked:not(:disabled)') as Found)) ||\n firstControl(field) ||\n firstControl(fields);\n (target ?? form)?.focus();\n}\n\nexport function focusItem(\n document: { getElementById(id: string): unknown },\n root: Searchable | null | undefined,\n formId: string,\n group: string,\n index: number,\n added: boolean,\n definition?: FormDefinition,\n): void {\n const item = document.getElementById(itemDomId(formId, group, index, undefined, definition)) as Focusable | null;\n const next = (\n added ? (item?.closest?.('.fh-group__item') as Searchable | null | undefined)?.querySelector('input, select, textarea') : item\n ) as Found;\n (\n next ??\n (root?.querySelector('.fh-group__add') as Found) ??\n (document.getElementById(itemDomId(formId, group, index - 1, undefined, definition)) as Found)\n )?.focus();\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","import type { FormEngine } from '../engine';\nimport { errorKeys } from '../engine/validation-state';\nimport type { EngineInternals } from '../engine/runtime-internals';\nimport { itemLimits } from '../engine/groups';\nimport { labelFor } from '../i18n/labels';\nimport type { FormGroup, LabelSource } from '../types';\nimport { isBlank } from '../visibility/evaluate-condition';\nimport { isEntry, itemsOf } from '../visibility/nodes';\nimport { formatText } from '../validation/default-messages';\nimport { fieldDomId, itemDomId } from './ids';\n\nexport { itemLimits };\n\nconst visibility = (engine: FormEngine) => (engine as unknown as EngineInternals).visibility;\n\nexport function itemTitle(group: FormGroup, index: number, ...labels: (LabelSource | undefined)[]): string {\n const params = { label: group.label, index: index + 1 };\n return group.itemLabel ? formatText(group.itemLabel, params) : labelFor('itemLabel', params, ...labels);\n}\n\nexport function errorDomId(engine: FormEngine, formId: string, key: string): string {\n const path = visibility(engine).parse(key);\n return path ? itemDomId(formId, ...path, engine.definition) : fieldDomId(formId, key, engine.definition);\n}\n\nexport interface ErrorEntry {\n key: string;\n id: string;\n label: string;\n message: string;\n}\n\nexport function errorEntries(engine: FormEngine, formId: string, ...labels: (LabelSource | undefined)[]): ErrorEntry[] {\n const { errors, values } = engine;\n const nodes = engine.isMultiStep ? engine.visibleSteps.flatMap((step) => step.fields) : (engine.definition.fields ?? []);\n return errorKeys(nodes, errors, values).flatMap((key) => {\n const item = visibility(engine).activeItem(key, values);\n const field = item?.field ?? visibility(engine).activeField(key, values);\n if (!field) return [];\n const label = item ? `${field.label} (${itemTitle(item.group, item.index, ...labels)})` : field.label;\n return [{ key, id: errorDomId(engine, formId, key), label, message: errors[key] }];\n });\n}\n\nexport function itemHasContent(engine: FormEngine, key: string, index: number): boolean {\n const group = visibility(engine).groups.find((candidate) => candidate.key === key);\n const item = itemsOf(engine.values[key as never])[index];\n if (!group || !isEntry(item)) return false;\n return group.fields.some(({ key: name, defaultValue }) => {\n const value = typeof item[name] === 'string' ? (item[name] as string).trim() : item[name];\n return !isBlank(value) && value !== false && JSON.stringify(value) !== JSON.stringify(defaultValue);\n });\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]) => engine.errors[key] === message || engine.topLevelErrors.includes(message));\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 { FormEngine } from '../engine';\nimport type { EngineInternals } from '../engine/runtime-internals';\nimport { resolveSources, type SourceContext } from '../sources';\n\ninterface Browser {\n location: { search: string; href: string };\n document: { referrer: string; title: string };\n navigator: { language: string; userAgentData?: { mobile?: boolean } };\n matchMedia(query: string): { matches: boolean };\n}\n\nfunction device(browser: Browser): string {\n if (browser.navigator.userAgentData?.mobile) return 'mobile';\n if (!browser.matchMedia('(pointer: coarse)').matches) return 'desktop';\n return browser.matchMedia('(min-width: 600px) and (min-height: 600px)').matches ? 'tablet' : 'mobile';\n}\n\nexport function browserSources(): SourceContext {\n const browser = globalThis as unknown as Browser;\n const { location, document, navigator } = browser;\n return {\n get search() {\n return location.search;\n },\n get href() {\n return location.href;\n },\n get referrer() {\n return document.referrer;\n },\n get pageTitle() {\n return document.title;\n },\n get language() {\n return navigator.language;\n },\n get timezone() {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n },\n get device() {\n return device(browser);\n },\n };\n}\n\nexport function applySources(engine: FormEngine, initialValues?: Record<string, unknown>): void {\n const values = resolveSources(engine.definition, browserSources(), initialValues);\n const keys = Object.keys(values);\n if (!keys.length) return;\n (engine as unknown as EngineInternals).visibility.seed(values);\n for (const key of keys) engine.setValue(key, values[key]);\n}\n","export {\n cloudStateFor,\n createCloudController,\n initialCloudState,\n type CloudCallbacks,\n type CloudControllerOptions,\n type CloudState,\n} from '../cloud/controller';\nexport { canMoveFocus, focusField, focusItem, focusProblem, restoreFocus } from './focus';\nexport { fieldDomId, itemDomId } from './ids';\nexport { errorDomId, errorEntries, itemHasContent, itemLimits, itemTitle, type ErrorEntry } from './items';\nexport { shouldApplyExternalErrors } from '../engine/external-errors';\nexport { labelFor } from '../i18n/labels';\nimport type { FormEngine } from '../engine';\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 (engine as unknown as EngineInternals).advance('autoAdvance');\n}\nexport { applySources, browserSources } from './sources';\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type DefinitionIssueCode = 'invalid-type' | 'missing-property' | 'unknown-property' | 'empty-label' | 'fields-and-steps' | 'duplicate-step-id' | 'duplicate-key' | 'duplicate-option-value' | 'reserved-key' | 'route-target' | 'unknown-field' | 'group-scope' | 'invalid-nesting' | 'outdated-format-version' | 'forward-reference' | 'condition-operator-count' | 'unknown-operator' | 'condition-value-mismatch' | 'condition-cycle' | 'invalid-pattern' | 'slow-pattern' | 'invalid-range' | 'rule-not-applicable' | 'missing-options' | 'default-not-in-options' | 'unknown-field-type' | 'unknown-validator' | 'skip-unreachable' | 'route-fallthrough' | 'unsupported-format-version' | 'i18n-unbound-slot' | 'unknown-i18n-slot' | 'unknown-message-key' | 'unknown-label-key' | 'i18n-unsafe-identifier' | 'unknown-source' | 'source-not-applicable';
|
|
2
|
+
interface DefinitionIssue {
|
|
3
|
+
code: DefinitionIssueCode;
|
|
4
|
+
severity: 'error' | 'warning';
|
|
5
|
+
path: string;
|
|
6
|
+
message: string;
|
|
7
|
+
hint?: string;
|
|
8
|
+
}
|
|
9
|
+
declare class FormDefinitionError extends Error {
|
|
10
|
+
readonly issues: DefinitionIssue[];
|
|
11
|
+
constructor(issues: DefinitionIssue[]);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { type DefinitionIssue as D, FormDefinitionError as F, type DefinitionIssueCode as a };
|
package/dist/server.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { C as CheckDefinitionOptions, c as checkDefinition, p as parseDefinition } from './check-definition-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
import { V as ValidatorFn } from './validate-field-
|
|
1
|
+
export { C as CheckDefinitionOptions, c as checkDefinition, p as parseDefinition } from './check-definition-DyiWqhEV.js';
|
|
2
|
+
export { D as DefinitionIssue, a as DefinitionIssueCode, F as FormDefinitionError } from './issues-Dua58e1J.js';
|
|
3
|
+
import { l as FormDefinition } from './definition-o4Y0OY6y.js';
|
|
4
|
+
import { M as MessageSource } from './default-messages-E-nZe4Tc.js';
|
|
5
|
+
import { V as ValidatorFn } from './validate-field-CRR6GQBA.js';
|
|
6
6
|
|
|
7
7
|
interface SubmissionOptions {
|
|
8
8
|
skippedSteps?: string[];
|
package/dist/server.iife.js
CHANGED
|
@@ -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
|
|
2
|
+
var Gn=Object.defineProperty,Kn=Object.defineProperties;var _n=Object.getOwnPropertyDescriptors;var Rt=Object.getOwnPropertySymbols;var qn=Object.prototype.hasOwnProperty,Un=Object.prototype.propertyIsEnumerable;var $t=(e,t,n)=>t in e?Gn(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n,h=(e,t)=>{for(var n in t||(t={}))qn.call(t,n)&&$t(e,n,t[n]);if(Rt)for(var n of Rt(t))Un.call(t,n)&&$t(e,n,t[n]);return e},_=(e,t)=>Kn(e,_n(t));var tt=["eq","neq","in","notIn","notEmpty","gt","gte","lt","lte"];function ie(e){return e==null||e===""||Array.isArray(e)&&!e.length}function Ae(e){let t=typeof e=="string"&&e.trim()!==""?Number(e):e;return typeof t=="number"&&Number.isFinite(t)?t:void 0}var Wn={eq:(e,t)=>e===t,neq:(e,t)=>e!==t,in:(e,t)=>t.includes(e),notIn:(e,t)=>!t.includes(e),notEmpty:(e,t)=>!t||!ie(e),gt:(e,t)=>Ae(e)>t,gte:(e,t)=>Ae(e)>=t,lt:(e,t)=>Ae(e)<t,lte:(e,t)=>Ae(e)<=t};function nt(e,t){let n=t[e.field],r=tt.find(o=>e[o]!==void 0);return !!r&&Wn[r](n,e[r])}var Q=class extends Error{constructor(t){super(`Invalid form definition:
|
|
3
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&<(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
|
|
4
|
+
`)}`),this.name="FormDefinitionError",this.issues=t;}},Mt=e=>e.endsWith("?")?e:`${e}.`;function Ct(e){return (t,n,r,o)=>h({code:t,severity:e,path:n,message:`${n||"/"}: ${r}.${o?` ${Mt(o)}`:""}`},o&&{hint:Mt(o)})}var k=Ct("error"),C=Ct("warning");function ae(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}function Dt(e){return e.severity==="error"}function Z(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 Bn(e,t){let n=Array.from({length:t.length+1},(r,o)=>o);for(let r=1;r<=e.length;r++){let o=[r];for(let s=1;s<=t.length;s++)o[s]=Math.min(n[s]+1,o[s-1]+1,n[s-1]+(e[r-1]===t[s-1]?0:1));n=o;}return n[t.length]}function xe(e,t){let n=e.toLowerCase();return t.find(r=>r!==e&&Bn(n,r.toLowerCase())<=(r.length>4?2:1))}function rt(e,t){let n=xe(e,t);return n!==void 0?`Use ${JSON.stringify(n)}`:t.length?Z(t):void 0}var Ie=tt;function Hn({suggest:e},t,n){let r=Object.keys(t).filter(a=>a!=="field"),o=r.filter(a=>!Ie.includes(a)),s=o.map(a=>k("unknown-operator",`${n}/${ae(a)}`,`"${a}" is not a condition operator`,e(a,[...Ie]))),i=r.length-o.length;if(i!==1&&!(i===0&&o.length)){let a=i?`the condition has ${i} operators`:"the condition has no operator";s.push(k("condition-operator-count",n,a,`Use exactly one of: ${Ie.join(", ")}`));}return s}function Ee(e,t,n,r,o){var a,u;if(e.target(t,r))return [];let s=[...e.g].find(([,c])=>c.has(t));if(s)return [k("group-scope",n,`"${t}" is a field inside the group "${s[0]}"`,"Only fields of the same group can use it")];let i=[...r!==void 0?(u=(a=e.g.get(r))==null?void 0:a.keys())!=null?u:[]:[],...e.h].filter(c=>c!==o);return [k("unknown-field",n,`"${t}" is not a field key`,e.suggest(t,i))]}function Yn(e,{condition:t,path:n,owner:r,step:o,key:s,group:i}){let a=e.target(t.field,i);if(!a)return Ee(e,t.field,`${n}/field`,i,s);if(a.group||o<0||r==="action")return [];let u=r==="step"?"this or a later step":"a later step";if(a.step<o||r!=="step"&&a.step===o)return [];let c=r==="step"?"earlier steps":"this or an earlier step";return [k("forward-reference",`${n}/field`,`"${t.field}" belongs to ${u}`,`${r==="route"?"Route":r==="step"?"Step":"Field"} conditions can use fields of ${c}`)]}function ot(e,t){let{condition:n,path:r}=t;return typeof n.field!="string"?[k("missing-property",r,'missing required property "field"',"Add the key of the field to test")]:[...Hn(e,n,r),...Yn(e,t)]}function Ot(e){return e.conditions.flatMap(t=>ot(e,t))}var zn=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",time:"Enter a valid 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",hidden:"{label}: {message}"});function Vt(e,t){return e.replace(/\{(\w+)\}/g,(n,r)=>G(t,r)?String(t[r]):n)}function Xn(e,t,n,r,...o){for(let s of r){let i=typeof s=="function"?s(t,n,...o):s==null?void 0:s[t];if(i&&typeof i=="string")return typeof s=="function"?i:Vt(i,n)}return Vt(e[t],n)}function ee(...e){return (t,n,r)=>Xn(zn,t,n,e,r)}function fe(e){return (t,n,r)=>{let o=e(t,n,r);return r.type==="hidden"?e("hidden",{label:r.label||r.key,message:o},r):o}}var de=["checkbox","switch"],ue=["text","email","phone","number","password","select","autocomplete","multiselect","checkbox","radio","switch","file","date","datetime","time","textarea","hidden"],te=1e4,Jn=2e3,Qn=254,Zn=1e3,At=100,Nt=/^[^\s@]+@[^\s@.]+(?:\.[^\s@.]+)+$/,er=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/,Lt="\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])",tr=new RegExp(`^${Lt}$`),st="(?:[01]\\d|2[0-3]):[0-5]\\d",nr=new RegExp(`^${Lt}T${st}(?::[0-5]\\d(?:\\.\\d{1,3})?)?(?:Z|[+-]${st})?$`),jt=new RegExp(`^${st}(?::[0-5]\\d)?$`),rr=new Set(["text","phone","password","textarea","autocomplete","hidden"]),or=new Map([["email",[Nt,"email",Qn]],["date",[tr,"date",te]],["datetime",[nr,"datetime",te]],["time",[jt,"time",te]]]);function sr(e){let[t,n,r]=e.split(/\D/).map(Number);return r<=new Date(new Date(0).setUTCFullYear(t,n,0)).getUTCDate()}var ir=new Set(["password","number","select","radio","file"]);function ne(e,t){return typeof t=="string"&&!ir.has(e.type)?t.trim():t}function it(e,t){if(Array.isArray(t)&&t.length===0&&e.type!=="multiselect"&&ue.includes(e.type))return;if(e.type==="group")return ar(e,t);let n=ne(e,t);if(e.type!=="number"||typeof n!="string"||!er.test(n))return n;let r=Number(n);return Number.isFinite(r)?r:n}function ar(e,t){var n,r;return !Array.isArray(t)||t.length>((r=(n=e.validation)==null?void 0:n.maxLength)!=null?r:At)?t:t.map(o=>{if(!Kt(o))return o;let s={};for(let i of e.fields){let a=G(o,i.key)?it(i,o[i.key]):void 0;a!==void 0&&(s[i.key]=a);}return s})}var Tt=e=>e.optionsFrom?void 0:e.options;function Pt(e,t){let n=Tt(e);return !n||n.some(r=>r.value===t)}function Gt(e,t,n){var o,s,i,a;let r=Math.min(te,(s=(o=e.validation)==null?void 0:o.maxLength)!=null?s:e.type==="hidden"?Jn:te);return t.length<=r?null:(a=(i=e.validation)==null?void 0:i.maxLengthMessage)!=null?a:n("maxLength",{max:r})}function ur(e,t,n){var o,s;return Array.isArray(t)?t.length>((s=(o=Tt(e))==null?void 0:o.length)!=null?s:Zn)?n("option"):t.every(i=>typeof i=="string"&&i.length<=te&&Pt(e,i))?null:n("option"):n("options")}function Ne(e,t,n,r){return typeof t=="string"?Gt(e,t,r):r(n)}function lr(e,t,[n,r,o],s){var i;return typeof t!="string"?s(r):(i=Gt(e,t,s))!=null?i:t.length<=o&&n.test(t)&&(n===Nt||n===jt||sr(t))?null:s(r)}function cr(e,t,n){return typeof t=="boolean"||typeof t=="number"&&Number.isFinite(t)?null:Ne(e,t,"value",n)}function fr(e,t){return ie(t)&&(e.type==="multiselect"||!Array.isArray(t))}var Kt=e=>Object.prototype.toString.call(e)==="[object Object]";function dr(e,t,n){var o,s,i;let r=(o=e.validation)==null?void 0:o.maxLength;return Array.isArray(t)?r!==void 0&&t.length>r?(i=(s=e.validation)==null?void 0:s.maxLengthMessage)!=null?i:n("maxItems",{max:r}):t.length>(r!=null?r:At)||!t.every(Kt)?n("value"):null:n("value")}function Re(e,t,n=ee()){var s;if(fr(e,t))return null;let r=(i,a={})=>n(i,a,e);if(e.type==="group")return dr(e,t,r);if(de.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 ur(e,t,r);if(e.type==="file")return Ne(e,t,"file",r);let o=or.get(e.type);return o?lr(e,t,o,r):e.type==="select"||e.type==="radio"?(s=Ne(e,t,"option",r))!=null?s:Pt(e,t)?null:r("option"):rr.has(e.type)?Ne(e,t,"string",r):cr(e,t,r)}function _t(e,t,n){return e.type==="file"||!ue.includes(e.type)&&e.type!=="group"?null:Re(e,t,n)}function O(e,t){var r,o;let n=s=>nt(s,t);return ((r=e.show)!=null?r:[]).every(n)&&(!((o=e.showAny)!=null&&o.length)||e.showAny.some(n))}var $=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),G=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),j=e=>e.type==="section",E=e=>e.type==="group";function V(e){return e.flatMap(t=>j(t)?t.fields:[t])}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 pe(e){var t,n;return [...(t=e.show)!=null?t:[],...(n=e.showAny)!=null?n:[]].map(r=>r.field)}function me(e,t){return e.flatMap(n=>O(n,t)?j(n)?n.fields.filter(r=>O(r,t)):[n]:[])}var A=e=>Array.isArray(e)?e:[];function le(e,t,n){let r=h({},n),o=$(t)?t:{};for(let s of e.fields)r[s.key]=ne(s,o[s.key]);return r}function qt(e,t,n){return Array.isArray(t)?t.map(r=>{let o=le(e,r,n),s={};for(let i of e.fields)o[i.key]!==void 0&&O(i,o)&&(s[i.key]=o[i.key]);return s}):t}function q(e,t,n){return `${e}.${t}.${n}`}function $e(e,t){if(!t.startsWith(`${e}.`))return;let n=t.slice(e.length+1),r=/^(0|[1-9]\d*)\.(.+)$/.exec(n);return r?[Number(r[1]),r[2]]:void 0}var at=new WeakMap,pr=0;function ut(e,t){if(!$(e))return `${t}`;let n=at.get(e);return n===void 0&&at.set(e,n=`i${++pr}`),n}function ge(e,t){return at.set(t,ut(e,0)),t}var Ut="1.1";function Wt({formatVersion:e}){if(e===void 0)return [];let t=typeof e=="string"&&/^[1-9]\d*(\.\d+)?$/.test(e);return t&&parseInt(e,10)<=parseInt(Ut,10)?[]:[t?k("unsupported-format-version","/formatVersion",`format ${e} is not supported`,"Upgrade @formhaus/core"):k("invalid-type","/formatVersion","must be a version string",`Use "${Ut}"`)]}var ft=e=>e.split("/fields/").length<=3,mr={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 ye(e,t,n){return Object.entries(t).flatMap(([r,o])=>{let[s,i]=mr[o];return e[r]===void 0||s(e[r])?[]:[k("invalid-type",`${n}/${ae(r)}`,`"${r}" must be ${i}`)]})}function he(e,t,n,r=k){return r("missing-property",e,`missing required property "${t}"`,n)}function X(e,t,n,r,o=false){return e==null&&!o?[]:e===void 0?[he(t.slice(0,t.lastIndexOf("/")),t.slice(t.lastIndexOf("/")+1))]:Array.isArray(e)?e.flatMap((s,i)=>$(s)?r(s,`${t}/${i}`):[k("invalid-type",`${t}/${i}`,`must be ${n}`)]):[k("invalid-type",t,"must be an array",o?"Use [] when there is nothing to list":void 0)]}function Me(e,t,n){return e[t]===void 0?[he(n,t)]:typeof e[t]=="string"?[]:[k("invalid-type",`${n}/${ae(t)}`,`"${t}" must be a string`)]}var lt=(e,t)=>ye(e,{field:"string",eq:"scalar",neq:"scalar",in:"list",notIn:"list",notEmpty:"boolean",gt:"number",gte:"number",lt:"number",lte:"number"},t);function dt(e,t){return [...X(e.show,`${t}/show`,"a condition object",lt),...X(e.showAny,`${t}/showAny`,"a condition object",lt)]}function ct(e,t){return $(e)?[...ye(e,{label:"string"},t),...X(e.disabled,`${t}/disabled`,"a condition object",lt)]:[]}var gr=(e,t)=>[...Me(e,"value",t),...ye(e,{label:"string"},t)],yr={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 hr(e,t){return e===void 0?[]:$(e)?ye(e,yr,t):[k("invalid-type",t,"must be an object of validation rules")]}function br(e,t){return e===void 0||Array.isArray(e)&&e.every(r=>typeof r=="string")?[]:[k("invalid-type",t,"must be an array of field keys")]}var pt=(e,t)=>{let n=(e.type==="section"||e.type==="group")&&ft(t);return [...Me(e,"key",t),...Me(e,"type",t),...ye(e,{label:"string",placeholder:"string",helperText:"string",title:"string",description:"string",itemLabel:"string",addLabel:"string",removeLabel:"string",defaultItems:"number"},t),...n?X(e.fields,`${t}/fields`,"a field object",pt,true):[],...dt(e,t),...X(e.options,`${t}/options`,"an option object",gr),...hr(e.validation,`${t}/validation`),...br(e.optionsDependsOn,`${t}/optionsDependsOn`)]},Fr=(e,t)=>[...e.to===void 0?[he(t,"to")]:e.to===null||typeof e.to=="string"?[]:[k("invalid-type",`${t}/to`,'"to" must be a step id or null')],...dt(e,t)],kr=(e,t)=>[...Me(e,"id",t),...ye(e,{title:"string",description:"string"},t),...X(e.fields,`${t}/fields`,"a field object",pt,true),...dt(e,t),...X(e.routes,`${t}/routes`,"a route object",Fr),...["next","back","skip"].flatMap(n=>ct(e[n],`${t}/${n}`))];function Ht(e){if(!$(e))return [k("invalid-type","","the form definition must be an object")];let t=Wt(e);return t.length?t:[...X(e.fields,"/fields","a field object",pt),...X(e.steps,"/steps","a step object",kr),...ct(e.submit,"/submit"),...ct(e.cancel,"/cancel")]}var Bt='Add "submit": { "label": "Submit" }';function Yt(e){return [...Me(e,"id",""),...e.submit===void 0?[he("","submit",Bt)]:$(e.submit)?[]:[k("invalid-type","/submit","must be an action object",Bt)]]}function be(e,t,n,r,o,s,i){var a;for(let u of r==="action"?["disabled"]:["show","showAny"])(a=(t||{})[u])==null||a.forEach((c,l)=>{e.push({condition:c,path:`${n}/${u}/${l}`,owner:r,step:o,key:s,group:i});});}function zt(e,t,n=()=>{}){var l,g,p;let r=(l=e.steps)!=null?l:[],o=[],s=(f,d,b,y,S)=>f.forEach((R,Se)=>{let J=`${d}/${Se}`;o.push({node:R,path:J,step:b,group:S,parent:y}),(j(R)||E(R))&&ft(J)&&s(R.fields,`${J}/fields`,b,R,E(R)?R:S);});r.length?r.forEach((f,d)=>{s(f.fields,`/steps/${d}/fields`,d);}):s((g=e.fields)!=null?g:[],"/fields",-1);let i=o.flatMap(({node:f,path:d,step:b,group:y})=>j(f)?[]:[{field:f,path:d,step:b,group:y}]),a=new Map,u=new Map;for(let f of i){let d=f.group?(p=u.get(f.group.key))!=null?p:new Map:a;f.group&&u.set(f.group.key,d),d.has(f.field.key)||d.set(f.field.key,f);}let c=[];for(let{node:f,path:d,step:b,group:y}of o)be(c,f,d,"field",b,f.key,y==null?void 0:y.key);return r.forEach((f,d)=>{var b;be(c,f,`/steps/${d}`,"step",d),((b=f.routes)!=null?b:[]).forEach((y,S)=>{be(c,y,`/steps/${d}/routes/${S}`,"route",d);});for(let y of ["next","back","skip"])be(c,f[y],`/steps/${d}/${y}`,"action",d);}),be(c,e.submit,"/submit","action",-1),be(c,e.cancel,"/cancel","action",-1),{definition:e,nodes:o,entries:i,keys:a,h:[...a.keys()],g:u,conditions:c,validators:t,suggest:n,target:(f,d)=>{var b;return d!==void 0&&((b=u.get(d))==null?void 0:b.get(f))||a.get(f)}}}function Xt(e,t,n,r){let o=e[n],s=e[r];return o===void 0||s===void 0||o<=s?[]:[k("invalid-range",`${t}/validation/${n}`,`${n} (${o}) is greater than ${r} (${s})`,`Lower ${n} or raise ${r}`)]}function wr(e,t){if(e===void 0)return [];try{return new RegExp(e),[]}catch(n){return [k("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 vr(e,{field:t,path:n,group:r}){var a;let o=(a=t.validation)!=null?a:{},s=o.matchField,i=t.type==="group"?t.defaultItems:void 0;return [...Xt(o,n,"minLength","maxLength"),...Xt(o,n,"min","max"),...wr(o.pattern,n),...s===void 0?[]:Ee(e,s,`${n}/validation/matchField`,r==null?void 0:r.key),...i!==void 0&&o.maxLength!==void 0&&i>o.maxLength?[k("invalid-range",`${n}/defaultItems`,`defaultItems (${i}) is greater than maxLength (${o.maxLength})`,"Lower defaultItems or raise maxLength")]:[]]}function Sr({field:e,path:t}){var r;let n=((r=e.options)!=null?r:[]).map(o=>o.value);return n.flatMap((o,s)=>n.indexOf(o)<s?[k("duplicate-option-value",`${t}/options/${s}/value`,`"${o}" is already an option value`)]:[])}function Jt(e){return e.entries.flatMap(t=>[...vr(e,t),...Sr(t)])}var mt=({field:e,group:t})=>t?`${t.key}.${e.key}`:e.key;function xr({definition:e,entries:t,nodes:n,target:r}){var i,a;let o=new Map,s=(u,c,l)=>{var p;let g=pe(c).flatMap(f=>{let d=r(f,l);return d?[mt(d)]:[]});if(g.length)for(let f of u)o.set(f,[...(p=o.get(f))!=null?p:[],...g]);};for(let u of t)s([mt(u)],u.field,(i=u.group)==null?void 0:i.key);for(let{node:u,group:c}of n)j(u)&&!c&&s(u.fields.map(l=>l.key),u);for(let u of (a=e.steps)!=null?a:[])s(V(u.fields).map(c=>c.key),u);return o}function Ir(e){var r;let t=new Map,n=[];for(let o of e.keys()){if(t.has(o))continue;t.set(o,true);let s=[[o,0]];for(;s.length>0;){let i=s[s.length-1],a=(r=e.get(i[0]))==null?void 0:r[i[1]++];if(a===void 0)t.set(i[0],false),s.pop();else if(t.get(a)){let u=s.map(([c])=>c);n.push([...u.slice(u.indexOf(a)),a]);}else t.has(a)||(t.set(a,true),s.push([a,0]));}}return n}function Qt(e){let t=new Map(e.entries.map(n=>[mt(n),n.path]));return Ir(xr(e)).map(n=>k("condition-cycle",t.get(n[0]),`show conditions form a cycle: ${n.join(" -> ")}`,"Remove one of the conditions in the cycle"))}var Zt=(e,t)=>t.type!=="hidden"&&e[t.key]!==void 0;function je(e){return V(Le(e))}var Te=e=>({values:e,errors:{},topLevelErrors:[],n:{},y:[],currentStepIndex:0,fieldLoading:{},stepValidating:false,submitting:false});function W(e,t){let n={};for(let o of e)o.defaultValue!==void 0?n[o.key]=o.defaultValue:E(o)&&o.defaultItems>0&&(n[o.key]=Array.from({length:o.defaultItems},()=>W(o.fields)));let r=t!=null?t:{};for(let o of Object.keys(r))o!=="__proto__"&&(n[o]=r[o]);return n}function B(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 en=["referrer","page","pageTitle","language","timezone","device","country"];var tn='Use { "query": "<parameter name>" } for a URL parameter';function Er(e,{field:t,path:n}){var a;let r=t.source,o=`${n}/source`,s=en;if(typeof r=="string")return s.includes(r)?[]:[k("unknown-source",o,`"${r}" is not a source`,r==="query"?tn:(a=e.suggest(r,s))!=null?a:Z(s))];let i=$(r)&&Object.keys(r).length===1?r.query:void 0;return r===void 0||typeof i=="string"&&i.trim()?[]:[k("invalid-type",o,"must be a source name or a query object",tn)]}function nn(e){return e.entries.flatMap(t=>Er(e,t))}function rn({field:e,path:t}){return e.source===void 0||e.type==="hidden"?[]:[C("source-not-applicable",`${t}/source`,'only hidden fields read "source"','Set "type" to "hidden" or remove "source"')]}var Pe=e=>{var t,n;return !!((t=e.show)!=null&&t.length||(n=e.showAny)!=null&&n.length)};function on(e,t,n){var o;let r=[];for(let s of (o=e[n].routes)!=null?o:[]){let i=s.to===null?null:t.get(s.to);if(i===null&&!Pe(s))return r;if(!(i==null||i<=n)&&(r.push(i),!Pe(s)&&!Pe(e[i])))return r}return n+1<e.length?[...r,n+1]:r}function sn(e){let t=new Map(e.map((n,r)=>[n.id,r]));return e.map((n,r)=>{let o=new Set,s=on(e,t,r);for(;s.length;){let i=s.pop();o.has(i)||(o.add(i),s.push(...on(e,t,i)),Pe(e[i])&&i+1<e.length&&s.push(i+1));}return o})}var Rr=new Set([...Object.getOwnPropertyNames(Object.prototype),"prototype"]);function $r({definition:e}){var o;let t=[],n=(o=e.steps)!=null?o:[],r=new Map;return n.forEach((s,i)=>{let a=r.get(s.id);a===void 0?r.set(s.id,i):t.push(k("duplicate-step-id",`/steps/${i}/id`,`step id "${s.id}" is already used by /steps/${a}`,"Give each step a unique id"));}),n.forEach((s,i)=>{var a;((a=s.routes)!=null?a:[]).forEach((u,c)=>{if(u.to===null)return;let l=r.get(u.to);if(l!==void 0&&l>i)return;let g=n.slice(i+1).map(d=>d.id),p=l===void 0?`"${u.to}" is not a step id`:`"${u.to}" is not a later step`,f=g.length?`${Z(g)}, or null to end the form here`:"Use null to end the form here";t.push(k("route-target",`/steps/${i}/routes/${c}/to`,p,f));});}),t}function Mr({definition:e,nodes:t}){var a;let n=[],r=sn((a=e.steps)!=null?a:[]),o=(u,c)=>{var l;return u.step!==c.step&&!((l=r[u.step])!=null&&l.has(c.step))},s=t.filter(u=>!u.group),i=s.filter(u=>E(u.node));return t.forEach((u,c)=>{var b;let{node:{key:l},path:g,group:p}=u,f=p?(b=t.slice(0,c).find(y=>y.group===p&&y.node.key===l))!=null?b:s.find(y=>y.node.key===l):s.slice(0,s.indexOf(u)).find(y=>y.node.key===l&&!o(y,u)),d=!p&&i.find(y=>l.startsWith(`${y.node.key}.`));Rr.has(l)?n.push(k("reserved-key",`${g}/key`,`"${l}" is a built-in object property name`,"Rename the field key")):f?n.push(k("duplicate-key",`${g}/key`,`key "${l}" is already used by ${f.path}${p?"":" on the same path"}`,p?"Rename the field":"Rename one of the fields, or move them to route branches that never meet")):d&&n.push(k("duplicate-key",`${g}/key`,`key "${l}" starts with the group key "${d.node.key}."`,"Rename the field"));}),n}function Cr({nodes:e}){return e.flatMap(({node:t,path:n,group:r,parent:o})=>j(t)&&o||r&&["group","file","hidden"].includes(t.type)?[k("invalid-nesting",`${n}/type`,`a ${t.type} cannot be inside a ${o.type}`,"Move it to the fields of the step")]:[])}function an(e){var r,o;let{definition:t}=e;return [...!!((r=t.fields)!=null&&r.length)&&!!((o=t.steps)!=null&&o.length)?[k("fields-and-steps","",'the definition has both "fields" and "steps"','Move the top-level fields into a step, or remove "steps"')]:[],...$r(e),...Mr(e),...Cr(e)]}var H={form:"$schema formatVersion id lang title description messages labels i18n submit cancel fields steps",step:"id title description fields show showAny routes next back skip i18n",field:"key type label placeholder helperText autoAdvance defaultValue source show showAny validation options layout optionsFrom optionsDependsOn accept rows mask inputMode i18n",section:"key type title description show showAny fields i18n",group:"key type label helperText itemLabel addLabel removeLabel defaultItems show showAny validation fields i18n",option:"value label i18n",action:"label variant disabled i18n",route:"to show showAny",validation:"required minLength minLengthMessage maxLength maxLengthMessage min minMessage max maxMessage pattern patternMessage matchField matchFieldMessage validator i18n"},un="Add a label so screen readers can name the input";function re(e,t,n,r=()=>{}){let o=n.split(" "),s=o.filter(i=>!(i in e));return Object.keys(e).filter(i=>!o.includes(i)).map(i=>{let a=xe(i,s),u=a===void 0?r(i):`Did you mean "${a}"?`;return C("unknown-property",`${t}/${ae(i)}`,`unknown property "${i}"`,u)})}function Fe(e,t,n,r){return e[n]===void 0?[he(t,n,r,C)]:[]}function gt(e,t){return $(e)?[...Fe(e,t,"label"),...re(e,t,H.action)]:[]}var Dr=e=>e!=="i18n"&&H.validation.split(" ").includes(e)?`Move "${e}" into "validation": { "${e}": ... }`:void 0;function Or({field:e,path:t}){var o;let n=e.type!=="hidden",r=n&&typeof e.label=="string"&&!e.label.trim();return [...Fe(e,t,"label",n?un:void 0),...r?[C("empty-label",`${t}/label`,`the label of "${e.key}" is empty`,un)]:[],...re(e,t,e.type==="group"?H.group:H.field,Dr),...((o=e.options)!=null?o:[]).flatMap((s,i)=>[...Fe(s,`${t}/options/${i}`,"label"),...re(s,`${t}/options/${i}`,H.option)]),...$(e.validation)?re(e.validation,`${t}/validation`,H.validation):[]]}function ln({definition:e,entries:t,nodes:n}){var o;let{title:r}=e;return [...Fe(e,"","title","Add a title for host UI and editors"),...r===void 0||typeof r=="string"?[]:[C("invalid-type","/title",'"title" must be a string')],...re(e,"",H.form),...gt(e.submit,"/submit"),...gt(e.cancel,"/cancel"),...((o=e.steps)!=null?o:[]).flatMap((s,i)=>{var u;let a=`/steps/${i}`;return [...Fe(s,a,"title"),...re(s,a,H.step),...((u=s.routes)!=null?u:[]).flatMap((c,l)=>re(c,`${a}/routes/${l}`,H.route)),...["next","back","skip"].flatMap(c=>gt(s[c],`${a}/${c}`))]}),...n.flatMap(({node:s,path:i})=>s.type==="section"?[...Fe(s,i,"title"),...re(s,i,H.section)]:[]),...t.flatMap(Or)]}var Vr=["in","notIn"],Ar=["gt","gte","lt","lte"];function Nr(e){return e.type==="number"?"number":de.includes(e.type)?"boolean":ue.includes(e.type)&&e.type!=="multiselect"&&e.type!=="file"?"string":void 0}function Lr(e,t,n,r){var l;let o=(g,p)=>[C("condition-value-mismatch",r,g,p)];if(t==="notEmpty")return [];if(Ar.includes(t))return e.type!=="multiselect"&&!de.includes(e.type)?[]:o(`"${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 g=t==="neq"||t==="notIn"?"always":"never";return o(`"${e.key}" holds a list of values, so "${t}" ${g} matches it`,"Use notEmpty, or a select or radio field")}let s=Vr.includes(t)&&Array.isArray(n)?n:[n],i=Nr(e),a=i&&s.find(g=>typeof g!==i);if(i&&a!==void 0)return o(`${JSON.stringify(a)} is a ${typeof a}, but "${e.key}" holds a ${i}`,`Use a ${i} value`);let u=i==="string"&&!e.optionsFrom&&((l=e.options)!=null&&l.length)?e.options.map(g=>g.value):null,c=u&&s.find(g=>!u.includes(g));return u&&c!==void 0?o(`${JSON.stringify(c)} is not an option of "${e.key}"`,Z(u)):[]}function jr(e,t){let{condition:n,path:r}=t;if(ot(e,t).length)return [];let o=Ie.find(s=>s in n);return Lr(e.target(n.field,t.group).field,o,n[o],`${r}/${o}`)}function Tr({field:e,path:t}){if(!["select","radio","multiselect"].includes(e.type))return [];if(!Array.isArray(e.options))return e.optionsFrom?[]:[C("missing-options",`${t}/options`,`the ${e.type} field "${e.key}" has no options`,'Add "options" or "optionsFrom"')];let n=e.options.map(s=>s.value),r=e.type==="multiselect"&&Array.isArray(e.defaultValue)?e.defaultValue:[e.defaultValue],o=e.defaultValue===void 0||!n.length||e.optionsFrom?void 0:r.find(s=>!n.includes(s));return o===void 0?[]:[C("default-not-in-options",`${t}/defaultValue`,`${JSON.stringify(o)} is not an option of "${e.key}"`,Z(n))]}function Pr(e){let t=[],n=false;for(let r=0;r<e.length&&e.length<=1e3;r++){let o=e[r];if(n&&"*+{".includes(o))return true;if(n=false,o==="\\")r++;else if(o==="[")for(r++;r<e.length&&e[r]!=="]";r++)e[r]==="\\"&&r++;else o==="("?(t.push(false),e[r+1]==="?"&&r++):o===")"?(n=!!t.pop(),n&&t.length&&(t[t.length-1]=true)):t.length&&"*+?|{".includes(o)&&(t[t.length-1]=true);}return false}function Gr(e,{field:t,path:n}){var p;let r=(p=t.validation)!=null?p:{},o=(f,d,b)=>C("rule-not-applicable",`${n}/validation/${f}`,d,b),s=t.type==="group",i=s||ue.includes(t.type),a=t.type==="number",u=i&&!a?["min","max"].filter(f=>r[f]!==void 0):[],c=i&&["number","checkbox","switch"].includes(t.type)?["minLength","maxLength"].filter(f=>r[f]!==void 0):[],l=[...u.map(f=>o(f,`"${f}" applies to number fields only`,`Use ${f}Length to limit ${s?"the number of items":"text length"}`)),...c.map(f=>o(f,`"${f}" does not apply to ${t.type} fields`,a?"Use min and max for numbers":`Remove ${f}`))];typeof r.pattern=="string"&&Pr(r.pattern)&&l.push(C("slow-pattern",`${n}/validation/pattern`,`the pattern of "${t.key}" nests quantifiers and can be very slow`,"Remove the inner or outer quantifier"));let{validators:g}=e;return r.validator!==void 0&&g&&!G(g,r.validator)&&l.push(C("unknown-validator",`${n}/validation/validator`,`the validator "${r.validator}" is not registered`,'Pass it in the "validators" option')),l}function Kr(e,t){var s;let{field:n,path:r}=t,o=ue.includes(n.type)||n.type==="group"?void 0:xe(n.type,[...ue,"group","section"]);return [...o===void 0?[]:[C("unknown-field-type",`${r}/type`,`"${n.type}" is not a built-in field type`,`Use "${o}", or register a component for "${n.type}"`)],...Tr(t),...Gr(e,t),...rn(t),...((s=n.optionsDependsOn)!=null?s:[]).flatMap((i,a)=>Ee(e,i,`${r}/optionsDependsOn/${a}`).map(u=>_(h({},u),{severity:"warning"})))]}function _r({definition:e}){var n;let t=(n=e.steps)!=null?n:[];return t.flatMap((r,o)=>{var a,u,c;let s=[],i=new Set(((a=r.routes)!=null?a:[]).map(l=>l.to).filter(l=>l!==null));for(let l of i){let g=t.findIndex(d=>d.id===l),p=t[g+1],f=(c=(u=t[g])==null?void 0:u.routes)==null?void 0:c.some(d=>{var b,y;return !((b=d.show)!=null&&b.length)&&!((y=d.showAny)!=null&&y.length)});!p||!i.has(p.id)||f||s.push(C("route-fallthrough",`/steps/${g}`,`branch "${l}" from "${r.id}" continues into the sibling branch "${p.id}"`,`Add an unconditional route on "${l}" to the step where the branches meet`));}return r.skip&&(r.next===false||!t[1])&&s.push(C("skip-unreachable",`/steps/${o}/skip`,`step "${r.id}" has "skip" but no Continue button or later step`,'Remove "skip", or remove "next": false')),s})}function qr({definition:e,nodes:t}){var s;let[n,r=0]=String((s=e.formatVersion)!=null?s:"1.0").split(".").map(Number),o=t.find(({node:i})=>i.type==="section"||i.type==="group");return !o||n!==1||r>=1?[]:[C("outdated-format-version","/formatVersion",`${o.path} is a ${o.node.type}, which needs format 1.1`,'Set "formatVersion": "1.1", so that older versions of @formhaus/core reject the definition instead of skipping the fields inside')]}function cn(e){return [...qr(e),...ln(e),...e.conditions.flatMap(t=>jr(e,t)),...e.entries.flatMap(t=>Kr(e,t)),..._r(e)]}function yt(e,{validators:t,suggest:n,warnings:r}={}){let o=Ht(e);if(o.length)return o;let s=zt(e,t,n);return [...Yt(e),...an(s),...Ot(s),...Jt(s),...nn(s),...Qt(s),...r?r(s):[]]}function fn(e){return yt(e)}function Ge(e,t={}){return yt(e,{validators:t.validators,suggest:rt,warnings:cn})}function Ke(e,t){let n=yt(e,{suggest:rt});if(n.length)throw new Q(n);return e}function Ur(e,t){return ie(e)||e===false&&de.includes(t.type)}function dn(e,t,n,r){var i,a;let o=n[`min${t}`],s=n[`max${t}`];if(o!==void 0&&e<o)return (i=n[`min${t}Message`])!=null?i:r("min",{min:o});if(s!==void 0&&e>s)return (a=n[`max${t}Message`])!=null?a:r("max",{max:s})}function Wr(e,t,n){var r;if(t.pattern!==void 0)try{let o=new RegExp(t.pattern),s=String(e);return s.length<=te&&o.test(s)?void 0:(r=t.patternMessage)!=null?r:n()}catch(o){return}}function Br(e,t,n,r){if(typeof e=="number")return dn(e,"",t,(s,i)=>r(s,i,n));if(typeof e!="string"&&!Array.isArray(e))return;let o=Array.isArray(e)?"Items":"Length";return dn(e.length,"Length",t,(s,i)=>r(`${s}${o}`,i,n))}function ke(e,t,n,r,o){var l,g,p,f,d;let s=ne(e,t),i=(l=e.validation)!=null?l:{},a=fe(ee(o)),u=()=>{var b;return (b=i.matchFieldMessage)!=null?b:a("matchField",{},e)};if(Ur(s,e))return i.required?typeof i.required=="string"?i.required:a("required",{},e):i.matchField!==void 0&&!ie(n[i.matchField])?u():null;let c=_t(e,s,a);return c||((d=(p=(g=Br(s,i,e,a))!=null?g:Wr(s,i,()=>a("pattern",{},e)))!=null?p:i.matchField!==void 0&&s!==n[i.matchField]?u():void 0)!=null?d:i.validator?(f=r==null?void 0:r[i.validator])==null?void 0:f.call(r,s,n):void 0)||null}function Hr(e,t,n,r){let o={};return A(t[e.key]).forEach((s,i)=>{let a=le(e,s,t);for(let u of e.fields){let c=O(u,a)&&ke(u,a[u.key],a,n,r);c&&(o[q(e.key,i,u.key)]=c);}}),o}function Ce(e,t,n,r){let o={};for(let s of me(e,t)){let i=ke(s,t[s.key],t,n,r);i&&(o[s.key]=i),E(s)&&Object.assign(o,Hr(s,t,n,r));}return o}function ht(e,t,n){return V(e).flatMap(r=>[...Zt(t,r)?[r.key]:[],...E(r)?A(n[r.key]).flatMap((o,s)=>r.fields.map(({key:i})=>q(r.key,s,i))).filter(o=>t[o]!==void 0):[]])}function _e(e,t){return Ce(t,Y(e),e.validators,e.messages)}function bt(e,t,n,r=Y(e)){return ke(t,n,r,e.validators,e.messages)}function pn(e,{group:t,index:n,field:r}){let o=Y(e),s=le(t,A(o[t.key])[n],o);return bt(e,r,s[r.key],s)}function ce(e,t,n=false,r=[]){let{state:o}=e,s=e.errors,i={},a=[...r];for(let[c,l]of Object.entries(t))e.e.s(c,e.values)||e.e.m(c,e.values)?i[c]=l:a.push(l);n&&(o.n=i,o.y=a),o.errors=h(h({},o.n),i),o.topLevelErrors=n?a:[...o.y,...a];let u=n&&mn(e,i);e.t({fieldKeys:B(s,e.errors),structureChanged:u});}function mn(e,t){let n=e.visibleSteps.findIndex(r=>ht(r.fields,t,e.values).length>0);return n<0||n===e.currentStepIndex?false:(e.state.currentStepIndex=n,true)}function we(e,t,n=false){n&&delete e.state.n[t];let r=e.state.n[t];r===void 0?delete e.errors[t]:e.errors[t]=r;}function oe(e,t){let n=new Set(t),{n:r}=e.state;for(let o of Object.keys(r))(n.has(o)||n.has(e.e.owner(o)))&&delete r[o];}function De(e,t,n){var s;let r=[],o=n?n.group.fields.map(i=>[q(n.group.key,n.index,i.key),i]):e.e.l.map(i=>[i.key,i]);for(let[i,a]of o)((s=a.validation)==null?void 0:s.matchField)!==t||e.errors[i]===void 0||(n?pn(e,_(h({},n),{field:a})):bt(e,a,e.values[a.key]))||(we(e,i),r.push(i));if(!n)for(let i of e.e.groups)e.e.s(i.key,e.values)!==i||!i.fields.some(a=>{var u;return ((u=a.validation)==null?void 0:u.matchField)===t})||A(e.values[i.key]).forEach((a,u)=>{r.push(...De(e,t,{group:i,index:u,field:i.fields[0]}));});return r}function ve(e){let t=new Set(e.visibleSteps.flatMap(r=>V(r.fields).map(o=>o.key))),n=Object.keys(e.errors).filter(r=>!t.has(e.e.owner(r)));for(let r of n)delete e.errors[r];return oe(e,n),n}function Yr(e,t){for(let n of [...e.r.values()].flat())delete t[n];return t}function Oe(e,t=false){var s;let n=e.errors,r={};if(e.isMultiStep)for(let i of e.visibleSteps)e.r.has(i.id)||Object.assign(r,_e(e,i.fields));else Object.assign(r,_e(e,(s=e.definition.fields)!=null?s:[]));e.state.errors=h(h({},e.state.n),r);let o=t&&mn(e,r);return e.t({fieldKeys:B(n,r),structureChanged:o}),r}function gn(e,t){let n=e.e.s(t,e.values),r=!n&&e.e.m(t,e.values);if(!n&&!r)return null;let o=e.errors[t],s=r?pn(e,r):bt(e,n,e.values[t]);s?e.errors[t]=s:we(e,t,true);let i=Object.is(o,e.errors[t])?[]:[t];return e.t({fieldKeys:i}),s}function Y(e){return Yr(e,h({},e.e.b(e.values)))}function yn(e,t){let n=e.values,r=e.errors,o=Object.keys(e.fieldLoading);e.i++,e.o++,Object.assign(e.state,Te(W(e.e.l,t))),e.r.clear(),e.e.u(e.values,e.errors,true);let s=B(n,e.values),i=new Set([...s,...B(r,e.errors),...o]);e.t({fieldKeys:i,structureChanged:true,valuesChanged:s.size>0});}function bn(e,t){return Fn(e,t).steps}function Fn(e,t){var i,a,u;let n=(i=e.steps)!=null?i:[],r=new Map(n.map((c,l)=>[c.id,l])),o=[],s={};n.length||hn({fields:(a=e.fields)!=null?a:[]},t,s);for(let c=0;c<n.length;){let l=n[c];if(!O(l,s)){c++;continue}o.push(l),hn(l,t,s);let g=(u=l.routes)==null?void 0:u.find(p=>{var f;return O(p,s)&&(p.to===null||((f=r.get(p.to))!=null?f:-1)>c&&O(n[r.get(p.to)],s))});if((g==null?void 0:g.to)===null)break;c=g?r.get(g.to):c+1;}return {steps:o,values:s}}function qe(e,t,n){var i;let r=(i=e[n])!=null?i:e[e.length-1],o=t.findIndex(a=>a.id===(r==null?void 0:r.id));if(o!==-1)return o;let s=new Map(t.map((a,u)=>[a.id,u]));for(let a=Math.min(n-1,e.length-1);a>=0;a--){let u=s.get(e[a].id);if(u!==void 0)return u}return 0}function hn(e,t,n){let r=V(e.fields),o=r.map(({key:i})=>[i,G(n,i),n[i]]);for(let i of r)n[i.key]=ne(i,t[i.key]);let s=me(e.fields,n).filter(i=>t[i.key]!==void 0).map(i=>[i.key,E(i)?qt(i,t[i.key],n):ne(i,t[i.key])]);for(let[i,a,u]of o)a?n[i]=u:delete n[i];for(let[i,a]of s)n[i]=a;}function kn(e){let t=null,n=[],r={},o=s=>{t!==s&&(t=s,{steps:n,values:r}=Fn(e,s));};return {invalidate(){t=null;},steps(s){return o(s),n},values(s){return o(s),r}}}function se(e,t,n,r=true,o=()=>[]){let{values:s,errors:i}=e.state,a=e.isMultiStep?e.visibleSteps:null,u=!Object.is(s[t],n),c=i[t];s[t]=n,r&&we(e,t,u);for(let[d,b]of e.r)u&&b.includes(t)&&e.r.delete(d);let l=e.e.u(s,i);oe(e,l);let g=new Set([...l,...De(e,t),...o()]);(u||c!==i[t])&&g.add(t);let p=u||l.size>0,f=p&&e.e.F(t,l);if(a&&f){e.e.c(true,true),e.state.currentStepIndex=qe(a,e.visibleSteps,e.currentStepIndex);for(let d of ve(e))g.add(d);}e.t({fieldKeys:g,structureChanged:f,valuesChanged:p});}function Ue(e,t){let n=e.e.s(t,e.values);return n&&E(n)?n:void 0}function wn(e){var n,r,o;let t=(n=e.validation)!=null?n:{};return [(r=t.minLength)!=null?r:t.required?1:0,(o=t.maxLength)!=null?o:100]}var vn=(e,t)=>Number.isInteger(e)&&e>=0&&e<t.length;function Sn(e,t){let n=Ue(e,t);return n?A(e.values[t]).map((r,o)=>({id:ut(r,o),fields:e.e.k(n,r,e.values)})):[]}function xn(e,t){let n=Ue(e,t),r=A(e.values[t]);return !n||r.length>=wn(n)[1]?false:(se(e,t,[...r,W(n.fields)]),true)}function Ft(e,t,n){let r={};for(let o of Object.keys(e)){let s=$e(t,o);!s||s[0]<n||(s[0]>n&&(r[q(t,s[0]-1,s[1])]=e[o]),delete e[o]);}Object.assign(e,r);}function In(e,t,n){let r=Ue(e,t),o=A(e.values[t]);if(!r||!vn(n,o)||o.length<=wn(r)[0])return false;let s=h({},e.errors);return Ft(e.state.errors,t,n),Ft(e.state.n,t,n),Ft(e.state.fieldLoading,t,n),se(e,t,o.filter((i,a)=>a!==n),true,()=>B(s,e.errors)),true}function kt(e,t,n,r,o){let s=Ue(e,t),i=A(e.values[t]),a=s==null?void 0:s.fields.find(d=>d.key===r);if(!s||!a||!vn(n,i))return;let u=i[n],c=$(u)?u:{},l=q(t,n,r),g=!Object.is(c[r],o),p=e.errors[l],f=i;if(g){let d=ge(u,_(h({},c),{[r]:o}));f=i.map((b,y)=>y===n?d:b);}we(e,l,g),se(e,t,f,false,()=>[...g||p!==e.errors[l]?[l]:[],...De(e,r,{group:s,index:n,field:a})]);}var wt=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 We(e,t){try{await t();}catch(n){throw new wt(e,n)}}function En(e){return e.visibleSteps.map(t=>t.id).join(`
|
|
5
|
+
`)}function Be(e,t){let n=En(e),r=Object.keys(t).filter(o=>t[o]!==void 0).map(o=>[o,e.values[o]]);return ()=>En(e)!==n||r.some(([o,s])=>!Object.is(e.values[o],s))}function Rn(e,t){let n=h({},t);return ()=>B(n,e.values)}function $n(e){var r,o;let t=V((o=(r=e.currentStep)==null?void 0:r.fields)!=null?o:[]),n=h({},e.values);for(let{key:s}of t)delete n[s];return Object.assign(n,W(t))}function vt(e){return bn(e.definition,$n(e))[e.currentStepIndex+1]}function He(e){let t=e.currentStep,n=V(t.fields).map(({key:s})=>s);e.state.values=$n(e);let r=Object.keys(e.errors).filter(s=>n.includes(e.e.owner(s)));for(let s of r)delete e.errors[s];oe(e,n),e.r.set(t.id,n),oe(e,e.e.u(e.values,e.errors)),e.e.c(true,true);let o=ve(e);return e.t({fieldKeys:[...n,...r,...o],structureChanged:true,valuesChanged:true}),n}function Ye(e){let t=e.currentStep;t&&e.r.delete(t.id);}function Mn(e,t){return e.state.currentStepIndex=t,e.t({structureChanged:true}),He(e)}function St(e){return !!e&&Object.getPrototypeOf(e)===Object.prototype&&e.ok===false}function zr(e,t,n){let r={},o=typeof t.errors=="object"&&t.errors?t.errors:{};for(let[i,a]of Object.entries(o)){let u=Array.isArray(a)?a.join(" "):a;typeof u=="string"&&Object.is(e.values[e.e.owner(i)],n[e.e.owner(i)])&&(r[i]=u);}let s=Array.isArray(t.formErrors)?t.formErrors.filter(i=>typeof i=="string"):[];ce(e,r,true,s);}async function ze(e,t,n=false){if(e.submitting||e.stepValidating)return false;n||Ye(e);let r=h({},e.f),o=false,s=e.i,i=e.d=++e.o,a=Y(e),u=Be(e,a),c=()=>s!==e.i||i!==e.o||u();e.state.submitting=true,e.t();try{if(c()||Object.keys(Oe(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(Oe(e,!0)).length>0||c())return !1;a=Y(e);}o=!0;let l=[...e.r.keys()],g=h({},e.values),p=e.state.n,f=await t(a,[...l]),d=St(f);return i!==e.o?!d:d?(zr(e,f,g),!1):(e.state.n===p&&ce(e,{},!0),await We("afterSubmit",()=>{var b;return (b=r.onAfterSubmit)==null?void 0:b.call(r,a,l)}),!0)}catch(l){if(!o&&c())return false;throw l}finally{i===e.o&&(e.state.submitting=false,e.t());}}function Cn(e){let t=e.currentStep;if(!t)return true;let n=_e(e,t.fields);if(Object.keys(n).length===0)return false;let r=e.errors;return e.state.errors=h(h({},r),n),e.t({fieldKeys:B(r,e.errors)}),true}function Dn(e,t){e.i++,e.state.currentStepIndex=t,e.t({structureChanged:true});}async function On(e,t){var g;if(!e.isMultiStep||e.stepValidating||e.submitting||!((g=e.currentStep)!=null&&g.skip))return false;if(vt(e))return Xe(e,"next","skip");let n=e.currentStep;if(!t||!n)return false;let r=e.values,o=h({},e.errors),s=h({},e.state.n),i;He(e);let a=e.values,u=Rn(e,a),c=ze(e,async(p,f)=>{let d=await t(p,f),b=St(d);return (!b||l===e.o)&&(i=b),d},true),l=e.d;try{return await c}finally{if(i!==false&&l===e.d&&e.values===a){let p=e.visibleSteps,f=u(),d=e.values;e.state.values=h({},r);for(let b of f){delete e.values[b];for(let y of [o,s])for(let S of Object.keys(y))e.e.owner(S)===b&&delete y[S];b in d&&(e.values[b]=d[b]);}i===void 0&&(e.state.n=s),e.state.errors=h(h({},i?{}:o),e.errors),e.r.delete(n.id),oe(e,e.e.u(e.values,e.errors)),e.e.c(true,true),e.state.currentStepIndex=qe(p,e.visibleSteps,e.currentStepIndex),ve(e),e.t({fieldKeys:Object.keys(h(h(h({},r),d),o)),structureChanged:true,valuesChanged:true});}}}async function Xe(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 o=e.currentStep,s=t==="next"&&!r;if(s&&Ye(e),s&&Cn(e))return false;let i=h({},e.f),a=i.onStepValidate,u=false,l=e.currentStepIndex+(t==="next"?1:-1),g=r?vt(e):e.visibleSteps[l];if(!g)return false;let p={fromStepId:o.id,toStepId:g.id,reason:n,values:h({},Y(e))},f=e.i,d=e.d=++e.o,b=Be(e,p.values),y=()=>{var S;return f!==e.i||d!==e.o||((S=e.currentStep)==null?void 0:S.id)!==o.id||b()};e.state.stepValidating=true,e.t();try{if(y())return !1;if(s&&a){let S=await a(o.id,p.values);if(y())return !1;if(S&&Object.keys(S).length>0)return ce(e,S),!1}if(i.onBeforeStepChange){let S=await i.onBeforeStepChange(p);if(y()||S===!1)return !1}return y()||s&&Cn(e)?!1:(u=!0,r&&He(e),Dn(e,l),await We("afterStepChange",()=>{var S;return (S=i.onAfterStepChange)==null?void 0:S.call(i,p)}),!0)}catch(S){if(!u&&y())return false;throw S}finally{d===e.o&&(e.state.stepValidating=false,e.t());}}function Vn(e,t){if(!e.isMultiStep)return;let n=e.e.w(t,e.values,e.currentStepIndex);n===e.currentStepIndex?e.t():n!==null&&Dn(e,n);}function An(e,t){return e.add(t),()=>e.delete(t)}function Nn(){let e=0,t=0,n=new Set,r=new Set,o=new Map,s=new Map;return {subscribe:i=>An(n,i),getSnapshot:()=>e,subscribeStructure:i=>An(r,i),getStructureSnapshot:()=>t,getFieldSnapshot:i=>{var a;return (a=o.get(i))!=null?a:0},subscribeField(i,a){var c;let u=(c=s.get(i))!=null?c:new Set;return u.add(a),s.set(i,u),()=>{u.delete(a),u.size===0&&s.delete(i);}},t({fieldKeys:i=[],structureChanged:a=false}={}){var u,c;for(let l of new Set(i)){o.set(l,((u=o.get(l))!=null?u:0)+1);for(let g of (c=s.get(l))!=null?c:[])g();}if(a){t++;for(let l of r)l();}e++;for(let l of n)l();}}}function Xr(e,t){try{if(process.env.NODE_ENV!=="production")return Ge(e,{validators:t})}catch(n){if(!(n instanceof ReferenceError))throw n}}function Ln(e,t,n){var i,a;let r=(i=Xr(e,n))!=null?i:fn(e),o=r.filter(Dt);if(o.length)throw new Q(o);let s=(a=t.onWarning)!=null?a:(u=>console.warn(`[formhaus] ${u.message}`));for(let u of r)s(u);}function Ve(e,t,n=e){var r;for(let o of pe(n)){let s=(r=t.get(o))!=null?r:new Set;s.add(e),t.set(o,s);}}function Je(e){var xt,It,Et;let t=je(e),n=new Map,r=new Set,o=kn(e),s=new Map,i=new Map,a=new Map,u=new Map,c=t.filter(E),l={},g=true,p=true,f={visibleSteps:[],currentStep:null,visibleFields:[],visibleNodes:[],canGoNext:false};for(let m of Le(e))if(j(m))for(let F of m.fields)u.set(F,m);for(let m of t){n.set(m.key,[...(xt=n.get(m.key))!=null?xt:[],m]),Ve(m,s);let F=u.get(m);if(F&&Ve(m,s,F),E(m))for(let w of m.fields)Ve(m,s,w);}for(let m of (It=e.steps)!=null?It:[]){for(let F of V(m.fields))a.set(F,m);Ve(m,i);for(let F of (Et=m.routes)!=null?Et:[])for(let w of pe(F))r.add(w);}let d=()=>{var m;return !!((m=e.steps)!=null&&m.length)},b=(m,F)=>{let w=o.values(F),I=u.get(m);return (!I||O(I,w))&&O(m,w)},y=(m,F)=>{let w=a.get(m);return !w||o.steps(F).includes(w)},S=(m,F)=>{var w;return (w=n.get(m))==null?void 0:w.find(I=>y(I,F)&&b(I,F))},R=m=>{if(!n.has(m))for(let F of c){let w=$e(F.key,m);if(w)return [F.key,...w]}},Se=m=>{var F,w;return (w=(F=R(m))==null?void 0:F[0])!=null?w:m};function J(m,F,w){let I=le(m,F,o.values(w));return m.fields.filter(x=>O(x,I))}function jn(m,F){let w=R(m);if(!w)return;let[I,x,T]=w,M=S(I,F),D=A(F[I]);if(!M||!E(M)||x>=D.length)return;let N=J(M,D[x],F).find(L=>L.key===T);return N&&{group:M,index:x,field:N}}function et(m,F){var M,D,N,L;if(!g)return f;g=false;let w=f.visibleSteps=d()?o.steps(m):[],I=f.currentStep=d()&&(D=(M=w[F])!=null?M:w[w.length-1])!=null?D:null,x=d()?(N=I==null?void 0:I.fields)!=null?N:[]:(L=e.fields)!=null?L:[],T=o.values(m);return f.visibleFields=me(x,T),f.visibleNodes=x.filter(P=>O(P,T)).map(P=>j(P)?_(h({},P),{fields:P.fields.filter(z=>O(z,T))}):P),f}function Tn(m,F,w){var I;for(let x of c){if(S(x.key,m)!==x)continue;let T=A(m[x.key]),M=T.map((D,N)=>{let L=D;for(let P=0;$(L)&&P<=x.fields.length;P++){let z=L,v=J(x,z,m),U=x.fields.filter(K=>!v.includes(K)&&z[K.key]!==void 0);if(!U.length)break;L=ge(z,h({},z));for(let{key:K}of U)delete L[K],w.add(q(x.key,N,K));}return L});M.some((D,N)=>D!==T[N])&&(m[x.key]=M);for(let D of Object.keys(F)){let[N,L]=(I=$e(x.key,D))!=null?I:[];N===void 0||N<M.length&&J(x,M[N],m).some(P=>P.key===L)||(delete F[D],w.add(D));}}o.invalidate();}return {l:t,groups:c,b:o.values,state:et,s:S,m:jn,k:J,owner:Se,parse:R,c(m,F){m&&(g=true),(m||F)&&(p=true);},v(m,F,w){let I=et(m,F).currentStep;if(!p)return f.canGoNext;p=false;let x=I?Ce(I.fields,o.values(m),w):{};return f.canGoNext=d()&&Object.keys(x).length===0},w(m,F,w){let I=Se(m),x=et(F,w).visibleSteps.findIndex(T=>V(T.fields).some(M=>M.key===I));return x===-1?null:x},F(m,F){return r.has(m)||s.has(m)||i.has(m)||F.size>0},seed(m){l=h(h({},l),m);},u(m,F,w=false){var P,z;w&&(l=h({},m)),o.invalidate();let I=[...new Set([...s.keys(),...i.keys()])],x=new Set(I),T=new Set,M=v=>m[v]!==void 0||F[v]!==void 0,D=v=>{o.invalidate(),T.add(v),!x.has(v)&&(x.add(v),I.push(v));},N=v=>{delete m[v],delete F[v];for(let U of Object.keys(F))Se(U)===v&&delete F[U];D(v);},L=(v,U)=>{U?v.type==="hidden"&&!M(v.key)&&l[v.key]!==void 0&&b(v,m)?(m[v.key]=l[v.key],D(v.key)):E(v)&&v.defaultItems>0&&!M(v.key)&&b(v,m)&&(m[v.key]=W([v])[v.key],D(v.key)):M(v.key)&&N(v.key);};for(let v=0;v<I.length;v++){let U=I[v];x.delete(U);for(let K of (P=s.get(U))!=null?P:[])y(K,m)&&L(K,b(K,m));for(let K of (z=i.get(U))!=null?z:[])for(let Pn of V(K.fields))L(Pn,b(K,m));}return c.length&&Tn(m,F,T),T}}}var Qe=class{constructor(t,n,r){this.definition=t;this.r=new Map;this.i=0;this.o=0;this.d=0;this.a=Nn();var s;this.f=r!=null?r:{},this.validators=(s=r==null?void 0:r.validators)!=null?s:{},Ln(t,this.f,this.validators),this.messages=ee(r==null?void 0:r.messages,t.messages),this.e=Je(t);let o=W(this.e.l,n);this.state=Te(o),this.e.u(o,this.state.errors,true);}get values(){return this.state.values}get errors(){return this.state.errors}get topLevelErrors(){let{errors:t,topLevelErrors:n,values:r}=this.state;return [...n,...this.e.l.flatMap(o=>{var s;return o.type==="hidden"&&t[o.key]&&((s=this.e.s(o.key,r))!=null?s:o)===o&&t[o.key]||[]})]}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)}get visibleSteps(){return this.p.visibleSteps}get currentStep(){return this.p.currentStep}get visibleFields(){return this.p.visibleFields}get visibleNodes(){return this.p.visibleNodes}get isFirstStep(){return this.currentStepIndex===0}get isLastStep(){return this.currentStepIndex>=this.visibleSteps.length-1}get canGoNext(){return this.e.v(this.state.values,this.currentStepIndex,this.validators)}get stepErrors(){let t=Object.create(null);for(let n of this.visibleSteps){let r=ht(n.fields,this.errors,this.state.values);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.a.subscribe(t)}getSnapshot(){return this.a.getSnapshot()}subscribeField(t,n){return this.a.subscribeField(t,n)}getFieldSnapshot(t){return this.a.getFieldSnapshot(t)}subscribeStructure(t){return this.a.subscribeStructure(t)}getStructureSnapshot(){return this.a.getStructureSnapshot()}setValue(t,n){let r=this.e.parse(t);r?kt(this,...r,n):se(this,t,n);}items(t){return Sn(this,t)}addItem(t){return xn(this,t)}removeItem(t,n){return In(this,t,n)}setItemValue(t,n,r,o){kt(this,t,n,r,o);}setErrors(t){ce(this,t,true);}setFieldLoading(t,n){let r=this.state.fieldLoading[t]===true;n?this.state.fieldLoading[t]=true:delete this.state.fieldLoading[t],this.t({fieldKeys:r===n?[]:[t]});}cancelPendingActions(){this.i++,this.o++,this.state.stepValidating=false,this.state.submitting=false,this.t();}next(){return this.S("next")}back(){return Xe(this,"back")}skip(t){return On(this,t)}submit(t){return ze(this,t)}isStepSkipped(t){return this.r.has(t)}validate(){return Oe(this)}validateField(t){return gn(this,t)}getSubmitValues(){return Y(this)}goToStepWithField(t){Vn(this,t);}reset(t){yn(this,t);}S(t){return Xe(this,"next",t)}get p(){return this.e.state(this.state.values,this.currentStepIndex)}t(t={}){this.e.c(!!t.structureChanged,!!t.valuesChanged),this.a.t(t);}};var Jr='Pass the values object as the second argument, not the request body with "values" and "skippedSteps".',Qr=()=>null,Ze=e=>e;function Zr(e,t,n){var a;let r=n!==null&&typeof n=="object"&&!Array.isArray(n)?n:{},o=Je(e),s=[...new Set(t.map(({key:u})=>u))].filter(u=>G(r,u)),i={values:{},active:new Map};for(let u=0;u<=t.length;u++){let c={};for(let p of s){let f=it((a=i.active.get(p))!=null?a:t.find(d=>d.key===p),r[p]);f!==void 0&&(c[p]=f);}let l=new Map;for(let p of s){let f=o.s(p,c);f&&l.set(p,f);}let g=s.every(p=>l.get(p)===i.active.get(p));if(i={values:c,active:l},g)break}return i}function eo({values:e,active:t},n){let r=new Map;for(let[o,s]of t){let i=Re(s,e[o],n);i&&r.set(o,i);}return r}function to(e,t,n){let r=new Map;for(let o of Ze(e).e.groups){if(t.has(o.key))continue;let s=e.items(o.key),i=A(e.values[o.key]),a=i.map((u,c)=>{var g,p;if(!$(u))return u;let l={};for(let f of (p=(g=s[c])==null?void 0:g.fields)!=null?p:[]){let d=Re(f,u[f.key],n);d&&(r.set(q(o.key,c,f.key),d),l[f.key]=void 0);}return Object.keys(l).length?ge(u,h(h({},u),l)):u});a.some((u,c)=>u!==i[c])&&se(Ze(e),o.key,a,false);}return r}function no(e,t){var o;let n=s=>s.map(i=>j(i)?_(h({},i),{fields:n(i.fields)}):t.has(i.key)?_(h({},i),{validation:void 0}):i),r=(o=e.steps)==null?void 0:o.map(s=>_(h({},s),{fields:n(s.fields)}));return h(h(h({},e),e.fields&&{fields:n(e.fields)}),r&&{steps:r})}function ro(e,t={}){let n={};for(let{validation:r}of e.flatMap(o=>E(o)?[o,...o.fields]:[o]))r!=null&&r.validator&&(n[r.validator]=Qr);return h(h({},n),t)}function oo(e,t){return t===null||typeof t!="object"||!G(t,"values")?false:!e.some(n=>n.key==="values"||n.key==="skippedSteps")}function so(e,t){if(!Array.isArray(t))return;let n=new Set(t);for(let r=0;r<e.visibleSteps.length;r++){let o=e.visibleSteps[r];o.skip&&n.has(o.id)&&Mn(e,r);}}function io(e,t,n){let r=t!==null&&typeof t=="object"&&!Array.isArray(t)?h({},t):{},o=new Map;for(let s of e.filter(E)){let i=G(r,s.key)&&!o.has(s.key)&&Re(s,r[s.key],n);i&&(o.set(s.key,i),delete r[s.key]);}return {source:r,rejected:o}}function ao(e,t,n={}){Ke(e);let r=je(e),o=ee(n.messages,e.messages),{source:s,rejected:i}=io(r,t,fe(o)),a=Zr(e,r,s),u=eo(a,fe(o)),c={validators:ro(r,n.validators),messages:o,onWarning:()=>{}},l=new Qe(no(e,u),a.values,c),g=to(l,u,fe(o));so(l,n.skippedSteps);let p=l.validate(),f=l.getSubmitValues(),{e:d}=Ze(l);for(let[y,S]of u)if(G(f,y)){p[y]=S,f[y]=a.values[y];for(let R of Object.keys(p))R!==y&&d.owner(R)===y&&delete p[R];}let b=new Set([...Ze(l).r.values()].flat());for(let[y,S]of i)if(!(!d.s(y,l.values)||b.has(y))){p[y]=S,delete f[y];for(let R of Object.keys(p))R!==y&&d.owner(R)===y&&delete p[R];}for(let[y,S]of g)G(f,d.owner(y))&&d.m(y,l.values)&&(p[y]=S);return oo(r,t)&&(p.values=Jr),{values:f,errors:p}}exports.FormDefinitionError=Q;exports.checkDefinition=Ge;exports.parseDefinition=Ke;exports.validateSubmission=ao;return exports;})({});//# sourceMappingURL=server.iife.js.map
|
|
6
6
|
//# sourceMappingURL=server.iife.js.map
|