@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.
Files changed (63) hide show
  1. package/dist/{check-definition-DuLExofm.d.ts → check-definition-DyiWqhEV.d.ts} +3 -3
  2. package/dist/chunk-5WADJMJJ.js +2 -0
  3. package/dist/chunk-5WADJMJJ.js.map +1 -0
  4. package/dist/chunk-5YPOS62Y.js +3 -0
  5. package/dist/chunk-5YPOS62Y.js.map +1 -0
  6. package/dist/chunk-CW5ZWCSD.js +2 -0
  7. package/dist/chunk-CW5ZWCSD.js.map +1 -0
  8. package/dist/chunk-QMT7RJ4T.js +3 -0
  9. package/dist/chunk-QMT7RJ4T.js.map +1 -0
  10. package/dist/chunk-QVA6DLYS.js +2 -0
  11. package/dist/chunk-QVA6DLYS.js.map +1 -0
  12. package/dist/chunk-REIX6ART.js +2 -0
  13. package/dist/chunk-REIX6ART.js.map +1 -0
  14. package/dist/chunk-TMO47L42.js +5 -0
  15. package/dist/chunk-TMO47L42.js.map +1 -0
  16. package/dist/cloud.d.ts +3 -3
  17. package/dist/cloud.js +1 -1
  18. package/dist/{controller-Ds_kbXSU.d.ts → controller-BJVYkMHT.d.ts} +1 -1
  19. package/dist/default-messages-E-nZe4Tc.d.ts +10 -0
  20. package/dist/{definition-B4OIy_wH.d.ts → definition-o4Y0OY6y.d.ts} +53 -6
  21. package/dist/fix.d.ts +38 -0
  22. package/dist/fix.js +3 -0
  23. package/dist/fix.js.map +1 -0
  24. package/dist/i18n.d.ts +4 -3
  25. package/dist/i18n.js +1 -1
  26. package/dist/i18n.js.map +1 -1
  27. package/dist/{runtime-BN2PuKD7.d.ts → index-BNGgMIbC.d.ts} +20 -6
  28. package/dist/index.d.ts +67 -11
  29. package/dist/index.js +1 -1
  30. package/dist/internal.d.ts +28 -8
  31. package/dist/internal.js +1 -1
  32. package/dist/internal.js.map +1 -1
  33. package/dist/issues-Dua58e1J.d.ts +14 -0
  34. package/dist/server.d.ts +5 -5
  35. package/dist/server.iife.js +3 -3
  36. package/dist/server.iife.js.map +1 -1
  37. package/dist/server.js +1 -1
  38. package/dist/server.js.map +1 -1
  39. package/dist/{validate-field-ND_UxoJU.d.ts → validate-field-CRR6GQBA.d.ts} +2 -2
  40. package/fixtures/submissions/choices.json +6 -26
  41. package/fixtures/submissions/groups.json +649 -0
  42. package/fixtures/submissions/messages.json +4 -16
  43. package/fixtures/submissions/show-conditions.json +2 -7
  44. package/fixtures/submissions/skip-routes.json +1 -3
  45. package/fixtures/submissions/skip.json +3 -9
  46. package/fixtures/submissions/special-types.json +2 -6
  47. package/package.json +10 -6
  48. package/schema/form-definition.schema.json +380 -19
  49. package/schema/form-translation.schema.json +79 -1
  50. package/style.css +103 -82
  51. package/dist/chunk-35SAVPYL.js +0 -2
  52. package/dist/chunk-35SAVPYL.js.map +0 -1
  53. package/dist/chunk-76YV4J3Q.js +0 -3
  54. package/dist/chunk-76YV4J3Q.js.map +0 -1
  55. package/dist/chunk-PBTYUSZR.js +0 -2
  56. package/dist/chunk-PBTYUSZR.js.map +0 -1
  57. package/dist/chunk-PZEBYRGE.js +0 -2
  58. package/dist/chunk-PZEBYRGE.js.map +0 -1
  59. package/dist/chunk-RN5GQHKN.js +0 -5
  60. package/dist/chunk-RN5GQHKN.js.map +0 -1
  61. package/dist/chunk-YTUVSJUF.js +0 -3
  62. package/dist/chunk-YTUVSJUF.js.map +0 -1
  63. package/dist/default-messages-yS4QtrYi.d.ts +0 -23
