@bach.software/vue-dynamic-form 0.1.3 → 0.2.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/README.md +203 -7
- package/dist/examples.cjs.js +12 -0
- package/dist/examples.cjs.js.map +1 -0
- package/dist/examples.es.js +552 -0
- package/dist/examples.es.js.map +1 -0
- package/dist/src/components/DynamicForm.vue.d.ts +2 -0
- package/dist/src/components/DynamicFormItem.analytics.test.d.ts +1 -0
- package/dist/src/components/DynamicFormItem.logic.test.d.ts +1 -0
- package/dist/src/components/DynamicFormItem.test-helpers.d.ts +21 -0
- package/dist/src/components/DynamicFormItem.validation.test.d.ts +1 -0
- package/dist/src/components/DynamicFormItem.vue.d.ts +9 -2
- package/dist/src/components/DynamicFormItemArray.logic.test.d.ts +1 -0
- package/dist/src/components/DynamicFormItemArray.validation.test.d.ts +1 -0
- package/dist/src/components/DynamicFormItemArray.vue.d.ts +7 -2
- package/dist/src/components/DynamicFormItemChoice.logic.test.d.ts +1 -0
- package/dist/src/components/DynamicFormItemChoice.validation.test.d.ts +1 -0
- package/dist/src/components/DynamicFormItemChoice.vue.d.ts +7 -2
- package/dist/src/components/DynamicFormTemplate.vue.d.ts +78 -20
- package/dist/src/core/defineMetadata.d.ts +31 -7
- package/dist/src/core/useDynamicForm.d.ts +14 -0
- package/dist/src/core/useFieldArrayExtended.d.ts +16 -0
- package/dist/src/core/validation.d.ts +7 -0
- package/dist/src/core/validation.test.d.ts +1 -0
- package/dist/src/examples/DynamicForm.test.d.ts +1 -0
- package/dist/src/examples/TestForm.vue.d.ts +9 -0
- package/dist/src/examples/TestFormTemplate.testcases.d.ts +8 -0
- package/dist/src/examples/TestFormTemplate.vue.d.ts +75 -0
- package/dist/src/examples/components/IconButton.vue.d.ts +10 -0
- package/dist/src/examples/index.d.ts +3 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/test-setup.d.ts +1 -0
- package/dist/src/types/DynamicFormItemProps.d.ts +56 -1
- package/dist/src/types/DynamicFormSettings.d.ts +89 -0
- package/dist/src/types/FieldMetadata.d.ts +87 -17
- package/dist/src/types/InternalFieldMetadata.d.ts +2 -2
- package/dist/src/types/KeyValue.d.ts +3 -0
- package/dist/src/types/MetadataConfiguration.d.ts +1 -0
- package/dist/src/types/ValidationMessage.d.ts +3 -0
- package/dist/src/utils/camelize.d.ts +5 -0
- package/dist/src/utils/checkTreeHasValue.d.ts +9 -0
- package/dist/src/utils/checkTreeHasValue.test.d.ts +1 -0
- package/dist/src/utils/createValidation.d.ts +12 -0
- package/dist/src/utils/createValidation.test.d.ts +1 -0
- package/dist/src/utils/getFieldLabel.d.ts +16 -0
- package/dist/src/utils/normalizePath.d.ts +15 -0
- package/dist/src/utils/normalizePath.test.d.ts +1 -0
- package/dist/src/utils/overridePath.d.ts +19 -0
- package/dist/src/utils/overridePath.test.d.ts +1 -0
- package/dist/src/utils/resolveMessage.d.ts +17 -0
- package/dist/src/utils/resolveMessage.test.d.ts +1 -0
- package/dist/src/utils/setInPath.d.ts +10 -0
- package/dist/src/utils/setInPath.test.d.ts +1 -0
- package/dist/src/utils/splitValidationFunctions.d.ts +15 -0
- package/dist/src/utils/splitValidationFunctions.test.d.ts +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/useDynamicForm-3E1RNkVq.cjs +6 -0
- package/dist/useDynamicForm-3E1RNkVq.cjs.map +1 -0
- package/dist/useDynamicForm-B6YN35Qb.js +684 -0
- package/dist/useDynamicForm-B6YN35Qb.js.map +1 -0
- package/dist/vue-dynamic-form.cjs.js +2 -0
- package/dist/vue-dynamic-form.cjs.js.map +1 -0
- package/dist/vue-dynamic-form.es.js +13 -178
- package/dist/vue-dynamic-form.es.js.map +1 -0
- package/package.json +17 -9
- package/dist/vue-dynamic-form.umd.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDynamicForm-3E1RNkVq.cjs","sources":["../src/core/useFieldArrayExtended.ts","../src/types/DynamicFormSettings.ts","../../../node_modules/.pnpm/@vee-validate+rules@4.15.1_vue@3.5.18_typescript@5.9.2_/node_modules/@vee-validate/rules/dist/vee-validate-rules.mjs","../src/utils/checkTreeHasValue.ts","../src/utils/resolveMessage.ts","../src/core/validation.ts","../src/utils/getFieldLabel.ts","../src/utils/createValidation.ts","../src/utils/normalizePath.ts","../src/utils/overridePath.ts","../src/utils/splitValidationFunctions.ts","../src/components/DynamicFormItemArray.vue","../src/components/DynamicFormItemChoice.vue","../src/components/DynamicFormItem.vue","../src/components/DynamicForm.vue","../src/utils/camelize.ts","../src/components/DynamicFormTemplate.vue","../src/core/defineMetadata.ts","../src/core/useDynamicForm.ts"],"sourcesContent":["import type { MaybeRefOrGetter } from 'vue';\nimport { useFieldArray } from 'vee-validate';\nimport { computed } from 'vue';\n\n/**\n * Extended useFieldArray, with the childrens values included.\n */\nexport function useFieldArrayExtended(arrayPath: MaybeRefOrGetter<string>) {\n const { fields, ...originalFieldArray } = useFieldArray(arrayPath);\n const values = computed(() => fields.value.map(({ value }) => value));\n\n return {\n fields,\n values,\n ...originalFieldArray,\n };\n}\n","import type { ValidationMessage } from '@/types/ValidationMessage';\n\nexport const dynamicFormSettingsKey = Symbol('dynamicFormSettings');\n\nexport interface DynamicFormSettings {\n /**\n * Enables diagnostic data output via concealed DOM elements for reactivity testing\n */\n analytics?: boolean\n\n /**\n * In case of a complex type the value is stored in a value property, i.e. { value: 'the actual value' }\n * Use complexTypeValueProperty to change the property name, for example 'myValue' will result in { myValue: 'the actual value' }\n */\n complexTypeValueProperty?: string\n\n /**\n * When true, validates fields on every value change.\n * When false, only validates on submit.\n *\n * Defaults to true.\n */\n validateOnValueUpdate?: boolean\n\n /**\n * When true, validates fields on every value change after the first submit.\n * When false, listen to the validateOnValueUpdate.\n *\n * Defaults to false.\n */\n validateOnValueUpdateAfterSubmit?: boolean\n\n /**\n * When true, validates fields on blur.\n *\n * Defaults to false.\n */\n validateOnBlur?: boolean\n\n /**\n * When true, validates fields on every value change when the field has an error.\n *\n * Defaults to false.\n */\n validateWhenInError?: boolean\n\n /**\n * Use this setting to override the default text of the validation messages.\n *\n * Each message accepts either a `string` template or a `(ctx) => string` function.\n *\n * String templates support the following placeholders:\n * - `{field}` — the field label\n * - `{value}` — the current field value\n * - `{0}`, `{1}`, ... — rule params by position (e.g. `{0}` = the limit value)\n * - Named params where supported (e.g. `{min}`, `{max}`)\n *\n * Examples:\n * ```ts\n * required: 'The {field} field is required'\n * minLength: 'The {field} must be at least {0} characters'\n * minLength: (ctx) => `${ctx.field} is too short`\n * ```\n */\n messages?: {\n /** XSD: required. Available placeholders: `{field}` */\n required?: ValidationMessage\n /** XSD: minOccurs. Available placeholders: `{field}`, `{0}` or `{min}` (min number of filled items) */\n minOccurs?: ValidationMessage\n /** XSD: choiceMinOccurs. Available placeholders: `{field}`, `{0}` or `{min}` (min number of filled items) */\n choiceMinOccurs?: ValidationMessage\n /** XSD: minLength. Available placeholders: `{field}`, `{0}` or `{length}` (min length) */\n minLength?: ValidationMessage\n /** XSD: maxLength. Available placeholders: `{field}`, `{0}` or `{length}` (max length) */\n maxLength?: ValidationMessage\n /** XSD: length. Available placeholders: `{field}`, `{0}` or `{length}` (exact length) */\n length?: ValidationMessage\n /** XSD: pattern. Available placeholders: `{field}`, `{0}` or `{pattern}` (regex pattern) */\n pattern?: ValidationMessage\n /** XSD: minInclusive. Available placeholders: `{field}`, `{0}` or `{min}` (min value, inclusive) */\n minInclusive?: ValidationMessage\n /** XSD: maxInclusive. Available placeholders: `{field}`, `{0}` or `{max}` (max value, inclusive) */\n maxInclusive?: ValidationMessage\n /** XSD: minExclusive. Available placeholders: `{field}`, `{0}` or `{min}` (min value, exclusive) */\n minExclusive?: ValidationMessage\n /** XSD: maxExclusive. Available placeholders: `{field}`, `{0}` or `{max}` (max value, exclusive) */\n maxExclusive?: ValidationMessage\n /** XSD: enumeration. Available placeholders: `{field}` */\n enumeration?: ValidationMessage\n /** XSD: whiteSpace. Available placeholders: `{field}`, `{0}` or `{mode}` (preserve | replace | collapse) */\n whiteSpace?: ValidationMessage\n /** XSD: fractionDigits. Available placeholders: `{field}`, `{0}` or `{digits}` (max decimal places) */\n fractionDigits?: ValidationMessage\n /** XSD: totalDigits. Available placeholders: `{field}`, `{0}` or `{digits}` (max total digits) */\n totalDigits?: ValidationMessage\n }\n}\n","/**\n * vee-validate v4.15.1\n * (c) 2025 Abdelrahman Awad\n * @license MIT\n */\nimport 'vue';\nimport { validate, validateObject } from 'vee-validate';\n\n/* eslint-disable no-misleading-character-class */\n/**\n * Some Alpha Regex helpers.\n * https://github.com/chriso/validator.js/blob/master/src/lib/alpha.js\n */\nconst alpha = {\n en: /^[A-Z]*$/i,\n cs: /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]*$/i,\n da: /^[A-ZÆØÅ]*$/i,\n de: /^[A-ZÄÖÜß]*$/i,\n es: /^[A-ZÁÉÍÑÓÚÜ]*$/i,\n fr: /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]*$/i,\n it: /^[A-Z\\xC0-\\xFF]*$/i,\n lt: /^[A-ZĄČĘĖĮŠŲŪŽ]*$/i,\n nl: /^[A-ZÉËÏÓÖÜ]*$/i,\n hu: /^[A-ZÁÉÍÓÖŐÚÜŰ]*$/i,\n pl: /^[A-ZĄĆĘŚŁŃÓŻŹ]*$/i,\n pt: /^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]*$/i,\n ru: /^[А-ЯЁ]*$/i,\n kz: /^[А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]*$/i,\n sk: /^[A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ]*$/i,\n sr: /^[A-ZČĆŽŠĐ]*$/i,\n sv: /^[A-ZÅÄÖ]*$/i,\n tr: /^[A-ZÇĞİıÖŞÜ]*$/i,\n uk: /^[А-ЩЬЮЯЄІЇҐ]*$/i,\n ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]*$/,\n az: /^[A-ZÇƏĞİıÖŞÜ]*$/i,\n ug: /^[A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ]*$/i,\n};\nconst alphaSpaces = {\n en: /^[A-Z\\s]*$/i,\n cs: /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ\\s]*$/i,\n da: /^[A-ZÆØÅ\\s]*$/i,\n de: /^[A-ZÄÖÜß\\s]*$/i,\n es: /^[A-ZÁÉÍÑÓÚÜ\\s]*$/i,\n fr: /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ\\s]*$/i,\n it: /^[A-Z\\xC0-\\xFF\\s]*$/i,\n lt: /^[A-ZĄČĘĖĮŠŲŪŽ\\s]*$/i,\n nl: /^[A-ZÉËÏÓÖÜ\\s]*$/i,\n hu: /^[A-ZÁÉÍÓÖŐÚÜŰ\\s]*$/i,\n pl: /^[A-ZĄĆĘŚŁŃÓŻŹ\\s]*$/i,\n pt: /^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ\\s]*$/i,\n ru: /^[А-ЯЁ\\s]*$/i,\n kz: /^[А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA\\s]*$/i,\n sk: /^[A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ\\s]*$/i,\n sr: /^[A-ZČĆŽŠĐ\\s]*$/i,\n sv: /^[A-ZÅÄÖ\\s]*$/i,\n tr: /^[A-ZÇĞİıÖŞÜ\\s]*$/i,\n uk: /^[А-ЩЬЮЯЄІЇҐ\\s]*$/i,\n ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ\\s]*$/,\n az: /^[A-ZÇƏĞİıÖŞÜ\\s]*$/i,\n ug: /^[A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ\\s]*$/i,\n};\nconst alphanumeric = {\n en: /^[0-9A-Z]*$/i,\n cs: /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]*$/i,\n da: /^[0-9A-ZÆØÅ]$/i,\n de: /^[0-9A-ZÄÖÜß]*$/i,\n es: /^[0-9A-ZÁÉÍÑÓÚÜ]*$/i,\n fr: /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]*$/i,\n it: /^[0-9A-Z\\xC0-\\xFF]*$/i,\n lt: /^[0-9A-ZĄČĘĖĮŠŲŪŽ]*$/i,\n hu: /^[0-9A-ZÁÉÍÓÖŐÚÜŰ]*$/i,\n nl: /^[0-9A-ZÉËÏÓÖÜ]*$/i,\n pl: /^[0-9A-ZĄĆĘŚŁŃÓŻŹ]*$/i,\n pt: /^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]*$/i,\n ru: /^[0-9А-ЯЁ]*$/i,\n kz: /^[0-9А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]*$/i,\n sk: /^[0-9A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ]*$/i,\n sr: /^[0-9A-ZČĆŽŠĐ]*$/i,\n sv: /^[0-9A-ZÅÄÖ]*$/i,\n tr: /^[0-9A-ZÇĞİıÖŞÜ]*$/i,\n uk: /^[0-9А-ЩЬЮЯЄІЇҐ]*$/i,\n ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]*$/,\n az: /^[0-9A-ZÇƏĞİıÖŞÜ]*$/i,\n ug: /^[0-9A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ]*$/i,\n};\nconst alphaDash = {\n en: /^[0-9A-Z_-]*$/i,\n cs: /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ_-]*$/i,\n da: /^[0-9A-ZÆØÅ_-]*$/i,\n de: /^[0-9A-ZÄÖÜß_-]*$/i,\n es: /^[0-9A-ZÁÉÍÑÓÚÜ_-]*$/i,\n fr: /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ_-]*$/i,\n it: /^[0-9A-Z\\xC0-\\xFF_-]*$/i,\n lt: /^[0-9A-ZĄČĘĖĮŠŲŪŽ_-]*$/i,\n nl: /^[0-9A-ZÉËÏÓÖÜ_-]*$/i,\n hu: /^[0-9A-ZÁÉÍÓÖŐÚÜŰ_-]*$/i,\n pl: /^[0-9A-ZĄĆĘŚŁŃÓŻŹ_-]*$/i,\n pt: /^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ_-]*$/i,\n ru: /^[0-9А-ЯЁ_-]*$/i,\n kz: /^[0-9А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA_-]*$/i,\n sk: /^[0-9A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ_-]*$/i,\n sr: /^[0-9A-ZČĆŽŠĐ_-]*$/i,\n sv: /^[0-9A-ZÅÄÖ_-]*$/i,\n tr: /^[0-9A-ZÇĞİıÖŞÜ_-]*$/i,\n uk: /^[0-9А-ЩЬЮЯЄІЇҐ_-]*$/i,\n ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ_-]*$/,\n az: /^[0-9A-ZÇƏĞİıÖŞÜ_-]*$/i,\n ug: /^[0-9A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ_-]*$/i,\n};\nconst getLocale = (params) => {\n if (!params) {\n return undefined;\n }\n return Array.isArray(params) ? params[0] : params.locale;\n};\n\nfunction getSingleParam(params, paramName) {\n return Array.isArray(params) ? params[0] : params[paramName];\n}\nfunction isEmpty(value) {\n if (value === null || value === undefined || value === '') {\n return true;\n }\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n return false;\n}\n\nconst alphaValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n const locale = getLocale(params);\n if (Array.isArray(value)) {\n return value.every(val => alphaValidator(val, { locale }));\n }\n const valueAsString = String(value);\n // Match at least one locale.\n if (!locale) {\n return Object.keys(alpha).some(loc => alpha[loc].test(valueAsString));\n }\n return (alpha[locale] || alpha.en).test(valueAsString);\n};\n\nconst alphaDashValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n const locale = getLocale(params);\n if (Array.isArray(value)) {\n return value.every(val => alphaDashValidator(val, { locale }));\n }\n const valueAsString = String(value);\n // Match at least one locale.\n if (!locale) {\n return Object.keys(alphaDash).some(loc => alphaDash[loc].test(valueAsString));\n }\n return (alphaDash[locale] || alphaDash.en).test(valueAsString);\n};\n\nconst alphaNumValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n const locale = getLocale(params);\n if (Array.isArray(value)) {\n return value.every(val => alphaNumValidator(val, { locale }));\n }\n const valueAsString = String(value);\n // Match at least one locale.\n if (!locale) {\n return Object.keys(alphanumeric).some(loc => alphanumeric[loc].test(valueAsString));\n }\n return (alphanumeric[locale] || alphanumeric.en).test(valueAsString);\n};\n\nconst alphaSpacesValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n const locale = getLocale(params);\n if (Array.isArray(value)) {\n return value.every(val => alphaSpacesValidator(val, { locale }));\n }\n const valueAsString = String(value);\n // Match at least one locale.\n if (!locale) {\n return Object.keys(alphaSpaces).some(loc => alphaSpaces[loc].test(valueAsString));\n }\n return (alphaSpaces[locale] || alphaSpaces.en).test(valueAsString);\n};\n\nfunction getParams$1(params) {\n if (Array.isArray(params)) {\n return { min: params[0], max: params[1] };\n }\n return params;\n}\nconst betweenValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n const { min, max } = getParams$1(params);\n if (Array.isArray(value)) {\n return value.every(val => betweenValidator(val, { min, max }));\n }\n const valueAsNumber = Number(value);\n return Number(min) <= valueAsNumber && Number(max) >= valueAsNumber;\n};\n\nconst confirmedValidator = (value, params) => {\n const target = getSingleParam(params, 'target');\n return String(value) === String(target);\n};\n\nconst digitsValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n const length = getSingleParam(params, 'length');\n if (Array.isArray(value)) {\n return value.every(val => digitsValidator(val, { length }));\n }\n const strVal = String(value);\n return /^[0-9]*$/.test(strVal) && strVal.length === Number(length);\n};\n\nconst validateImage = (file, width, height) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const URL = window.URL || window.webkitURL;\n return new Promise(resolve => {\n const image = new Image();\n image.onerror = () => resolve(false);\n image.onload = () => resolve(image.width === width && image.height === height);\n image.src = URL.createObjectURL(file);\n });\n};\nfunction getParams(params) {\n if (!params) {\n return { width: 0, height: 0 };\n }\n if (Array.isArray(params)) {\n return { width: Number(params[0]), height: Number(params[1]) };\n }\n return {\n width: Number(params.width),\n height: Number(params.height),\n };\n}\nconst dimensionsValidator = (files, params) => {\n if (isEmpty(files)) {\n return true;\n }\n const { width, height } = getParams(params);\n const list = [];\n const fileList = Array.isArray(files) ? files : [files];\n for (let i = 0; i < fileList.length; i++) {\n // if file is not an image, reject.\n if (!/\\.(jpg|svg|jpeg|png|bmp|gif)$/i.test(fileList[i].name)) {\n return Promise.resolve(false);\n }\n list.push(fileList[i]);\n }\n return Promise.all(list.map(file => validateImage(file, width, height))).then(values => {\n return values.every(v => v);\n });\n};\n\n/* eslint-disable no-useless-escape */\n// https://github.com/colinhacks/zod/blob/40e72f9eaf576985f876d1afc2dbc22f73abc1ba/src/types.ts#L595\nconst emailRE = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\nconst emailValidator = (value) => {\n if (isEmpty(value)) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(val => emailRE.test(String(val)));\n }\n return emailRE.test(String(value));\n};\n\nconst extValidator = (files, extensions) => {\n if (isEmpty(files)) {\n return true;\n }\n const regex = new RegExp(`\\\\.(${extensions.join('|')})$`, 'i');\n if (Array.isArray(files)) {\n return files.every(file => regex.test(file.name));\n }\n return regex.test(files.name);\n};\n\nconst imageValidator = (files) => {\n if (isEmpty(files)) {\n return true;\n }\n const regex = /\\.(jpg|svg|jpeg|png|bmp|gif|webp)$/i;\n if (Array.isArray(files)) {\n return files.every(file => regex.test(file.name));\n }\n return regex.test(files.name);\n};\n\nconst integerValidator = (value) => {\n if (isEmpty(value)) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(val => /^-?[0-9]+$/.test(String(val)));\n }\n return /^-?[0-9]+$/.test(String(value));\n};\n\nconst isValidator = (value, params) => {\n const other = getSingleParam(params, 'other');\n return value === other;\n};\n\nconst isNotValidator = (value, params) => {\n const other = getSingleParam(params, 'other');\n return value !== other;\n};\n\nconst lengthValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n // Normalize the length value\n const length = getSingleParam(params, 'length');\n if (typeof value === 'number') {\n value = String(value);\n }\n if (!value.length) {\n value = Array.from(value);\n }\n return value.length === Number(length);\n};\n\nconst maxLengthValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n const length = getSingleParam(params, 'length');\n if (Array.isArray(value)) {\n return value.every(val => maxLengthValidator(val, { length }));\n }\n return [...String(value)].length <= Number(length);\n};\n\nconst maxValueValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n const max = getSingleParam(params, 'max');\n if (Array.isArray(value)) {\n return value.length > 0 && value.every(val => maxValueValidator(val, { max }));\n }\n return Number(value) <= Number(max);\n};\n\nconst ADDED_MIME_RE = /\\+(.+)?/;\nfunction buildRegExp(mime) {\n let strPattern = mime;\n if (ADDED_MIME_RE.test(mime)) {\n strPattern = mime.replace(ADDED_MIME_RE, '(\\\\+$1)?');\n }\n return new RegExp(strPattern.replace('*', '.+'), 'i');\n}\nconst mimesValidator = (files, mimes) => {\n if (isEmpty(files)) {\n return true;\n }\n if (!mimes) {\n mimes = [];\n }\n const patterns = mimes.map(buildRegExp);\n if (Array.isArray(files)) {\n return files.every(file => patterns.some(p => p.test(file.type)));\n }\n return patterns.some(p => p.test(files.type));\n};\n\nconst minValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n const length = getSingleParam(params, 'length');\n if (Array.isArray(value)) {\n return value.every(val => minValidator(val, { length }));\n }\n return [...String(value)].length >= Number(length);\n};\n\nconst minValueValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n const min = getSingleParam(params, 'min');\n if (Array.isArray(value)) {\n return value.length > 0 && value.every(val => minValueValidator(val, { min }));\n }\n return Number(value) >= Number(min);\n};\n\nconst oneOfValidator = (value, list) => {\n if (isEmpty(value)) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(val => oneOfValidator(val, list));\n }\n return Array.from(list).some(item => {\n return item == value;\n });\n};\n\nconst notOneOfValidator = (value, list) => {\n if (isEmpty(value)) {\n return true;\n }\n return !oneOfValidator(value, list);\n};\n\nconst ar = /^[٠١٢٣٤٥٦٧٨٩]+$/;\nconst en = /^[0-9]+$/;\nconst numericValidator = (value) => {\n if (isEmpty(value)) {\n return true;\n }\n const testValue = (val) => {\n const strValue = String(val);\n return en.test(strValue) || ar.test(strValue);\n };\n if (Array.isArray(value)) {\n return value.every(testValue);\n }\n return testValue(value);\n};\n\nconst regexValidator = (value, params) => {\n if (isEmpty(value)) {\n return true;\n }\n let regex = getSingleParam(params, 'regex');\n if (typeof regex === 'string') {\n regex = new RegExp(regex);\n }\n if (Array.isArray(value)) {\n return value.every(val => regexValidator(val, { regex }));\n }\n return regex.test(String(value));\n};\n\nfunction isNullOrUndefined(value) {\n return value === null || value === undefined;\n}\nfunction isEmptyArray(arr) {\n return Array.isArray(arr) && arr.length === 0;\n}\nconst isObject = (obj) => obj !== null && !!obj && typeof obj === 'object' && !Array.isArray(obj);\n\nconst requiredValidator = (value) => {\n if (isNullOrUndefined(value) || isEmptyArray(value) || value === false) {\n return false;\n }\n return !!String(value).trim().length;\n};\n\nconst sizeValidator = (files, params) => {\n if (isEmpty(files)) {\n return true;\n }\n let size = getSingleParam(params, 'size');\n size = Number(size);\n if (isNaN(size)) {\n return false;\n }\n const nSize = size * 1024;\n if (!Array.isArray(files)) {\n return files.size <= nSize;\n }\n for (let i = 0; i < files.length; i++) {\n if (files[i].size > nSize) {\n return false;\n }\n }\n return true;\n};\n\nconst urlValidator = (value, params) => {\n var _a;\n if (isEmpty(value)) {\n return true;\n }\n let pattern = getSingleParam(params, 'pattern');\n if (typeof pattern === 'string') {\n pattern = new RegExp(pattern);\n }\n try {\n new URL(value);\n }\n catch (_b) {\n return false;\n }\n return (_a = pattern === null || pattern === void 0 ? void 0 : pattern.test(value)) !== null && _a !== void 0 ? _a : true;\n};\n\n/**\n * A typed version of Object.keys\n */\nfunction keysOf(record) {\n return Object.keys(record);\n}\n\nfunction toTypedSchema(rawSchema) {\n const schema = {\n __type: 'VVTypedSchema',\n async parse(values) {\n // single field\n if (typeof rawSchema === 'string') {\n const result = await validate(values, rawSchema);\n return {\n errors: [\n {\n errors: result.errors,\n },\n ],\n };\n }\n const result = await validateObject(rawSchema, values);\n return {\n errors: keysOf(result.errors).map(path => {\n var _a;\n const error = {\n path: path,\n errors: ((_a = result.results[path]) === null || _a === void 0 ? void 0 : _a.errors) || [],\n };\n return error;\n }),\n };\n },\n describe(path) {\n if (!path) {\n return getDescriptionFromExpression(rawSchema);\n }\n if (isObject(rawSchema) && path in rawSchema) {\n return getDescriptionFromExpression(rawSchema[path]);\n }\n return {\n required: false,\n exists: false,\n };\n },\n };\n return schema;\n}\nfunction getDescriptionFromExpression(rules) {\n if (typeof rules === 'string') {\n return {\n exists: true,\n required: rules.includes('required'),\n };\n }\n if (isObject(rules)) {\n return {\n exists: true,\n required: !!rules.required,\n };\n }\n return {\n required: false,\n exists: true,\n };\n}\n\nconst all = {\n alpha_dash: alphaDashValidator,\n alpha_num: alphaNumValidator,\n alpha_spaces: alphaSpacesValidator,\n alpha: alphaValidator,\n between: betweenValidator,\n confirmed: confirmedValidator,\n digits: digitsValidator,\n dimensions: dimensionsValidator,\n email: emailValidator,\n ext: extValidator,\n image: imageValidator,\n integer: integerValidator,\n is_not: isNotValidator,\n is: isValidator,\n length: lengthValidator,\n max_value: maxValueValidator,\n max: maxLengthValidator,\n mimes: mimesValidator,\n min_value: minValueValidator,\n min: minValidator,\n not_one_of: notOneOfValidator,\n numeric: numericValidator,\n one_of: oneOfValidator,\n regex: regexValidator,\n required: requiredValidator,\n size: sizeValidator,\n url: urlValidator,\n};\n\nexport { all, alphaValidator as alpha, alphaDashValidator as alpha_dash, alphaNumValidator as alpha_num, alphaSpacesValidator as alpha_spaces, betweenValidator as between, confirmedValidator as confirmed, digitsValidator as digits, dimensionsValidator as dimensions, emailValidator as email, extValidator as ext, imageValidator as image, integerValidator as integer, isValidator as is, isNotValidator as is_not, lengthValidator as length, maxLengthValidator as max, maxValueValidator as max_value, mimesValidator as mimes, minValidator as min, minValueValidator as min_value, notOneOfValidator as not_one_of, numericValidator as numeric, oneOfValidator as one_of, regexValidator as regex, requiredValidator as required, sizeValidator as size, toTypedSchema, urlValidator as url };\n","/**\n * Recursively traverses a data structure to determine if it holds any meaningful data.\n * Returns false only when the entire structure consists of null/undefined values.\n * Particularly useful for validation frameworks to detect populated form fields.\n *\n * @param element Data structure to analyze (supports primitives, objects, arrays)\n * @returns Boolean indicating presence of non-nullish values\n */\nexport function checkTreeHasValue(element: unknown): boolean {\n if (element === null || element === undefined) {\n return false;\n }\n\n if (Array.isArray(element)) {\n return element.some((value: unknown) => checkTreeHasValue(value));\n }\n if (typeof element === 'object') {\n return Object.values(element).some((value: unknown) => checkTreeHasValue(value));\n }\n\n return true;\n}\n","import type { FieldValidationMetaInfo, ValidationMessage } from '@/types/ValidationMessage';\n\n/**\n * Helper function to resolve a validation message, with parameters.\n *\n * All three param styles work:\n * 'Must be at least {0} characters' // positional\n * 'Must be at least {min} characters' // named (object params)\n * 'The {field} value {value} is invalid' // context properties\n *\n * This is exactly how @vee-validate/i18n handles it internally.\n * @param message - The message template or function\n * @param ctx - The vee-validate field validation context\n * @param params - Optional param override. Array for positional `{0}, {1}`, or object for\n * named `{min}, {length}` (also supports positional via numeric keys). Falls back to ctx.rule.params if not provided.\n * @returns The resolved message string\n */\nexport function resolveMessage(message: ValidationMessage, ctx: FieldValidationMetaInfo, params?: unknown[] | Record<string, unknown>): string {\n if (typeof message === 'function')\n return message(ctx);\n return message.replace(/\\{(\\w+)\\}/g, (_, key) => {\n // Named context properties: {field}, {value}\n if (key in ctx)\n return String((ctx as any)[key]);\n // Named or positional from explicit params object: {min}, {length}, {0}\n if (params && !Array.isArray(params) && key in params)\n return String(params[key]);\n // Positional from explicit params array: {0}, {1}\n const index = Number(key);\n if (!Number.isNaN(index)) {\n if (Array.isArray(params) && params[index] !== undefined)\n return String(params[index]);\n return String((ctx.rule?.params as unknown[])?.[index] ?? `{${key}}`);\n }\n // Named from ctx.rule.params object: {min}, {max}\n if (ctx.rule?.params && !Array.isArray(ctx.rule.params))\n return String(ctx.rule.params[key] ?? `{${key}}`);\n return `{${key}}`;\n });\n}\n","import { max, max_value, min, min_value, one_of, regex, required } from '@vee-validate/rules';\nimport { defineRule } from 'vee-validate';\nimport { checkTreeHasValue } from '@/utils/checkTreeHasValue';\n\nexport { resolveMessage } from '@/utils/resolveMessage';\n\nexport type ValidationRule = 'xsd_required'\n | 'xsd_minOccurs'\n | 'xsd_choiceMinOccurs'\n | 'xsd_minLength'\n | 'xsd_maxLength'\n | 'xsd_pattern'\n | 'xsd_minInclusive'\n | 'xsd_maxInclusive'\n | 'xsd_minExclusive'\n | 'xsd_maxExclusive'\n | 'xsd_enumeration'\n | 'xsd_length'\n | 'xsd_whiteSpace'\n | 'xsd_fractionDigits'\n | 'xsd_totalDigits';\n\n// XSD: required\ndefineRule('xsd_required' as ValidationRule, required);\n\n// XSD: minOccurs — minimum number of array items that have a value\ndefineRule('xsd_minOccurs' as ValidationRule, (value: unknown, [min]: [number]) => {\n if (!Array.isArray(value))\n return true;\n return value.filter(checkTreeHasValue).length >= Number(min);\n});\n\n// XSD: choiceMinOccurs — minimum number of choice items that have a value\ndefineRule('xsd_choiceMinOccurs' as ValidationRule, () => {\n // As we can't actually validate a choice field (it doesn't exist in the vee-validate value tree)\n // we always validate false if this validation is added.\n return false;\n});\n\n// XSD: minLength / maxLength — maps to vee-validate's min/max (string length)\ndefineRule('xsd_minLength' as ValidationRule, min);\ndefineRule('xsd_maxLength' as ValidationRule, max);\n\n// XSD: length — exact string length\ndefineRule('xsd_length' as ValidationRule, (value: unknown, [length]: [number]) => {\n if (value === null || value === undefined || value === '')\n return true;\n return String(value).length === Number(length);\n});\n\n// XSD: pattern — maps to vee-validate's regex\ndefineRule('xsd_pattern' as ValidationRule, regex);\n\n// XSD: minInclusive / maxInclusive (value >= min, value <= max)\ndefineRule('xsd_minInclusive' as ValidationRule, min_value);\ndefineRule('xsd_maxInclusive' as ValidationRule, max_value);\n\n// XSD: minExclusive / maxExclusive (value > min, value < max)\ndefineRule('xsd_minExclusive' as ValidationRule, (value: unknown, [min]: [number]) => {\n if (value === null || value === undefined || value === '')\n return true;\n return Number(value) > Number(min);\n});\ndefineRule('xsd_maxExclusive' as ValidationRule, (value: unknown, [max]: [number]) => {\n if (value === null || value === undefined || value === '')\n return true;\n return Number(value) < Number(max);\n});\n\n// XSD: enumeration — maps to vee-validate's one_of\ndefineRule('xsd_enumeration' as ValidationRule, one_of);\n\n// XSD: whiteSpace — validates the value conforms to the given whitespace mode\n// Modes: 'preserve' (no restriction), 'replace' (no tabs/newlines), 'collapse' (no leading/trailing/multiple spaces)\ndefineRule('xsd_whiteSpace' as ValidationRule, (value: unknown, [mode]: [string]) => {\n if (value === null || value === undefined || value === '')\n return true;\n const str = String(value);\n if (mode === 'replace')\n return !/[\\t\\n\\r]/.test(str);\n if (mode === 'collapse')\n return str === str.trim() && !/\\s{2,}/.test(str);\n return true; // 'preserve' — no restriction\n});\n\n// XSD: fractionDigits — maximum number of decimal places\ndefineRule('xsd_fractionDigits' as ValidationRule, (value: unknown, [digits]: [number]) => {\n if (value === null || value === undefined || value === '')\n return true;\n const decimalIndex = String(value).indexOf('.');\n if (decimalIndex === -1)\n return true;\n return String(value).length - decimalIndex - 1 <= Number(digits);\n});\n\n// XSD: totalDigits — maximum total number of significant digits (excluding sign and decimal point)\ndefineRule('xsd_totalDigits' as ValidationRule, (value: unknown, [digits]: [number]) => {\n if (value === null || value === undefined || value === '')\n return true;\n const significant = String(value).replace(/^-/, '').replace('.', '').replace(/^0+/, '') || '0';\n return significant.length <= Number(digits);\n});\n\n/**\n * Maps each rule to its semantic parameter name, enabling named placeholder\n * interpolation (e.g. `{length}`, `{min}`) alongside positional `{0}` in messages.\n */\nexport const ruleParamNames: Partial<Record<ValidationRule, string>> = {\n xsd_minOccurs: 'min',\n xsd_choiceMinOccurs: 'min',\n xsd_minLength: 'length',\n xsd_maxLength: 'length',\n xsd_length: 'length',\n xsd_pattern: 'pattern',\n xsd_minInclusive: 'min',\n xsd_maxInclusive: 'max',\n xsd_minExclusive: 'min',\n xsd_maxExclusive: 'max',\n xsd_whiteSpace: 'mode',\n xsd_fractionDigits: 'digits',\n xsd_totalDigits: 'digits',\n};\n","import type { FieldValidationMetaInfo } from '@/types/ValidationMessage';\n\n/**\n * Resolves the most user-friendly label for a field validation context.\n *\n * Most components (e.g. DynamicFormItem, DynamicFormItemArray) call `useField`\n * with the field's `fieldOptions`, so vee-validate already sets `ctx.label`\n * and `ctx.field` to a human-readable name. Choice fields are special: they\n * validate at the root path (`''`) and historically registered without any\n * `fieldOptions`, which left vee-validate with the literal placeholder\n * string `{field}`. Normalizing the label here ensures shared helpers like\n * createValidation/splitValidationFunctions always receive a real display name\n * even for those “virtual” fields.\n *\n * Preference order: explicit label → ctx.field → ctx.name → empty string.\n */\nexport function getFieldLabel(ctx: FieldValidationMetaInfo): string {\n return ctx.label ?? ctx.field ?? ctx.name ?? '';\n}\n","import type { ValidationRule } from '@/core/validation';\nimport type { FieldValidationMetaInfo, ValidationMessage } from '@/types/ValidationMessage';\nimport { validate } from 'vee-validate';\nimport { resolveMessage, ruleParamNames } from '@/core/validation';\nimport { getFieldLabel } from '@/utils/getFieldLabel';\n\n/**\n * Creates a validation that uses a globally defined rule in our 'vdf' namespace.\n * When the validation fails we either show the message override from the settings.messages\n * or let the user override the message using the configure.generateMessage\n *\n * @param rule\n * @param param\n * @param customMessage\n */\nexport function createValidation(rule: ValidationRule, param?: unknown, customMessage?: ValidationMessage) {\n // Build params as an object so both positional ({0}) and named ({length}, {min}, ...) placeholders work\n const paramName = ruleParamNames[rule];\n const params: Record<string, unknown> = param !== undefined\n ? { 0: param, ...(paramName ? { [paramName]: param } : {}) }\n : {};\n return async (value: unknown, ctx: FieldValidationMetaInfo) => {\n const fieldName = getFieldLabel(ctx);\n const validateOptions = fieldName ? { name: fieldName } : undefined;\n const normalizedCtx = fieldName && ctx.field !== fieldName\n ? { ...ctx, field: fieldName }\n : ctx;\n\n const result = await validate(\n value,\n param !== undefined ? { [rule]: param } : rule,\n validateOptions,\n );\n if (result.valid)\n return true;\n return customMessage ? resolveMessage(customMessage, normalizedCtx, params) : result.errors[0];\n };\n}\n","/**\n * Helper function that converts a path with bracket notation to a dot notation.\n * When adding an extra path segment, we do this by using the bracket notation, i.e.: person['value'].\n *\n * Vee-validate can't work with this notation, therefore this function fixes those cases.\n *\n * const actualPath = normalizePath(\n * 'this.is[\"added\"].to.my.path.and.more',\n * )\n *\n * console.log(actualPath) // 'this.is.added.to.my.path.and.more'\n *\n * @param path to be normalized\n */\nexport function normalizePath(path: string) {\n return path?.replaceAll(/\\[[`'\"](.*?)[`'\"]\\]/g, '.$1') ?? '';\n}\n","/**\n * Merges two dot-notation paths by replacing leading segments of the base path\n * with segments from the replacement path. Useful for resolving array indices\n * in nested field paths where parent context contains array positions.\n *\n * @example\n * // Given a generic path and an indexed parent path, produce the indexed child path\n * const result = overridePath(\n * 'data.users.contact.email',\n * 'data.users[2]'\n * )\n *\n * console.log(result) // 'data.users[2].contact.email'\n *\n * @param path Base path string to be modified\n * @param overrideWithPath Replacement path that will substitute initial segments\n * @returns Modified path with replaced segments\n */\nexport function overridePath(path: string, overrideWithPath: string | undefined) {\n if (!path || !overrideWithPath)\n return path;\n\n // Split both paths and substitute leading segments from the replacement path\n const parentSegments = overrideWithPath.split('.') ?? [];\n const childSegments = path.split('.') ?? [];\n for (let index = 0; index < parentSegments.length; index++) {\n childSegments[index] = parentSegments[index];\n }\n return childSegments.join('.');\n}\n","import type { GenericValidateFunction, RuleExpression } from 'vee-validate';\nimport type { FieldValidationMetaInfo } from '@/types/ValidationMessage';\nimport { validate } from 'vee-validate';\nimport { getFieldLabel } from '@/utils/getFieldLabel';\n\n/**\n * Splits a vee-validate `RuleExpression` into an array of individual `GenericValidateFunction`s,\n * one per rule. This allows vee-validate to run each rule independently and collect all errors\n * when `bails: false` is configured.\n *\n * Handles all `RuleExpression` formats:\n * - **Function** — returned as-is in a single-element array\n * - **Array** — each element is recursively split\n * - **String** — pipe-separated rules (e.g. `'required|email'`) are split into separate functions,\n * each delegating to vee-validate's `validate()`\n * - **Object** — each key/value pair (e.g. `{ required: true, min: 3 }`) becomes a separate function,\n * each delegating to vee-validate's `validate()`\n */\nexport function splitToValidationFunctions(userRules: RuleExpression<unknown>):\nGenericValidateFunction[] {\n if (!userRules)\n return [];\n if (typeof userRules === 'function')\n return [userRules];\n if (Array.isArray(userRules))\n return userRules.flatMap(splitToValidationFunctions);\n\n if (typeof userRules === 'string') {\n return userRules.split('|').map(rule => async (value: unknown, ctx: FieldValidationMetaInfo) => {\n const fieldName = getFieldLabel(ctx);\n const result = await validate(value, rule, fieldName ? { name: fieldName } : undefined);\n return result.valid ? true : result.errors[0];\n });\n }\n\n // Object format: { required: true, email: true }\n return Object.entries(userRules).map(([key, val]) => async (value: unknown, ctx: FieldValidationMetaInfo) => {\n const fieldName = getFieldLabel(ctx);\n const result = await validate(value, { [key]: val }, fieldName ? { name: fieldName } : undefined);\n return result.valid ? true : result.errors[0];\n });\n}\n","<script\n lang=\"ts\"\n setup\n generic=\"InternalMetadata extends InternalFieldMetadata<FieldMetadata>\"\n>\nimport type { GenericValidateFunction } from 'vee-validate';\nimport type { ComputedRef } from 'vue';\nimport type { LimitedFieldContext } from '@/components/DynamicFormTemplate.vue';\nimport type { DynamicFormItemProps } from '@/types/DynamicFormItemProps';\nimport type { DynamicFormSettings } from '@/types/DynamicFormSettings';\nimport type { FieldMetadata } from '@/types/FieldMetadata';\nimport type { InternalFieldMetadata } from '@/types/InternalFieldMetadata';\nimport { useField, useSubmitCount, useValidateField } from 'vee-validate';\nimport { computed, inject, ref, watch, watchEffect } from 'vue';\nimport DynamicFormItem from '@/components/DynamicFormItem.vue';\nimport { useFieldArrayExtended } from '@/core/useFieldArrayExtended';\nimport { dynamicFormSettingsKey } from '@/types/DynamicFormSettings';\nimport { createValidation } from '@/utils/createValidation';\nimport { normalizePath } from '@/utils/normalizePath';\nimport { overridePath } from '@/utils/overridePath';\nimport { splitToValidationFunctions } from '@/utils/splitValidationFunctions';\n\n// #region Interfaces\nexport interface Emit {\n (e: 'update:modelValue', value: unknown): void\n}\n\ntype Props = DynamicFormItemProps<InternalMetadata>;\n// #endregion\n\n// #region Props, Emits and inject\nconst props = defineProps<Props>();\nconst emits = defineEmits<Emit>();\nconst settings = inject<ComputedRef<DynamicFormSettings>>(dynamicFormSettingsKey);\n// #endregion\n\n// #region Analytics: to test reactivity and prevent unnecessary rerenders.\n// They're not reactive to avoid infinite loops.\n// eslint-disable-next-line prefer-const\nlet _analytics_renderCount = 0;\nlet _analytics_constructValidationCount = 0;\nlet _analytics_fieldChangedCount = 0;\n// #endregion\n\n// Keep track of changes to the field for analytics\nconst field = computed(() => {\n _analytics_fieldChangedCount++;\n return props.fieldMetadata;\n});\n\n// The path of this field, while taking the override into consideration\nconst path = computed(() => {\n if (!field.value?.path)\n return '';\n\n return overridePath(field.value.path, props.pathOverride);\n});\n\n// Link the vee-validate field to this metadata field\nconst normalizedPath = computed(() => normalizePath(path.value));\nconst validate = useValidateField(normalizedPath);\nconst { remove, push, fields, update, values, replace }\n = useFieldArrayExtended(normalizedPath);\n\n// minOccurs determines how many times this field should appear at minimum\nconst minOccurs = computed(() =>\n props.minOccursOverride !== undefined\n ? props.minOccursOverride\n : (field.value?.minOccurs ?? 1),\n);\n\n// maxOccurs determines how many times this field should appear at maximum\nconst maxOccurs = computed(() =>\n props.maxOccursOverride !== undefined\n ? props.maxOccursOverride\n : (field.value?.maxOccurs ?? 1),\n);\n\nconst disabled = computed(() => maxOccurs.value === 0);\n\nconst required = computed(() => minOccurs.value >= 1 && !disabled.value);\n\n// An override we pass to the fields, as the sub-items should not be array items themselves\nconst _maxOccursOverride = computed(() =>\n maxOccurs.value === 0 ? 0 : 1, // max 1\n);\n\nconst _canAddItems = computed(\n () =>\n // When we have less then the allowed amount\n maxOccurs.value > fields.value?.length,\n);\nconst _canRemoveItems = computed(() => {\n // If we're a child of a choiceField we can remove until 0 fields\n if (props.partOfChoiceField)\n return fields.value?.length > 0;\n\n // In other cases allow removing until we reach the minOccurs or the minimum of 1\n return fields.value?.length > minOccurs.value && fields.value?.length > 1;\n});\n\nconst combinedValidation = computed<GenericValidateFunction[]>(() => {\n _analytics_constructValidationCount++;\n\n const _validations: GenericValidateFunction[] = [];\n const _messages = settings?.value?.messages;\n\n if (required.value)\n _validations.push(createValidation('xsd_minOccurs', minOccurs.value, _messages?.minOccurs));\n\n // Add the user defined validations, if they exist\n if (field.value?.validation)\n _validations.push(...splitToValidationFunctions(field.value?.validation));\n\n return _validations;\n});\n\nconst { label, errors, errorMessage, handleBlur } = useField(normalizedPath, combinedValidation, {\n ...(field.value?.fieldOptions ?? {}),\n validateOnValueUpdate: false, // We own the validation moment\n});\nconst fieldContext: LimitedFieldContext = { label, errors, errorMessage };\n\n// Because we add empty placeholders, we only want to trigger validation once a child actually updated the value\nconst submitCount = useSubmitCount();\nconst firstValueSet = ref(false);\nconst shouldValidateOnValueUpdate = computed(() => {\n // Without a first value set, no point validating\n if (!firstValueSet.value)\n return;\n\n // Only when validateOnValueUpdateAfterSubmit is true, we want to take the check into account.\n // The check can be true or false, both should be final. In case validateOnValueUpdateAfterSubmit is not true (undefined or false)\n // we want to listen to the next check (therefore we use undefined).\n const validateOnValueUpdateAfterSubmit = settings?.value?.validateOnValueUpdateAfterSubmit === true\n ? (submitCount.value > 0 && settings?.value?.validateOnValueUpdateAfterSubmit)\n : undefined;\n\n // Either validate or let another value determine whether we should validate\n const validateWhenInError = settings?.value?.validateWhenInError && fieldContext?.errors.value?.length > 0\n ? true\n : undefined;\n\n // field has priority\n return field.value?.fieldOptions?.validateOnValueUpdate\n // then whether we are in error\n ?? validateWhenInError\n // then whether we only want to validate after submit\n ?? validateOnValueUpdateAfterSubmit\n // and finally the always validate\n ?? settings?.value?.validateOnValueUpdate;\n});\n// #endregion\n\n// #region Watchers and lifecycle events\nwatch(\n values,\n (v) => {\n // Automatically validate when we configured it to do so\n if (shouldValidateOnValueUpdate.value) {\n validate();\n }\n emits('update:modelValue', v);\n },\n { immediate: true },\n);\n\nwatchEffect(() => {\n // Don't add items when part of a choice field\n if (props.partOfChoiceField)\n return;\n\n // Auto-add items to meet minOccurs\n if (fields.value?.length < 1 || fields.value?.length < minOccurs.value) {\n _addItem();\n }\n});\n// #endregion\n\n// #region Methods\n\nfunction _addItem() {\n push(null); // empty placeholder\n emits('update:modelValue', values.value);\n}\n\nfunction _removeItem(index?: number) {\n if (_canRemoveItems.value) {\n // Remove the item at the given index or the last one\n remove(index ?? fields.value.length - 1);\n }\n else {\n // In case we're not allowed to remove an item, clear it instead\n replace(values.value?.map((x, i) => i === index ? null : x));\n }\n\n emits('update:modelValue', values.value);\n}\n\nfunction guardAndNotifyItemUpdate(value: any, index: number) {\n if (!firstValueSet.value) {\n // We postponed validation until the first value is set, now that the first value is set\n // make sure that we also validate if we have to\n firstValueSet.value = true;\n if (shouldValidateOnValueUpdate.value) {\n validate();\n }\n }\n\n // Workaround for required validation on array items with attributes:\n // When an array item has attributes, the complexType structure may still contain the attribute values\n // even when the main value has just been emptied. This causes checkTreeHasValue() to return true,\n // incorrectly marking the item as having a value and bypassing required validation.\n // We explicitly call update() with undefined to ensure the value is properly cleared\n // and required validation can trigger correctly.\n if (value === undefined && index >= 0) {\n update(index, undefined);\n }\n\n // Emit the value coming from vee-validate\n emits('update:modelValue', values.value);\n};\n\n// #endregion\n</script>\n\n<template>\n <div v-if=\"settings?.analytics\" v-show=\"false\">\n <span :data-testid=\"`${path}-analytics-render-count`\">{{\n ++_analytics_renderCount\n }}</span>\n </div>\n <component\n :is=\"template\"\n type=\"array\"\n :field-metadata\n :field-context\n :required\n :disabled\n :index\n :slot-props\n :can-add-items=\"_canAddItems\"\n :can-remove-items=\"_canRemoveItems\"\n :add-item=\"_addItem\"\n :remove-item=\"_removeItem\"\n >\n <template #default=\"slotProps\">\n <DynamicFormItem\n v-for=\"({ key }, index) in fields ?? []\"\n :key=\"key\"\n :field-metadata\n :path-override=\"`${path}[${index}]`\"\n :index\n :template=\"template\"\n :slot-props\n :max-occurs-override=\"_maxOccursOverride\"\n :can-add-items=\"_canAddItems\"\n :can-remove-items=\"_canRemoveItems\"\n :add-item=\"_addItem\"\n :remove-item=\"() => _removeItem(index)\"\n part-of-array-field\n is-array-override=\"single\"\n\n @update:model-value=\"guardAndNotifyItemUpdate($event, index)\"\n @blur=\"handleBlur\"\n />\n </template>\n </component>\n</template>\n","<script\n lang=\"ts\"\n setup\n generic=\"InternalMetadata extends InternalFieldMetadata<FieldMetadata>\"\n>\nimport type { ComputedRef } from 'vue';\nimport type { LimitedFieldContext } from '@/components/DynamicFormTemplate.vue';\nimport type { DynamicFormItemProps } from '@/types/DynamicFormItemProps';\nimport type { DynamicFormSettings } from '@/types/DynamicFormSettings';\nimport type { FieldMetadata } from '@/types/FieldMetadata';\nimport type { InternalFieldMetadata } from '@/types/InternalFieldMetadata';\nimport { useField } from 'vee-validate';\nimport { computed, inject, ref, watch } from 'vue';\nimport DynamicFormItem from '@/components/DynamicFormItem.vue';\nimport { dynamicFormSettingsKey } from '@/types/DynamicFormSettings';\nimport { checkTreeHasValue } from '@/utils/checkTreeHasValue';\nimport { createValidation } from '@/utils/createValidation';\nimport { normalizePath } from '@/utils/normalizePath';\nimport { overridePath } from '@/utils/overridePath';\n\n// #region Interfaces\nexport interface Emit {\n (e: 'update:modelValue', value: unknown): void\n}\ntype Props = DynamicFormItemProps<InternalMetadata>;\n// #endregion\n\n// #region Props, Emits and inject\nconst props = defineProps<Props>();\nconst emits = defineEmits<Emit>();\nconst settings = inject<ComputedRef<DynamicFormSettings>>(dynamicFormSettingsKey);\n// #endregion\n\n// #region Analytics: to test reactivity and prevent unnecessary rerenders.\n// They're not reactive to avoid infinite loops.\nlet _analytics_updateCallCount = 0;\nlet _analytics_occurrencesCalculatedCount = 0;\n// #endregion\n\n// #region Computed properties and state\nconst field = computed(() => props.fieldMetadata);\n\n// Choice fields often don't have a path, as they don't take any space in the xml hierarchy\n// therefore we get the closest path of the choice\nconst closestPath = computed(() =>\n overridePath(field.value.path ?? '', props.pathOverride));\n\nconst minOccurs = computed(() =>\n props.minOccursOverride !== undefined\n ? props.minOccursOverride\n : (field.value?.minOccurs ?? 1),\n);\n\nconst maxOccurs = computed(() =>\n props.maxOccursOverride !== undefined\n ? props.maxOccursOverride\n : (field.value?.maxOccurs ?? 1),\n);\n\n// When the minOccurs = 0, we use that to make a field optional. We need to pass this down to its children\nconst _minOccursOverride = computed(() =>\n minOccurs.value === 0 ? 0 : undefined,\n);\n\n// When the maxOccurs = 0, we use that to disable fields. We need to pass this down to its children\nconst _maxOccursOverride = computed(() =>\n maxOccurs.value === 0 ? 0 : undefined,\n);\n\n// Depending on the original maxOccurs of this choice field, we make the all children fieldArray's (if necessary)\nconst childrenAreArrays = computed(() => field.value?.maxOccurs > 1 ? 'array' : undefined);\n\nconst disabled = computed(() => maxOccurs.value === 0);\n\nconst required = computed(() => minOccurs.value >= 1 && !disabled.value);\n\ninterface ChildValue {\n value: any\n occurrences: number // this is how often a child is visible\n valuesCount: number // this is how many of them have a value\n maxOccurrences: number\n};\nconst childValues = ref<{\n [index: string]: ChildValue\n}>({});\n\nconst values = computed(() => Object.values(childValues.value).map(x => x.value));\n\n/**\n * A calculation for each child on how much its value means in terms of choice occurrences.\n * And what dynamic max & min occurrences override we should configure.\n */\nconst occurrences = computed(() => {\n _analytics_occurrencesCalculatedCount++;\n\n const _occurrences: {\n [index: string]: {\n childValuesCount: number\n childOccurrences: number\n childMaxOccurrences: number\n choiceValuesCount: number\n choiceOccurrences: number\n overrideChildMaxOccurrences: number | undefined\n overrideChildMinOccurrences: number | undefined\n }\n } = {};\n // Setup a default for each child\n field.value?.choice?.forEach((_, i) => {\n _occurrences[i] = {\n childValuesCount: 0,\n childOccurrences: 0,\n childMaxOccurrences: 1,\n choiceValuesCount: 0,\n choiceOccurrences: 0,\n overrideChildMaxOccurrences: undefined,\n overrideChildMinOccurrences: 0, // make required fields by default optional\n };\n });\n\n const _maxOccurs = maxOccurs.value ?? 1;\n\n // In case the maxOccurs = 0, we need to disable this field and the fields below.\n // Continuing with the calculations therefore doesn't make any sense, just return a 0 for both min & max occurrences.\n if (_maxOccurs === 0) {\n field.value?.choice?.forEach((_, i) => {\n _occurrences[i].overrideChildMaxOccurrences = 0;\n _occurrences[i].overrideChildMinOccurrences = 0;\n });\n return _occurrences;\n }\n\n for (const [key, child] of Object.entries(childValues.value ?? {})) {\n // Calculate how much this child's occurrences will take up the choice occurrences\n // For example: choice.maxOccurs = 4 & child.maxOccurs = 2\n // then only every 2x the child has an occurrence, it will count as 1x choice occurrence\n let choiceOccurrences = Math.ceil(child.occurrences / child.maxOccurrences);\n\n // Do the same for the values\n const choiceValuesCount = Math.ceil(\n child.valuesCount / child.maxOccurrences,\n );\n\n // In case the totalChildOccurrences = 1, we know that the child is not a fieldArray but a normal item.\n // And for normal items we always show all fields, making it always take up 1 occurrence. This is unwanted.\n // Therefore for these cases we don't look at the occurrences but at the valuesCount.\n const totalChildOccurrences = _maxOccurs * child.maxOccurrences; // Calculate how many occurrences we can have\n if (totalChildOccurrences === 1) {\n choiceOccurrences = choiceValuesCount;\n }\n\n _occurrences[key] = {\n childValuesCount: child.valuesCount,\n childOccurrences: child.occurrences,\n childMaxOccurrences: child.maxOccurrences,\n choiceOccurrences,\n choiceValuesCount,\n // Only override the minOccurrences (making a required field optional) when there is no value in that child\n overrideChildMinOccurrences: child.valuesCount === 0 ? 0 : undefined,\n // will be calculated below, once all child values are present\n overrideChildMaxOccurrences: undefined,\n };\n }\n\n const totalChoiceOccurrences = Object.values(_occurrences).reduce(\n (acc, value) => acc + value.choiceOccurrences,\n 0,\n );\n\n // Now, loop through each child and calculate its override of maxOccurrences\n Object.values(_occurrences).forEach((value) => {\n // As the choiceOccurrences are rounded upwards (Match.ceil()), we don't know whether it was a full count or not\n // for example: choice.maxOccurs = 2 & child.maxOccurs = 2\n // if we have 3 children, this counts already as 2 choice occurrences, but we can still add 1 child to get to 4.\n // Therefore we need to calculate the occurrences based on the combined occurrences.\n const othersChoiceOccurrences\n = totalChoiceOccurrences - value.choiceOccurrences; // Remove the child's choiceCount from the total\n const othersAsChildOccurrences\n = othersChoiceOccurrences * value.childMaxOccurrences; // Convert the other choiceCounts to the combined child count\n const totalChildOccurrences = _maxOccurs * value.childMaxOccurrences; // Calculate how many occurrences we can have\n\n value.overrideChildMaxOccurrences\n = totalChildOccurrences - othersAsChildOccurrences; // convert to a new childMaxOccurrence\n });\n\n return _occurrences;\n});\n\nconst valuesCount = computed(() =>\n Object.values(occurrences.value).reduce(\n (acc, c) => acc + c.choiceValuesCount,\n 0,\n ),\n);\n\n// In case there is only one child in a choice field, don't add any logic and just display the child\nconst singleChild = computed(() =>\n field.value?.choice?.length === 1 ? field.value?.choice[0] as InternalMetadata : undefined,\n);\n\n// A choice field doesn't have a place in the Vee-Validate values tree, therefore\n// we use a trick to get it validated anyways.\nconst combinedValidation = computed(() => {\n // Don't validate a single child, this one should just be ignored\n if (singleChild.value)\n return;\n\n // If disabled, do nothing\n if (disabled.value)\n return;\n\n // All valid, do nothing\n if (valuesCount.value >= minOccurs.value)\n return;\n\n const _messages = settings?.value?.messages;\n\n return [createValidation('xsd_choiceMinOccurs', minOccurs.value, _messages?.choiceMinOccurs)];\n});\n\n// Link the vee-validate field to the nearest parent of the choice. Before we had it linked to the root, but when multiple choice\n// elements were validating, this was giving a problem\nconst normalizedPath = computed(() => normalizePath(closestPath.value));\nconst { errors, errorMessage } = useField(normalizedPath, combinedValidation, field.value?.fieldOptions); // Use the closed path for any errors errors\nconst fieldContext: LimitedFieldContext = { label: field.value?.fieldOptions?.label, errors, errorMessage };\n// #endregion\n\n// #region Watchers and lifecycle events\nwatch(field, (_field) => {\n if (!_field)\n return;\n\n // Once we know the field and the choice fields below, we can initialize the occurrences\n _field.choice?.forEach((child, index) => {\n updateChildValue(undefined, index, child.maxOccurs);\n });\n}, { immediate: true });\n// #endregion\n\n// #region Methods\nfunction updateChildValue(\n value: any,\n childIndex: number | undefined,\n maxOccurrences: number = 1,\n skipCalculations: boolean = false,\n) {\n // In some cases we just need to forward the fact that the value was updated\n if (skipCalculations) {\n emits('update:modelValue', values.value);\n return;\n }\n\n _analytics_updateCallCount++;\n\n if (childIndex === undefined)\n return;\n\n let calculateValues = Array.isArray(value) ? value : [value];\n\n // A normal field updates the parent by emitting an undefined when it is cleared, this means it doesn't have a value\n // and we want to filter those out. In case of an arrayField, we don't want to filter those values out.\n // Therefore we check whether the maxOccurs = 1 (== normal field)\n const _maxOccurs = maxOccurs.value ?? 1;\n const totalChildOccurrences = _maxOccurs * maxOccurrences; // Calculate how many occurrences we can have\n if (totalChildOccurrences === 1) {\n calculateValues = calculateValues.filter(x => x !== undefined);\n }\n\n const occurrences = calculateValues.length;\n const valuesCount = calculateValues.filter(v => checkTreeHasValue(v)).length;\n\n const childValue = childValues.value[childIndex] ?? ({} as ChildValue);\n childValue.value = value;\n childValue.occurrences = occurrences;\n childValue.valuesCount = valuesCount;\n childValue.maxOccurrences = maxOccurrences;\n\n if (!childValues.value[childIndex]) {\n childValues.value[childIndex] = childValue;\n }\n\n emits('update:modelValue', values.value);\n};\n// #endregion\n</script>\n\n<template>\n <component\n :is=\"template\"\n v-slot=\"slotProps\"\n type=\"choice\"\n :field-metadata\n :field-context\n :required\n :disabled\n :slot-props\n :can-add-items\n :can-remove-items\n :add-item\n :remove-item\n >\n <DynamicFormItem\n v-if=\"singleChild\"\n :field-metadata=\"singleChild\"\n :path-override\n :template\n :slot-props\n :min-occurs-override=\"_minOccursOverride\"\n :max-occurs-override=\"_maxOccursOverride\"\n part-of-choice-field\n\n @update:model-value=\"updateChildValue($event, 0, singleChild!.maxOccurs, true)\"\n />\n <template v-else>\n <DynamicFormItem\n v-for=\"(child, index) in field.choice\"\n :key=\"child.name\"\n :field-metadata=\"(child as InternalMetadata)\"\n :path-override\n :template\n :slot-props\n :min-occurs-override=\"occurrences[index]?.overrideChildMinOccurrences\"\n :max-occurs-override=\"occurrences[index]?.overrideChildMaxOccurrences\"\n :is-array-override=\"childrenAreArrays\"\n part-of-choice-field\n\n @update:model-value=\"updateChildValue($event, index, child.maxOccurs)\"\n />\n </template>\n </component>\n</template>\n","<script\n lang=\"ts\"\n setup\n generic=\"InternalMetadata extends InternalFieldMetadata<FieldMetadata>\"\n>\nimport type { GenericValidateFunction } from 'vee-validate';\nimport type { ComputedRef } from 'vue';\nimport type { FieldContext } from '@/components/DynamicFormTemplate.vue';\nimport type { DynamicFormItemProps } from '@/types/DynamicFormItemProps';\nimport type { DynamicFormSettings } from '@/types/DynamicFormSettings';\nimport type { ComputedPropsType, FieldMetadata } from '@/types/FieldMetadata';\nimport type { InternalFieldMetadata } from '@/types/InternalFieldMetadata';\nimport { useField, useSubmitCount } from 'vee-validate';\nimport { computed, inject, onBeforeUnmount, ref, watch, watchEffect } from 'vue';\nimport DynamicFormItemArray from '@/components/DynamicFormItemArray.vue';\nimport DynamicFormItemChoice from '@/components/DynamicFormItemChoice.vue';\nimport { dynamicFormSettingsKey } from '@/types/DynamicFormSettings';\nimport { checkTreeHasValue } from '@/utils/checkTreeHasValue';\nimport { createValidation } from '@/utils/createValidation';\nimport { normalizePath } from '@/utils/normalizePath';\nimport { overridePath } from '@/utils/overridePath';\nimport { splitToValidationFunctions } from '@/utils/splitValidationFunctions';\n\n// #region Interfaces\nexport interface Emit {\n (e: 'update:modelValue', value: unknown): void\n (e: 'blur', event?: Event | undefined, shouldValidate?: boolean | undefined): void\n}\ntype Props = DynamicFormItemProps<InternalMetadata>;\n// #endregion\n\n// #region Props, Emits and inject\nconst props = defineProps<Props>();\nconst emits = defineEmits<Emit>();\nconst settings = inject<ComputedRef<DynamicFormSettings>>(dynamicFormSettingsKey);\n// #endregion\n\n// #region Analytics: to test reactivity and prevent unnecessary rerenders.\n// They're not reactive to avoid infinite loops.\n// eslint-disable-next-line prefer-const\nlet _analytics_renderCount = 0;\nlet _analytics_constructValidationCount = 0;\nlet _analytics_fieldChangedCount = 0;\nlet _analytics_fieldComputeCount = 0;\nlet _analytics_valueChangedCount = 0;\nlet _analytics_notifyValueUpdateCount = 0;\n// #endregion\n\n// #region Safety guard\n// Detects non-idempotent value writes in computedProps that would cause an infinite recomputation loop.\n// The counter resets after each microtask, so it only catches computes that happen synchronously.\nconst COMPUTE_LOOP_MAX = 10;\nlet _computeLoopCount = 0;\nlet _computeLoopResetTimer: ReturnType<typeof setTimeout> | undefined;\n\nfunction assertNoComputeLoop(fieldPath: string) {\n _computeLoopCount++;\n\n if (_computeLoopResetTimer == null) {\n _computeLoopResetTimer = setTimeout(() => {\n // Reset after the current macrotask so repeated Vue flushes in one runaway update\n // cascade still accumulate and trip the guard.\n _computeLoopCount = 0;\n _computeLoopResetTimer = undefined;\n }, 0);\n }\n if (_computeLoopCount > COMPUTE_LOOP_MAX) {\n throw new Error(\n `[DynamicFormItem] Possible infinite loop detected in computedProps for field \"${fieldPath}\". `\n + `computedProps recomputed more than ${COMPUTE_LOOP_MAX} times synchronously. `\n + `Ensure value writes inside computedProps are idempotent (the same input always produces the same output).`,\n );\n }\n}\n// #endregion\n\n// #region Computed properties and state\n\n// Keep track of changes to the field for analytics\nconst field = computed(() => {\n _analytics_fieldChangedCount++;\n return props.fieldMetadata;\n});\n\n// The path of this field, while taking the override into consideration\nconst path = computed(() => {\n if (!field.value?.path)\n return '';\n\n return overridePath(field.value.path, props.pathOverride);\n});\n\n// If the field has attributes, it automatically becomes a complexType\nconst isComplexType = computed(() => field.value?.isComplexType || field.value?.attributes?.length);\n\n// The path that takes value types into consideration\nconst itemPath = computed(() => {\n let _path = path.value;\n if (isComplexType.value && _path) {\n const complexTypeValueProperty = settings?.value?.complexTypeValueProperty ?? 'value';\n _path = `${_path}['${complexTypeValueProperty}']`; // we use this notation to still be able to count the segments by splitting on '.'\n }\n return _path;\n});\n\n// Link the vee-validate field to this metadata field\nconst normalizedPath = computed(() => normalizePath(itemPath.value));\n\nconst isArray = computed(() => {\n if (props.isArrayOverride === 'array')\n return true;\n\n if (props.isArrayOverride === 'single')\n return false;\n\n // Check if we can occur multiple times, if yes, we're an array.\n // This can not be reactive.\n return (field.value?.maxOccurs ?? 1) > 1;\n});\n\nconst combinedValidation = ref<GenericValidateFunction[]>([]);\n\n// Create the Vee-validate extended field context\nconst fieldContext = !isArray.value\n ? useField(normalizedPath, combinedValidation, {\n ...(field.value?.fieldOptions ?? {}),\n validateOnValueUpdate: false, // We own the validation moment\n }) as FieldContext\n : { value: ref(undefined) } as FieldContext;\n\nconst value = fieldContext.value;\n\nconst initialUpdate = ref(true);\n\n/**\n * In case of an object, the useFieldValue() in vee-validate doesn't react on an update of a value of its children.\n * Therefore we keep track of an reactive value, that is updated by the children. That re-triggers reactivity\n */\nconst childValueReactivity = ref(0);\n\nconst computedField = computed(() => {\n _analytics_fieldComputeCount++;\n assertNoComputeLoop(path.value);\n\n if (field.value?.computeOnChildValueChange === true) {\n // In case the component has children and when those children update their value, the object in the current component (parent)\n // doesn't retrigger this computed. If this is required, the computeOnChildValueChange can be set to true. We then include the\n // childValueReactivity in here, so the computed is hooked up to changes of children.\n void childValueReactivity.value;\n }\n const _computedField = (field.value?.computedProps ?? []).reduce(\n (field, compute) => {\n // We allow to transform the field metadata reactively based on the current value. In case the value is not\n // called upon in any of the computedProps, it will not be part of the reactivity that triggers a re-compute\n compute(field, value);\n return field;\n },\n // Spread the original object, so we can make changes & add the actual path\n { ...field.value, path: path.value } as ComputedPropsType<FieldMetadata>,\n );\n\n // Path is always reverted back to our calculated value. This way it can be used, but no set.\n const _internalMetadata = _computedField as InternalMetadata; // convert back to normal (stop pretending to not have any children and other excluded properties)\n _internalMetadata.path = path.value;\n\n return _internalMetadata;\n});\n\n// minOccurs determines how many times this field should appear at minimum\nconst minOccurs = computed(() => {\n if (props.minOccursOverride !== undefined)\n return props.minOccursOverride;\n\n // In case this element is part of an array field, make the field optional\n if (props.partOfArrayField)\n return 0;\n\n return computedField.value?.minOccurs ?? 1;\n});\n\n// maxOccurs determines how many times this field should appear at maximum\nconst maxOccurs = computed(() =>\n props.maxOccursOverride !== undefined\n ? props.maxOccursOverride\n : (computedField.value?.maxOccurs ?? 1),\n);\n\nconst isParent = computed(() => !!field.value?.children?.length);\n\nconst isChoice = computed(() => !!field.value?.choice?.length);\n\n// If we're none of the other types that can hold other components, we're an input\nconst isInput = computed(() => !isArray.value && !isChoice.value && !isParent.value);\n\nconst disabled = computed(() => maxOccurs.value === 0);\n\nconst required = computed(() => minOccurs.value >= 1 && !disabled.value);\n\n// In case this field is optional, we also want to temporarily set the minOccurs to 0 (not required) of the children of this field.\n// if this field is optional and none of the children have values yet. Then all required validation\n// is removed and the user is not forced to fill in any values.\nconst _minOccursOverride = computed(() => {\n // If one of it's parents has set the override, pass it down\n // But only if it's set to 0\n if (props.minOccursOverride === 0)\n return props.minOccursOverride;\n\n // If the field is required, don't bother continuing (as we don't need to override anything)\n if (minOccurs.value > 0)\n return undefined;\n\n // So the field is optional, now check whether there is a value in it\n if (checkTreeHasValue(value.value))\n return undefined;\n\n // No value and the field is optional, set the children to minOccurs = 0 (optional)\n return 0;\n});\n\n// When the maxOccurs = 0, we use that to disable fields. We need to pass this down to its children\nconst _maxOccursOverride = computed(() =>\n maxOccurs.value === 0 ? 0 : undefined,\n);\n\nconst _canRemoveItems = computed(() => {\n // If we're part of an array field and we have a value, we can always remove it.\n // This way the user can just easily press the x button to clear any values.\n if (props.partOfArrayField && checkTreeHasValue((value.value)))\n return true;\n\n // In all other cases, listen to the props\n return props.canRemoveItems;\n});\n\nconst showAttributes = computed(\n () => field.value?.attributes?.length && checkTreeHasValue(value.value),\n);\nconst submitCount = useSubmitCount();\nconst shouldValidateOnValueUpdate = computed(() => {\n // Only when validateOnValueUpdateAfterSubmit is true, we want to take the check into account.\n // The check can be true or false, both should be final. In case validateOnValueUpdateAfterSubmit is not true (undefined or false)\n // we want to listen to the next check (therefore we use undefined).\n const validateOnValueUpdateAfterSubmit = settings?.value?.validateOnValueUpdateAfterSubmit === true\n ? (submitCount.value > 0 && settings?.value?.validateOnValueUpdateAfterSubmit)\n : undefined;\n\n // Either validate or let another value determine whether we should validate\n const validateWhenInError = settings?.value?.validateWhenInError && fieldContext?.errors.value?.length > 0\n ? true\n : undefined;\n\n // field has priority\n return field.value?.fieldOptions?.validateOnValueUpdate\n // then whether we are in error\n ?? validateWhenInError\n // then whether we only want to validate after submit\n ?? validateOnValueUpdateAfterSubmit\n // and finally the always validate\n ?? settings?.value?.validateOnValueUpdate;\n});\n\n// #endregion\n\n// #region Improve FieldContext\nfieldContext.hasValue = computed(\n // Computed that will only be called, when the hasValue.value is actually used\n () => checkTreeHasValue(value.value),\n);\n\n// When shouldValidate is not provided, I would have expected to use the general settings and not a default false.\n// Therefore we override the handleBlur and handleChange and listen to the settings, before setting a default.\nconst originalHandleBlur = fieldContext.handleBlur;\nfieldContext.handleBlur = function (e?: Event | undefined, shouldValidate?: boolean | undefined) {\n shouldValidate = shouldValidate ?? settings?.value?.validateOnBlur;\n originalHandleBlur(e, shouldValidate);\n emits('blur', e, shouldValidate); // add a helper for array fields to know when a blur occurred\n};\n\nconst originalHandleChange = fieldContext.handleChange;\nfieldContext.handleChange = function (e: unknown, shouldValidate?: boolean | undefined) {\n // We're handling the validate in the value watcher. Only execute it here if it is explicitly set to true by the user\n originalHandleChange(e, shouldValidate === true);\n};\n\n// #endregion\n\n// #region Watchers and lifecycle events\n/**\n * We've used a watchEffect to solve a circular reference. The useField starts with an empty validation, but this will be updated quickly.\n * Because we have a circular reference with the computedField, that needs the value from useField,\n * and useField needs the combinedValidation, which needs the computedField again.\n */\nwatchEffect(() => {\n _analytics_constructValidationCount++;\n\n const _validations: GenericValidateFunction[] = [];\n const _restriction = field.value.restriction ?? {};\n const _messages = settings?.value?.messages;\n\n if (required.value)\n _validations.push(createValidation('xsd_required', undefined, _messages?.required));\n\n if (_restriction.minLength != null)\n _validations.push(createValidation('xsd_minLength', _restriction.minLength, _messages?.minLength));\n\n if (_restriction.maxLength != null)\n _validations.push(createValidation('xsd_maxLength', _restriction.maxLength, _messages?.maxLength));\n\n if (_restriction.length != null)\n _validations.push(createValidation('xsd_length', _restriction.length, _messages?.length));\n\n if (_restriction.pattern != null)\n _validations.push(createValidation('xsd_pattern', _restriction.pattern, _messages?.pattern));\n\n if (_restriction.minInclusive != null)\n _validations.push(createValidation('xsd_minInclusive', _restriction.minInclusive, _messages?.minInclusive));\n\n if (_restriction.maxInclusive != null)\n _validations.push(createValidation('xsd_maxInclusive', _restriction.maxInclusive, _messages?.maxInclusive));\n\n if (_restriction.minExclusive != null)\n _validations.push(createValidation('xsd_minExclusive', _restriction.minExclusive, _messages?.minExclusive));\n\n if (_restriction.maxExclusive != null)\n _validations.push(createValidation('xsd_maxExclusive', _restriction.maxExclusive, _messages?.maxExclusive));\n\n if (_restriction.enumeration != null)\n _validations.push(createValidation('xsd_enumeration', _restriction.enumeration, _messages?.enumeration));\n\n if (_restriction.whiteSpace != null)\n _validations.push(createValidation('xsd_whiteSpace', _restriction.whiteSpace, _messages?.whiteSpace));\n\n if (_restriction.fractionDigits != null)\n _validations.push(createValidation('xsd_fractionDigits', _restriction.fractionDigits, _messages?.fractionDigits));\n\n if (_restriction.totalDigits != null)\n _validations.push(createValidation('xsd_totalDigits', _restriction.totalDigits, _messages?.totalDigits));\n\n // Add the user defined validations, if they exist\n if (field.value?.validation)\n _validations.push(...splitToValidationFunctions(field.value?.validation));\n\n combinedValidation.value = _validations;\n});\n\n// Hook into the fieldContext.value to make sure that if it is an empty string we change the value to undefined.\n// This way the element is removed from the parent object.\nlet _transforming = false;\nwatch(value, (newValue) => {\n // We need to use a guard flag, because we're updating the same value we're watching.\n // Which would cause an endless loop\n if (_transforming)\n return;\n\n _transforming = true;\n\n // In case of an empty value, remove the element from the parent object by setting it to undefined.\n // In case of an arrayField we set it back to null\n if (newValue === '')\n value.value = props.partOfArrayField ? null : undefined;\n\n _transforming = false;\n}, {\n flush: 'sync', // we need to override the value before its used somewhere else\n});\n\n// We watch the value because it can also be updated by other vee-validate methods.\n// Every time its updated we let the parent know that the value has changed. This functionality is not present it\n// vee-validate, therefore we implemented manually using a readOnlyValue.\nwatch(\n value,\n (v) => {\n _analytics_valueChangedCount++;\n\n // Only notify and validate when this is an actual input field, in all other cases\n // it will be done by the children directly\n if (!isInput.value)\n return;\n\n // Don't update the parent if the initial value is empty, neither validate\n if (!initialUpdate.value || v) {\n notifyValueUpdate();\n\n if (shouldValidateOnValueUpdate.value)\n fieldContext?.validate();\n }\n\n initialUpdate.value = false;\n },\n {\n immediate: true,\n },\n);\n\nonBeforeUnmount(() => {\n if (_computeLoopResetTimer != null)\n clearTimeout(_computeLoopResetTimer);\n\n // Array items are cleaned up by useFieldArray's remove() — setting the value to undefined here\n // would write back to form.values at the (now-removed) index, causing useFieldArray's sync\n // watcher to detect a mismatch and re-add the entry via initFields().\n if (props.partOfArrayField) {\n return;\n }\n\n // In case of attributes, they're removed depending on whether the parent has a value.\n // We experience the problem that if the value is removed, the attribute field is removed but the value remained.\n // Therefore we have this extra rule to remove any values once a field gets unmounted.\n if (value.value !== undefined) {\n value.value = undefined;\n // The watch is not executed anymore at this point, therefore manually update the parents\n notifyValueUpdate();\n }\n});\n// #endregion\n\n// #region Methods\n\nfunction notifyValueUpdate() {\n _analytics_notifyValueUpdateCount++;\n childValueReactivity.value++;\n emits('update:modelValue', value.value);\n};\n\n/**\n * In case of an ArrayField, we bypass the useField, therefore we need to manually update the value.\n */\nfunction updateArrayValue(_value: unknown) {\n value.value = _value;\n emits('update:modelValue', value.value);\n};\n// #endregion\n</script>\n\n<template>\n <div v-if=\"settings?.analytics\" v-show=\"false\">\n <span :data-testid=\"`${path}-analytics-render-count`\">{{\n ++_analytics_renderCount\n }}</span>\n </div>\n <template v-if=\"isChoice\">\n <DynamicFormItemChoice\n v-bind=\"props\"\n :field-metadata=\"computedField\"\n\n @update:model-value=\"notifyValueUpdate\"\n />\n </template>\n <template v-else-if=\"isArray\">\n <DynamicFormItemArray\n v-bind=\"props\"\n :part-of-choice-field\n :field-metadata=\"computedField\"\n\n @update:model-value=\"updateArrayValue\"\n />\n </template>\n <template v-else>\n <component\n :is=\"template\"\n :type=\"computedField.type\"\n :field-metadata=\"computedField\"\n :field-context\n :slot-props\n :required\n :disabled\n :can-add-items\n :can-remove-items=\"_canRemoveItems\"\n :add-item\n :remove-item\n >\n <template #default=\"slotProps\">\n <template v-if=\"isParent\">\n <DynamicFormItem\n v-for=\"child in computedField.children\"\n :key=\"child.path\"\n :field-metadata=\"(child as InternalMetadata)\"\n :path-override=\"itemPath\"\n :template\n :slot-props\n :min-occurs-override=\"_minOccursOverride\"\n :max-occurs-override=\"_maxOccursOverride\"\n\n @update:model-value=\"notifyValueUpdate\"\n />\n </template>\n <template v-if=\"!isParent\">\n <component\n :is=\"template\"\n :type=\"`${computedField.type}-input`\"\n :field-metadata=\"computedField\"\n :field-context\n :slot-props\n :required\n :disabled\n :can-add-items\n :can-remove-items=\"_canRemoveItems\"\n :add-item\n :remove-item\n />\n </template>\n </template>\n <template v-if=\"showAttributes\" #attributes=\"slotProps\">\n <DynamicFormItem\n v-for=\"attribute in computedField.attributes\"\n :key=\"attribute.path\"\n :field-metadata=\"(attribute as InternalMetadata)\"\n :path-override=\"path\"\n :template\n :slot-props\n :min-occurs-override=\"_minOccursOverride\"\n :max-occurs-override=\"_maxOccursOverride\"\n\n @update:model-value=\"notifyValueUpdate\"\n />\n </template>\n </component>\n </template>\n</template>\n","<script lang=\"ts\" setup generic=\"Metadata extends FieldMetadata\">\nimport type { DefineComponent } from 'vue';\n\nimport type { DynamicFormSettings } from '@/types/DynamicFormSettings';\nimport type { FieldMetadata } from '@/types/FieldMetadata';\nimport type { InternalFieldMetadata } from '@/types/InternalFieldMetadata';\n\nimport { computed, provide } from 'vue';\nimport DynamicFormItem from '@/components/DynamicFormItem.vue';\nimport { dynamicFormSettingsKey } from '@/types/DynamicFormSettings';\n\n// #region Interfaces\nexport interface DynamicFormProps<Metadata extends FieldMetadata> {\n metadata: Metadata | Metadata[]\n template: DefineComponent<object, object, any>\n settings?: DynamicFormSettings\n}\n// #endregion\n\n// #region Props and State\ndefineOptions({ name: 'DynamicForm', inheritAttrs: false });\n\nconst { settings: _settings, metadata, template } = defineProps<DynamicFormProps<Metadata>>();\n\nconst settings = computed(() => ({\n // Set some default values\n validateOnValueUpdate: true,\n validateWhenInError: true,\n ...(_settings ?? {}),\n}));\n\nprovide(dynamicFormSettingsKey, settings);\n\nconst metadataAsArray = computed(() =>\n Array.isArray(metadata) ? metadata : [metadata],\n);\n\nconst metadataWithDefaults = computed(() =>\n metadataAsArray.value?.map((x, index) => correctMetadataAndSetDefaults(x, index)) ?? [],\n);\n\nconst typedTemplate = computed(\n () =>\n template as DefineComponent<\n object,\n object,\n {\n default?: ((props: object) => any) | undefined\n attributes?: ((props: object) => any) | undefined\n choice?: ((props: object) => any) | undefined\n array?: ((props: object) => any) | undefined\n }\n >,\n);\n\n// #endregion\n\n// #region Methods\n\nfunction correctMetadataAndSetDefaults(\n fieldMetadata: Metadata,\n index?: number,\n parent?: InternalFieldMetadata<Metadata>,\n) {\n if (!fieldMetadata)\n return fieldMetadata;\n\n const fieldName = fieldMetadata.name ?? `field-${index}`;\n // Construct the path with the parent path, unless we specify an override\n const fieldPath = fieldMetadata.path ?? [parent?.path, fieldName].filter(Boolean).join('.');\n const copy: InternalFieldMetadata<Metadata> = {\n // Set defaults\n name: fieldName,\n path: fieldPath,\n type: 'text', // Default type\n minOccurs: 1, // by default required\n maxOccurs: 1, // by default not repeatable\n\n ...fieldMetadata,\n // Override some of the field properties\n computedProps: [...(fieldMetadata.computedProps ?? [])],\n parent,\n };\n\n // Recursively go through the tree\n copy.children = (fieldMetadata.children ?? []).map((x, index) =>\n correctMetadataAndSetDefaults(x as Metadata, index, copy),\n );\n copy.choice = (fieldMetadata.choice ?? []).map((x, index) =>\n correctMetadataAndSetDefaults(x as Metadata, index, copy),\n );\n copy.attributes = (fieldMetadata.attributes ?? []).map((x, index) =>\n correctMetadataAndSetDefaults(x as Metadata, index, copy),\n );\n\n return copy;\n}\n\n// #endregion\n</script>\n\n<template>\n <DynamicFormItem\n v-for=\"fieldMetadata in metadataWithDefaults\"\n :key=\"fieldMetadata.name\"\n :template=\"typedTemplate\"\n :field-metadata=\"(fieldMetadata as InternalFieldMetadata<FieldMetadata>)\"\n />\n</template>\n","const camelizeRE = /-\\w/g;\n/**\n * Coming from vue source code\n * @private\n */\nexport const camelize: (str: string) => string = cacheStringFunction(\n (str: string): string => {\n return str.replace(camelizeRE, c => c.slice(1).toUpperCase());\n },\n);\n\nfunction cacheStringFunction<T extends (str: string) => string>(fn: T): T {\n const cache: Record<string, string> = Object.create(null);\n return ((str: string) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n }) as T;\n}\n","<script\n lang=\"ts\"\n setup\n generic=\"TMetadataConfiguration extends MetadataConfiguration\"\n>\nimport type { FieldContext as _FieldContext } from 'vee-validate';\nimport type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';\nimport type { FieldMetadata } from '@/types/FieldMetadata';\nimport type { MetadataConfiguration } from '@/types/MetadataConfiguration';\nimport { computed, useAttrs } from 'vue';\nimport { camelize } from '@/utils/camelize';\n\n// #region Interface\nexport interface FieldContext<TValue = unknown> extends _FieldContext<TValue> {\n /**\n * Whether this field (or any of its descendants) has a value.\n * Lazily evaluated — only computed when accessed, so safe to use on deep field trees.\n */\n hasValue: ComputedRef<boolean>\n}\n\nexport interface DynamicFormConfigurationProps<\n TMetadataConfiguration extends MetadataConfiguration,\n> {\n /**\n * Use defineMetadata to create a strongly-typed metadata configuration.\n * This metadata configuration can be provided here to type the DynamicFormTemplate component.\n */\n metadataConfiguration: TMetadataConfiguration\n}\n\nexport interface LimitedFieldContext {\n errors: Ref<string[]>\n errorMessage: Ref<string | undefined>\n label?: MaybeRefOrGetter<string | undefined>\n}\n\n/**\n * We define the attributes here instead of the props. This way the user don't see them\n * when using the DynamicFormConfiguration component.\n * The attributes will be passed internally by the other components of the library.\n */\nexport interface Attributes<\n TMetadataConfiguration extends MetadataConfiguration,\n> {\n type: TMetadataConfiguration['fieldTypes'][number] | 'default' | 'array' | 'choice'\n /**\n * The metadata that you configured for this field\n */\n fieldMetadata: FieldMetadata<\n TMetadataConfiguration['fieldTypes'][number],\n TMetadataConfiguration['extendedProperties']\n >\n /**\n * Indicates if a field is required.\n */\n required: boolean\n /**\n * Indicates whether a field is disabled\n */\n disabled: boolean\n /**\n * If the field is part of an arrayField, this is its index in the array\n */\n index: number\n /**\n * If the field is part of an arrayField, this boolean lets you know whether\n * new items can be added. For example: when the maxOccurs is 2 and there are already\n * 2 items, this will be false.\n */\n canAddItems: boolean\n /**\n * If the field is part of an arrayField, this boolean lets you konw whether\n * an item can be removed. For example: when the minOccurs is 2 and there are already\n * 2 items, this will be false.\n */\n canRemoveItems: boolean\n /**\n * if the field is part of an arrayField, this method will add another item.\n */\n addItem: () => void\n /**\n * if the field is part of an arrayField, this method will remove an item.\n */\n removeItem: () => void\n}\n\nexport interface ItemAttributes<\n TMetadataConfiguration extends MetadataConfiguration,\n FieldType extends string = string,\n> extends Attributes<TMetadataConfiguration> {\n /**\n * The extended Vee-Validate context, coming from the useField.\n * A computed hasValue is added, indicating whether the current field or any of its children\n * has a value.\n */\n fieldContext: FieldContext<FieldType extends keyof TMetadataConfiguration['valueTypes']\n ? TMetadataConfiguration['valueTypes'][FieldType]\n : unknown>\n}\n\nexport interface ArrayChoiceAttributes<\n TMetadataConfiguration extends MetadataConfiguration,\n> extends Attributes<TMetadataConfiguration> {\n fieldContext: LimitedFieldContext\n}\n\ntype Props = DynamicFormConfigurationProps<TMetadataConfiguration>;\ntype SlotProps<FieldType extends string = string> = ItemAttributes<TMetadataConfiguration, FieldType>; // we pass the attributes as slot props\ntype ArrayChoiceSlotProps = ArrayChoiceAttributes<TMetadataConfiguration>; // we pass the attributes as slot props\n\ntype SlotsFromMetadata = {\n // With the default slot you can define how unknown fields are rendered\n default: (props: SlotProps) => any\n} & {\n // With the default-input slot you can define how unknown input components are rendered\n 'default-input': (props: SlotProps) => any\n} & {\n // With the array slot you can define how array fields are rendered\n array: (props: ArrayChoiceSlotProps) => any\n} & {\n // With the choice slot you can define how choice fields are rendered\n choice: (props: ArrayChoiceSlotProps) => any\n}\n& {\n // Each field type will have its own slot that you can use to define how that field type is rendered\n [K in TMetadataConfiguration['fieldTypes'][number]]: (props: SlotProps<K>) => any;\n} & {\n // Each field type will have its own input slot that you can use to define how that input is rendered\n [K in `${TMetadataConfiguration['fieldTypes'][number]}-input`]: (props: SlotProps<K extends `${infer FieldType}-input` ? FieldType : never>) => any;\n};\n\n// #endregion\n\n// #region State\ndefineOptions({ name: 'DynamicFormTemplate', inheritAttrs: false });\ndefineProps<Props>();\nconst slots = defineSlots<SlotsFromMetadata>();\n\nconst rawAttrs = useAttrs();\n\n// Convert kebab-case attributes to camelCase\nconst attrs = computed(() => {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(rawAttrs)) {\n result[camelize(key)] = value;\n }\n return result as unknown as SlotProps;\n});\n\ntype RegularSlotName = Exclude<keyof SlotsFromMetadata, 'array' | 'choice'>;\n\nconst typeWithFallback = computed((): RegularSlotName => {\n const type = attrs.value.type;\n if (type && type !== 'array' && type !== 'choice' && slots[type as RegularSlotName]) {\n return type as RegularSlotName;\n }\n if (type?.includes('-input')) {\n return 'default-input';\n }\n return 'default';\n});\n\n// #endregion\n</script>\n\n<template>\n <template v-if=\"attrs.fieldMetadata\">\n <slot v-if=\"attrs.type === 'array'\" name=\"array\" v-bind=\"(attrs as unknown as ArrayChoiceSlotProps)\" />\n <slot v-else-if=\"attrs.type === 'choice'\" name=\"choice\" v-bind=\"(attrs as unknown as ArrayChoiceSlotProps)\" />\n <slot v-else :name=\"typeWithFallback\" v-bind=\"attrs\" />\n </template>\n</template>\n","/**\n * Helps you to create a metadata configuration with strongly-typed field definitions.\n * Field value types are directly inferred from the provided type interface.\n *\n * Simply pass an interface where keys are field names and values are the expected value types.\n * Use `never` for fields that don't hold values (like headings).\n * Note: you can't use the following reserved field names: 'input', 'children', 'choice', 'array'.\n *\n * Use the extended properties to add custom metadata to each field definition. *\n * @returns Typed configuration object for DynamicFormTemplate consumption\n *\n * @example\n * const config = defineMetadata<\n * {\n * text: string;\n * checkbox: boolean;\n * age: number;\n * address: { street: string; city: string };\n * heading: never;\n * },\n * {\n * // This will add a label and options property to each field's metadata\n * label?: string;\n * options?: Array<{ key: string; value: string }>;\n * }\n * >();\n */\nexport function defineMetadata<\n const FieldValueTypes extends Record<string, any>,\n ExtendedFieldProperties extends object = object,\n>() {\n // Reserved field identifiers that cannot be defined by the user\n type ExcludedFields = 'input' | 'children' | 'choice' | 'array';\n type IncludeFields = 'default';\n\n type FieldTypeMetadata\n = | Exclude<keyof FieldValueTypes, ExcludedFields>\n | IncludeFields;\n\n // Value types are directly from the generic parameter, default is always included and always a string\n type ValueTypeMap = FieldValueTypes & {\n default: string\n };\n\n return {\n fieldTypes: Object.keys({} as FieldValueTypes) as unknown as readonly FieldTypeMetadata[],\n extendedProperties: {} as ExtendedFieldProperties,\n valueTypes: {} as ValueTypeMap,\n };\n}\n","import type { PartialDeep } from 'type-fest';\nimport type {\n FlattenAndSetPathsType,\n FormContext,\n GenericObject,\n Path,\n PathValue,\n} from 'vee-validate';\nimport type { MaybeRef, MaybeRefOrGetter, Ref } from 'vue';\nimport {\n useFieldValue as _useFieldValue,\n useForm,\n} from 'vee-validate';\n\nexport interface FormOptions<TValues extends GenericObject> {\n initialValues?: PartialDeep<TValues> | undefined | null\n initialErrors?: FlattenAndSetPathsType<TValues, string | undefined>\n initialTouched?: FlattenAndSetPathsType<TValues, boolean>\n validateOnMount?: boolean\n keepValuesOnUnmount?: MaybeRef<boolean>\n name?: string\n}\n\nexport function useDynamicForm<TValues extends GenericObject = GenericObject>(opts?: FormOptions<TValues>): FormContext<TValues> & {\n useFieldValue: <TPath extends Path<TValues>>(path?: MaybeRefOrGetter<TPath>) => Ref<PathValue<TValues, TPath>>\n} {\n // Type the useFieldValue\n const useFieldValue = <TPath extends Path<TValues>>(path?: MaybeRefOrGetter<TPath>) => {\n return _useFieldValue<PathValue<TValues, TPath>>(path);\n };\n\n const form = useForm<TValues>(opts);\n\n return {\n ...form,\n useFieldValue,\n };\n}\n"],"names":["useFieldArrayExtended","arrayPath","fields","originalFieldArray","useFieldArray","values","computed","value","dynamicFormSettingsKey","getSingleParam","params","paramName","isEmpty","maxLengthValidator","length","val","maxValueValidator","max","minValidator","minValueValidator","min","oneOfValidator","list","item","regexValidator","regex","isNullOrUndefined","isEmptyArray","arr","requiredValidator","checkTreeHasValue","element","resolveMessage","message","ctx","_","key","index","defineRule","required","min_value","max_value","one_of","mode","str","digits","decimalIndex","ruleParamNames","getFieldLabel","createValidation","rule","param","customMessage","fieldName","validateOptions","normalizedCtx","result","validate","normalizePath","path","overridePath","overrideWithPath","parentSegments","childSegments","splitToValidationFunctions","userRules","props","__props","emits","__emit","settings","inject","_analytics_renderCount","field","normalizedPath","useValidateField","remove","push","update","replace","minOccurs","maxOccurs","disabled","_maxOccursOverride","_canAddItems","_canRemoveItems","combinedValidation","_validations","_messages","label","errors","errorMessage","handleBlur","useField","fieldContext","submitCount","useSubmitCount","firstValueSet","ref","shouldValidateOnValueUpdate","validateOnValueUpdateAfterSubmit","validateWhenInError","watch","v","watchEffect","_addItem","_removeItem","x","i","guardAndNotifyItemUpdate","_unref","_createElementBlock","_hoisted_1","_createElementVNode","_toDisplayString","_isRef","_hoisted_2","_openBlock","_createBlock","_resolveDynamicComponent","template","fieldMetadata","slotProps","_withCtx","_Fragment","_renderList","DynamicFormItem","$event","closestPath","_minOccursOverride","childrenAreArrays","childValues","occurrences","_occurrences","_maxOccurs","child","choiceOccurrences","choiceValuesCount","totalChoiceOccurrences","acc","othersAsChildOccurrences","totalChildOccurrences","valuesCount","c","singleChild","_field","updateChildValue","childIndex","maxOccurrences","skipCalculations","calculateValues","childValue","canAddItems","canRemoveItems","addItem","removeItem","pathOverride","COMPUTE_LOOP_MAX","_computeLoopCount","_computeLoopResetTimer","assertNoComputeLoop","fieldPath","isComplexType","itemPath","_path","complexTypeValueProperty","isArray","initialUpdate","childValueReactivity","computedField","_internalMetadata","compute","isParent","isChoice","isInput","showAttributes","originalHandleBlur","e","shouldValidate","originalHandleChange","_restriction","_transforming","newValue","notifyValueUpdate","onBeforeUnmount","updateArrayValue","_value","DynamicFormItemChoice","_mergeProps","DynamicFormItemArray","partOfChoiceField","_component_DynamicFormItem","attribute","provide","metadataAsArray","metadataWithDefaults","correctMetadataAndSetDefaults","typedTemplate","parent","copy","camelizeRE","camelize","cacheStringFunction","fn","cache","slots","_useSlots","rawAttrs","useAttrs","attrs","typeWithFallback","type","_renderSlot","_ctx","_normalizeProps","defineMetadata","useDynamicForm","opts","useFieldValue","_useFieldValue","useForm"],"mappings":"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","x_google_ignoreList":[2]}
|