@formhaus/core 0.10.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cloud.d.ts +1 -1
- package/dist/cloud.js +2 -2
- package/dist/cloud.js.map +1 -1
- package/dist/{definition-H3WUR596.d.ts → definition-BAHgjY7x.d.ts} +2 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.iife.js +3 -3
- package/dist/server.iife.js.map +1 -1
- package/dist/server.js +3 -3
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
- package/schema/form-definition.schema.json +4 -1
- package/style.css +12 -8
package/dist/server.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function
|
|
2
|
-
`)}function D(t,e){let r=at(t);return ()=>at(t)!==r||Object.keys(e).some(i=>e[i]!==void 0&&!Object.is(t.values[i],e[i]))}var c={email:"Enter a valid email",number:"Enter a number",boolean:"Must be true or false",option:"Select one of the available options",options:"Must be a list of available options",string:"Must be text",date:"Enter a valid date",datetime:"Enter a valid date and time",file:"Must be a file reference",value:"Invalid value"};function b(t,e){switch(t){case "required":return "This field is required";case "minLength":return `Must be at least ${e?.min} ${e?.unit??"characters"}`;case "maxLength":return `Must be at most ${e?.max} ${e?.unit??"characters"}`;case "min":return `Must be at least ${e?.min}`;case "max":return `Must be at most ${e?.max}`;case "pattern":return "Invalid format";case "matchField":return "Fields must match";default:return "Invalid value"}}var Z=new Set(["checkbox","switch"]);function Ct(t,e){return $(t)||t===false&&Z.has(e.type)}function lt(t,e,r,i){let n=r[`min${e}`],s=r[`max${e}`];if(n!==void 0&&t<n)return r[`min${e}Message`]??b(`min${e}`,{min:n,unit:i});if(s!==void 0&&t>s)return r[`max${e}Message`]??b(`max${e}`,{max:s,unit:i})}function At(t,e){if(e.pattern!==void 0)try{return new RegExp(e.pattern).test(String(t))?void 0:e.patternMessage??b("pattern")}catch{return}}function E(t,e,r,i){let n=t.validation;if(!n)return null;if(Ct(e,t))return n.required?typeof n.required=="string"?n.required:b("required"):null;let s=typeof e=="string"||Array.isArray(e)?lt(e.length,"Length",n,Array.isArray(e)?"items":void 0):typeof e=="number"?lt(e,"",n):void 0,a=n.matchField!==void 0&&e!==r[n.matchField]?n.matchFieldMessage??b("matchField"):void 0;return (s??At(e,n)??a??(n.validator?i?.[n.validator]?.(e,r):void 0))||null}function w(t,e,r){return T(t.fields,e,r)}function T(t,e,r){let i={};for(let n of t){if(!p(n,e))continue;let s=E(n,e[n.key],e,r);s&&(i[n.key]=s);}return i}function K(t,e,r=false){let i=t.errors;t.errors={},t.topLevelErrors=[];for(let[o,l]of Object.entries(e))t.visibility.isFieldVisible(o,t.values)?t.errors[o]=l:t.topLevelErrors.push(l);let n=Object.keys(e).find(o=>t.errors[o]!==void 0),s=r&&n&&t.isMultiStep?t.visibility.findStepIndex(n,t.values,t.currentStepIndex):null,a=s!==null&&s!==t.currentStepIndex;s!==null&&(t.currentStepIndex=s),t.notify({fieldKeys:F(i,t.errors),structureChanged:a});}function dt(t,e){let r=[];for(let i of t.visibility.allFields)i.validation?.matchField!==e||t.errors[i.key]===void 0||E(i,t.values[i.key],R(t),t.validators)||(delete t.errors[i.key],r.push(i.key));return r}function ut(t){let e=new Set(t.visibleSteps.flatMap(i=>i.fields.map(n=>n.key))),r=Object.keys(t.errors).filter(i=>!e.has(i));for(let i of r)delete t.errors[i];return r}function R(t){return y(t.definition)?I(t):pt(t,{...t.values})}function pt(t,e){for(let r of [...t.skipped.values()].flat())delete e[r];return e}function C(t){let e=t.errors,r={};if(t.isMultiStep)for(let i of t.visibleSteps)t.skipped.has(i.id)||Object.assign(r,w(i,R(t),t.validators));else Object.assign(r,T(t.definition.fields??[],t.values,t.validators));return t.errors=r,t.notify({fieldKeys:F(e,r)}),r}function ct(t,e){let r=t.visibility.fieldByKey.get(e);if(!r||!t.visibility.isFieldVisible(e,t.values))return null;let i=t.errors[e],n=E(r,t.values[e],R(t),t.validators);n?t.errors[e]=n:delete t.errors[e];let s=Object.is(i,t.errors[e])?[]:[e];return t.notify({fieldKeys:s}),n}function I(t){let e={},r=t.visibility.getVisibleFieldKeys(t.values,t.currentStepIndex);for(let i of r)t.values[i]!==void 0&&(e[i]=t.values[i]);return pt(t,e)}function ft(t,e){let r=t.values,i=t.errors,n=Object.keys(t.fieldLoading);t.validationEpoch++,t.operationEpoch++,t.submitting=false,t.values=k(t.visibility.allFields,e),t.errors={},t.topLevelErrors=[],t.fieldLoading={},t.stepValidating=false,t.currentStepIndex=0,t.skipped.clear(),t.visibility.reconcileHidden(t.values,t.errors);let s=F(r,t.values),a=new Set([...s,...F(i,t.errors),...n]);t.notify({fieldKeys:a,structureChanged:true,valuesChanged:s.size>0});}function ht(t){let e=t.currentStep?.fields??[],r={...t.values};for(let{key:i}of e)delete r[i];return Object.assign(r,k(e))}function P(t){return X(t.definition,ht(t))[t.currentStepIndex+1]}function A(t){let e=t.currentStep,r=e.fields.map(({key:i})=>i);t.values=ht(t);for(let i of r)delete t.errors[i];return t.skipped.set(e.id,r),t.visibility.reconcileHidden(t.values,t.errors),t.notify({fieldKeys:r,structureChanged:true,valuesChanged:true}),r}function O(t){let e=t.currentStep;e&&t.skipped.delete(e.id);}function mt(t,e){return t.currentStepIndex=e,t.notify({structureChanged:true}),A(t)}async function B(t,e,r=false){if(t.submitting||t.stepValidating)return false;r||O(t);let i={...t.lifecycle},n=false,s=t.validationEpoch,a=++t.operationEpoch,o=I(t),l=D(t,o),d=()=>s!==t.validationEpoch||a!==t.operationEpoch||l();t.submitting=true,t.notify();try{if(d()||Object.keys(C(t)).length>0||d())return !1;if(i.onBeforeSubmit){let u=await i.onBeforeSubmit(o);if(d()||u===!1)return !1}if(d())return !1;if(i.onBeforeSubmit){if(Object.keys(C(t)).length>0||d())return !1;o=I(t);}return n=!0,await e(o,[...t.skipped.keys()]),a!==t.operationEpoch||await N("afterSubmit",()=>i.onAfterSubmit?.(o)),!0}catch(u){if(!n&&d())return false;throw u}finally{a===t.operationEpoch&&(t.submitting=false,t.notify());}}function J(t){let e=t.currentStep;if(!e)return true;let r=w(e,R(t),t.validators);if(Object.keys(r).length===0)return false;let i={...t.errors};return Object.assign(t.errors,r),t.notify({fieldKeys:F(i,t.errors)}),true}function G(t,e){t.validationEpoch++,t.currentStepIndex=e,t.notify({structureChanged:true});}function yt(t){return t.isLastStep?false:(G(t,t.currentStepIndex+1),true)}function gt(t){return t.isMultiStep?(O(t),!J(t)&&yt(t)):false}function bt(t){return !t.isMultiStep||!P(t)?false:(A(t),yt(t))}async function St(t,e){if(!t.isMultiStep||t.stepValidating||t.submitting)return false;if(P(t))return q(t,"next","skip");let r=t.currentStep;if(!e||!r)return false;let i=t.values,n={...t.errors},s=false,a=A(t),o=t.values,l=D(t,{...o});try{return await B(t,async(d,u)=>{await e(d,u),s=!0;},!0)}finally{!s&&t.values===o&&!l()&&(t.values=i,t.errors={...n,...t.errors},t.skipped.delete(r.id),t.notify({fieldKeys:a,structureChanged:true,valuesChanged:true}));}}async function q(t,e,r=e){let i=r==="skip";if(!t.isMultiStep||t.stepValidating||t.submitting||!i&&(e==="next"?t.isLastStep:t.isFirstStep))return false;let n=t.currentStep,s=e==="next"&&!i;if(s&&O(t),s&&J(t))return false;let a={...t.lifecycle},o=t.onStepValidate,l=false,u=t.currentStepIndex+(e==="next"?1:-1),h=i?P(t):t.visibleSteps[u];if(!h)return false;let f={fromStepId:n.id,toStepId:h.id,direction:e,reason:r,values:{...R(t)}},It=t.validationEpoch,et=++t.operationEpoch,Vt=D(t,f.values),V=()=>It!==t.validationEpoch||et!==t.operationEpoch||t.currentStep?.id!==n.id||Vt();t.stepValidating=true,t.notify();try{if(V())return !1;if(s&&o){let S=await o(n.id,f.values);if(V())return !1;if(S&&Object.keys(S).length>0)return K(t,S),!1}if(a.onBeforeStepChange){let S=await a.onBeforeStepChange(f);if(V()||S===!1)return !1}return V()||s&&J(t)?!1:(l=!0,i&&A(t),G(t,u),await N("afterStepChange",()=>a.onAfterStepChange?.(f)),!0)}catch(S){if(!l&&V())return false;throw S}finally{et===t.operationEpoch&&(t.stepValidating=false,t.notify());}}function vt(t){t.isMultiStep&&!t.isFirstStep&&G(t,t.currentStepIndex-1);}function Ft(t,e){if(!t.isMultiStep)return;let r=t.visibility.findStepIndex(e,t.values,t.currentStepIndex);r===t.currentStepIndex?t.notify():r!==null&&G(t,r);}var H=class{constructor(){this.version=0;this.listeners=new Set;this.fieldVersions=new Map;this.fieldListeners=new Map;this.structureVersion=0;this.structureListeners=new Set;}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}getSnapshot(){return this.version}subscribeField(e,r){let i=this.fieldListeners.get(e)??new Set;return i.add(r),this.fieldListeners.set(e,i),()=>{i.delete(r),i.size===0&&this.fieldListeners.delete(e);}}getFieldSnapshot(e){return this.fieldVersions.get(e)??0}subscribeStructure(e){return this.structureListeners.add(e),()=>this.structureListeners.delete(e)}getStructureSnapshot(){return this.structureVersion}notify({fieldKeys:e=[],structureChanged:r=false}={}){for(let i of new Set(e))this.notifyField(i);r&&this.notifyStructure(),this.version++;for(let i of this.listeners)i();}notifyField(e){this.fieldVersions.set(e,(this.fieldVersions.get(e)??0)+1);for(let r of this.fieldListeners.get(e)??[])r();}notifyStructure(){this.structureVersion++;for(let e of this.structureListeners)e();}};function U(t,e){for(let r of m(t)){let i=e.get(r)??new Set;i.add(t),e.set(r,i);}}var _=class{constructor(e){this.definition=e;this.routeFields=new Set;this.fieldDependents=new Map;this.stepDependents=new Map;this.stepByFieldKey=new Map;this.visibilityDirty=true;this.canGoNextDirty=true;this.cache={visibleSteps:[],currentStep:null,visibleFields:[],canGoNext:false};this.allFields=g(e),this.fieldByKey=new Map(this.allFields.map(r=>[r.key,r])),this.path=new j(e);for(let r of e.steps??[])for(let i of r.fields)this.stepByFieldKey.set(i.key,r);this.buildIndexes();}markChanged(e,r){(e||r)&&this.path.invalidate(),e?(this.visibilityDirty=true,this.canGoNextDirty=true):r&&(this.canGoNextDirty=true);}state(e,r){return this.recomputeVisibility(e,r),this.cache}getCanGoNext(e,r,i){if(this.recomputeVisibility(e,r),!this.canGoNextDirty)return this.cache.canGoNext;this.canGoNextDirty=false;let n=this.cache.currentStep,s=n?w(n,this.conditionValues(e),i):{};return this.cache.canGoNext=this.isMultiStep&&Object.keys(s).length===0,this.cache.canGoNext}findStepIndex(e,r,i){let s=this.state(r,i).visibleSteps.findIndex(a=>a.fields.some(o=>o.key===e));return s===-1?null:s}affectsStructure(e,r){return this.routeFields.has(e)||this.fieldDependents.has(e)||this.stepDependents.has(e)||r.size>0}cascadeHiddenFields(e,r,i){return this.path.invalidate(),this.hasRoutes?this.reconcileHidden(r,i):this.drainQueue(new Set([e]),r,i)}reconcileHidden(e,r){this.path.invalidate();let i=new Set([...this.fieldDependents.keys(),...this.stepDependents.keys()]);return this.drainQueue(i,e,r)}drainQueue(e,r,i){let n=[...e],s=new Set(n),a=new Set,o=l=>{delete r[l],delete i[l],this.path.invalidate(),a.add(l),!s.has(l)&&(s.add(l),n.push(l));};for(let l=0;l<n.length;l++){let d=n[l];s.delete(d),this.clearHiddenFields(this.fieldDependents.get(d),r,o),this.clearHiddenSteps(this.stepDependents.get(d),r,o);}return a}isFieldVisible(e,r){let i=this.fieldByKey.get(e);if(!i||!p(i,this.conditionValues(r)))return false;let n=this.stepByFieldKey.get(e);return !n||this.path.steps(r).includes(n)}getVisibleFieldKeys(e,r){if(this.hasRoutes)return new Set(Object.keys(this.path.values(e)));let i=new Set,n=this.isMultiStep?this.state(e,r).visibleSteps.flatMap(s=>s.fields):this.definition.fields??[];for(let s of n)p(s,this.conditionValues(e))&&i.add(s.key);return i}conditionValues(e){return this.hasRoutes?this.path.values(e):e}get hasRoutes(){return this.path.enabled}get isMultiStep(){return (this.definition.steps??[]).length>0}buildIndexes(){for(let e of this.allFields)U(e,this.fieldDependents);for(let e of this.definition.steps??[]){U(e,this.stepDependents);for(let r of e.routes??[])for(let i of m(r))this.routeFields.add(i);}}recomputeVisibility(e,r){if(!this.visibilityDirty)return;if(this.visibilityDirty=false,!this.isMultiStep){this.cache.visibleSteps=[],this.cache.currentStep=null,this.cache.visibleFields=(this.definition.fields??[]).filter(s=>p(s,this.conditionValues(e)));return}this.cache.visibleSteps=this.path.steps(e);let i=this.cache.visibleSteps;this.cache.currentStep=i[r]??i[i.length-1]??null;let n=this.cache.currentStep;this.cache.visibleFields=n?n.fields.filter(s=>p(s,this.conditionValues(e))):[];}clearHiddenFields(e,r,i){for(let n of e??[]){let s=this.stepByFieldKey.get(n.key);this.hasRoutes&&s&&!this.path.steps(r).includes(s)||p(n,this.conditionValues(r))||r[n.key]===void 0||i(n.key);}}clearHiddenSteps(e,r,i){for(let n of e??[])if(!v(n,this.conditionValues(r)))for(let s of n.fields)r[s.key]!==void 0&&i(s.key);}};var z=class{constructor(e,r,i){this.definition=e;this.errors={};this.topLevelErrors=[];this.currentStepIndex=0;this.fieldLoading={};this.stepValidating=false;this.submitting=false;this.skipped=new Map;this.validationEpoch=0;this.operationEpoch=0;this.subscriptions=new H;let n=x(e);if(n.length)throw new Error(n.join(`
|
|
3
|
-
`));this.lifecycle=i??{},this.validators=i?.validators??{},this.visibility=new
|
|
1
|
+
function T(t){return t==null||t===""||Array.isArray(t)&&!t.length}function J(t,e){let r=e[t.field];return t.eq!==void 0?r===t.eq:t.neq!==void 0?r!==t.neq:t.in!==void 0?t.in.includes(r):t.notIn!==void 0?!t.notIn.includes(r):t.notEmpty===true?!T(r):true}function c(t,e){let r=i=>J(i,e);return (t.show??[]).every(r)&&(!t.showAny?.length||t.showAny.some(r))}var v=c;function lt(t){return !!t.fields?.length&&!!t.steps?.length}function g(t){return !!t.steps?.some(e=>e.routes?.length)}function m(t){return [...t.show??[],...t.showAny??[]].map(e=>e.field)}function y(t){return t.steps?.length?t.steps.flatMap(e=>e.fields):t.fields??[]}function k(t,e){let r={};for(let i of t)i.defaultValue!==void 0&&(r[i.key]=i.defaultValue);return Object.assign(r,e)}function F(t,e){let r=new Set([...Object.keys(t),...Object.keys(e)]);return new Set([...r].filter(i=>!Object.is(t[i],e[i])))}function x(t){let e=t.steps??[],r=lt(t)?['FormEngine rejects a definition with both "fields" and "steps".']:[],i=new Map,n=new Map;e.forEach((s,a)=>{i.has(s.id)&&r.push(`Duplicate step id "${s.id}".`),i.set(s.id,a);for(let o of s.fields)n.set(o.key,a);});for(let{key:s}of y(t))(s in Object.prototype||s==="prototype")&&r.push(`Reserved field key "${s}".`);return g(t)&&e.forEach((s,a)=>{for(let o of s.routes??[]){let l=o.to===null?null:i.get(o.to);(l===void 0||l!==null&&l<=a)&&r.push(`Invalid route from "${s.id}" to "${o.to}": targets must be later steps or null.`);for(let u of m(o))(n.get(u)??1/0)<=a||r.push(`Invalid route on "${s.id}": condition field "${u}" must belong to this or an earlier step.`);}}),r}function ut(t){let e=t.steps??[],r=[];for(let i of e){let n=new Set((i.routes??[]).map(s=>s.to).filter(s=>s!==null));for(let s of n){let a=e.findIndex(u=>u.id===s),o=e[a+1],l=e[a]?.routes?.some(u=>!u.show?.length&&!u.showAny?.length);o&&n.has(o.id)&&!l&&r.push(`Route branch "${s}" from "${i.id}" continues into sibling branch "${o.id}". Add an unconditional route where it should continue.`);}}return r}function U(t,e){let r=t.steps??[];if(!g(t))return r.filter(a=>v(a,e));let i=new Map(r.map((a,o)=>[a.id,o])),n=[],s={};for(let a=0;a<r.length;){let o=r[a];if(!v(o,s)){a++;continue}n.push(o),Object.assign(s,ct(o,e,s));let l=o.routes?.find(u=>c(u,s)&&(u.to===null||(i.get(u.to)??-1)>a&&v(r[i.get(u.to)],s)));if(l?.to===null)break;a=l?i.get(l.to):a+1;}return n}function dt(t,e,r){let i=t[r]??t[t.length-1],n=e.findIndex(a=>a.id===i?.id);if(n!==-1)return n;let s=new Map(e.map((a,o)=>[a.id,o]));for(let a=Math.min(r-1,t.length-1);a>=0;a--){let o=s.get(t[a].id);if(o!==void 0)return o}return 0}function ct(t,e,r){let i={...r};for(let s of t.fields)i[s.key]=e[s.key];let n={};for(let s of t.fields)c(s,i)&&e[s.key]!==void 0&&(n[s.key]=e[s.key]);return n}var N=class{constructor(e){this.definition=e;this.source=null;this.activeStepList=[];this.activeValueMap={};this.enabled=g(e);}invalidate(){this.source=null;}steps(e){return this.refresh(e),this.activeStepList}values(e){return this.refresh(e),this.activeValueMap}refresh(e){if(this.source===e)return;this.source=e,this.activeStepList=U(this.definition,e);let r={};for(let i of this.activeStepList)Object.assign(r,ct(i,e,r));this.activeValueMap=r;}};function pt(t){let e=[],r=new Map,i=y(t),n=new Set;for(let{key:o}of i)n.has(o)&&e.push(`Duplicate field key "${o}" \u2014 fields will share state and overwrite each other`),n.add(o);let s=(o,l,u,d)=>{let h=m(u);for(let f of h)typeof f!="string"?e.push(`${o} "${l}" has a show condition without a "field" name`):n.has(f)||e.push(`${o} "${l}" has show condition referencing non-existent field "${f}"`);if(h.length)for(let f of d)r.set(f,[...r.get(f)??[],...h]);};for(let o of i){s("Field",o.key,o,[o.key]);let l=o.validation?.pattern;if(l!==void 0)try{new RegExp(l);}catch{e.push(`Field "${o.key}" has invalid regex pattern: "${l}"`);}}let a=new Set;for(let o of t.steps??[]){s("Step",o.id,o,o.fields.map(l=>l.key));for(let l of m(o))g(t)&&n.has(l)&&!a.has(l)&&e.push(`Step "${o.id}" condition field "${l}" must belong to an earlier step.`);for(let{key:l}of o.fields)a.add(l);o.skip&&(o.next===false||!t.steps[1])&&e.push(`Step "${o.id}" has "skip" but no Next button or later step.`);}return {graph:r,warnings:e}}var K=t=>typeof t=="object"&&t!==null&&!Array.isArray(t);function E(t,e,r,i=false){return t==null&&!i?[]:Array.isArray(t)?t.flatMap((n,s)=>r(n,`${e}[${s}]`)):[`${e} must be an array.`]}function P(t,e){return (r,i)=>K(r)?e(r,i):[`${i} must be ${t}.`]}var ft=P("a condition object",()=>[]);function tt(t,e){return [...E(t.show,`${e}.show`,ft),...E(t.showAny,`${e}.showAny`,ft)]}var ht=P("a field object",tt),Nt=P("a route object",tt),Kt=P("a step object",(t,e)=>[...E(t.fields,`${e}.fields`,ht,true),...tt(t,e),...E(t.routes,`${e}.routes`,Nt)]);function R(t){return K(t)?[...E(t.fields,"fields",ht),...E(t.steps,"steps",Kt)]:["Form definition must be an object."]}function Pt(t){let e=new Map,r=[];for(let i of t.keys()){if(e.has(i))continue;e.set(i,true);let n=[[i,0]];for(;n.length>0;){let s=n[n.length-1],a=t.get(s[0])?.[s[1]++];if(a===void 0)e.set(s[0],false),n.pop();else if(e.get(a)){let o=n.map(([l])=>l);r.push([...o.slice(o.indexOf(a)),a]);}else e.has(a)||(e.set(a,true),n.push([a,0]));}}return r}function D(t){let e=R(t);if(e.length)return e;let r=t,{graph:i,warnings:n}=pt(r);K(r.submit)||n.unshift('Form definition is missing the "submit" action.');for(let s of Pt(i))n.push(`Circular show condition detected: ${s.join(" -> ")}`);return [...x(r),...n,...ut(r)]}function Bt(t){let e=R(t);if(e.length)return {errors:e,warnings:[]};let r=t,i=x(r),n=new Set(i);return {errors:i,warnings:D(r).filter(s=>!n.has(s))}}var et=class extends Error{constructor(r,i){super(`The action completed, but ${r} failed: ${i instanceof Error?i.message:String(i)}`);this.phase=r;this.committed=true;this.name="FormLifecycleError",this.cause=i;}};async function B(t,e){try{await e();}catch(r){throw new et(t,r)}}function mt(t){return t.visibleSteps.map(e=>e.id).join(`
|
|
2
|
+
`)}function C(t,e){let r=mt(t);return ()=>mt(t)!==r||Object.keys(e).some(i=>e[i]!==void 0&&!Object.is(t.values[i],e[i]))}var p={email:"Enter a valid email",number:"Enter a number",boolean:"Must be true or false",option:"Select one of the available options",options:"Must be a list of available options",string:"Must be text",date:"Enter a valid date",datetime:"Enter a valid date and time",file:"Must be a file reference",value:"Invalid value"};function b(t,e){switch(t){case "required":return "This field is required";case "minLength":return `Must be at least ${e?.min} ${e?.unit??"characters"}`;case "maxLength":return `Must be at most ${e?.max} ${e?.unit??"characters"}`;case "min":return `Must be at least ${e?.min}`;case "max":return `Must be at most ${e?.max}`;case "pattern":return "Invalid format";case "matchField":return "Fields must match";default:return "Invalid value"}}var rt=new Set(["checkbox","switch"]);function Gt(t,e){return T(t)||t===false&&rt.has(e.type)}function gt(t,e,r,i){let n=r[`min${e}`],s=r[`max${e}`];if(n!==void 0&&t<n)return r[`min${e}Message`]??b(`min${e}`,{min:n,unit:i});if(s!==void 0&&t>s)return r[`max${e}Message`]??b(`max${e}`,{max:s,unit:i})}function qt(t,e){if(e.pattern!==void 0)try{return new RegExp(e.pattern).test(String(t))?void 0:e.patternMessage??b("pattern")}catch{return}}function I(t,e,r,i){let n=t.validation;if(!n)return null;if(Gt(e,t))return n.required?typeof n.required=="string"?n.required:b("required"):null;let s=typeof e=="string"||Array.isArray(e)?gt(e.length,"Length",n,Array.isArray(e)?"items":void 0):typeof e=="number"?gt(e,"",n):void 0,a=n.matchField!==void 0&&e!==r[n.matchField]?n.matchFieldMessage??b("matchField"):void 0;return (s??qt(e,n)??a??(n.validator?i?.[n.validator]?.(e,r):void 0))||null}function w(t,e,r){return G(t.fields,e,r)}function G(t,e,r){let i={};for(let n of t){if(!c(n,e))continue;let s=I(n,e[n.key],e,r);s&&(i[n.key]=s);}return i}function q(t,e,r=false){let i=t.errors;t.errors={},t.topLevelErrors=[];for(let[s,a]of Object.entries(e))t.visibility.isFieldVisible(s,t.values)?t.errors[s]=a:t.topLevelErrors.push(a);let n=r&&yt(t,e);t.notify({fieldKeys:F(i,t.errors),structureChanged:n});}function yt(t,e){let r=Object.keys(e).find(n=>t.errors[n]!==void 0),i=r&&t.isMultiStep?t.visibility.findStepIndex(r,t.values,t.currentStepIndex):null;return i===null||i===t.currentStepIndex?false:(t.currentStepIndex=i,true)}function bt(t,e){let r=[];for(let i of t.visibility.allFields)i.validation?.matchField!==e||t.errors[i.key]===void 0||I(i,t.values[i.key],V(t),t.validators)||(delete t.errors[i.key],r.push(i.key));return r}function St(t){let e=new Set(t.visibleSteps.flatMap(i=>i.fields.map(n=>n.key))),r=Object.keys(t.errors).filter(i=>!e.has(i));for(let i of r)delete t.errors[i];return r}function V(t){return g(t.definition)?M(t):vt(t,{...t.values})}function vt(t,e){for(let r of [...t.skipped.values()].flat())delete e[r];return e}function O(t,e=false){let r=t.errors,i={};if(t.isMultiStep)for(let s of t.visibleSteps)t.skipped.has(s.id)||Object.assign(i,w(s,V(t),t.validators));else Object.assign(i,G(t.definition.fields??[],t.values,t.validators));t.errors=i;let n=e&&yt(t,i);return t.notify({fieldKeys:F(r,i),structureChanged:n}),i}function Ft(t,e){let r=t.visibility.fieldByKey.get(e);if(!r||!t.visibility.isFieldVisible(e,t.values))return null;let i=t.errors[e],n=I(r,t.values[e],V(t),t.validators);n?t.errors[e]=n:delete t.errors[e];let s=Object.is(i,t.errors[e])?[]:[e];return t.notify({fieldKeys:s}),n}function M(t){let e={},r=t.visibility.getVisibleFieldKeys(t.values,t.currentStepIndex);for(let i of r)t.values[i]!==void 0&&(e[i]=t.values[i]);return vt(t,e)}function wt(t,e){let r=t.values,i=t.errors,n=Object.keys(t.fieldLoading);t.validationEpoch++,t.operationEpoch++,t.submitting=false,t.values=k(t.visibility.allFields,e),t.errors={},t.topLevelErrors=[],t.fieldLoading={},t.stepValidating=false,t.currentStepIndex=0,t.skipped.clear(),t.visibility.reconcileHidden(t.values,t.errors);let s=F(r,t.values),a=new Set([...s,...F(i,t.errors),...n]);t.notify({fieldKeys:a,structureChanged:true,valuesChanged:s.size>0});}function kt(t){let e=t.currentStep?.fields??[],r={...t.values};for(let{key:i}of e)delete r[i];return Object.assign(r,k(e))}function H(t){return U(t.definition,kt(t))[t.currentStepIndex+1]}function $(t){let e=t.currentStep,r=e.fields.map(({key:i})=>i);t.values=kt(t);for(let i of r)delete t.errors[i];return t.skipped.set(e.id,r),t.visibility.reconcileHidden(t.values,t.errors),t.notify({fieldKeys:r,structureChanged:true,valuesChanged:true}),r}function L(t){let e=t.currentStep;e&&t.skipped.delete(e.id);}function xt(t,e){return t.currentStepIndex=e,t.notify({structureChanged:true}),$(t)}async function _(t,e,r=false){if(t.submitting||t.stepValidating)return false;r||L(t);let i={...t.lifecycle},n=false,s=t.validationEpoch,a=++t.operationEpoch,o=M(t),l=C(t,o),u=()=>s!==t.validationEpoch||a!==t.operationEpoch||l();t.submitting=true,t.notify();try{if(u()||Object.keys(O(t,!0)).length>0||u())return !1;if(i.onBeforeSubmit){let d=await i.onBeforeSubmit(o);if(u()||d===!1)return !1}if(u())return !1;if(i.onBeforeSubmit){if(Object.keys(O(t,!0)).length>0||u())return !1;o=M(t);}return n=!0,await e(o,[...t.skipped.keys()]),a!==t.operationEpoch||await B("afterSubmit",()=>i.onAfterSubmit?.(o)),!0}catch(d){if(!n&&u())return false;throw d}finally{a===t.operationEpoch&&(t.submitting=false,t.notify());}}function it(t){let e=t.currentStep;if(!e)return true;let r=w(e,V(t),t.validators);if(Object.keys(r).length===0)return false;let i={...t.errors};return Object.assign(t.errors,r),t.notify({fieldKeys:F(i,t.errors)}),true}function z(t,e){t.validationEpoch++,t.currentStepIndex=e,t.notify({structureChanged:true});}function Et(t){return t.isLastStep?false:(z(t,t.currentStepIndex+1),true)}function Rt(t){return t.isMultiStep?(L(t),!it(t)&&Et(t)):false}function It(t){return !t.isMultiStep||!H(t)?false:($(t),Et(t))}async function Vt(t,e){if(!t.isMultiStep||t.stepValidating||t.submitting)return false;if(H(t))return W(t,"next","skip");let r=t.currentStep;if(!e||!r)return false;let i=t.values,n={...t.errors},s=false,a=$(t),o=t.values,l=C(t,{...o});try{return await _(t,async(u,d)=>{await e(u,d),s=!0;},!0)}finally{!s&&t.values===o&&!l()&&(t.values=i,t.errors={...n,...t.errors},t.skipped.delete(r.id),t.notify({fieldKeys:a,structureChanged:true,valuesChanged:true}));}}async function W(t,e,r=e){let i=r==="skip";if(!t.isMultiStep||t.stepValidating||t.submitting||!i&&(e==="next"?t.isLastStep:t.isFirstStep))return false;let n=t.currentStep,s=e==="next"&&!i;if(s&&L(t),s&&it(t))return false;let a={...t.lifecycle},o=t.onStepValidate,l=false,d=t.currentStepIndex+(e==="next"?1:-1),h=i?H(t):t.visibleSteps[d];if(!h)return false;let f={fromStepId:n.id,toStepId:h.id,direction:e,reason:r,values:{...V(t)}},jt=t.validationEpoch,at=++t.operationEpoch,Tt=C(t,f.values),A=()=>jt!==t.validationEpoch||at!==t.operationEpoch||t.currentStep?.id!==n.id||Tt();t.stepValidating=true,t.notify();try{if(A())return !1;if(s&&o){let S=await o(n.id,f.values);if(A())return !1;if(S&&Object.keys(S).length>0)return q(t,S),!1}if(a.onBeforeStepChange){let S=await a.onBeforeStepChange(f);if(A()||S===!1)return !1}return A()||s&&it(t)?!1:(l=!0,i&&$(t),z(t,d),await B("afterStepChange",()=>a.onAfterStepChange?.(f)),!0)}catch(S){if(!l&&A())return false;throw S}finally{at===t.operationEpoch&&(t.stepValidating=false,t.notify());}}function Mt(t){t.isMultiStep&&!t.isFirstStep&&z(t,t.currentStepIndex-1);}function At(t,e){if(!t.isMultiStep)return;let r=t.visibility.findStepIndex(e,t.values,t.currentStepIndex);r===t.currentStepIndex?t.notify():r!==null&&z(t,r);}var Y=class{constructor(){this.version=0;this.listeners=new Set;this.fieldVersions=new Map;this.fieldListeners=new Map;this.structureVersion=0;this.structureListeners=new Set;}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}getSnapshot(){return this.version}subscribeField(e,r){let i=this.fieldListeners.get(e)??new Set;return i.add(r),this.fieldListeners.set(e,i),()=>{i.delete(r),i.size===0&&this.fieldListeners.delete(e);}}getFieldSnapshot(e){return this.fieldVersions.get(e)??0}subscribeStructure(e){return this.structureListeners.add(e),()=>this.structureListeners.delete(e)}getStructureSnapshot(){return this.structureVersion}notify({fieldKeys:e=[],structureChanged:r=false}={}){for(let i of new Set(e))this.notifyField(i);r&&this.notifyStructure(),this.version++;for(let i of this.listeners)i();}notifyField(e){this.fieldVersions.set(e,(this.fieldVersions.get(e)??0)+1);for(let r of this.fieldListeners.get(e)??[])r();}notifyStructure(){this.structureVersion++;for(let e of this.structureListeners)e();}};function nt(t,e){for(let r of m(t)){let i=e.get(r)??new Set;i.add(t),e.set(r,i);}}var X=class{constructor(e){this.definition=e;this.routeFields=new Set;this.fieldDependents=new Map;this.stepDependents=new Map;this.stepByFieldKey=new Map;this.visibilityDirty=true;this.canGoNextDirty=true;this.cache={visibleSteps:[],currentStep:null,visibleFields:[],canGoNext:false};this.allFields=y(e),this.fieldByKey=new Map(this.allFields.map(r=>[r.key,r])),this.path=new N(e);for(let r of e.steps??[])for(let i of r.fields)this.stepByFieldKey.set(i.key,r);this.buildIndexes();}markChanged(e,r){(e||r)&&this.path.invalidate(),e?(this.visibilityDirty=true,this.canGoNextDirty=true):r&&(this.canGoNextDirty=true);}state(e,r){return this.recomputeVisibility(e,r),this.cache}getCanGoNext(e,r,i){if(this.recomputeVisibility(e,r),!this.canGoNextDirty)return this.cache.canGoNext;this.canGoNextDirty=false;let n=this.cache.currentStep,s=n?w(n,this.conditionValues(e),i):{};return this.cache.canGoNext=this.isMultiStep&&Object.keys(s).length===0,this.cache.canGoNext}findStepIndex(e,r,i){let s=this.state(r,i).visibleSteps.findIndex(a=>a.fields.some(o=>o.key===e));return s===-1?null:s}affectsStructure(e,r){return this.routeFields.has(e)||this.fieldDependents.has(e)||this.stepDependents.has(e)||r.size>0}cascadeHiddenFields(e,r,i){return this.path.invalidate(),this.hasRoutes?this.reconcileHidden(r,i):this.drainQueue(new Set([e]),r,i)}reconcileHidden(e,r){this.path.invalidate();let i=new Set([...this.fieldDependents.keys(),...this.stepDependents.keys()]);return this.drainQueue(i,e,r)}drainQueue(e,r,i){let n=[...e],s=new Set(n),a=new Set,o=l=>{delete r[l],delete i[l],this.path.invalidate(),a.add(l),!s.has(l)&&(s.add(l),n.push(l));};for(let l=0;l<n.length;l++){let u=n[l];s.delete(u),this.clearHiddenFields(this.fieldDependents.get(u),r,o),this.clearHiddenSteps(this.stepDependents.get(u),r,o);}return a}isFieldVisible(e,r){let i=this.fieldByKey.get(e);if(!i||!c(i,this.conditionValues(r)))return false;let n=this.stepByFieldKey.get(e);return !n||this.path.steps(r).includes(n)}getVisibleFieldKeys(e,r){if(this.hasRoutes)return new Set(Object.keys(this.path.values(e)));let i=new Set,n=this.isMultiStep?this.state(e,r).visibleSteps.flatMap(s=>s.fields):this.definition.fields??[];for(let s of n)c(s,this.conditionValues(e))&&i.add(s.key);return i}conditionValues(e){return this.hasRoutes?this.path.values(e):e}get hasRoutes(){return this.path.enabled}get isMultiStep(){return (this.definition.steps??[]).length>0}buildIndexes(){for(let e of this.allFields)nt(e,this.fieldDependents);for(let e of this.definition.steps??[]){nt(e,this.stepDependents);for(let r of e.routes??[])for(let i of m(r))this.routeFields.add(i);}}recomputeVisibility(e,r){if(!this.visibilityDirty)return;if(this.visibilityDirty=false,!this.isMultiStep){this.cache.visibleSteps=[],this.cache.currentStep=null,this.cache.visibleFields=(this.definition.fields??[]).filter(s=>c(s,this.conditionValues(e)));return}this.cache.visibleSteps=this.path.steps(e);let i=this.cache.visibleSteps;this.cache.currentStep=i[r]??i[i.length-1]??null;let n=this.cache.currentStep;this.cache.visibleFields=n?n.fields.filter(s=>c(s,this.conditionValues(e))):[];}clearHiddenFields(e,r,i){for(let n of e??[]){let s=this.stepByFieldKey.get(n.key);this.hasRoutes&&s&&!this.path.steps(r).includes(s)||c(n,this.conditionValues(r))||r[n.key]===void 0||i(n.key);}}clearHiddenSteps(e,r,i){for(let n of e??[])if(!v(n,this.conditionValues(r)))for(let s of n.fields)r[s.key]!==void 0&&i(s.key);}};var st=new WeakSet,Q=class{constructor(e,r,i){this.definition=e;this.errors={};this.topLevelErrors=[];this.currentStepIndex=0;this.fieldLoading={};this.stepValidating=false;this.submitting=false;this.skipped=new Map;this.validationEpoch=0;this.operationEpoch=0;this.subscriptions=new Y;let n=R(e),s=n.length?n:x(e);if(s.length)throw new Error(s.join(`
|
|
3
|
+
`));this.lifecycle=i??{},this.validators=i?.validators??{},this.visibility=new X(e),st.has(this.lifecycle)||this.warnAboutDefinition(),this.values=k(this.visibility.allFields,r),this.visibility.reconcileHidden(this.values,this.errors);}get onStepValidate(){return this.lifecycle.onStepValidate}get isMultiStep(){return (this.definition.steps??[]).length>0}get visibleSteps(){return this.visibility.state(this.values,this.currentStepIndex).visibleSteps}get currentStep(){return this.visibility.state(this.values,this.currentStepIndex).currentStep}get visibleFields(){return this.visibility.state(this.values,this.currentStepIndex).visibleFields}get isFirstStep(){return this.currentStepIndex===0}get isLastStep(){return this.currentStepIndex>=this.visibleSteps.length-1}get canGoNext(){return this.visibility.getCanGoNext(this.values,this.currentStepIndex,this.validators)}get progress(){let e=this.visibleSteps.length;return {current:Math.min(this.currentStepIndex+1,e),total:e}}subscribe(e){return this.subscriptions.subscribe(e)}getSnapshot(){return this.subscriptions.getSnapshot()}subscribeField(e,r){return this.subscriptions.subscribeField(e,r)}getFieldSnapshot(e){return this.subscriptions.getFieldSnapshot(e)}subscribeStructure(e){return this.subscriptions.subscribeStructure(e)}getStructureSnapshot(){return this.subscriptions.getStructureSnapshot()}setValue(e,r){let i=this.isMultiStep?this.visibleSteps:null,n=!Object.is(this.values[e],r),s=this.errors[e]!==void 0;this.values[e]=r,delete this.errors[e];for(let[h,f]of this.skipped)n&&f.includes(e)&&this.skipped.delete(h);let a=this.visibility.cascadeHiddenFields(e,this.values,this.errors),o=bt(this.internals,e),l=new Set([...a,...o]);(n||s)&&l.add(e);let u=n||a.size>0,d=u&&this.visibility.affectsStructure(e,a);if(i&&d){this.visibility.markChanged(true,true),this.currentStepIndex=dt(i,this.visibleSteps,this.currentStepIndex);for(let h of St(this.internals))l.add(h);}this.notify({fieldKeys:l,structureChanged:d,valuesChanged:u});}setErrors(e){q(this.internals,e,true);}setFieldLoading(e,r){let i=this.fieldLoading[e]===true;r?this.fieldLoading[e]=true:delete this.fieldLoading[e],this.notify({fieldKeys:i===r?[]:[e]});}cancelPendingActions(){this.validationEpoch++,this.operationEpoch++,this.stepValidating=false,this.submitting=false,this.notify();}nextStep(){return Rt(this.internals)}nextStepAsync(e="next"){return W(this.internals,"next",e)}prevStepAsync(){return W(this.internals,"back")}skipStep(){return It(this.internals)}skipStepAsync(e){return Vt(this.internals,e)}isStepSkipped(e){return this.skipped.has(e)}submitAsync(e){return _(this.internals,e)}prevStep(){Mt(this.internals);}validate(){return O(this.internals)}validateField(e){return Ft(this.internals,e)}getSubmitValues(){return M(this.internals)}goToStepWithField(e){At(this.internals,e);}reset(e){wt(this.internals,e);}warnAboutDefinition(){let e=D(this.definition);for(let{key:r,validation:i}of this.visibility.allFields){let n=i?.validator;n&&!this.validators[n]&&e.push(`Field "${r}" references unknown validator "${n}".`);}for(let r of e)console.warn(`[FormEngine] ${r}`);}get internals(){return this}notify(e={}){this.visibility.markChanged(!!e.structureChanged,!!e.valuesChanged),this.subscriptions.notify(e);}};var j=1e4,Ht=254,_t=1e3,zt=/^[^\s@]+@[^\s@.]+(?:\.[^\s@.]+)+$/,Wt=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/,Dt="\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])",Yt=new RegExp(`^${Dt}$`),Xt=new RegExp(`^${Dt}T(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d{1,3})?)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)?$`),Qt=new Set(["text","phone","password","textarea","autocomplete"]),Zt=new Map([["email",[zt,p.email,Ht]],["date",[Yt,p.date,j]],["datetime",[Xt,p.datetime,j]]]);function Ct(t,e){if(t.type!=="number"||typeof e!="string"||!Wt.test(e))return e;let r=Number(e);return Number.isFinite(r)?r:e}function Ot(t,e){return !t.options||t.options.some(r=>r.value===e)}function $t(t,e){let r=Math.min(j,t.validation?.maxLength??j);return e.length<=r?null:t.validation?.maxLengthMessage??b("maxLength",{max:r})}function Jt(t,e){return Array.isArray(e)?e.length>(t.options?.length??_t)?p.option:e.every(i=>typeof i=="string"&&i.length<=j&&Ot(t,i))?null:p.option:p.options}function Z(t,e,r){return typeof e=="string"?$t(t,e):r}function Ut(t,e,[r,i,n]){return typeof e!="string"?i:$t(t,e)??(e.length<=n&&r.test(e)?null:i)}function te(t,e){return typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e)?null:Z(t,e,p.value)}function ee(t,e){return e==null||e===""||t.type==="multiselect"&&Array.isArray(e)&&!e.length}function Lt(t,e){if(ee(t,e))return null;if(rt.has(t.type))return typeof e=="boolean"?null:p.boolean;if(t.type==="number")return typeof e=="number"&&Number.isFinite(e)?null:p.number;if(t.type==="multiselect")return Jt(t,e);if(t.type==="file")return Z(t,e,p.file);let r=Zt.get(t.type);return r?Ut(t,e,r):t.type==="select"||t.type==="radio"?Z(t,e,p.option)??(Ot(t,e)?null:p.option):Qt.has(t.type)?Z(t,e,p.string):te(t,e)}var re=()=>null,ot=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);function ie(t,e){let r=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{},i={};for(let n of t)ot(r,n.key)&&(i[n.key]=Ct(n,r[n.key]));return i}function ne(t,e){let r=new Map;for(let i of t){let n=ot(e,i.key)?Lt(i,e[i.key]):null;n&&r.set(i.key,n);}return r}function se(t,e){let r=n=>n.map(s=>e.has(s.key)?{...s,validation:void 0}:s),i=t.steps?.map(n=>({...n,fields:r(n.fields)}));return {...t,...t.fields&&{fields:r(t.fields)},...i&&{steps:i}}}function oe(t){let e={};for(let{validation:r}of t)r?.validator&&(e[r.validator]=re);return e}function ae(t,e){if(!Array.isArray(e))return;let r=new Set(e);for(let i=0;i<t.visibleSteps.length;i++){let n=t.visibleSteps[i];n.skip&&r.has(n.id)&&xt(t,i);}}function le(t,e,r={}){let i=y(t),n=ie(i,e),s=ne(i,n),a={validators:oe(i)};st.add(a);let o=new Q(se(t,s),n,a);ae(o,r.skippedSteps);let l=o.validate(),u=o.getSubmitValues();for(let[d,h]of s)ot(u,d)&&(l[d]=h);return {values:u,errors:l}}export{Bt as checkDefinition,le as validateSubmission};//# sourceMappingURL=server.js.map
|
|
4
4
|
//# sourceMappingURL=server.js.map
|