package/dist/server.js CHANGED
@@ -1,2 +1,2 @@
1
- import {c,b}from'./chunk-PBTYUSZR.js';import {r}from'./chunk-76YV4J3Q.js';import {k}from'./chunk-RN5GQHKN.js';export{a as FormDefinitionError,j as checkDefinition,k as parseDefinition}from'./chunk-RN5GQHKN.js';import {g,d as d$1,p,q}from'./chunk-35SAVPYL.js';var h='Pass the values object as the second argument, not the request body with "values" and "skippedSteps".',D=()=>null,d=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function A(e,t,s){let o=s!==null&&typeof s=="object"&&!Array.isArray(s)?s:{},n=b(e),r=[...new Set(t.map(({key:l})=>l))].filter(l=>d(o,l)),a={values:{},active:new Map};for(let l=0;l<=t.length;l++){let c={};for(let i of r){let p$1=p(a.active.get(i)??t.find(w=>w.key===i),o[i]);p$1!==void 0&&(c[i]=p$1);}let u=new Map;for(let i of r){let p=n.activeField(i,c);p&&u.set(i,p);}let f=r.every(i=>u.get(i)===a.active.get(i));if(a={values:c,active:u},f)break}return a}function M({values:e,active:t},s){let o=new Map;for(let[n,r]of t){let a=q(r,e[n],s);a&&o.set(n,a);}return o}function E(e,t){let s=n=>n.map(r=>t.has(r.key)?{...r,validation:void 0}:r),o=e.steps?.map(n=>({...n,fields:s(n.fields)}));return {...e,...e.fields&&{fields:s(e.fields)},...o&&{steps:o}}}function O(e,t={}){let s={};for(let{validation:o}of e)o?.validator&&(s[o.validator]=D);return {...s,...t}}function x(e,t){return t===null||typeof t!="object"||!d(t,"values")?false:!e.some(s=>s.key==="values"||s.key==="skippedSteps")}function j(e,t){if(!Array.isArray(t))return;let s=new Set(t);for(let o=0;o<e.visibleSteps.length;o++){let n=e.visibleSteps[o];n.skip&&s.has(n.id)&&r(e,o);}}function I(e,t,s={}){k(e);let o=g(e),n=A(e,o,t),r=d$1(s.messages,e.messages),a=M(n,r),l={validators:O(o,s.validators),messages:r,onWarning:()=>{}},c$1=new c(E(e,a),n.values,l);j(c$1,s.skippedSteps);let u=c$1.validate(),f=c$1.getSubmitValues();for(let[i,p]of a)d(f,i)&&(u[i]=p);return x(o,t)&&(u.values=h),{values:f,errors:u}}export{I as validateSubmission};//# sourceMappingURL=server.js.map
1
+ import {e,d,b as b$2}from'./chunk-QMT7RJ4T.js';import {q as q$1}from'./chunk-CW5ZWCSD.js';import {l}from'./chunk-TMO47L42.js';export{a as FormDefinitionError,k as checkDefinition,l as parseDefinition}from'./chunk-TMO47L42.js';import {b as b$1}from'./chunk-QVA6DLYS.js';import {F,G,o,q,j,i,v,n,y,B,p}from'./chunk-5WADJMJJ.js';var P='Pass the values object as the second argument, not the request body with "values" and "skippedSteps".',z=()=>null,b=s=>s;function W(s,t,n){let o$1=n!==null&&typeof n=="object"&&!Array.isArray(n)?n:{},e=d(s),r=[...new Set(t.map(({key:d})=>d))].filter(d=>o(o$1,d)),u={values:{},active:new Map};for(let d=0;d<=t.length;d++){let l={};for(let a of r){let i$1=i(u.active.get(a)??t.find(m=>m.key===a),o$1[a]);i$1!==void 0&&(l[a]=i$1);}let p=new Map;for(let a of r){let i=e.s(a,l);i&&p.set(a,i);}let f=r.every(a=>p.get(a)===u.active.get(a));if(u={values:l,active:p},f)break}return u}function Y({values:s,active:t},n){let o=new Map;for(let[e,r]of t){let u=j(r,s[e],n);u&&o.set(e,u);}return o}function _(s,t,n$1){let o=new Map;for(let e of b(s).e.groups){if(t.has(e.key))continue;let r=s.items(e.key),u=v(s.values[e.key]),d=u.map((l,p)=>{if(!n(l))return l;let f={};for(let a of r[p]?.fields??[]){let i=j(a,l[a.key],n$1);i&&(o.set(y(e.key,p,a.key),i),f[a.key]=void 0);}return Object.keys(f).length?B(l,{...l,...f}):l});d.some((l,p)=>l!==u[p])&&q$1(b(s),e.key,d,false);}return o}function H(s,t){let n=e=>e.map(r=>p(r)?{...r,fields:n(r.fields)}:t.has(r.key)?{...r,validation:void 0}:r),o=s.steps?.map(e=>({...e,fields:n(e.fields)}));return {...s,...s.fields&&{fields:n(s.fields)},...o&&{steps:o}}}function J(s,t={}){let n={};for(let{validation:o}of s.flatMap(e=>q(e)?[e,...e.fields]:[e]))o?.validator&&(n[o.validator]=z);return {...n,...t}}function K(s,t){return t===null||typeof t!="object"||!o(t,"values")?false:!s.some(n=>n.key==="values"||n.key==="skippedSteps")}function L(s,t){if(!Array.isArray(t))return;let n=new Set(t);for(let o=0;o<s.visibleSteps.length;o++){let e=s.visibleSteps[o];e.skip&&n.has(e.id)&&b$2(s,o);}}function Q(s,t,n){let o$1=t!==null&&typeof t=="object"&&!Array.isArray(t)?{...t}:{},e=new Map;for(let r of s.filter(q)){let u=o(o$1,r.key)&&!e.has(r.key)&&j(r,o$1[r.key],n);u&&(e.set(r.key,u),delete o$1[r.key]);}return {source:o$1,rejected:e}}function T(s,t,n={}){l(s);let o$1=b$1(s),e$1=F(n.messages,s.messages),{source:r,rejected:u}=Q(o$1,t,G(e$1)),d=W(s,o$1,r),l$1=Y(d,G(e$1)),p={validators:J(o$1,n.validators),messages:e$1,onWarning:()=>{}},f=new e(H(s,l$1),d.values,p),a=_(f,l$1,G(e$1));L(f,n.skippedSteps);let i=f.validate(),m=f.getSubmitValues(),{e:v}=b(f);for(let[c,k]of l$1)if(o(m,c)){i[c]=k,m[c]=d.values[c];for(let g of Object.keys(i))g!==c&&v.owner(g)===c&&delete i[g];}let q=new Set([...b(f).r.values()].flat());for(let[c,k]of u)if(!(!v.s(c,f.values)||q.has(c))){i[c]=k,delete m[c];for(let g of Object.keys(i))g!==c&&v.owner(g)===c&&delete i[g];}for(let[c,k]of a)o(m,v.owner(c))&&v.l(c,f.values)&&(i[c]=k);return K(o$1,t)&&(i.values=P),{values:m,errors:i}}export{T as validateSubmission};//# sourceMappingURL=server.js.map
2
2
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/validate-submission.ts"],"names":["BODY_MESSAGE","allow","hasOwn","source","key","activeValues","definition","fields","input","visibility","createVisibility","keys","result","round","values","value","normalizeValue","field","active","settled","typeErrors","resolve","errors","error","typeError","withoutRules","invalid","strip","steps","step","ignoredValidators","given","validators","validation","isBody","applySkips","engine","skippedSteps","requested","index","skipStepAt","validateSubmission","options","parseDefinition","getAllFields","resolved","messages","messageResolver","engineOptions","FormEngine","submitted"],"mappings":"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","file":"server.js","sourcesContent":["import type { FormDefinition, FormField } from '../types';\nimport type { MessageSource, ValidatorFn } from '../validation';\nimport { messageResolver, type ResolveMessage } from '../validation/default-messages';\nimport { parseDefinition } from '../definition-validation';\nimport { getAllFields } from '../engine/engine-utils';\nimport type { EngineInternals } from '../engine/runtime-internals';\nimport { FormEngine } from '../engine/runtime';\nimport { skipStepAt } from '../engine/step-skip';\nimport { createVisibility } from '../engine/visibility-state';\nimport { normalizeValue, typeError } from '../validation/type-checks';\n\nexport interface SubmissionOptions {\n skippedSteps?: string[];\n validators?: Record<string, ValidatorFn>;\n messages?: MessageSource;\n}\n\nconst BODY_MESSAGE = 'Pass the values object as the second argument, not the request body with \"values\" and \"skippedSteps\".';\n\nexport interface SubmissionResult {\n values: Record<string, unknown>;\n errors: Record<string, string>;\n}\n\nconst allow: ValidatorFn = () => null;\n\nconst hasOwn = (source: object, key: string) => Object.prototype.hasOwnProperty.call(source, key);\n\ninterface ActiveValues {\n values: Record<string, unknown>;\n active: Map<string, FormField>;\n}\n\nfunction activeValues(definition: FormDefinition, fields: FormField[], input: unknown): ActiveValues {\n const source = input !== null && typeof input === 'object' && !Array.isArray(input) ? input as Record<string, unknown> : {};\n const visibility = createVisibility(definition);\n const keys = [...new Set(fields.map(({ key }) => key))].filter((key) => hasOwn(source, key));\n let result: ActiveValues = { values: {}, active: new Map() };\n for (let round = 0; round <= fields.length; round++) {\n const values: Record<string, unknown> = {};\n for (const key of keys) {\n const value = normalizeValue(result.active.get(key) ?? fields.find((field) => field.key === key)!, source[key]);\n if (value !== undefined) values[key] = value;\n }\n const active = new Map<string, FormField>();\n for (const key of keys) {\n const field = visibility.activeField(key, values);\n if (field) active.set(key, field);\n }\n const settled = keys.every((key) => active.get(key) === result.active.get(key));\n result = { values, active };\n if (settled) break;\n }\n return result;\n}\n\nfunction typeErrors({ values, active }: ActiveValues, resolve: ResolveMessage): Map<string, string> {\n const errors = new Map<string, string>();\n for (const [key, field] of active) {\n const error = typeError(field, values[key], resolve);\n if (error) errors.set(key, error);\n }\n return errors;\n}\n\nfunction withoutRules(definition: FormDefinition, invalid: Map<string, string>): FormDefinition {\n const strip = (fields: FormField[]) => fields.map((field) => (invalid.has(field.key) ? { ...field, validation: undefined } : field));\n const steps = definition.steps?.map((step) => ({ ...step, fields: strip(step.fields) }));\n return { ...definition, ...(definition.fields && { fields: strip(definition.fields) }), ...(steps && { steps }) };\n}\n\nfunction ignoredValidators(fields: FormField[], given: Record<string, ValidatorFn> = {}): Record<string, ValidatorFn> {\n const validators: Record<string, ValidatorFn> = {};\n for (const { validation } of fields) if (validation?.validator) validators[validation.validator] = allow;\n return { ...validators, ...given };\n}\n\nfunction isBody(fields: FormField[], input: unknown): boolean {\n if (input === null || typeof input !== 'object' || !hasOwn(input, 'values')) return false;\n return !fields.some((field) => field.key === 'values' || field.key === 'skippedSteps');\n}\n\nfunction applySkips(engine: FormEngine, skippedSteps: unknown): void {\n if (!Array.isArray(skippedSteps)) return;\n const requested = new Set(skippedSteps);\n for (let index = 0; index < engine.visibleSteps.length; index++) {\n const step = engine.visibleSteps[index];\n if (step.skip && requested.has(step.id)) skipStepAt(engine as unknown as EngineInternals, index);\n }\n}\n\nexport function validateSubmission(\n definition: FormDefinition,\n values: unknown,\n options: SubmissionOptions = {},\n): SubmissionResult {\n parseDefinition(definition);\n const fields = getAllFields(definition);\n const resolved = activeValues(definition, fields, values);\n const messages = messageResolver(options.messages, definition.messages);\n const invalid = typeErrors(resolved, messages);\n const engineOptions = { validators: ignoredValidators(fields, options.validators), messages, onWarning: () => {} };\n const engine = new FormEngine(withoutRules(definition, invalid), resolved.values, engineOptions);\n applySkips(engine, options.skippedSteps);\n const errors = engine.validate();\n const submitted = engine.getSubmitValues();\n for (const [key, error] of invalid) if (hasOwn(submitted, key)) errors[key] = error;\n if (isBody(fields, values)) errors.values = BODY_MESSAGE;\n return { values: submitted, errors };\n}\n"]}
1
+ {"version":3,"sources":["../src/server/validate-submission.ts"],"names":["BODY_MESSAGE","allow","internals","engine","activeValues","definition","fields","input","source","visibility","createVisibility","keys","key","hasOwn","result","round","values","value","normalizeValue","field","active","activeField","settled","typeErrors","resolve","errors","error","typeError","itemErrors","invalid","group","shown","items","itemsOf","next","item","index","isEntry","cleared","itemPath","keepId","writeValue","withoutRules","strip","isSection","steps","step","ignoredValidators","given","validators","validation","isGroup","isBody","applySkips","skippedSteps","requested","skipStepAt","rejectGroups","rejected","validateSubmission","options","parseDefinition","getAllFields","messages","messageResolver","namedResolver","resolved","engineOptions","FormEngine","submitted","path","skipped","activeItem"],"mappings":"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","file":"server.js","sourcesContent":["import type { FormDefinition, FormField, FormNode } from '../types';\nimport type { MessageSource, ValidatorFn } from '../validation';\nimport { messageResolver, namedResolver, type ResolveMessage } from '../validation/default-messages';\nimport { parseDefinition } from '../definition-validation';\nimport { getAllFields } from '../engine/engine-utils';\nimport type { EngineInternals } from '../engine/runtime-internals';\nimport { FormEngine } from '../engine/runtime';\nimport { skipStepAt } from '../engine/step-skip';\nimport { createVisibility } from '../engine/visibility-state';\nimport { writeValue } from '../engine/write-value';\nimport { normalizeValue, typeError } from '../validation/type-checks';\nimport { hasOwn, isEntry, isGroup, isSection, itemPath, itemsOf, keepId } from '../visibility/nodes';\n\nexport interface SubmissionOptions {\n skippedSteps?: string[];\n validators?: Record<string, ValidatorFn>;\n messages?: MessageSource;\n}\n\nconst BODY_MESSAGE = 'Pass the values object as the second argument, not the request body with \"values\" and \"skippedSteps\".';\n\nexport interface SubmissionResult {\n values: Record<string, unknown>;\n errors: Record<string, string>;\n}\n\nconst allow: ValidatorFn = () => null;\n\nconst internals = (engine: FormEngine) => engine as unknown as EngineInternals;\n\ninterface ActiveValues {\n values: Record<string, unknown>;\n active: Map<string, FormField>;\n}\n\nfunction activeValues(definition: FormDefinition, fields: FormField[], input: unknown): ActiveValues {\n const source = input !== null && typeof input === 'object' && !Array.isArray(input) ? (input as Record<string, unknown>) : {};\n const visibility = createVisibility(definition);\n const keys = [...new Set(fields.map(({ key }) => key))].filter((key) => hasOwn(source, key));\n let result: ActiveValues = { values: {}, active: new Map() };\n for (let round = 0; round <= fields.length; round++) {\n const values: Record<string, unknown> = {};\n for (const key of keys) {\n const value = normalizeValue(result.active.get(key) ?? fields.find((field) => field.key === key)!, source[key]);\n if (value !== undefined) values[key] = value;\n }\n const active = new Map<string, FormField>();\n for (const key of keys) {\n const field = visibility.activeField(key, values);\n if (field) active.set(key, field);\n }\n const settled = keys.every((key) => active.get(key) === result.active.get(key));\n result = { values, active };\n if (settled) break;\n }\n return result;\n}\n\nfunction typeErrors({ values, active }: ActiveValues, resolve: ResolveMessage): Map<string, string> {\n const errors = new Map<string, string>();\n for (const [key, field] of active) {\n const error = typeError(field, values[key], resolve);\n if (error) errors.set(key, error);\n }\n return errors;\n}\n\nfunction itemErrors(engine: FormEngine, invalid: Map<string, string>, resolve: ResolveMessage): Map<string, string> {\n const errors = new Map<string, string>();\n for (const group of internals(engine).visibility.groups) {\n if (invalid.has(group.key)) continue;\n const shown = engine.items(group.key);\n const items = itemsOf(engine.values[group.key]);\n const next = items.map((item, index) => {\n if (!isEntry(item)) return item;\n const cleared: Record<string, undefined> = {};\n for (const field of shown[index]?.fields ?? []) {\n const error = typeError(field, item[field.key], resolve);\n if (!error) continue;\n errors.set(itemPath(group.key, index, field.key), error);\n cleared[field.key] = undefined;\n }\n return Object.keys(cleared).length ? keepId(item, { ...item, ...cleared }) : item;\n });\n if (next.some((item, index) => item !== items[index])) writeValue(internals(engine), group.key, next, false);\n }\n return errors;\n}\n\nfunction withoutRules(definition: FormDefinition, invalid: Map<string, string>): FormDefinition {\n const strip = (fields: FormNode[]): FormNode[] =>\n fields.map((field) =>\n isSection(field)\n ? { ...field, fields: strip(field.fields) as FormField[] }\n : invalid.has(field.key)\n ? { ...field, validation: undefined }\n : field,\n );\n const steps = definition.steps?.map((step) => ({ ...step, fields: strip(step.fields) }));\n return { ...definition, ...(definition.fields && { fields: strip(definition.fields) }), ...(steps && { steps }) };\n}\n\nfunction ignoredValidators(fields: FormField[], given: Record<string, ValidatorFn> = {}): Record<string, ValidatorFn> {\n const validators: Record<string, ValidatorFn> = {};\n for (const { validation } of fields.flatMap((field) => (isGroup(field) ? [field, ...field.fields] : [field])))\n if (validation?.validator) validators[validation.validator] = allow;\n return { ...validators, ...given };\n}\n\nfunction isBody(fields: FormField[], input: unknown): boolean {\n if (input === null || typeof input !== 'object' || !hasOwn(input, 'values')) return false;\n return !fields.some((field) => field.key === 'values' || field.key === 'skippedSteps');\n}\n\nfunction applySkips(engine: FormEngine, skippedSteps: unknown): void {\n if (!Array.isArray(skippedSteps)) return;\n const requested = new Set(skippedSteps);\n for (let index = 0; index < engine.visibleSteps.length; index++) {\n const step = engine.visibleSteps[index];\n if (step.skip && requested.has(step.id)) skipStepAt(engine as unknown as EngineInternals, index);\n }\n}\n\nfunction rejectGroups(fields: FormField[], input: unknown, resolve: ResolveMessage) {\n const source = input !== null && typeof input === 'object' && !Array.isArray(input) ? { ...(input as Record<string, unknown>) } : {};\n const rejected = new Map<string, string>();\n for (const group of fields.filter(isGroup)) {\n const error = hasOwn(source, group.key) && !rejected.has(group.key) && typeError(group, source[group.key], resolve);\n if (!error) continue;\n rejected.set(group.key, error);\n delete source[group.key];\n }\n return { source, rejected };\n}\n\nexport function validateSubmission(definition: FormDefinition, values: unknown, options: SubmissionOptions = {}): SubmissionResult {\n parseDefinition(definition);\n const fields = getAllFields(definition);\n const messages = messageResolver(options.messages, definition.messages);\n const { source, rejected } = rejectGroups(fields, values, namedResolver(messages));\n const resolved = activeValues(definition, fields, source);\n const invalid = typeErrors(resolved, namedResolver(messages));\n const engineOptions = { validators: ignoredValidators(fields, options.validators), messages, onWarning: () => {} };\n const engine = new FormEngine(withoutRules(definition, invalid), resolved.values, engineOptions);\n const items = itemErrors(engine, invalid, namedResolver(messages));\n applySkips(engine, options.skippedSteps);\n const errors = engine.validate();\n const submitted: Record<string, unknown> = engine.getSubmitValues();\n const { visibility } = internals(engine);\n for (const [key, error] of invalid) {\n if (!hasOwn(submitted, key)) continue;\n errors[key] = error;\n submitted[key] = resolved.values[key];\n for (const path of Object.keys(errors)) if (path !== key && visibility.owner(path) === key) delete errors[path];\n }\n const skipped = new Set([...internals(engine).skipped.values()].flat());\n for (const [key, error] of rejected) {\n if (!visibility.activeField(key, engine.values) || skipped.has(key)) continue;\n errors[key] = error;\n delete submitted[key];\n for (const path of Object.keys(errors)) if (path !== key && visibility.owner(path) === key) delete errors[path];\n }\n for (const [key, error] of items)\n if (hasOwn(submitted, visibility.owner(key)) && visibility.activeItem(key, engine.values)) errors[key] = error;\n if (isBody(fields, values)) errors.values = BODY_MESSAGE;\n return { values: submitted, errors };\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { F as FormField } from './definition-B4OIy_wH.js';
2
- import { M as MessageSource } from './default-messages-yS4QtrYi.js';
1
+ import { d as FormField } from './definition-o4Y0OY6y.js';
2
+ import { M as MessageSource } from './default-messages-E-nZe4Tc.js';
3
3
 
4
4
  type ValidatorFn = (value: unknown, allValues: Record<string, unknown>) => string | null;
5
5
  declare function validateFieldValue(field: FormField, input: unknown, allValues: Record<string, unknown>, validators?: Record<string, ValidatorFn>, messages?: MessageSource): string | null;
@@ -72,10 +72,7 @@
72
72
  "values": {
73
73
  "color": "red",
74
74
  "size": "m",
75
- "tags": [
76
- "a",
77
- "b"
78
- ],
75
+ "tags": ["a", "b"],
79
76
  "agree": false,
80
77
  "alerts": true
81
78
  },
@@ -85,10 +82,7 @@
85
82
  "values": {
86
83
  "color": "red",
87
84
  "size": "m",
88
- "tags": [
89
- "a",
90
- "b"
91
- ],
85
+ "tags": ["a", "b"],
92
86
  "agree": false,
93
87
  "alerts": true
94
88
  },
@@ -101,10 +95,7 @@
101
95
  "values": {
102
96
  "color": "green",
103
97
  "size": "xl",
104
- "tags": [
105
- "a",
106
- "z"
107
- ],
98
+ "tags": ["a", "z"],
108
99
  "agree": "yes",
109
100
  "alerts": 1
110
101
  },
@@ -114,10 +105,7 @@
114
105
  "values": {
115
106
  "color": "green",
116
107
  "size": "xl",
117
- "tags": [
118
- "a",
119
- "z"
120
- ],
108
+ "tags": ["a", "z"],
121
109
  "agree": "yes",
122
110
  "alerts": 1
123
111
  },
@@ -187,21 +175,13 @@
187
175
  "name": "rejects more multiselect items than options",
188
176
  "input": {
189
177
  "values": {
190
- "tags": [
191
- "a",
192
- "a",
193
- "b"
194
- ]
178
+ "tags": ["a", "a", "b"]
195
179
  },
196
180
  "skippedSteps": []
197
181
  },
198
182
  "expected": {
199
183
  "values": {
200
- "tags": [
201
- "a",
202
- "a",
203
- "b"
204
- ]
184
+ "tags": ["a", "a", "b"]
205
185
  },
206
186
  "errors": {
207
187
  "tags": "Select one of the available options"