a11y-form-validator 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +390 -0
  4. package/dist/A11yFormValidator-D0n6br-b.d.ts +335 -0
  5. package/dist/A11yFormValidator-D0n6br-b.d.ts.map +1 -0
  6. package/dist/addons/character-count.d.ts +38 -0
  7. package/dist/addons/character-count.d.ts.map +1 -0
  8. package/dist/addons/character-count.js +161 -0
  9. package/dist/addons/character-count.js.map +1 -0
  10. package/dist/addons/error-summary.d.ts +29 -0
  11. package/dist/addons/error-summary.d.ts.map +1 -0
  12. package/dist/addons/error-summary.js +4 -0
  13. package/dist/default-BHBWPNeK.d.ts +7 -0
  14. package/dist/default-BHBWPNeK.d.ts.map +1 -0
  15. package/dist/default-DFnPBuVC.js +18 -0
  16. package/dist/default-DFnPBuVC.js.map +1 -0
  17. package/dist/docs.d.ts +66 -0
  18. package/dist/docs.d.ts.map +1 -0
  19. package/dist/docs.js +204 -0
  20. package/dist/docs.js.map +1 -0
  21. package/dist/error-summary-FnZoUC72.js +99 -0
  22. package/dist/error-summary-FnZoUC72.js.map +1 -0
  23. package/dist/helpers-c_THOe-Q.js +150 -0
  24. package/dist/helpers-c_THOe-Q.js.map +1 -0
  25. package/dist/index.d.ts +37 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +1197 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/index.min.js +2 -0
  30. package/dist/index.min.js.map +1 -0
  31. package/dist/locales/ar.json +13 -0
  32. package/dist/locales/en.json +13 -0
  33. package/dist/locales/es.json +13 -0
  34. package/dist/locales/fr.json +13 -0
  35. package/dist/locales/hi.json +13 -0
  36. package/dist/locales/it.json +13 -0
  37. package/dist/locales/ja.json +13 -0
  38. package/dist/locales/ko.json +13 -0
  39. package/dist/locales/nl.json +13 -0
  40. package/dist/locales/pl.json +13 -0
  41. package/dist/locales/pt-BR.json +13 -0
  42. package/dist/locales/ru.json +13 -0
  43. package/dist/locales/tr.json +13 -0
  44. package/dist/locales/uk.json +13 -0
  45. package/dist/locales/zh-CN.json +13 -0
  46. package/dist/minimal-40_EIW9U.d.ts +7 -0
  47. package/dist/minimal-40_EIW9U.d.ts.map +1 -0
  48. package/dist/minimal-Bm3pKoN7.js +15 -0
  49. package/dist/minimal-Bm3pKoN7.js.map +1 -0
  50. package/dist/no-summary-BI1pTld5.d.ts +7 -0
  51. package/dist/no-summary-BI1pTld5.d.ts.map +1 -0
  52. package/dist/no-summary-DQCNtzs6.js +16 -0
  53. package/dist/no-summary-DQCNtzs6.js.map +1 -0
  54. package/dist/presets/default.d.ts +3 -0
  55. package/dist/presets/default.js +5 -0
  56. package/dist/presets/minimal.d.ts +3 -0
  57. package/dist/presets/minimal.js +3 -0
  58. package/dist/presets/no-summary.d.ts +3 -0
  59. package/dist/presets/no-summary.js +3 -0
  60. package/dist/styles.css +91 -0
  61. package/package.json +95 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["target: Element | null","rules: RuleList","minLength","maxLength","pattern","enMessages","candidates: string[]","context: MessageResolverContext","requiredRule","emailRule","minLengthRule","maxLengthRule","patternRule","checkedRule","sameAsRule"],"sources":["../src/rules/checked.ts","../src/rules/email.ts","../src/rules/maxLength.ts","../src/rules/minLength.ts","../src/rules/pattern.ts","../src/rules/required.ts","../src/rules/same-as.ts","../src/core/ErrorRenderer.ts","../src/core/EventEmitter.ts","../src/core/FieldController.ts","../src/locales/en.json","../src/core/MessageResolver.ts","../src/core/RuleRegistry.ts","../src/core/ValidationState.ts","../src/core/A11yFormValidator.ts"],"sourcesContent":["import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\n\nexport function checkedRule({ value }: ValidationContext): ValidationResult {\n const isValid = Array.isArray(value) ? value.length > 0 : Boolean(value);\n return {\n valid: isValid,\n messageKey: 'checked'\n };\n}\n\nexport default checkedRule;\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue } from '../core/helpers.js';\n\nconst EMAIL_PATTERN =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\n\nexport function emailRule({ value }: ValidationContext): ValidationResult {\n if (isEmptyValue(value)) {\n return { valid: true, messageKey: 'email' };\n }\n\n return {\n valid: EMAIL_PATTERN.test(String(value).trim()),\n messageKey: 'email'\n };\n}\n\nexport default emailRule;\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue, toSafeInteger } from '../core/helpers.js';\n\nexport function maxLengthRule({ value, options }: ValidationContext): ValidationResult {\n const max = toSafeInteger(options.max as number | string | undefined, Number.POSITIVE_INFINITY, { min: 0 });\n if (isEmptyValue(value)) {\n return { valid: true, messageKey: 'maxLength', params: { max } };\n }\n\n const length = Array.isArray(value) ? value.length : String(value).length;\n return {\n valid: length <= max,\n messageKey: 'maxLength',\n params: { max }\n };\n}\n\nexport default maxLengthRule;\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue, toSafeInteger } from '../core/helpers.js';\n\nexport function minLengthRule({ value, options }: ValidationContext): ValidationResult {\n const min = toSafeInteger(options.min as number | string | undefined, 0, { min: 0 });\n if (isEmptyValue(value)) {\n return { valid: true, messageKey: 'minLength', params: { min } };\n }\n\n const length = Array.isArray(value) ? value.length : String(value).length;\n return {\n valid: length >= min,\n messageKey: 'minLength',\n params: { min }\n };\n}\n\nexport default minLengthRule;\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue } from '../core/helpers.js';\n\nexport function patternRule({ value, options }: ValidationContext): ValidationResult {\n if (isEmptyValue(value)) {\n return { valid: true, messageKey: 'pattern' };\n }\n\n try {\n const expression = new RegExp(String(options.pattern || ''));\n return {\n valid: expression.test(String(value)),\n messageKey: 'pattern'\n };\n } catch {\n return {\n valid: true,\n messageKey: 'pattern',\n metadata: { ignoredInvalidPattern: true }\n };\n }\n}\n\nexport default patternRule;\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue } from '../core/helpers.js';\n\nexport function requiredRule({ value }: ValidationContext): ValidationResult {\n return {\n valid: !isEmptyValue(value),\n messageKey: 'required'\n };\n}\n\nexport default requiredRule;\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue } from '../core/helpers.js';\n\nexport function sameAsRule({ field, form, value, options }: ValidationContext): ValidationResult {\n if (isEmptyValue(value)) {\n return {\n valid: true,\n messageKey: 'sameAs',\n params: { targetLabel: '' }\n };\n }\n\n const selector = String(options.selector || `[name=\"${options.field || ''}\"]`);\n let target: Element | null = null;\n try {\n target = selector ? form.querySelector(selector) : null;\n } catch {\n target = null;\n }\n const targetValue =\n target instanceof HTMLInputElement ||\n target instanceof HTMLSelectElement ||\n target instanceof HTMLTextAreaElement\n ? target.value\n : '';\n\n return {\n valid: target ? String(value) === String(targetValue) : false,\n messageKey: 'sameAs',\n params: {\n targetLabel: field.getTargetLabel(target)\n }\n };\n}\n\nexport default sameAsRule;\n","import type { A11yFormValidator, ValidatorRenderer } from './A11yFormValidator.js';\nimport type { FieldController } from './FieldController.js';\n\nexport class ErrorRenderer implements ValidatorRenderer {\n readonly validator: A11yFormValidator;\n\n constructor(validator: A11yFormValidator) {\n this.validator = validator;\n }\n\n getNode(field: FieldController): HTMLElement | null {\n return this.validator.form.querySelector<HTMLElement>(`#${field.errorId}`);\n }\n\n shouldRenderInline(): boolean {\n return this.validator.options.errorMode !== 'native';\n }\n\n syncAnnouncementAttributes(errorNode: HTMLElement): void {\n if (this.validator.shouldAnnounceInlineErrors()) {\n errorNode.setAttribute('role', 'status');\n errorNode.setAttribute('aria-live', 'polite');\n errorNode.setAttribute('aria-atomic', 'true');\n return;\n }\n\n errorNode.removeAttribute('role');\n errorNode.removeAttribute('aria-live');\n errorNode.removeAttribute('aria-atomic');\n }\n\n setNativeMessage(field: FieldController, message: string): void {\n field.elements.forEach((element) => {\n element.setCustomValidity?.(message || '');\n });\n }\n\n getInsertionTarget(field: FieldController): Element {\n if (field.isGroupedChoice) {\n const fieldset = field.primaryElement.closest('fieldset');\n if (fieldset && this.validator.form.contains(fieldset)) {\n return fieldset;\n }\n }\n\n const label = field.primaryElement.closest('label');\n if (label && this.validator.form.contains(label)) {\n return label;\n }\n\n return field.primaryElement;\n }\n\n render(field: FieldController, message: string): void {\n this.setNativeMessage(field, message);\n const renderInline = this.shouldRenderInline();\n if (renderInline) {\n field.connectDescription(field.errorId);\n } else {\n field.disconnectDescription(field.errorId);\n }\n field.setAriaInvalid(true, renderInline ? field.errorId : '');\n field.setVisualState('invalid');\n\n if (!renderInline) {\n return;\n }\n\n let errorNode = this.getNode(field);\n if (!errorNode) {\n errorNode = this.validator.form.ownerDocument.createElement('div');\n errorNode.id = field.errorId;\n errorNode.className = 'a11y-form-validator__error';\n this.getInsertionTarget(field).insertAdjacentElement('afterend', errorNode);\n }\n\n this.syncAnnouncementAttributes(errorNode);\n errorNode.textContent = message;\n }\n\n clear(field: FieldController): void {\n const errorNode = this.getNode(field);\n if (errorNode) {\n errorNode.remove();\n }\n\n this.setNativeMessage(field, '');\n field.disconnectDescription(field.errorId);\n field.setAriaInvalid(false);\n field.setVisualState('valid');\n }\n\n destroy(): void {\n this.validator.fields.forEach((field) => this.clear(field));\n }\n}\n","export class EventEmitter {\n readonly target: EventTarget;\n\n constructor(target: EventTarget) {\n this.target = target;\n }\n\n emit(name: string, detail: Record<string, unknown> = {}): void {\n this.target.dispatchEvent(\n new CustomEvent(name, {\n bubbles: true,\n detail\n })\n );\n }\n\n on(name: string, handler: EventListener): () => void {\n this.target.addEventListener(name, handler);\n return () => this.off(name, handler);\n }\n\n off(name: string, handler: EventListener): void {\n this.target.removeEventListener(name, handler);\n }\n}\n","import type { A11yFormValidator, FieldValue, ValidationContext } from './A11yFormValidator.js';\nimport {\n camelToKebabCase,\n ensureElementId,\n escapeSelectorIdentifier,\n getPreferredScrollBehavior,\n parseRuleList,\n sanitizeId,\n toRuleOptions,\n toSafeInteger,\n unique,\n type RuleList,\n type RuleOptions\n} from './helpers.js';\n\nexport type FormControl = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\nexport type FieldType =\n | 'textarea'\n | 'select'\n | 'select-multiple'\n | 'radio'\n | 'checkbox'\n | 'file'\n | string;\n\nfunction getControlLabels(element: Element): NodeListOf<HTMLLabelElement> | [] {\n if ('labels' in element && element.labels) {\n return element.labels as NodeListOf<HTMLLabelElement>;\n }\n\n return [];\n}\n\nexport class FieldController {\n readonly validator: A11yFormValidator;\n readonly name: string;\n readonly elements: FormControl[];\n readonly primaryElement: FormControl;\n readonly type: FieldType;\n readonly isGroupedChoice: boolean;\n readonly errorId: string;\n readonly primaryId: string;\n readonly initialDescribedBy: Map<FormControl, string>;\n private readonly generatedPrimaryId: boolean;\n\n serverMessage: string;\n lastError: string;\n touched: boolean;\n dirty: boolean;\n\n constructor(validator: A11yFormValidator, name: string, elements: FormControl[]) {\n this.validator = validator;\n this.name = name;\n this.elements = [...elements];\n this.primaryElement = this.elements[0];\n this.type = this.detectType();\n this.isGroupedChoice = this.elements.length > 1 && ['radio', 'checkbox'].includes(this.type);\n this.errorId = `a11y-form-validator-error-${sanitizeId(this.validator.form.id || 'form')}-${sanitizeId(this.name)}`;\n this.generatedPrimaryId = !this.primaryElement.id;\n this.primaryId = ensureElementId(this.primaryElement);\n this.initialDescribedBy = new Map(\n this.elements.map((element) => [element, element.getAttribute('aria-describedby') || ''])\n );\n this.serverMessage = '';\n this.lastError = '';\n this.touched = false;\n this.dirty = false;\n }\n\n detectType(): FieldType {\n const tagName = this.primaryElement.tagName.toLowerCase();\n if (tagName === 'textarea') {\n return 'textarea';\n }\n\n if (tagName === 'select') {\n return (this.primaryElement as HTMLSelectElement).multiple ? 'select-multiple' : 'select';\n }\n\n return (this.primaryElement.getAttribute('type') || 'text').toLowerCase();\n }\n\n getActiveElements(): FormControl[] {\n return this.elements.filter((element) => !element.disabled);\n }\n\n isDisabled(): boolean {\n return this.getActiveElements().length === 0;\n }\n\n isHidden(): boolean {\n return this.elements.every((element) => {\n if ((element instanceof HTMLInputElement && element.type === 'hidden') || element.hidden) {\n return true;\n }\n\n return Boolean(element.closest('[hidden]'));\n });\n }\n\n shouldIgnore(): false | 'disabled' | 'hidden' | 'selector' {\n const { ignore, validateHidden } = this.validator.options;\n if (ignore.disabled !== false && this.isDisabled()) {\n return 'disabled';\n }\n\n if (!validateHidden && ignore.hidden !== false && this.isHidden()) {\n return 'hidden';\n }\n\n if (ignore.selector && this.elements.some((element) => element.matches(ignore.selector))) {\n return 'selector';\n }\n\n return false;\n }\n\n getValue(): FieldValue {\n const activeElements = this.getActiveElements();\n if (this.type === 'radio') {\n const selected = activeElements.find((element) => element instanceof HTMLInputElement && element.checked);\n return selected ? selected.value : '';\n }\n\n if (this.type === 'checkbox' && this.elements.length > 1) {\n return activeElements\n .filter((element): element is HTMLInputElement => element instanceof HTMLInputElement && element.checked)\n .map((element) => element.value);\n }\n\n if (this.type === 'checkbox') {\n return this.primaryElement instanceof HTMLInputElement ? Boolean(this.primaryElement.checked) : false;\n }\n\n if (this.type === 'file') {\n return this.primaryElement instanceof HTMLInputElement ? Array.from(this.primaryElement.files || []) : [];\n }\n\n if (this.type === 'select-multiple' && this.primaryElement instanceof HTMLSelectElement) {\n return Array.from(this.primaryElement.selectedOptions).map((option) => option.value);\n }\n\n return this.primaryElement.value;\n }\n\n getFieldConfig(): unknown {\n return this.validator.options.rules?.[this.name] || {};\n }\n\n getDataMessage(ruleName: string): string {\n return this.primaryElement.dataset[`message${ruleName.charAt(0).toUpperCase()}${ruleName.slice(1)}`] ||\n this.primaryElement.getAttribute(`data-message-${camelToKebabCase(ruleName)}`) ||\n '';\n }\n\n getLabel(): string {\n const fieldset = this.primaryElement.closest('fieldset');\n if (this.isGroupedChoice && fieldset) {\n const legend = fieldset.querySelector('legend');\n if (legend) {\n return legend.textContent?.trim() || this.name;\n }\n }\n\n const id = this.primaryElement.id;\n if (id) {\n const labelSelector = `label[for=\"${escapeSelectorIdentifier(id)}\"]`;\n const label =\n this.validator.form.querySelector(labelSelector) ||\n this.validator.form.ownerDocument.querySelector(labelSelector);\n if (label) {\n return label.textContent?.trim() || this.name;\n }\n }\n\n const wrapperLabel = this.primaryElement.closest('label');\n if (wrapperLabel) {\n return wrapperLabel.textContent?.trim() || this.name;\n }\n\n return this.name;\n }\n\n getTargetLabel(target: Element | null): string {\n if (!target) {\n return '';\n }\n\n const labels = getControlLabels(target);\n if (labels.length) {\n return labels[0].textContent?.trim() || '';\n }\n\n if (target.id) {\n const label = this.validator.form.querySelector(`label[for=\"${escapeSelectorIdentifier(target.id)}\"]`);\n if (label) {\n return label.textContent?.trim() || '';\n }\n }\n\n if (target instanceof HTMLInputElement || target instanceof HTMLSelectElement || target instanceof HTMLTextAreaElement) {\n return target.name || target.id || '';\n }\n\n return target.id || '';\n }\n\n getDescribedBy(): string[] {\n return unique(\n this.elements.flatMap((element) => String(element.getAttribute('aria-describedby') || '').split(/\\s+/))\n );\n }\n\n connectDescription(id: string): void {\n this.elements.forEach((element) => {\n const base = String(this.initialDescribedBy.get(element) || '').split(/\\s+/);\n const current = String(element.getAttribute('aria-describedby') || '').split(/\\s+/);\n const next = unique([...base, ...current, id]);\n if (next.length) {\n element.setAttribute('aria-describedby', next.join(' '));\n }\n });\n }\n\n disconnectDescription(id: string): void {\n this.elements.forEach((element) => {\n const base = String(this.initialDescribedBy.get(element) || '').split(/\\s+/);\n const current = String(element.getAttribute('aria-describedby') || '').split(/\\s+/);\n const next = unique([...base, ...current].filter((token) => token && token !== id));\n if (next.length) {\n element.setAttribute('aria-describedby', next.join(' '));\n } else {\n element.removeAttribute('aria-describedby');\n }\n });\n }\n\n setAriaInvalid(isInvalid: boolean, errorId = this.errorId): void {\n this.elements.forEach((element) => {\n if (isInvalid) {\n element.setAttribute('aria-invalid', 'true');\n if (errorId) {\n element.setAttribute('aria-errormessage', errorId);\n } else {\n element.removeAttribute('aria-errormessage');\n }\n } else {\n element.removeAttribute('aria-invalid');\n element.removeAttribute('aria-errormessage');\n }\n });\n }\n\n setVisualState(state: 'valid' | 'invalid' | 'pending'): void {\n this.elements.forEach((element) => {\n element.dataset.validationState = state;\n element.classList.toggle('is-valid', state === 'valid');\n element.classList.toggle('is-invalid', state === 'invalid');\n element.classList.toggle('is-pending', state === 'pending');\n element.classList.toggle('is-touched', this.touched);\n element.classList.toggle('is-dirty', this.dirty);\n element.classList.toggle('is-disabled', this.isDisabled());\n });\n }\n\n clearVisualState(): void {\n this.elements.forEach((element) => {\n delete element.dataset.validationState;\n element.classList.remove('is-valid', 'is-invalid', 'is-pending', 'is-touched', 'is-dirty', 'is-disabled');\n });\n }\n\n focus(): void {\n this.primaryElement.focus({ preventScroll: true });\n this.primaryElement.scrollIntoView?.({\n block: 'center',\n behavior: getPreferredScrollBehavior(this.primaryElement)\n });\n }\n\n markTouched(): void {\n this.touched = true;\n }\n\n markDirty(): void {\n this.dirty = true;\n }\n\n clearServerMessage(): void {\n this.serverMessage = '';\n }\n\n setServerMessage(message: string): void {\n this.serverMessage = message;\n this.lastError = message;\n }\n\n getRules(): RuleList {\n const nativeRules = this.getNativeRules();\n const dataRules = this.getDataRules();\n const configuredRules = parseRuleList(this.getFieldConfig());\n\n return {\n ...nativeRules,\n ...dataRules,\n ...configuredRules\n };\n }\n\n getNativeRules(): RuleList {\n if (!this.validator.options.useNativeRules) {\n return {};\n }\n\n const rules: RuleList = {};\n const requiredRuleName = ['checkbox', 'radio'].includes(this.type) ? 'checked' : 'required';\n if (this.elements.some((element) => element.hasAttribute('required'))) {\n rules[requiredRuleName] = true;\n }\n\n if (this.type === 'email') {\n rules.email = true;\n }\n\n const minLength = toSafeInteger(this.primaryElement.getAttribute('minlength') ?? undefined, Number.NaN, { min: 0 });\n if (Number.isFinite(minLength)) {\n rules.minLength = { min: minLength };\n }\n\n const maxLength = toSafeInteger(this.primaryElement.getAttribute('maxlength') ?? undefined, Number.NaN, { min: 0 });\n if (Number.isFinite(maxLength)) {\n rules.maxLength = { max: maxLength };\n }\n\n const pattern = this.primaryElement.getAttribute('pattern');\n if (pattern) {\n rules.pattern = { pattern };\n }\n\n return rules;\n }\n\n getDataRules(): RuleList {\n const rules = parseRuleList(this.primaryElement.dataset.validate);\n if (this.primaryElement.dataset.required === 'true') {\n rules.required = true;\n }\n\n if (this.primaryElement.dataset.checked === 'true') {\n rules.checked = true;\n }\n\n const dataMinLength = toSafeInteger(this.primaryElement.dataset.minLength, Number.NaN, { min: 0 });\n if (Number.isFinite(dataMinLength)) {\n rules.minLength = { min: dataMinLength };\n }\n\n const dataMaxLength = toSafeInteger(this.primaryElement.dataset.maxLength, Number.NaN, { min: 0 });\n if (Number.isFinite(dataMaxLength)) {\n rules.maxLength = { max: dataMaxLength };\n }\n\n if (this.primaryElement.dataset.pattern) {\n rules.pattern = { pattern: this.primaryElement.dataset.pattern };\n }\n\n if (this.primaryElement.dataset.sameAs) {\n rules.sameAs = { selector: this.primaryElement.dataset.sameAs };\n }\n\n return Object.fromEntries(\n Object.entries(rules).map(([key, value]) => [key, toRuleOptions(value, key)])\n );\n }\n\n getValidationContext(ruleName: string, ruleOptions: unknown, allValues: Record<string, FieldValue>): ValidationContext {\n return {\n field: this,\n form: this.validator.form,\n value: this.getValue(),\n options: toRuleOptions(ruleOptions, ruleName) as RuleOptions,\n allValues,\n validator: this.validator\n };\n }\n\n getNativeValidationMessage(): string {\n if (typeof this.primaryElement.validationMessage === 'string') {\n return this.primaryElement.validationMessage;\n }\n\n return '';\n }\n\n destroy(): void {\n this.clearServerMessage();\n this.lastError = '';\n this.setAriaInvalid(false);\n this.clearVisualState();\n this.elements.forEach((element) => {\n const initial = this.initialDescribedBy.get(element);\n if (initial) {\n element.setAttribute('aria-describedby', initial);\n } else {\n element.removeAttribute('aria-describedby');\n }\n });\n if (this.generatedPrimaryId && this.primaryElement.id === this.primaryId) {\n this.primaryElement.removeAttribute('id');\n }\n }\n}\n","{\n \"required\": \"This field is required.\",\n \"email\": \"Enter a valid email address.\",\n \"minLength\": \"Enter at least {min} characters.\",\n \"maxLength\": \"Enter no more than {max} characters.\",\n \"pattern\": \"Enter a value in the correct format.\",\n \"checked\": \"Select this option to continue.\",\n \"sameAs\": \"This value must match {targetLabel}.\",\n \"summaryTitleOne\": \"There is 1 problem with your form.\",\n \"summaryTitleOther\": \"There are {count} problems with your form.\",\n \"summaryItem\": \"{fieldLabel}: {message}\",\n \"genericFallback\": \"Check this field.\"\n}\n","import enMessages from '../locales/en.json' with { type: 'json' };\nimport type {\n A11yFormValidator,\n LocaleMessages,\n MessageResolverContext,\n MessageValue,\n ValidationResult\n} from './A11yFormValidator.js';\nimport type { FieldController } from './FieldController.js';\nimport { applyPlaceholders } from './helpers.js';\n\nexport class MessageResolver {\n readonly validator: A11yFormValidator;\n readonly defaultMessages: LocaleMessages;\n\n constructor(validator: A11yFormValidator) {\n this.validator = validator;\n this.defaultMessages = enMessages;\n }\n\n detectLocale(): string {\n const explicit = this.validator.options.locale;\n const formLang = this.validator.form.getAttribute('lang');\n const documentLang = this.validator.form.ownerDocument.documentElement.getAttribute('lang');\n return explicit || formLang || documentLang || 'en';\n }\n\n getLocaleCandidates(locale = this.detectLocale()): string[] {\n const candidates: string[] = [];\n if (locale) {\n candidates.push(locale);\n const [base] = locale.split('-');\n if (base && base !== locale) {\n candidates.push(base);\n }\n }\n\n candidates.push('en');\n return [...new Set(candidates.filter(Boolean))];\n }\n\n getLocaleMessage(key: string): MessageValue | undefined {\n const candidates = this.getLocaleCandidates();\n const configuredLocales = this.validator.options.locales || {};\n\n for (const locale of candidates) {\n const localeMessages = configuredLocales[locale];\n if (localeMessages && localeMessages[key] != null) {\n return localeMessages[key];\n }\n }\n\n if (this.validator.options.messages?.[key] != null) {\n return this.validator.options.messages[key] as MessageValue;\n }\n\n return this.defaultMessages[key];\n }\n\n resolveValue(message: unknown, context: MessageResolverContext): string {\n if (typeof message === 'function') {\n return message(context);\n }\n\n if (typeof message === 'string') {\n return applyPlaceholders(message, context.params);\n }\n\n return '';\n }\n\n getSummaryTitle(count: number): string {\n const key = count === 1 ? 'summaryTitleOne' : 'summaryTitleOther';\n const message = this.getLocaleMessage(key) || this.getLocaleMessage('summaryTitle');\n return this.resolveValue(message, {\n field: null,\n fieldName: '',\n fieldLabel: '',\n form: this.validator.form,\n rule: key,\n value: count,\n params: { count },\n locale: this.detectLocale()\n }) || `There ${count === 1 ? 'is' : 'are'} ${count} problem${count === 1 ? '' : 's'} with your form.`;\n }\n\n getSummaryItem(field: FieldController, message: string): string {\n const fieldLabel = field.getLabel();\n const params = {\n label: fieldLabel,\n fieldLabel,\n fieldName: field.name,\n message\n };\n const configuredMessage = this.validator.options.messages?.summaryItem;\n const summaryMessage = configuredMessage ?? this.getLocaleMessage('summaryItem');\n const context: MessageResolverContext = {\n field,\n fieldName: field.name,\n fieldLabel,\n form: this.validator.form,\n rule: 'summaryItem',\n value: message,\n params,\n locale: this.detectLocale()\n };\n\n return this.resolveValue(summaryMessage, context) || `${fieldLabel}: ${message}`;\n }\n\n resolve(field: FieldController, ruleName: string, result: ValidationResult): string {\n const target = field.primaryElement;\n const fieldLabel = field.getLabel();\n const params = {\n ...result.params,\n label: fieldLabel,\n fieldLabel,\n targetLabel: result.params?.targetLabel || '',\n value: field.getValue()\n };\n const context: MessageResolverContext = {\n field,\n fieldName: field.name,\n fieldLabel,\n form: this.validator.form,\n rule: ruleName,\n value: field.getValue(),\n params,\n locale: this.detectLocale()\n };\n\n const fieldMessages = this.validator.options.messages?.fields;\n const shouldUseNativeMessage =\n this.validator.options.errorMode === 'native' || Boolean(result.nativeMessage);\n const candidates = [\n field.serverMessage,\n field.getDataMessage(ruleName),\n fieldMessages?.[field.name]?.[ruleName],\n this.validator.options.messages?.[ruleName],\n result.message,\n shouldUseNativeMessage ? result.nativeMessage : '',\n shouldUseNativeMessage && target.validity?.valid === false ? field.getNativeValidationMessage() : '',\n this.getLocaleMessage(result.messageKey || ruleName),\n this.defaultMessages[result.messageKey || ruleName],\n this.defaultMessages.genericFallback,\n 'Check this field.'\n ];\n\n for (const candidate of candidates) {\n const value = this.resolveValue(candidate, context);\n if (value) {\n return value;\n }\n }\n\n return 'Check this field.';\n }\n}\n","import type { ValidationContext, ValidationResult, ValidatorRule } from './A11yFormValidator.js';\n\nexport class RuleRegistry {\n private readonly rules: Map<string, ValidatorRule>;\n\n constructor() {\n this.rules = new Map();\n }\n\n register(name: string, rule: ValidatorRule): this {\n this.rules.set(name, rule);\n return this;\n }\n\n unregister(name: string): this {\n this.rules.delete(name);\n return this;\n }\n\n has(name: string): boolean {\n return this.rules.has(name);\n }\n\n async run(name: string, context: ValidationContext): Promise<ValidationResult> {\n const rule = this.rules.get(name);\n if (!rule) {\n return {\n valid: true,\n messageKey: name,\n params: {}\n };\n }\n\n const rawResult = await rule(context);\n return this.normalize(name, rawResult);\n }\n\n normalize(name: string, result: Awaited<ReturnType<ValidatorRule>>): ValidationResult {\n if (result == null || result === true) {\n return {\n valid: true,\n messageKey: name,\n params: {}\n };\n }\n\n if (result === false) {\n return {\n valid: false,\n messageKey: name,\n params: {}\n };\n }\n\n if (typeof result === 'string') {\n return {\n valid: false,\n messageKey: name,\n message: result,\n params: {}\n };\n }\n\n return {\n valid: Boolean(result.valid),\n messageKey: result.messageKey || name,\n message: result.message,\n params: result.params || {},\n metadata: result.metadata || {},\n nativeMessage: result.nativeMessage\n };\n }\n}\n","export type FormValidationState = 'idle' | 'validating' | 'valid' | 'invalid';\n\nexport interface FieldValidationState {\n pristine: boolean;\n dirty: boolean;\n touched: boolean;\n pending: boolean;\n valid: boolean;\n invalid: boolean;\n disabled: boolean;\n ignored: boolean;\n}\n\nexport interface ValidationStateSnapshot {\n form: FormValidationState;\n fields: Record<string, FieldValidationState>;\n}\n\nexport class ValidationState {\n private formState: FormValidationState;\n private readonly fieldStates: Map<string, FieldValidationState>;\n\n constructor() {\n this.formState = 'idle';\n this.fieldStates = new Map();\n }\n\n ensure(name: string): FieldValidationState {\n if (!this.fieldStates.has(name)) {\n this.fieldStates.set(name, {\n pristine: true,\n dirty: false,\n touched: false,\n pending: false,\n valid: false,\n invalid: false,\n disabled: false,\n ignored: false\n });\n }\n\n return this.fieldStates.get(name)!;\n }\n\n updateField(name: string, patch: Partial<FieldValidationState>): FieldValidationState {\n const current = this.ensure(name);\n this.fieldStates.set(name, { ...current, ...patch });\n return this.fieldStates.get(name)!;\n }\n\n setFormState(state: FormValidationState): void {\n this.formState = state;\n }\n\n snapshot(): ValidationStateSnapshot {\n return {\n form: this.formState,\n fields: Object.fromEntries(this.fieldStates.entries())\n };\n }\n}\n","import checkedRule from '../rules/checked.js';\nimport emailRule from '../rules/email.js';\nimport maxLengthRule from '../rules/maxLength.js';\nimport minLengthRule from '../rules/minLength.js';\nimport patternRule from '../rules/pattern.js';\nimport requiredRule from '../rules/required.js';\nimport sameAsRule from '../rules/same-as.js';\nimport { ErrorRenderer } from './ErrorRenderer.js';\nimport { EventEmitter } from './EventEmitter.js';\nimport { FieldController } from './FieldController.js';\nimport { MessageResolver } from './MessageResolver.js';\nimport { RuleRegistry } from './RuleRegistry.js';\nimport { ValidationState, type ValidationStateSnapshot } from './ValidationState.js';\nimport { mergeOptions, normalizeToArray, toSafeInteger, type RuleOptions } from './helpers.js';\n\nexport type ValidateTrigger = 'submit' | 'blur' | 'input' | 'change';\nexport type ErrorMode = 'inline' | 'native' | 'both';\nexport type FocusOnError = 'summary' | 'first-invalid' | false;\nexport type FieldValue = string | boolean | string[] | File[];\n\nexport interface ValidationResult {\n valid: boolean;\n messageKey?: string;\n message?: string;\n params?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n nativeMessage?: string;\n}\n\nexport type ValidatorRuleResult = boolean | string | Partial<ValidationResult> | null | undefined;\n\nexport interface ValidationContext {\n field: FieldController;\n form: HTMLFormElement;\n value: FieldValue;\n options: RuleOptions;\n allValues: Record<string, FieldValue>;\n validator: A11yFormValidator;\n}\n\nexport type ValidatorRule = (context: ValidationContext) => ValidatorRuleResult | Promise<ValidatorRuleResult>;\n\nexport type MessageResolverContext = {\n field: FieldController | null;\n fieldName: string;\n fieldLabel: string;\n form: HTMLFormElement;\n rule: string;\n value: unknown;\n params: Record<string, unknown>;\n locale: string;\n};\n\nexport type MessageValue = string | ((context: MessageResolverContext) => string);\n\nexport interface ValidatorMessages {\n fields?: Record<string, Record<string, MessageValue>>;\n [key: string]: MessageValue | Record<string, Record<string, MessageValue>> | undefined;\n}\n\nexport type LocaleMessages = Record<string, MessageValue>;\n\nexport interface ValidatorRenderer {\n render(field: FieldController, message: string): void;\n clear(field: FieldController): void;\n destroy?(): void;\n}\n\nexport interface ValidatorAddon {\n install(validator: A11yFormValidator): void;\n destroy?(): void;\n}\n\nexport type AddonInput = ValidatorAddon;\n\nexport interface A11yFormValidatorOptions {\n validateOn: ValidateTrigger | ValidateTrigger[];\n focusOnError: FocusOnError;\n errorMode: ErrorMode;\n useNativeRules: boolean;\n disableNativeUI: boolean;\n validateHidden: boolean;\n ignore: {\n disabled: boolean;\n hidden: boolean;\n selector: string;\n };\n debounce: number;\n messages: ValidatorMessages;\n locales: Record<string, LocaleMessages>;\n locale: string;\n selectors: {\n fields: string;\n };\n addons: AddonInput[];\n renderer: ValidatorRenderer | null;\n rules: Record<string, unknown>;\n}\n\nexport type A11yFormValidatorOptionsInput = Partial<\n Omit<A11yFormValidatorOptions, 'validateOn' | 'addons' | 'ignore' | 'selectors'>\n> & {\n validateOn?: ValidateTrigger | ValidateTrigger[];\n addons?: AddonInput | AddonInput[];\n ignore?: Partial<A11yFormValidatorOptions['ignore']>;\n selectors?: Partial<A11yFormValidatorOptions['selectors']>;\n};\n\nexport interface A11yFormValidatorInstance {\n validate(options?: ValidateOptions): Promise<boolean>;\n validateField(input: FieldInput, options?: ValidateOptions): Promise<boolean>;\n refresh(): this;\n reset(): this;\n clearErrors(): this;\n setErrors(errors?: ServerErrors): this;\n getErrors(): ValidatorErrors;\n getState(): ValidationStateSnapshot;\n enable(): this;\n disable(): this;\n focusOnError(): void;\n destroy(): void;\n}\n\nexport interface ValidateOptions {\n reason?: string;\n}\n\nexport type FieldInput = FieldController | string | HTMLElement | null | undefined;\n\nexport interface ValidatorErrors {\n fields: Record<string, string>;\n form: string[];\n}\n\nexport type ServerErrors = Record<string, string | string[] | undefined> & {\n fields?: Record<string, string | string[] | undefined>;\n form?: string | string[];\n _form?: string | string[];\n};\n\nconst COMPONENT_NAME = 'a11y-form-validator';\n\nexport const EVENTS = Object.freeze({\n init: `${COMPONENT_NAME}:init`,\n beforeValidate: `${COMPONENT_NAME}:before-validate`,\n afterValidate: `${COMPONENT_NAME}:after-validate`,\n fieldValid: `${COMPONENT_NAME}:field-valid`,\n fieldInvalid: `${COMPONENT_NAME}:field-invalid`,\n formValid: `${COMPONENT_NAME}:form-valid`,\n formInvalid: `${COMPONENT_NAME}:form-invalid`,\n submitBlocked: `${COMPONENT_NAME}:submit-blocked`,\n destroy: `${COMPONENT_NAME}:destroy`\n});\n\nexport const SELECTORS = Object.freeze({\n fields: 'input, select, textarea',\n initAll: '[data-a11y-form-validator]'\n});\n\nexport const CLASSES = Object.freeze({\n root: COMPONENT_NAME,\n initialized: 'is-initialized'\n});\n\nexport const ATTRIBUTES = Object.freeze({\n describedBy: 'aria-describedby',\n errorMessage: 'aria-errormessage',\n hidden: 'hidden',\n invalid: 'aria-invalid',\n noValidate: 'novalidate',\n validationState: 'data-validation-state'\n});\n\nexport const DEFAULT_OPTIONS = Object.freeze({\n validateOn: ['submit'] as ValidateTrigger[],\n focusOnError: 'summary' as FocusOnError,\n errorMode: 'inline' as ErrorMode,\n useNativeRules: true,\n disableNativeUI: true,\n validateHidden: false,\n ignore: Object.freeze({\n disabled: true,\n hidden: true,\n selector: ''\n }),\n debounce: 150,\n messages: Object.freeze({}) as ValidatorMessages,\n locales: Object.freeze({}) as Record<string, LocaleMessages>,\n locale: '',\n selectors: Object.freeze({\n fields: SELECTORS.fields\n }),\n addons: [] as AddonInput[],\n renderer: null as ValidatorRenderer | null,\n rules: Object.freeze({}) as Record<string, unknown>\n}) satisfies A11yFormValidatorOptions;\n\nexport class A11yFormValidator implements A11yFormValidatorInstance {\n private static readonly instances = new WeakMap<HTMLFormElement, A11yFormValidator>();\n\n readonly form!: HTMLFormElement;\n readonly options!: A11yFormValidatorOptions;\n readonly events!: EventEmitter;\n readonly state!: ValidationState;\n readonly ruleRegistry!: RuleRegistry;\n readonly messageResolver!: MessageResolver;\n readonly renderer!: ValidatorRenderer;\n\n fields!: FieldController[];\n fieldMap!: Map<string, FieldController>;\n enabled!: boolean;\n hasSubmitted!: boolean;\n formErrors!: string[];\n summaryAddon!: (ValidatorAddon & { hasErrors(): boolean; focus(): void }) | null;\n\n private addons!: ValidatorAddon[];\n private readonly timers!: Map<string, ReturnType<typeof setTimeout>>;\n private readonly addedRootClass!: boolean;\n private readonly addedNoValidate!: boolean;\n private readonly abortController!: AbortController | null;\n private readonly validationRuns!: Map<string, number>;\n private destroyed!: boolean;\n private inlineErrorAnnouncementsMuted!: boolean;\n private readonly onSubmit!: EventListener;\n private readonly onFocusOut!: EventListener;\n private readonly onInput!: EventListener;\n private readonly onChange!: EventListener;\n\n constructor(form: HTMLFormElement, options: A11yFormValidatorOptionsInput = {}) {\n if (!(form instanceof HTMLFormElement)) {\n throw new TypeError('A11yFormValidator expects an HTMLFormElement.');\n }\n\n const existingInstance = A11yFormValidator.instances.get(form);\n if (existingInstance) {\n return existingInstance;\n }\n\n A11yFormValidator.instances.set(form, this);\n\n this.form = form;\n this.options = this.normalizeOptions(options);\n this.events = new EventEmitter(this.form);\n this.state = new ValidationState();\n this.ruleRegistry = new RuleRegistry();\n this.messageResolver = new MessageResolver(this);\n this.renderer = this.options.renderer || new ErrorRenderer(this);\n this.fields = [];\n this.fieldMap = new Map();\n this.enabled = true;\n this.hasSubmitted = false;\n this.formErrors = [];\n this.summaryAddon = null;\n this.addons = [];\n this.timers = new Map();\n this.addedRootClass = !this.form.classList.contains(CLASSES.root);\n this.addedNoValidate =\n this.options.disableNativeUI &&\n this.options.errorMode !== 'native' &&\n !this.form.hasAttribute('novalidate');\n const AbortControllerConstructor = this.form.ownerDocument.defaultView?.AbortController || globalThis.AbortController;\n this.abortController = AbortControllerConstructor ? new AbortControllerConstructor() : null;\n this.validationRuns = new Map();\n this.destroyed = false;\n this.inlineErrorAnnouncementsMuted = false;\n this.onSubmit = this.handleSubmit.bind(this);\n this.onFocusOut = this.handleFocusOut.bind(this);\n this.onInput = this.handleInput.bind(this);\n this.onChange = this.handleChange.bind(this);\n\n this.registerDefaultRules();\n this.form.classList.add(CLASSES.root, CLASSES.initialized);\n\n if (this.addedNoValidate) {\n this.form.setAttribute('novalidate', 'novalidate');\n }\n\n this.refresh();\n this.bindEvents();\n this.installAddons();\n this.emit(EVENTS.init);\n }\n\n static getInstance(form: HTMLFormElement): A11yFormValidator | undefined {\n return A11yFormValidator.instances.get(form);\n }\n\n private normalizeOptions(options: A11yFormValidatorOptionsInput): A11yFormValidatorOptions {\n const merged = mergeOptions(DEFAULT_OPTIONS, options as Record<string, unknown>) as unknown as A11yFormValidatorOptions;\n return {\n ...merged,\n validateOn: normalizeToArray(merged.validateOn) as ValidateTrigger[],\n addons: normalizeToArray(merged.addons) as AddonInput[],\n debounce: toSafeInteger(merged.debounce, DEFAULT_OPTIONS.debounce, { min: 0 }),\n ignore: {\n ...DEFAULT_OPTIONS.ignore,\n ...(options.ignore || {})\n },\n selectors: {\n ...DEFAULT_OPTIONS.selectors,\n ...(options.selectors || {})\n },\n messages: options.messages || DEFAULT_OPTIONS.messages,\n locales: options.locales || DEFAULT_OPTIONS.locales,\n rules: options.rules || DEFAULT_OPTIONS.rules\n };\n }\n\n private emit(name: string, detail: Record<string, unknown> = {}): void {\n this.events.emit(name, {\n instance: this,\n validator: this,\n ...detail\n });\n }\n\n shouldAnnounceInlineErrors(): boolean {\n return !this.inlineErrorAnnouncementsMuted;\n }\n\n private shouldMuteInlineErrorsForBatch(reason: string): boolean {\n return reason === 'submit' && this.options.focusOnError === 'summary' && Boolean(this.summaryAddon);\n }\n\n registerDefaultRules(): void {\n this.registerRule('required', requiredRule);\n this.registerRule('email', emailRule);\n this.registerRule('minLength', minLengthRule);\n this.registerRule('maxLength', maxLengthRule);\n this.registerRule('pattern', patternRule);\n this.registerRule('checked', checkedRule);\n this.registerRule('sameAs', sameAsRule);\n }\n\n registerRule(name: string, rule: ValidatorRule): this {\n this.ruleRegistry.register(name, rule);\n return this;\n }\n\n unregisterRule(name: string): this {\n this.ruleRegistry.unregister(name);\n return this;\n }\n\n installAddons(): void {\n this.addons = normalizeToArray(this.options.addons)\n .filter((addon): addon is ValidatorAddon => {\n return Boolean(addon) && typeof addon === 'object' && typeof addon.install === 'function';\n });\n this.addons.forEach((addon) => addon.install(this));\n }\n\n collectFields(): FieldController[] {\n const nodes = Array.from(this.form.querySelectorAll(this.options.selectors.fields))\n .filter((element): element is HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement => {\n return element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement;\n })\n .filter((element) => element.name || element.id);\n const nameCounts = nodes.reduce<Map<string, number>>((counts, element) => {\n const name = element.name || element.id;\n counts.set(name, (counts.get(name) || 0) + 1);\n return counts;\n }, new Map());\n const grouped = new Map<string, Array<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>>();\n\n nodes.forEach((element) => {\n const name = element.name || element.id;\n const type = (element.type || element.tagName).toLowerCase();\n const shouldGroup = type === 'radio' || (type === 'checkbox' && (nameCounts.get(name) || 0) > 1);\n if (!grouped.has(name)) {\n grouped.set(name, []);\n }\n\n const group = grouped.get(name)!;\n if (shouldGroup) {\n group.push(element);\n return;\n }\n\n if (group.length === 0) {\n group.push(element);\n }\n });\n\n return [...grouped.entries()].map(([name, elements]) => new FieldController(this, name, elements));\n }\n\n refresh(): this {\n this.fields = this.collectFields();\n this.fieldMap = new Map(this.fields.map((field) => [field.name, field]));\n this.fields.forEach((field) => this.state.ensure(field.name));\n return this;\n }\n\n private bindEvents(): void {\n const listenerOptions = this.abortController ? { signal: this.abortController.signal } : undefined;\n this.form.addEventListener('submit', this.onSubmit, listenerOptions);\n this.form.addEventListener('focusout', this.onFocusOut, listenerOptions);\n this.form.addEventListener('input', this.onInput, listenerOptions);\n this.form.addEventListener('change', this.onChange, listenerOptions);\n }\n\n private async handleSubmit(event: Event): Promise<void> {\n if (!this.enabled || !this.options.validateOn.includes('submit')) {\n return;\n }\n\n this.hasSubmitted = true;\n const valid = await this.validate({ reason: 'submit' });\n if (!valid) {\n event.preventDefault();\n this.emit(EVENTS.submitBlocked, { errors: this.getErrors() });\n this.focusOnError();\n }\n }\n\n private handleFocusOut(event: Event): void {\n const field = this.findFieldByElement(event.target);\n if (!field) {\n return;\n }\n\n field.markTouched();\n if (this.options.validateOn.includes('blur') || this.hasSubmitted) {\n void this.validateField(field, { reason: 'blur' });\n }\n }\n\n private handleInput(event: Event): void {\n const field = this.findFieldByElement(event.target);\n if (!field) {\n return;\n }\n\n field.markDirty();\n field.clearServerMessage();\n this.formErrors = [];\n if (this.options.validateOn.includes('input')) {\n this.queueValidation(field, 'input');\n } else if (field.lastError && !field.serverMessage) {\n this.renderer.clear(field);\n field.lastError = '';\n }\n }\n\n private handleChange(event: Event): void {\n const field = this.findFieldByElement(event.target);\n if (!field) {\n return;\n }\n\n field.markDirty();\n field.clearServerMessage();\n if (this.options.validateOn.includes('change')) {\n void this.validateField(field, { reason: 'change' });\n }\n }\n\n queueValidation(field: FieldController, reason: string): void {\n clearTimeout(this.timers.get(field.name));\n const timer = setTimeout(() => {\n void this.validateField(field, { reason });\n this.timers.delete(field.name);\n }, this.options.debounce);\n this.timers.set(field.name, timer);\n }\n\n findFieldByElement(element: EventTarget | null): FieldController | undefined {\n if (!(element instanceof HTMLElement)) {\n return undefined;\n }\n\n return this.fields.find((field) => field.elements.some((fieldElement) => fieldElement === element));\n }\n\n resolveField(input: FieldInput): FieldController | null {\n if (input instanceof FieldController) {\n return input;\n }\n\n if (typeof input === 'string') {\n return this.fieldMap.get(input) || null;\n }\n\n if (input instanceof HTMLElement) {\n return this.findFieldByElement(input) || null;\n }\n\n return null;\n }\n\n getAllValues(): Record<string, FieldValue> {\n return Object.fromEntries(this.fields.map((field) => [field.name, field.getValue()]));\n }\n\n async validate(options: ValidateOptions = {}): Promise<boolean> {\n const reason = options.reason || 'manual';\n const previousInlineErrorAnnouncementsMuted = this.inlineErrorAnnouncementsMuted;\n this.inlineErrorAnnouncementsMuted =\n previousInlineErrorAnnouncementsMuted || this.shouldMuteInlineErrorsForBatch(reason);\n\n try {\n this.emit(EVENTS.beforeValidate, { reason });\n this.state.setFormState('validating');\n\n const results = await Promise.all(this.fields.map((field) => this.validateField(field, options)));\n const valid = results.every(Boolean) && this.formErrors.length === 0;\n\n this.state.setFormState(valid ? 'valid' : 'invalid');\n this.emit(EVENTS.afterValidate, { valid, errors: this.getErrors() });\n this.emit(valid ? EVENTS.formValid : EVENTS.formInvalid, { errors: this.getErrors() });\n return valid;\n } finally {\n this.inlineErrorAnnouncementsMuted = previousInlineErrorAnnouncementsMuted;\n }\n }\n\n async validateField(input: FieldInput, options: ValidateOptions = {}): Promise<boolean> {\n const field = this.resolveField(input);\n if (!field) {\n return true;\n }\n\n const ignoredReason = field.shouldIgnore();\n if (ignoredReason) {\n field.lastError = '';\n this.renderer.clear(field);\n this.state.updateField(field.name, {\n ignored: ignoredReason !== 'disabled',\n disabled: ignoredReason === 'disabled',\n valid: true,\n invalid: false,\n pending: false,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty\n });\n return true;\n }\n\n if (field.serverMessage) {\n this.renderer.render(field, field.serverMessage);\n this.state.updateField(field.name, {\n valid: false,\n invalid: true,\n pending: false,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty\n });\n this.emit(EVENTS.fieldInvalid, { field, message: field.serverMessage, reason: options.reason || 'manual' });\n return false;\n }\n\n const runId = (this.validationRuns.get(field.name) || 0) + 1;\n this.validationRuns.set(field.name, runId);\n field.setVisualState('pending');\n this.state.updateField(field.name, {\n pending: true,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty\n });\n\n const rules = field.getRules();\n const allValues = this.getAllValues();\n for (const [ruleName, ruleOptions] of Object.entries(rules)) {\n const result = await this.ruleRegistry.run(ruleName, field.getValidationContext(ruleName, ruleOptions, allValues));\n if (this.validationRuns.get(field.name) !== runId) {\n return !field.lastError;\n }\n\n if (!result.valid) {\n const message = this.messageResolver.resolve(field, ruleName, result);\n field.lastError = message;\n this.renderer.render(field, message);\n this.state.updateField(field.name, {\n valid: false,\n invalid: true,\n pending: false,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty,\n ignored: false,\n disabled: false\n });\n this.emit(EVENTS.fieldInvalid, { field, message, reason: options.reason || 'manual' });\n return false;\n }\n }\n\n field.lastError = '';\n this.renderer.clear(field);\n this.state.updateField(field.name, {\n valid: true,\n invalid: false,\n pending: false,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty,\n ignored: false,\n disabled: false\n });\n this.emit(EVENTS.fieldValid, { field, reason: options.reason || 'manual' });\n return true;\n }\n\n reset(): this {\n this.form.reset();\n this.hasSubmitted = false;\n this.clearErrors();\n this.fields.forEach((field) => {\n field.dirty = false;\n field.touched = false;\n field.setVisualState('valid');\n this.state.updateField(field.name, {\n pristine: true,\n dirty: false,\n touched: false,\n pending: false,\n valid: false,\n invalid: false,\n disabled: false,\n ignored: false\n });\n });\n this.state.setFormState('idle');\n return this;\n }\n\n clearErrors(): this {\n this.formErrors = [];\n this.fields.forEach((field) => {\n field.clearServerMessage();\n field.lastError = '';\n this.renderer.clear(field);\n });\n this.emit(EVENTS.afterValidate, { valid: true, errors: this.getErrors() });\n return this;\n }\n\n setErrors(errors: ServerErrors = {}): this {\n this.clearErrors();\n const fieldErrors = errors.fields || Object.fromEntries(\n Object.entries(errors).filter(([key]) => !['form', '_form', 'fields'].includes(key))\n );\n const formErrors = errors.form || errors._form || [];\n\n const previousInlineErrorAnnouncementsMuted = this.inlineErrorAnnouncementsMuted;\n this.inlineErrorAnnouncementsMuted =\n previousInlineErrorAnnouncementsMuted ||\n (this.options.focusOnError === 'summary' && Boolean(this.summaryAddon));\n\n try {\n this.formErrors = Array.isArray(formErrors) ? formErrors.map(String) : [formErrors].filter(Boolean).map(String);\n Object.entries(fieldErrors).forEach(([name, message]) => {\n const field = this.fieldMap.get(name);\n if (!field || !message) {\n return;\n }\n\n const text = Array.isArray(message) ? String(message[0]) : String(message);\n field.setServerMessage(text);\n this.renderer.render(field, text);\n this.state.updateField(field.name, {\n valid: false,\n invalid: true,\n pending: false,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty,\n ignored: false,\n disabled: false\n });\n });\n } finally {\n this.inlineErrorAnnouncementsMuted = previousInlineErrorAnnouncementsMuted;\n }\n\n this.state.setFormState('invalid');\n this.emit(EVENTS.afterValidate, { valid: false, errors: this.getErrors() });\n this.emit(EVENTS.formInvalid, { errors: this.getErrors() });\n return this;\n }\n\n getErrors(): ValidatorErrors {\n const fields = Object.fromEntries(\n this.fields\n .filter((field) => field.lastError)\n .map((field) => [field.name, field.lastError])\n );\n\n return {\n fields,\n form: [...this.formErrors]\n };\n }\n\n getState(): ValidationStateSnapshot {\n return this.state.snapshot();\n }\n\n enable(): this {\n this.enabled = true;\n return this;\n }\n\n disable(): this {\n this.enabled = false;\n return this;\n }\n\n focusOnError(): void {\n if (this.options.focusOnError === false) {\n return;\n }\n\n if (this.options.focusOnError === 'summary' && this.summaryAddon?.hasErrors()) {\n this.summaryAddon.focus();\n return;\n }\n\n const firstInvalidField = this.fields.find((field) => field.lastError);\n firstInvalidField?.focus();\n }\n\n destroy(): void {\n if (this.destroyed) {\n return;\n }\n\n this.destroyed = true;\n if (this.abortController) {\n this.abortController.abort();\n } else {\n this.form.removeEventListener('submit', this.onSubmit);\n this.form.removeEventListener('focusout', this.onFocusOut);\n this.form.removeEventListener('input', this.onInput);\n this.form.removeEventListener('change', this.onChange);\n }\n\n this.timers.forEach((timer) => clearTimeout(timer));\n this.timers.clear();\n this.renderer.destroy?.();\n this.addons.forEach((addon) => addon.destroy?.());\n this.fields.forEach((field) => field.destroy());\n this.form.classList.remove(CLASSES.initialized);\n if (this.addedRootClass) {\n this.form.classList.remove(CLASSES.root);\n }\n if (this.addedNoValidate) {\n this.form.removeAttribute('novalidate');\n }\n\n this.emit(EVENTS.destroy);\n A11yFormValidator.instances.delete(this.form);\n }\n}\n\nexport function createFormValidator(\n form: HTMLFormElement,\n options: A11yFormValidatorOptionsInput = {}\n): A11yFormValidatorInstance {\n return new A11yFormValidator(form, options);\n}\n\nexport function initFormValidators(\n options: A11yFormValidatorOptionsInput = {},\n root?: ParentNode\n): A11yFormValidatorInstance[] {\n const scope = root || globalThis.document;\n if (!scope) {\n return [];\n }\n\n return Array.from(scope.querySelectorAll(SELECTORS.initAll))\n .filter((element): element is HTMLFormElement => element instanceof HTMLFormElement)\n .map((form) => createFormValidator(form, options));\n}\n\nexport default A11yFormValidator;\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ function e({value:e}){return{valid:Array.isArray(e)?e.length>0:!!e,messageKey:`checked`}}var t=e;const n=/([a-z0-9])([A-Z])/g;function r(e){let t=String(e||`field`),n=``,r=!1;for(let e of t){if(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e>=`0`&&e<=`9`||e===`_`||e===`-`){n+=e,r=!1;continue}r||=(n+=`-`,!0)}for(;n.startsWith(`-`);)n=n.slice(1);for(;n.endsWith(`-`);)n=n.slice(0,-1);return n||`field`}function i(e){let t=String(e||``);return globalThis.CSS?.escape?globalThis.CSS.escape(t):t.replace(/[^a-zA-Z0-9_-]/g,e=>`\\${e}`)}function a(e,t=`a11y-form-validator-field`){if(e.id)return e.id;let n=e.name||e.getAttribute(`name`)||``,i=n?r(n):``,a=e.ownerDocument,o=i?`${t}-${i}`:t,s=2;for(;a.getElementById(o);)o=`${t}-${i}-${s}`,s+=1;return e.id=o,o}function o(e){return(e?.ownerDocument?.defaultView||globalThis).matchMedia?.(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`}function s(e=``){return String(e).replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}function c(e=``){return String(e).replace(n,`$1-$2`).toLowerCase()}function l(e){return Array.isArray(e)?e:e==null||e===!1?[]:[e]}function u(e,t,n={}){let r=typeof e==`number`?e:Number.parseInt(String(e),10);return!Number.isFinite(r)||n.min!==void 0&&r<n.min||n.max!==void 0&&r>n.max?t:r}function d(e,t={}){let n={...e,...t};return n.ignore={...e.ignore||{},...t.ignore||{}},n.selectors={...e.selectors||{},...t.selectors||{}},n.messages=t?.messages||e.messages,n.locales=t?.locales||e.locales,n.rules=t?.rules||e.rules,n.addons=l(t.addons??e.addons),n.validateOn=l(t.validateOn??e.validateOn),n.debounce=Number(t.debounce??e.debounce),n}function f(e){return e?Array.isArray(e)?e.reduce((e,t)=>({...e,...f(t)}),{}):typeof e==`object`?{...e}:String(e).split(/\s+/).filter(Boolean).reduce((e,t)=>{let[n,r]=t.split(`:`),i=s(n);if(!i)return e;if(r==null||r===``)return e[i]=!0,e;let a=Number(r);return e[i]=Number.isNaN(a)?r:a,e},{}):{}}function p(e){return[...new Set(e.filter(Boolean))]}function m(e){return Array.isArray(e)||typeof FileList<`u`&&e instanceof FileList||e&&typeof e==`object`&&`length`in e&&typeof e.length==`number`?e.length===0:typeof e==`boolean`?e===!1:String(e??``).trim()===``}function h(e,t={}){let n=String(e),r=``;for(let e=0;e<n.length;e+=1){let i=n[e];if(i!==`{`){r+=i;continue}let a=n.indexOf(`}`,e+1);if(a===-1){r+=i;continue}let o=t[n.slice(e+1,a).trim()];r+=o==null?``:String(o),e=a}return r}function g(e,t){if(e===!0||e==null||e===!1)return{};if(typeof e==`object`&&!Array.isArray(e))return e;if(typeof e==`number`){if(t===`minLength`||t===`min`)return{min:e};if(t===`maxLength`||t===`max`)return{max:e}}if(typeof e==`string`){if(t===`sameAs`)return{selector:e};if(t===`pattern`)return{pattern:e}}return{value:e}}const _=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;function v({value:e}){return m(e)?{valid:!0,messageKey:`email`}:{valid:_.test(String(e).trim()),messageKey:`email`}}var y=v;function b({value:e,options:t}){let n=u(t.max,1/0,{min:0});return m(e)?{valid:!0,messageKey:`maxLength`,params:{max:n}}:{valid:(Array.isArray(e)?e.length:String(e).length)<=n,messageKey:`maxLength`,params:{max:n}}}var x=b;function S({value:e,options:t}){let n=u(t.min,0,{min:0});return m(e)?{valid:!0,messageKey:`minLength`,params:{min:n}}:{valid:(Array.isArray(e)?e.length:String(e).length)>=n,messageKey:`minLength`,params:{min:n}}}var C=S;function w({value:e,options:t}){if(m(e))return{valid:!0,messageKey:`pattern`};try{return{valid:new RegExp(String(t.pattern||``)).test(String(e)),messageKey:`pattern`}}catch{return{valid:!0,messageKey:`pattern`,metadata:{ignoredInvalidPattern:!0}}}}var T=w;function E({value:e}){return{valid:!m(e),messageKey:`required`}}var D=E;function O({field:e,form:t,value:n,options:r}){if(m(n))return{valid:!0,messageKey:`sameAs`,params:{targetLabel:``}};let i=String(r.selector||`[name="${r.field||``}"]`),a=null;try{a=i?t.querySelector(i):null}catch{a=null}let o=a instanceof HTMLInputElement||a instanceof HTMLSelectElement||a instanceof HTMLTextAreaElement?a.value:``;return{valid:a?String(n)===String(o):!1,messageKey:`sameAs`,params:{targetLabel:e.getTargetLabel(a)}}}var k=O,A=class{validator;constructor(e){this.validator=e}getNode(e){return this.validator.form.querySelector(`#${e.errorId}`)}shouldRenderInline(){return this.validator.options.errorMode!==`native`}syncAnnouncementAttributes(e){if(this.validator.shouldAnnounceInlineErrors()){e.setAttribute(`role`,`status`),e.setAttribute(`aria-live`,`polite`),e.setAttribute(`aria-atomic`,`true`);return}e.removeAttribute(`role`),e.removeAttribute(`aria-live`),e.removeAttribute(`aria-atomic`)}setNativeMessage(e,t){e.elements.forEach(e=>{e.setCustomValidity?.(t||``)})}getInsertionTarget(e){if(e.isGroupedChoice){let t=e.primaryElement.closest(`fieldset`);if(t&&this.validator.form.contains(t))return t}let t=e.primaryElement.closest(`label`);return t&&this.validator.form.contains(t)?t:e.primaryElement}render(e,t){this.setNativeMessage(e,t);let n=this.shouldRenderInline();if(n?e.connectDescription(e.errorId):e.disconnectDescription(e.errorId),e.setAriaInvalid(!0,n?e.errorId:``),e.setVisualState(`invalid`),!n)return;let r=this.getNode(e);r||(r=this.validator.form.ownerDocument.createElement(`div`),r.id=e.errorId,r.className=`a11y-form-validator__error`,this.getInsertionTarget(e).insertAdjacentElement(`afterend`,r)),this.syncAnnouncementAttributes(r),r.textContent=t}clear(e){let t=this.getNode(e);t&&t.remove(),this.setNativeMessage(e,``),e.disconnectDescription(e.errorId),e.setAriaInvalid(!1),e.setVisualState(`valid`)}destroy(){this.validator.fields.forEach(e=>this.clear(e))}},j=class{target;constructor(e){this.target=e}emit(e,t={}){this.target.dispatchEvent(new CustomEvent(e,{bubbles:!0,detail:t}))}on(e,t){return this.target.addEventListener(e,t),()=>this.off(e,t)}off(e,t){this.target.removeEventListener(e,t)}};function M(e){return`labels`in e&&e.labels?e.labels:[]}var N=class{validator;name;elements;primaryElement;type;isGroupedChoice;errorId;primaryId;initialDescribedBy;generatedPrimaryId;serverMessage;lastError;touched;dirty;constructor(e,t,n){this.validator=e,this.name=t,this.elements=[...n],this.primaryElement=this.elements[0],this.type=this.detectType(),this.isGroupedChoice=this.elements.length>1&&[`radio`,`checkbox`].includes(this.type),this.errorId=`a11y-form-validator-error-${r(this.validator.form.id||`form`)}-${r(this.name)}`,this.generatedPrimaryId=!this.primaryElement.id,this.primaryId=a(this.primaryElement),this.initialDescribedBy=new Map(this.elements.map(e=>[e,e.getAttribute(`aria-describedby`)||``])),this.serverMessage=``,this.lastError=``,this.touched=!1,this.dirty=!1}detectType(){let e=this.primaryElement.tagName.toLowerCase();return e===`textarea`?`textarea`:e===`select`?this.primaryElement.multiple?`select-multiple`:`select`:(this.primaryElement.getAttribute(`type`)||`text`).toLowerCase()}getActiveElements(){return this.elements.filter(e=>!e.disabled)}isDisabled(){return this.getActiveElements().length===0}isHidden(){return this.elements.every(e=>e instanceof HTMLInputElement&&e.type===`hidden`||e.hidden?!0:!!e.closest(`[hidden]`))}shouldIgnore(){let{ignore:e,validateHidden:t}=this.validator.options;return e.disabled!==!1&&this.isDisabled()?`disabled`:!t&&e.hidden!==!1&&this.isHidden()?`hidden`:e.selector&&this.elements.some(t=>t.matches(e.selector))?`selector`:!1}getValue(){let e=this.getActiveElements();if(this.type===`radio`){let t=e.find(e=>e instanceof HTMLInputElement&&e.checked);return t?t.value:``}return this.type===`checkbox`&&this.elements.length>1?e.filter(e=>e instanceof HTMLInputElement&&e.checked).map(e=>e.value):this.type===`checkbox`?this.primaryElement instanceof HTMLInputElement?!!this.primaryElement.checked:!1:this.type===`file`?this.primaryElement instanceof HTMLInputElement?Array.from(this.primaryElement.files||[]):[]:this.type===`select-multiple`&&this.primaryElement instanceof HTMLSelectElement?Array.from(this.primaryElement.selectedOptions).map(e=>e.value):this.primaryElement.value}getFieldConfig(){return this.validator.options.rules?.[this.name]||{}}getDataMessage(e){return this.primaryElement.dataset[`message${e.charAt(0).toUpperCase()}${e.slice(1)}`]||this.primaryElement.getAttribute(`data-message-${c(e)}`)||``}getLabel(){let e=this.primaryElement.closest(`fieldset`);if(this.isGroupedChoice&&e){let t=e.querySelector(`legend`);if(t)return t.textContent?.trim()||this.name}let t=this.primaryElement.id;if(t){let e=`label[for="${i(t)}"]`,n=this.validator.form.querySelector(e)||this.validator.form.ownerDocument.querySelector(e);if(n)return n.textContent?.trim()||this.name}let n=this.primaryElement.closest(`label`);return n&&n.textContent?.trim()||this.name}getTargetLabel(e){if(!e)return``;let t=M(e);if(t.length)return t[0].textContent?.trim()||``;if(e.id){let t=this.validator.form.querySelector(`label[for="${i(e.id)}"]`);if(t)return t.textContent?.trim()||``}return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?e.name||e.id||``:e.id||``}getDescribedBy(){return p(this.elements.flatMap(e=>String(e.getAttribute(`aria-describedby`)||``).split(/\s+/)))}connectDescription(e){this.elements.forEach(t=>{let n=String(this.initialDescribedBy.get(t)||``).split(/\s+/),r=String(t.getAttribute(`aria-describedby`)||``).split(/\s+/),i=p([...n,...r,e]);i.length&&t.setAttribute(`aria-describedby`,i.join(` `))})}disconnectDescription(e){this.elements.forEach(t=>{let n=String(this.initialDescribedBy.get(t)||``).split(/\s+/),r=String(t.getAttribute(`aria-describedby`)||``).split(/\s+/),i=p([...n,...r].filter(t=>t&&t!==e));i.length?t.setAttribute(`aria-describedby`,i.join(` `)):t.removeAttribute(`aria-describedby`)})}setAriaInvalid(e,t=this.errorId){this.elements.forEach(n=>{e?(n.setAttribute(`aria-invalid`,`true`),t?n.setAttribute(`aria-errormessage`,t):n.removeAttribute(`aria-errormessage`)):(n.removeAttribute(`aria-invalid`),n.removeAttribute(`aria-errormessage`))})}setVisualState(e){this.elements.forEach(t=>{t.dataset.validationState=e,t.classList.toggle(`is-valid`,e===`valid`),t.classList.toggle(`is-invalid`,e===`invalid`),t.classList.toggle(`is-pending`,e===`pending`),t.classList.toggle(`is-touched`,this.touched),t.classList.toggle(`is-dirty`,this.dirty),t.classList.toggle(`is-disabled`,this.isDisabled())})}clearVisualState(){this.elements.forEach(e=>{delete e.dataset.validationState,e.classList.remove(`is-valid`,`is-invalid`,`is-pending`,`is-touched`,`is-dirty`,`is-disabled`)})}focus(){this.primaryElement.focus({preventScroll:!0}),this.primaryElement.scrollIntoView?.({block:`center`,behavior:o(this.primaryElement)})}markTouched(){this.touched=!0}markDirty(){this.dirty=!0}clearServerMessage(){this.serverMessage=``}setServerMessage(e){this.serverMessage=e,this.lastError=e}getRules(){let e=this.getNativeRules(),t=this.getDataRules(),n=f(this.getFieldConfig());return{...e,...t,...n}}getNativeRules(){if(!this.validator.options.useNativeRules)return{};let e={},t=[`checkbox`,`radio`].includes(this.type)?`checked`:`required`;this.elements.some(e=>e.hasAttribute(`required`))&&(e[t]=!0),this.type===`email`&&(e.email=!0);let n=u(this.primaryElement.getAttribute(`minlength`)??void 0,NaN,{min:0});Number.isFinite(n)&&(e.minLength={min:n});let r=u(this.primaryElement.getAttribute(`maxlength`)??void 0,NaN,{min:0});Number.isFinite(r)&&(e.maxLength={max:r});let i=this.primaryElement.getAttribute(`pattern`);return i&&(e.pattern={pattern:i}),e}getDataRules(){let e=f(this.primaryElement.dataset.validate);this.primaryElement.dataset.required===`true`&&(e.required=!0),this.primaryElement.dataset.checked===`true`&&(e.checked=!0);let t=u(this.primaryElement.dataset.minLength,NaN,{min:0});Number.isFinite(t)&&(e.minLength={min:t});let n=u(this.primaryElement.dataset.maxLength,NaN,{min:0});return Number.isFinite(n)&&(e.maxLength={max:n}),this.primaryElement.dataset.pattern&&(e.pattern={pattern:this.primaryElement.dataset.pattern}),this.primaryElement.dataset.sameAs&&(e.sameAs={selector:this.primaryElement.dataset.sameAs}),Object.fromEntries(Object.entries(e).map(([e,t])=>[e,g(t,e)]))}getValidationContext(e,t,n){return{field:this,form:this.validator.form,value:this.getValue(),options:g(t,e),allValues:n,validator:this.validator}}getNativeValidationMessage(){return typeof this.primaryElement.validationMessage==`string`?this.primaryElement.validationMessage:``}destroy(){this.clearServerMessage(),this.lastError=``,this.setAriaInvalid(!1),this.clearVisualState(),this.elements.forEach(e=>{let t=this.initialDescribedBy.get(e);t?e.setAttribute(`aria-describedby`,t):e.removeAttribute(`aria-describedby`)}),this.generatedPrimaryId&&this.primaryElement.id===this.primaryId&&this.primaryElement.removeAttribute(`id`)}},P={required:`This field is required.`,email:`Enter a valid email address.`,minLength:`Enter at least {min} characters.`,maxLength:`Enter no more than {max} characters.`,pattern:`Enter a value in the correct format.`,checked:`Select this option to continue.`,sameAs:`This value must match {targetLabel}.`,summaryTitleOne:`There is 1 problem with your form.`,summaryTitleOther:`There are {count} problems with your form.`,summaryItem:`{fieldLabel}: {message}`,genericFallback:`Check this field.`},F=class{validator;defaultMessages;constructor(e){this.validator=e,this.defaultMessages=P}detectLocale(){let e=this.validator.options.locale,t=this.validator.form.getAttribute(`lang`),n=this.validator.form.ownerDocument.documentElement.getAttribute(`lang`);return e||t||n||`en`}getLocaleCandidates(e=this.detectLocale()){let t=[];if(e){t.push(e);let[n]=e.split(`-`);n&&n!==e&&t.push(n)}return t.push(`en`),[...new Set(t.filter(Boolean))]}getLocaleMessage(e){let t=this.getLocaleCandidates(),n=this.validator.options.locales||{};for(let r of t){let t=n[r];if(t&&t[e]!=null)return t[e]}return this.validator.options.messages?.[e]==null?this.defaultMessages[e]:this.validator.options.messages[e]}resolveValue(e,t){return typeof e==`function`?e(t):typeof e==`string`?h(e,t.params):``}getSummaryTitle(e){let t=e===1?`summaryTitleOne`:`summaryTitleOther`,n=this.getLocaleMessage(t)||this.getLocaleMessage(`summaryTitle`);return this.resolveValue(n,{field:null,fieldName:``,fieldLabel:``,form:this.validator.form,rule:t,value:e,params:{count:e},locale:this.detectLocale()})||`There ${e===1?`is`:`are`} ${e} problem${e===1?``:`s`} with your form.`}getSummaryItem(e,t){let n=e.getLabel(),r={label:n,fieldLabel:n,fieldName:e.name,message:t},i=this.validator.options.messages?.summaryItem??this.getLocaleMessage(`summaryItem`),a={field:e,fieldName:e.name,fieldLabel:n,form:this.validator.form,rule:`summaryItem`,value:t,params:r,locale:this.detectLocale()};return this.resolveValue(i,a)||`${n}: ${t}`}resolve(e,t,n){let r=e.primaryElement,i=e.getLabel(),a={...n.params,label:i,fieldLabel:i,targetLabel:n.params?.targetLabel||``,value:e.getValue()},o={field:e,fieldName:e.name,fieldLabel:i,form:this.validator.form,rule:t,value:e.getValue(),params:a,locale:this.detectLocale()},s=this.validator.options.messages?.fields,c=this.validator.options.errorMode===`native`||!!n.nativeMessage,l=[e.serverMessage,e.getDataMessage(t),s?.[e.name]?.[t],this.validator.options.messages?.[t],n.message,c?n.nativeMessage:``,c&&r.validity?.valid===!1?e.getNativeValidationMessage():``,this.getLocaleMessage(n.messageKey||t),this.defaultMessages[n.messageKey||t],this.defaultMessages.genericFallback,`Check this field.`];for(let e of l){let t=this.resolveValue(e,o);if(t)return t}return`Check this field.`}},I=class{rules;constructor(){this.rules=new Map}register(e,t){return this.rules.set(e,t),this}unregister(e){return this.rules.delete(e),this}has(e){return this.rules.has(e)}async run(e,t){let n=this.rules.get(e);if(!n)return{valid:!0,messageKey:e,params:{}};let r=await n(t);return this.normalize(e,r)}normalize(e,t){return t==null||t===!0?{valid:!0,messageKey:e,params:{}}:t===!1?{valid:!1,messageKey:e,params:{}}:typeof t==`string`?{valid:!1,messageKey:e,message:t,params:{}}:{valid:!!t.valid,messageKey:t.messageKey||e,message:t.message,params:t.params||{},metadata:t.metadata||{},nativeMessage:t.nativeMessage}}},L=class{formState;fieldStates;constructor(){this.formState=`idle`,this.fieldStates=new Map}ensure(e){return this.fieldStates.has(e)||this.fieldStates.set(e,{pristine:!0,dirty:!1,touched:!1,pending:!1,valid:!1,invalid:!1,disabled:!1,ignored:!1}),this.fieldStates.get(e)}updateField(e,t){let n=this.ensure(e);return this.fieldStates.set(e,{...n,...t}),this.fieldStates.get(e)}setFormState(e){this.formState=e}snapshot(){return{form:this.formState,fields:Object.fromEntries(this.fieldStates.entries())}}};const R=`a11y-form-validator`,z=Object.freeze({init:`${R}:init`,beforeValidate:`${R}:before-validate`,afterValidate:`${R}:after-validate`,fieldValid:`${R}:field-valid`,fieldInvalid:`${R}:field-invalid`,formValid:`${R}:form-valid`,formInvalid:`${R}:form-invalid`,submitBlocked:`${R}:submit-blocked`,destroy:`${R}:destroy`}),B=Object.freeze({fields:`input, select, textarea`,initAll:`[data-a11y-form-validator]`}),V=Object.freeze({root:R,initialized:`is-initialized`}),H=Object.freeze({describedBy:`aria-describedby`,errorMessage:`aria-errormessage`,hidden:`hidden`,invalid:`aria-invalid`,noValidate:`novalidate`,validationState:`data-validation-state`}),U=Object.freeze({validateOn:[`submit`],focusOnError:`summary`,errorMode:`inline`,useNativeRules:!0,disableNativeUI:!0,validateHidden:!1,ignore:Object.freeze({disabled:!0,hidden:!0,selector:``}),debounce:150,messages:Object.freeze({}),locales:Object.freeze({}),locale:``,selectors:Object.freeze({fields:B.fields}),addons:[],renderer:null,rules:Object.freeze({})});var W=class e{static instances=new WeakMap;form;options;events;state;ruleRegistry;messageResolver;renderer;fields;fieldMap;enabled;hasSubmitted;formErrors;summaryAddon;addons;timers;addedRootClass;addedNoValidate;abortController;validationRuns;destroyed;inlineErrorAnnouncementsMuted;onSubmit;onFocusOut;onInput;onChange;constructor(t,n={}){if(!(t instanceof HTMLFormElement))throw TypeError(`A11yFormValidator expects an HTMLFormElement.`);let r=e.instances.get(t);if(r)return r;e.instances.set(t,this),this.form=t,this.options=this.normalizeOptions(n),this.events=new j(this.form),this.state=new L,this.ruleRegistry=new I,this.messageResolver=new F(this),this.renderer=this.options.renderer||new A(this),this.fields=[],this.fieldMap=new Map,this.enabled=!0,this.hasSubmitted=!1,this.formErrors=[],this.summaryAddon=null,this.addons=[],this.timers=new Map,this.addedRootClass=!this.form.classList.contains(V.root),this.addedNoValidate=this.options.disableNativeUI&&this.options.errorMode!==`native`&&!this.form.hasAttribute(`novalidate`);let i=this.form.ownerDocument.defaultView?.AbortController||globalThis.AbortController;this.abortController=i?new i:null,this.validationRuns=new Map,this.destroyed=!1,this.inlineErrorAnnouncementsMuted=!1,this.onSubmit=this.handleSubmit.bind(this),this.onFocusOut=this.handleFocusOut.bind(this),this.onInput=this.handleInput.bind(this),this.onChange=this.handleChange.bind(this),this.registerDefaultRules(),this.form.classList.add(V.root,V.initialized),this.addedNoValidate&&this.form.setAttribute(`novalidate`,`novalidate`),this.refresh(),this.bindEvents(),this.installAddons(),this.emit(z.init)}static getInstance(t){return e.instances.get(t)}normalizeOptions(e){let t=d(U,e);return{...t,validateOn:l(t.validateOn),addons:l(t.addons),debounce:u(t.debounce,U.debounce,{min:0}),ignore:{...U.ignore,...e.ignore||{}},selectors:{...U.selectors,...e.selectors||{}},messages:e.messages||U.messages,locales:e.locales||U.locales,rules:e.rules||U.rules}}emit(e,t={}){this.events.emit(e,{instance:this,validator:this,...t})}shouldAnnounceInlineErrors(){return!this.inlineErrorAnnouncementsMuted}shouldMuteInlineErrorsForBatch(e){return e===`submit`&&this.options.focusOnError===`summary`&&!!this.summaryAddon}registerDefaultRules(){this.registerRule(`required`,D),this.registerRule(`email`,y),this.registerRule(`minLength`,C),this.registerRule(`maxLength`,x),this.registerRule(`pattern`,T),this.registerRule(`checked`,t),this.registerRule(`sameAs`,k)}registerRule(e,t){return this.ruleRegistry.register(e,t),this}unregisterRule(e){return this.ruleRegistry.unregister(e),this}installAddons(){this.addons=l(this.options.addons).filter(e=>!!e&&typeof e==`object`&&typeof e.install==`function`),this.addons.forEach(e=>e.install(this))}collectFields(){let e=Array.from(this.form.querySelectorAll(this.options.selectors.fields)).filter(e=>e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement).filter(e=>e.name||e.id),t=e.reduce((e,t)=>{let n=t.name||t.id;return e.set(n,(e.get(n)||0)+1),e},new Map),n=new Map;return e.forEach(e=>{let r=e.name||e.id,i=(e.type||e.tagName).toLowerCase(),a=i===`radio`||i===`checkbox`&&(t.get(r)||0)>1;n.has(r)||n.set(r,[]);let o=n.get(r);if(a){o.push(e);return}o.length===0&&o.push(e)}),[...n.entries()].map(([e,t])=>new N(this,e,t))}refresh(){return this.fields=this.collectFields(),this.fieldMap=new Map(this.fields.map(e=>[e.name,e])),this.fields.forEach(e=>this.state.ensure(e.name)),this}bindEvents(){let e=this.abortController?{signal:this.abortController.signal}:void 0;this.form.addEventListener(`submit`,this.onSubmit,e),this.form.addEventListener(`focusout`,this.onFocusOut,e),this.form.addEventListener(`input`,this.onInput,e),this.form.addEventListener(`change`,this.onChange,e)}async handleSubmit(e){!this.enabled||!this.options.validateOn.includes(`submit`)||(this.hasSubmitted=!0,await this.validate({reason:`submit`})||(e.preventDefault(),this.emit(z.submitBlocked,{errors:this.getErrors()}),this.focusOnError()))}handleFocusOut(e){let t=this.findFieldByElement(e.target);t&&(t.markTouched(),(this.options.validateOn.includes(`blur`)||this.hasSubmitted)&&this.validateField(t,{reason:`blur`}))}handleInput(e){let t=this.findFieldByElement(e.target);t&&(t.markDirty(),t.clearServerMessage(),this.formErrors=[],this.options.validateOn.includes(`input`)?this.queueValidation(t,`input`):t.lastError&&!t.serverMessage&&(this.renderer.clear(t),t.lastError=``))}handleChange(e){let t=this.findFieldByElement(e.target);t&&(t.markDirty(),t.clearServerMessage(),this.options.validateOn.includes(`change`)&&this.validateField(t,{reason:`change`}))}queueValidation(e,t){clearTimeout(this.timers.get(e.name));let n=setTimeout(()=>{this.validateField(e,{reason:t}),this.timers.delete(e.name)},this.options.debounce);this.timers.set(e.name,n)}findFieldByElement(e){if(e instanceof HTMLElement)return this.fields.find(t=>t.elements.some(t=>t===e))}resolveField(e){return e instanceof N?e:typeof e==`string`?this.fieldMap.get(e)||null:e instanceof HTMLElement&&this.findFieldByElement(e)||null}getAllValues(){return Object.fromEntries(this.fields.map(e=>[e.name,e.getValue()]))}async validate(e={}){let t=e.reason||`manual`,n=this.inlineErrorAnnouncementsMuted;this.inlineErrorAnnouncementsMuted=n||this.shouldMuteInlineErrorsForBatch(t);try{this.emit(z.beforeValidate,{reason:t}),this.state.setFormState(`validating`);let n=(await Promise.all(this.fields.map(t=>this.validateField(t,e)))).every(Boolean)&&this.formErrors.length===0;return this.state.setFormState(n?`valid`:`invalid`),this.emit(z.afterValidate,{valid:n,errors:this.getErrors()}),this.emit(n?z.formValid:z.formInvalid,{errors:this.getErrors()}),n}finally{this.inlineErrorAnnouncementsMuted=n}}async validateField(e,t={}){let n=this.resolveField(e);if(!n)return!0;let r=n.shouldIgnore();if(r)return n.lastError=``,this.renderer.clear(n),this.state.updateField(n.name,{ignored:r!==`disabled`,disabled:r===`disabled`,valid:!0,invalid:!1,pending:!1,touched:n.touched,dirty:n.dirty,pristine:!n.dirty}),!0;if(n.serverMessage)return this.renderer.render(n,n.serverMessage),this.state.updateField(n.name,{valid:!1,invalid:!0,pending:!1,touched:n.touched,dirty:n.dirty,pristine:!n.dirty}),this.emit(z.fieldInvalid,{field:n,message:n.serverMessage,reason:t.reason||`manual`}),!1;let i=(this.validationRuns.get(n.name)||0)+1;this.validationRuns.set(n.name,i),n.setVisualState(`pending`),this.state.updateField(n.name,{pending:!0,touched:n.touched,dirty:n.dirty,pristine:!n.dirty});let a=n.getRules(),o=this.getAllValues();for(let[e,r]of Object.entries(a)){let a=await this.ruleRegistry.run(e,n.getValidationContext(e,r,o));if(this.validationRuns.get(n.name)!==i)return!n.lastError;if(!a.valid){let r=this.messageResolver.resolve(n,e,a);return n.lastError=r,this.renderer.render(n,r),this.state.updateField(n.name,{valid:!1,invalid:!0,pending:!1,touched:n.touched,dirty:n.dirty,pristine:!n.dirty,ignored:!1,disabled:!1}),this.emit(z.fieldInvalid,{field:n,message:r,reason:t.reason||`manual`}),!1}}return n.lastError=``,this.renderer.clear(n),this.state.updateField(n.name,{valid:!0,invalid:!1,pending:!1,touched:n.touched,dirty:n.dirty,pristine:!n.dirty,ignored:!1,disabled:!1}),this.emit(z.fieldValid,{field:n,reason:t.reason||`manual`}),!0}reset(){return this.form.reset(),this.hasSubmitted=!1,this.clearErrors(),this.fields.forEach(e=>{e.dirty=!1,e.touched=!1,e.setVisualState(`valid`),this.state.updateField(e.name,{pristine:!0,dirty:!1,touched:!1,pending:!1,valid:!1,invalid:!1,disabled:!1,ignored:!1})}),this.state.setFormState(`idle`),this}clearErrors(){return this.formErrors=[],this.fields.forEach(e=>{e.clearServerMessage(),e.lastError=``,this.renderer.clear(e)}),this.emit(z.afterValidate,{valid:!0,errors:this.getErrors()}),this}setErrors(e={}){this.clearErrors();let t=e.fields||Object.fromEntries(Object.entries(e).filter(([e])=>![`form`,`_form`,`fields`].includes(e))),n=e.form||e._form||[],r=this.inlineErrorAnnouncementsMuted;this.inlineErrorAnnouncementsMuted=r||this.options.focusOnError===`summary`&&!!this.summaryAddon;try{this.formErrors=Array.isArray(n)?n.map(String):[n].filter(Boolean).map(String),Object.entries(t).forEach(([e,t])=>{let n=this.fieldMap.get(e);if(!n||!t)return;let r=Array.isArray(t)?String(t[0]):String(t);n.setServerMessage(r),this.renderer.render(n,r),this.state.updateField(n.name,{valid:!1,invalid:!0,pending:!1,touched:n.touched,dirty:n.dirty,pristine:!n.dirty,ignored:!1,disabled:!1})})}finally{this.inlineErrorAnnouncementsMuted=r}return this.state.setFormState(`invalid`),this.emit(z.afterValidate,{valid:!1,errors:this.getErrors()}),this.emit(z.formInvalid,{errors:this.getErrors()}),this}getErrors(){return{fields:Object.fromEntries(this.fields.filter(e=>e.lastError).map(e=>[e.name,e.lastError])),form:[...this.formErrors]}}getState(){return this.state.snapshot()}enable(){return this.enabled=!0,this}disable(){return this.enabled=!1,this}focusOnError(){if(this.options.focusOnError!==!1){if(this.options.focusOnError===`summary`&&this.summaryAddon?.hasErrors()){this.summaryAddon.focus();return}this.fields.find(e=>e.lastError)?.focus()}}destroy(){this.destroyed||(this.destroyed=!0,this.abortController?this.abortController.abort():(this.form.removeEventListener(`submit`,this.onSubmit),this.form.removeEventListener(`focusout`,this.onFocusOut),this.form.removeEventListener(`input`,this.onInput),this.form.removeEventListener(`change`,this.onChange)),this.timers.forEach(e=>clearTimeout(e)),this.timers.clear(),this.renderer.destroy?.(),this.addons.forEach(e=>e.destroy?.()),this.fields.forEach(e=>e.destroy()),this.form.classList.remove(V.initialized),this.addedRootClass&&this.form.classList.remove(V.root),this.addedNoValidate&&this.form.removeAttribute(`novalidate`),this.emit(z.destroy),e.instances.delete(this.form))}};function G(e,t={}){return new W(e,t)}function K(e={},t){let n=t||globalThis.document;return n?Array.from(n.querySelectorAll(B.initAll)).filter(e=>e instanceof HTMLFormElement).map(t=>G(t,e)):[]}function q(e={}){return{validator:null,options:e,container:null,title:null,list:null,install(t){this.validator=t,this.options=e;let n=t.form.ownerDocument;this.container=n.createElement(`section`),this.container.className=`a11y-form-validator__summary`,this.container.hidden=!0,this.container.tabIndex=-1,this.title=n.createElement(`h2`),this.title.id=e.titleId||`${a(t.form,`a11y-form-validator-form`)}-summary-title`,this.title.className=`a11y-form-validator__summary-title`,this.container.setAttribute(`aria-labelledby`,this.title.id),this.list=n.createElement(`ul`),this.list.className=`a11y-form-validator__summary-list`,this.container.append(this.title,this.list),t.form.prepend(this.container),t.summaryAddon=this,this.unsubscribeAfterValidate=t.events.on(`a11y-form-validator:after-validate`,()=>this.update()),this.unsubscribeDestroy=t.events.on(`a11y-form-validator:destroy`,()=>this.destroy())},getErrors(){if(!this.validator)return[];let e=this.validator.fields.filter(e=>e.lastError).map(e=>({field:e,message:e.lastError}));return[...this.validator.formErrors.map((e,t)=>({field:null,message:e,key:`form-${t}`})),...e]},hasErrors(){return this.getErrors().length>0},update(){if(!this.container||!this.list||!this.title||!this.validator)return;let e=this.getErrors();if(this.list.replaceChildren(),!e.length){this.container.hidden=!0;return}this.title.textContent=this.validator.messageResolver.getSummaryTitle(e.length),e.forEach(e=>{let t=this.validator.form.ownerDocument.createElement(`li`);if(!e.field)t.textContent=e.message;else{let n=this.validator.form.ownerDocument.createElement(`a`);n.className=`a11y-form-validator__summary-link`,n.href=`#${e.field.primaryId}`,n.textContent=this.validator.messageResolver.getSummaryItem(e.field,e.message);let r=e.field;n.addEventListener(`click`,e=>{e.preventDefault(),r.focus()}),t.append(n)}this.list.append(t)}),this.container.hidden=!1},focus(){this.hasErrors()&&this.container&&(this.container.focus({preventScroll:!0}),this.container.scrollIntoView?.({block:`start`,behavior:o(this.container)}))},destroy(){this.unsubscribeAfterValidate?.(),this.unsubscribeDestroy?.(),this.container?.remove(),this.validator&&(this.validator.summaryAddon=null),this.container=null,this.title=null,this.list=null,this.validator=null}}}function J(){return{validateOn:[`submit`,`blur`],focusOnError:`summary`,errorMode:`both`,useNativeRules:!0,disableNativeUI:!0,addons:[q()]}}function Y(){return{validateOn:[`submit`,`blur`],focusOnError:`first-invalid`,errorMode:`both`,useNativeRules:!0,disableNativeUI:!0,addons:[]}}function X(){return{validateOn:[`submit`],focusOnError:`first-invalid`,errorMode:`inline`,useNativeRules:!0,disableNativeUI:!0}}export{W as A11yFormValidator,H as ATTRIBUTES,V as CLASSES,U as DEFAULT_OPTIONS,z as EVENTS,A as ErrorRenderer,j as EventEmitter,N as FieldController,F as MessageResolver,I as RuleRegistry,B as SELECTORS,L as ValidationState,J as createDefaultPreset,G as createFormValidator,X as createMinimalPreset,Y as createNoSummaryPreset,P as enMessages,K as initFormValidators};
2
+ //# sourceMappingURL=index.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.min.js","names":["output: Record<string, unknown>","target: Element | null","rules: RuleList","minLength","maxLength","pattern","enMessages","candidates: string[]","context: MessageResolverContext","requiredRule","emailRule","minLengthRule","maxLengthRule","patternRule","checkedRule","sameAsRule"],"sources":["../src/rules/checked.ts","../src/core/helpers.ts","../src/rules/email.ts","../src/rules/maxLength.ts","../src/rules/minLength.ts","../src/rules/pattern.ts","../src/rules/required.ts","../src/rules/same-as.ts","../src/core/ErrorRenderer.ts","../src/core/EventEmitter.ts","../src/core/FieldController.ts","../src/locales/en.json","../src/core/MessageResolver.ts","../src/core/RuleRegistry.ts","../src/core/ValidationState.ts","../src/core/A11yFormValidator.ts","../src/addons/error-summary.ts","../src/presets/default.ts","../src/presets/no-summary.ts","../src/presets/minimal.ts"],"sourcesContent":["import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\n\nexport function checkedRule({ value }: ValidationContext): ValidationResult {\n const isValid = Array.isArray(value) ? value.length > 0 : Boolean(value);\n return {\n valid: isValid,\n messageKey: 'checked'\n };\n}\n\nexport default checkedRule;\n","const RULE_NAME_PATTERN = /([a-z0-9])([A-Z])/g;\n\nexport type RuleOptions = Record<string, unknown>;\nexport type RuleList = Record<string, true | string | number | RuleOptions>;\n\nexport function sanitizeId(value: unknown): string {\n const input = String(value || 'field');\n let output = '';\n let previousWasDash = false;\n\n for (const character of input) {\n const isSafeCharacter =\n (character >= 'a' && character <= 'z') ||\n (character >= 'A' && character <= 'Z') ||\n (character >= '0' && character <= '9') ||\n character === '_' ||\n character === '-';\n\n if (isSafeCharacter) {\n output += character;\n previousWasDash = false;\n continue;\n }\n\n if (!previousWasDash) {\n output += '-';\n previousWasDash = true;\n }\n }\n\n while (output.startsWith('-')) {\n output = output.slice(1);\n }\n\n while (output.endsWith('-')) {\n output = output.slice(0, -1);\n }\n\n return output || 'field';\n}\n\n\nexport function escapeSelectorIdentifier(value: unknown): string {\n const input = String(value || '');\n if (globalThis.CSS?.escape) {\n return globalThis.CSS.escape(input);\n }\n\n return input.replace(/[^a-zA-Z0-9_-]/g, (character) => `\\\\${character}`);\n}\n\nexport function ensureElementId(element: HTMLElement, prefix = 'a11y-form-validator-field'): string {\n if (element.id) {\n return element.id;\n }\n\n const namedElement = element as HTMLElement & { name?: string };\n const rawBase = namedElement.name || element.getAttribute('name') || '';\n const base = rawBase ? sanitizeId(rawBase) : '';\n const root = element.ownerDocument;\n let id = base ? `${prefix}-${base}` : prefix;\n let index = 2;\n\n while (root.getElementById(id)) {\n id = `${prefix}-${base}-${index}`;\n index += 1;\n }\n\n element.id = id;\n return id;\n}\n\n\nexport function getPreferredScrollBehavior(element: Element): ScrollBehavior {\n const view = element?.ownerDocument?.defaultView || globalThis;\n return view.matchMedia?.('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth';\n}\n\nexport function kebabToCamelCase(value = ''): string {\n return String(value).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nexport function camelToKebabCase(value = ''): string {\n return String(value).replace(RULE_NAME_PATTERN, '$1-$2').toLowerCase();\n}\n\nexport function normalizeToArray<T>(value: T | T[] | null | undefined | false): T[] {\n if (Array.isArray(value)) {\n return value;\n }\n\n if (value == null || value === false) {\n return [];\n }\n\n return [value];\n}\n\nexport function toSafeBoolean(value: boolean | string | undefined, fallback: boolean): boolean {\n if (value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n return fallback;\n}\n\nexport function toSafeInteger(\n value: number | string | undefined,\n fallback: number,\n options: { min?: number; max?: number } = {}\n): number {\n const parsed = typeof value === 'number' ? value : Number.parseInt(String(value), 10);\n\n if (!Number.isFinite(parsed)) {\n return fallback;\n }\n\n if (options.min !== undefined && parsed < options.min) {\n return fallback;\n }\n\n if (options.max !== undefined && parsed > options.max) {\n return fallback;\n }\n\n return parsed;\n}\n\nexport function toSafeString(value: string | undefined, fallback: string): string {\n const normalized = String(value ?? '').trim();\n return normalized.length > 0 ? normalized : fallback;\n}\n\nexport function mergeOptions(\n defaults: Record<string, unknown>,\n overrides: Record<string, unknown> = {}\n): Record<string, unknown> {\n const output: Record<string, unknown> = { ...defaults, ...overrides };\n\n output.ignore = {\n ...((defaults.ignore as Record<string, unknown>) || {}),\n ...((overrides.ignore as Record<string, unknown>) || {})\n };\n\n output.selectors = {\n ...((defaults.selectors as Record<string, unknown>) || {}),\n ...((overrides.selectors as Record<string, unknown>) || {})\n };\n\n output.messages = overrides?.messages || defaults.messages;\n output.locales = overrides?.locales || defaults.locales;\n output.rules = overrides?.rules || defaults.rules;\n output.addons = normalizeToArray(overrides.addons ?? defaults.addons);\n output.validateOn = normalizeToArray(overrides.validateOn ?? defaults.validateOn);\n output.debounce = Number(overrides.debounce ?? defaults.debounce);\n\n return output;\n}\n\nexport function parseRuleList(value: unknown): RuleList {\n if (!value) {\n return {};\n }\n\n if (Array.isArray(value)) {\n return value.reduce<RuleList>((rules, rule) => ({ ...rules, ...parseRuleList(rule) }), {});\n }\n\n if (typeof value === 'object') {\n return { ...(value as RuleList) };\n }\n\n return String(value)\n .split(/\\s+/)\n .filter(Boolean)\n .reduce<RuleList>((rules, ruleToken) => {\n const [rawName, rawParam] = ruleToken.split(':');\n const ruleName = kebabToCamelCase(rawName);\n if (!ruleName) {\n return rules;\n }\n\n if (rawParam == null || rawParam === '') {\n rules[ruleName] = true;\n return rules;\n }\n\n const numericValue = Number(rawParam);\n rules[ruleName] = Number.isNaN(numericValue) ? rawParam : numericValue;\n return rules;\n }, {});\n}\n\nexport function unique(values: string[]): string[] {\n return [...new Set(values.filter(Boolean))];\n}\n\nexport function isEmptyValue(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (typeof FileList !== 'undefined' && value instanceof FileList) {\n return value.length === 0;\n }\n\n if (value && typeof value === 'object' && 'length' in value && typeof value.length === 'number') {\n return value.length === 0;\n }\n\n if (typeof value === 'boolean') {\n return value === false;\n }\n\n return String(value ?? '').trim() === '';\n}\n\nexport function applyPlaceholders(template: string, params: Record<string, unknown> = {}): string {\n const input = String(template);\n let output = '';\n\n for (let index = 0; index < input.length; index += 1) {\n const character = input[index];\n if (character !== '{') {\n output += character;\n continue;\n }\n\n const closingIndex = input.indexOf('}', index + 1);\n if (closingIndex === -1) {\n output += character;\n continue;\n }\n\n const key = input.slice(index + 1, closingIndex).trim();\n const replacement = params[key];\n output += replacement == null ? '' : String(replacement);\n index = closingIndex;\n }\n\n return output;\n}\n\nexport function toRuleOptions(value: unknown, key: string): RuleOptions {\n if (value === true) {\n return {};\n }\n\n if (value == null || value === false) {\n return {};\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n return value as RuleOptions;\n }\n\n if (typeof value === 'number') {\n if (key === 'minLength' || key === 'min') {\n return { min: value };\n }\n\n if (key === 'maxLength' || key === 'max') {\n return { max: value };\n }\n }\n\n if (typeof value === 'string') {\n if (key === 'sameAs') {\n return { selector: value };\n }\n\n if (key === 'pattern') {\n return { pattern: value };\n }\n }\n\n return { value };\n}\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue } from '../core/helpers.js';\n\nconst EMAIL_PATTERN =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\n\nexport function emailRule({ value }: ValidationContext): ValidationResult {\n if (isEmptyValue(value)) {\n return { valid: true, messageKey: 'email' };\n }\n\n return {\n valid: EMAIL_PATTERN.test(String(value).trim()),\n messageKey: 'email'\n };\n}\n\nexport default emailRule;\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue, toSafeInteger } from '../core/helpers.js';\n\nexport function maxLengthRule({ value, options }: ValidationContext): ValidationResult {\n const max = toSafeInteger(options.max as number | string | undefined, Number.POSITIVE_INFINITY, { min: 0 });\n if (isEmptyValue(value)) {\n return { valid: true, messageKey: 'maxLength', params: { max } };\n }\n\n const length = Array.isArray(value) ? value.length : String(value).length;\n return {\n valid: length <= max,\n messageKey: 'maxLength',\n params: { max }\n };\n}\n\nexport default maxLengthRule;\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue, toSafeInteger } from '../core/helpers.js';\n\nexport function minLengthRule({ value, options }: ValidationContext): ValidationResult {\n const min = toSafeInteger(options.min as number | string | undefined, 0, { min: 0 });\n if (isEmptyValue(value)) {\n return { valid: true, messageKey: 'minLength', params: { min } };\n }\n\n const length = Array.isArray(value) ? value.length : String(value).length;\n return {\n valid: length >= min,\n messageKey: 'minLength',\n params: { min }\n };\n}\n\nexport default minLengthRule;\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue } from '../core/helpers.js';\n\nexport function patternRule({ value, options }: ValidationContext): ValidationResult {\n if (isEmptyValue(value)) {\n return { valid: true, messageKey: 'pattern' };\n }\n\n try {\n const expression = new RegExp(String(options.pattern || ''));\n return {\n valid: expression.test(String(value)),\n messageKey: 'pattern'\n };\n } catch {\n return {\n valid: true,\n messageKey: 'pattern',\n metadata: { ignoredInvalidPattern: true }\n };\n }\n}\n\nexport default patternRule;\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue } from '../core/helpers.js';\n\nexport function requiredRule({ value }: ValidationContext): ValidationResult {\n return {\n valid: !isEmptyValue(value),\n messageKey: 'required'\n };\n}\n\nexport default requiredRule;\n","import type { ValidationContext, ValidationResult } from '../core/A11yFormValidator.js';\nimport { isEmptyValue } from '../core/helpers.js';\n\nexport function sameAsRule({ field, form, value, options }: ValidationContext): ValidationResult {\n if (isEmptyValue(value)) {\n return {\n valid: true,\n messageKey: 'sameAs',\n params: { targetLabel: '' }\n };\n }\n\n const selector = String(options.selector || `[name=\"${options.field || ''}\"]`);\n let target: Element | null = null;\n try {\n target = selector ? form.querySelector(selector) : null;\n } catch {\n target = null;\n }\n const targetValue =\n target instanceof HTMLInputElement ||\n target instanceof HTMLSelectElement ||\n target instanceof HTMLTextAreaElement\n ? target.value\n : '';\n\n return {\n valid: target ? String(value) === String(targetValue) : false,\n messageKey: 'sameAs',\n params: {\n targetLabel: field.getTargetLabel(target)\n }\n };\n}\n\nexport default sameAsRule;\n","import type { A11yFormValidator, ValidatorRenderer } from './A11yFormValidator.js';\nimport type { FieldController } from './FieldController.js';\n\nexport class ErrorRenderer implements ValidatorRenderer {\n readonly validator: A11yFormValidator;\n\n constructor(validator: A11yFormValidator) {\n this.validator = validator;\n }\n\n getNode(field: FieldController): HTMLElement | null {\n return this.validator.form.querySelector<HTMLElement>(`#${field.errorId}`);\n }\n\n shouldRenderInline(): boolean {\n return this.validator.options.errorMode !== 'native';\n }\n\n syncAnnouncementAttributes(errorNode: HTMLElement): void {\n if (this.validator.shouldAnnounceInlineErrors()) {\n errorNode.setAttribute('role', 'status');\n errorNode.setAttribute('aria-live', 'polite');\n errorNode.setAttribute('aria-atomic', 'true');\n return;\n }\n\n errorNode.removeAttribute('role');\n errorNode.removeAttribute('aria-live');\n errorNode.removeAttribute('aria-atomic');\n }\n\n setNativeMessage(field: FieldController, message: string): void {\n field.elements.forEach((element) => {\n element.setCustomValidity?.(message || '');\n });\n }\n\n getInsertionTarget(field: FieldController): Element {\n if (field.isGroupedChoice) {\n const fieldset = field.primaryElement.closest('fieldset');\n if (fieldset && this.validator.form.contains(fieldset)) {\n return fieldset;\n }\n }\n\n const label = field.primaryElement.closest('label');\n if (label && this.validator.form.contains(label)) {\n return label;\n }\n\n return field.primaryElement;\n }\n\n render(field: FieldController, message: string): void {\n this.setNativeMessage(field, message);\n const renderInline = this.shouldRenderInline();\n if (renderInline) {\n field.connectDescription(field.errorId);\n } else {\n field.disconnectDescription(field.errorId);\n }\n field.setAriaInvalid(true, renderInline ? field.errorId : '');\n field.setVisualState('invalid');\n\n if (!renderInline) {\n return;\n }\n\n let errorNode = this.getNode(field);\n if (!errorNode) {\n errorNode = this.validator.form.ownerDocument.createElement('div');\n errorNode.id = field.errorId;\n errorNode.className = 'a11y-form-validator__error';\n this.getInsertionTarget(field).insertAdjacentElement('afterend', errorNode);\n }\n\n this.syncAnnouncementAttributes(errorNode);\n errorNode.textContent = message;\n }\n\n clear(field: FieldController): void {\n const errorNode = this.getNode(field);\n if (errorNode) {\n errorNode.remove();\n }\n\n this.setNativeMessage(field, '');\n field.disconnectDescription(field.errorId);\n field.setAriaInvalid(false);\n field.setVisualState('valid');\n }\n\n destroy(): void {\n this.validator.fields.forEach((field) => this.clear(field));\n }\n}\n","export class EventEmitter {\n readonly target: EventTarget;\n\n constructor(target: EventTarget) {\n this.target = target;\n }\n\n emit(name: string, detail: Record<string, unknown> = {}): void {\n this.target.dispatchEvent(\n new CustomEvent(name, {\n bubbles: true,\n detail\n })\n );\n }\n\n on(name: string, handler: EventListener): () => void {\n this.target.addEventListener(name, handler);\n return () => this.off(name, handler);\n }\n\n off(name: string, handler: EventListener): void {\n this.target.removeEventListener(name, handler);\n }\n}\n","import type { A11yFormValidator, FieldValue, ValidationContext } from './A11yFormValidator.js';\nimport {\n camelToKebabCase,\n ensureElementId,\n escapeSelectorIdentifier,\n getPreferredScrollBehavior,\n parseRuleList,\n sanitizeId,\n toRuleOptions,\n toSafeInteger,\n unique,\n type RuleList,\n type RuleOptions\n} from './helpers.js';\n\nexport type FormControl = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\nexport type FieldType =\n | 'textarea'\n | 'select'\n | 'select-multiple'\n | 'radio'\n | 'checkbox'\n | 'file'\n | string;\n\nfunction getControlLabels(element: Element): NodeListOf<HTMLLabelElement> | [] {\n if ('labels' in element && element.labels) {\n return element.labels as NodeListOf<HTMLLabelElement>;\n }\n\n return [];\n}\n\nexport class FieldController {\n readonly validator: A11yFormValidator;\n readonly name: string;\n readonly elements: FormControl[];\n readonly primaryElement: FormControl;\n readonly type: FieldType;\n readonly isGroupedChoice: boolean;\n readonly errorId: string;\n readonly primaryId: string;\n readonly initialDescribedBy: Map<FormControl, string>;\n private readonly generatedPrimaryId: boolean;\n\n serverMessage: string;\n lastError: string;\n touched: boolean;\n dirty: boolean;\n\n constructor(validator: A11yFormValidator, name: string, elements: FormControl[]) {\n this.validator = validator;\n this.name = name;\n this.elements = [...elements];\n this.primaryElement = this.elements[0];\n this.type = this.detectType();\n this.isGroupedChoice = this.elements.length > 1 && ['radio', 'checkbox'].includes(this.type);\n this.errorId = `a11y-form-validator-error-${sanitizeId(this.validator.form.id || 'form')}-${sanitizeId(this.name)}`;\n this.generatedPrimaryId = !this.primaryElement.id;\n this.primaryId = ensureElementId(this.primaryElement);\n this.initialDescribedBy = new Map(\n this.elements.map((element) => [element, element.getAttribute('aria-describedby') || ''])\n );\n this.serverMessage = '';\n this.lastError = '';\n this.touched = false;\n this.dirty = false;\n }\n\n detectType(): FieldType {\n const tagName = this.primaryElement.tagName.toLowerCase();\n if (tagName === 'textarea') {\n return 'textarea';\n }\n\n if (tagName === 'select') {\n return (this.primaryElement as HTMLSelectElement).multiple ? 'select-multiple' : 'select';\n }\n\n return (this.primaryElement.getAttribute('type') || 'text').toLowerCase();\n }\n\n getActiveElements(): FormControl[] {\n return this.elements.filter((element) => !element.disabled);\n }\n\n isDisabled(): boolean {\n return this.getActiveElements().length === 0;\n }\n\n isHidden(): boolean {\n return this.elements.every((element) => {\n if ((element instanceof HTMLInputElement && element.type === 'hidden') || element.hidden) {\n return true;\n }\n\n return Boolean(element.closest('[hidden]'));\n });\n }\n\n shouldIgnore(): false | 'disabled' | 'hidden' | 'selector' {\n const { ignore, validateHidden } = this.validator.options;\n if (ignore.disabled !== false && this.isDisabled()) {\n return 'disabled';\n }\n\n if (!validateHidden && ignore.hidden !== false && this.isHidden()) {\n return 'hidden';\n }\n\n if (ignore.selector && this.elements.some((element) => element.matches(ignore.selector))) {\n return 'selector';\n }\n\n return false;\n }\n\n getValue(): FieldValue {\n const activeElements = this.getActiveElements();\n if (this.type === 'radio') {\n const selected = activeElements.find((element) => element instanceof HTMLInputElement && element.checked);\n return selected ? selected.value : '';\n }\n\n if (this.type === 'checkbox' && this.elements.length > 1) {\n return activeElements\n .filter((element): element is HTMLInputElement => element instanceof HTMLInputElement && element.checked)\n .map((element) => element.value);\n }\n\n if (this.type === 'checkbox') {\n return this.primaryElement instanceof HTMLInputElement ? Boolean(this.primaryElement.checked) : false;\n }\n\n if (this.type === 'file') {\n return this.primaryElement instanceof HTMLInputElement ? Array.from(this.primaryElement.files || []) : [];\n }\n\n if (this.type === 'select-multiple' && this.primaryElement instanceof HTMLSelectElement) {\n return Array.from(this.primaryElement.selectedOptions).map((option) => option.value);\n }\n\n return this.primaryElement.value;\n }\n\n getFieldConfig(): unknown {\n return this.validator.options.rules?.[this.name] || {};\n }\n\n getDataMessage(ruleName: string): string {\n return this.primaryElement.dataset[`message${ruleName.charAt(0).toUpperCase()}${ruleName.slice(1)}`] ||\n this.primaryElement.getAttribute(`data-message-${camelToKebabCase(ruleName)}`) ||\n '';\n }\n\n getLabel(): string {\n const fieldset = this.primaryElement.closest('fieldset');\n if (this.isGroupedChoice && fieldset) {\n const legend = fieldset.querySelector('legend');\n if (legend) {\n return legend.textContent?.trim() || this.name;\n }\n }\n\n const id = this.primaryElement.id;\n if (id) {\n const labelSelector = `label[for=\"${escapeSelectorIdentifier(id)}\"]`;\n const label =\n this.validator.form.querySelector(labelSelector) ||\n this.validator.form.ownerDocument.querySelector(labelSelector);\n if (label) {\n return label.textContent?.trim() || this.name;\n }\n }\n\n const wrapperLabel = this.primaryElement.closest('label');\n if (wrapperLabel) {\n return wrapperLabel.textContent?.trim() || this.name;\n }\n\n return this.name;\n }\n\n getTargetLabel(target: Element | null): string {\n if (!target) {\n return '';\n }\n\n const labels = getControlLabels(target);\n if (labels.length) {\n return labels[0].textContent?.trim() || '';\n }\n\n if (target.id) {\n const label = this.validator.form.querySelector(`label[for=\"${escapeSelectorIdentifier(target.id)}\"]`);\n if (label) {\n return label.textContent?.trim() || '';\n }\n }\n\n if (target instanceof HTMLInputElement || target instanceof HTMLSelectElement || target instanceof HTMLTextAreaElement) {\n return target.name || target.id || '';\n }\n\n return target.id || '';\n }\n\n getDescribedBy(): string[] {\n return unique(\n this.elements.flatMap((element) => String(element.getAttribute('aria-describedby') || '').split(/\\s+/))\n );\n }\n\n connectDescription(id: string): void {\n this.elements.forEach((element) => {\n const base = String(this.initialDescribedBy.get(element) || '').split(/\\s+/);\n const current = String(element.getAttribute('aria-describedby') || '').split(/\\s+/);\n const next = unique([...base, ...current, id]);\n if (next.length) {\n element.setAttribute('aria-describedby', next.join(' '));\n }\n });\n }\n\n disconnectDescription(id: string): void {\n this.elements.forEach((element) => {\n const base = String(this.initialDescribedBy.get(element) || '').split(/\\s+/);\n const current = String(element.getAttribute('aria-describedby') || '').split(/\\s+/);\n const next = unique([...base, ...current].filter((token) => token && token !== id));\n if (next.length) {\n element.setAttribute('aria-describedby', next.join(' '));\n } else {\n element.removeAttribute('aria-describedby');\n }\n });\n }\n\n setAriaInvalid(isInvalid: boolean, errorId = this.errorId): void {\n this.elements.forEach((element) => {\n if (isInvalid) {\n element.setAttribute('aria-invalid', 'true');\n if (errorId) {\n element.setAttribute('aria-errormessage', errorId);\n } else {\n element.removeAttribute('aria-errormessage');\n }\n } else {\n element.removeAttribute('aria-invalid');\n element.removeAttribute('aria-errormessage');\n }\n });\n }\n\n setVisualState(state: 'valid' | 'invalid' | 'pending'): void {\n this.elements.forEach((element) => {\n element.dataset.validationState = state;\n element.classList.toggle('is-valid', state === 'valid');\n element.classList.toggle('is-invalid', state === 'invalid');\n element.classList.toggle('is-pending', state === 'pending');\n element.classList.toggle('is-touched', this.touched);\n element.classList.toggle('is-dirty', this.dirty);\n element.classList.toggle('is-disabled', this.isDisabled());\n });\n }\n\n clearVisualState(): void {\n this.elements.forEach((element) => {\n delete element.dataset.validationState;\n element.classList.remove('is-valid', 'is-invalid', 'is-pending', 'is-touched', 'is-dirty', 'is-disabled');\n });\n }\n\n focus(): void {\n this.primaryElement.focus({ preventScroll: true });\n this.primaryElement.scrollIntoView?.({\n block: 'center',\n behavior: getPreferredScrollBehavior(this.primaryElement)\n });\n }\n\n markTouched(): void {\n this.touched = true;\n }\n\n markDirty(): void {\n this.dirty = true;\n }\n\n clearServerMessage(): void {\n this.serverMessage = '';\n }\n\n setServerMessage(message: string): void {\n this.serverMessage = message;\n this.lastError = message;\n }\n\n getRules(): RuleList {\n const nativeRules = this.getNativeRules();\n const dataRules = this.getDataRules();\n const configuredRules = parseRuleList(this.getFieldConfig());\n\n return {\n ...nativeRules,\n ...dataRules,\n ...configuredRules\n };\n }\n\n getNativeRules(): RuleList {\n if (!this.validator.options.useNativeRules) {\n return {};\n }\n\n const rules: RuleList = {};\n const requiredRuleName = ['checkbox', 'radio'].includes(this.type) ? 'checked' : 'required';\n if (this.elements.some((element) => element.hasAttribute('required'))) {\n rules[requiredRuleName] = true;\n }\n\n if (this.type === 'email') {\n rules.email = true;\n }\n\n const minLength = toSafeInteger(this.primaryElement.getAttribute('minlength') ?? undefined, Number.NaN, { min: 0 });\n if (Number.isFinite(minLength)) {\n rules.minLength = { min: minLength };\n }\n\n const maxLength = toSafeInteger(this.primaryElement.getAttribute('maxlength') ?? undefined, Number.NaN, { min: 0 });\n if (Number.isFinite(maxLength)) {\n rules.maxLength = { max: maxLength };\n }\n\n const pattern = this.primaryElement.getAttribute('pattern');\n if (pattern) {\n rules.pattern = { pattern };\n }\n\n return rules;\n }\n\n getDataRules(): RuleList {\n const rules = parseRuleList(this.primaryElement.dataset.validate);\n if (this.primaryElement.dataset.required === 'true') {\n rules.required = true;\n }\n\n if (this.primaryElement.dataset.checked === 'true') {\n rules.checked = true;\n }\n\n const dataMinLength = toSafeInteger(this.primaryElement.dataset.minLength, Number.NaN, { min: 0 });\n if (Number.isFinite(dataMinLength)) {\n rules.minLength = { min: dataMinLength };\n }\n\n const dataMaxLength = toSafeInteger(this.primaryElement.dataset.maxLength, Number.NaN, { min: 0 });\n if (Number.isFinite(dataMaxLength)) {\n rules.maxLength = { max: dataMaxLength };\n }\n\n if (this.primaryElement.dataset.pattern) {\n rules.pattern = { pattern: this.primaryElement.dataset.pattern };\n }\n\n if (this.primaryElement.dataset.sameAs) {\n rules.sameAs = { selector: this.primaryElement.dataset.sameAs };\n }\n\n return Object.fromEntries(\n Object.entries(rules).map(([key, value]) => [key, toRuleOptions(value, key)])\n );\n }\n\n getValidationContext(ruleName: string, ruleOptions: unknown, allValues: Record<string, FieldValue>): ValidationContext {\n return {\n field: this,\n form: this.validator.form,\n value: this.getValue(),\n options: toRuleOptions(ruleOptions, ruleName) as RuleOptions,\n allValues,\n validator: this.validator\n };\n }\n\n getNativeValidationMessage(): string {\n if (typeof this.primaryElement.validationMessage === 'string') {\n return this.primaryElement.validationMessage;\n }\n\n return '';\n }\n\n destroy(): void {\n this.clearServerMessage();\n this.lastError = '';\n this.setAriaInvalid(false);\n this.clearVisualState();\n this.elements.forEach((element) => {\n const initial = this.initialDescribedBy.get(element);\n if (initial) {\n element.setAttribute('aria-describedby', initial);\n } else {\n element.removeAttribute('aria-describedby');\n }\n });\n if (this.generatedPrimaryId && this.primaryElement.id === this.primaryId) {\n this.primaryElement.removeAttribute('id');\n }\n }\n}\n","{\n \"required\": \"This field is required.\",\n \"email\": \"Enter a valid email address.\",\n \"minLength\": \"Enter at least {min} characters.\",\n \"maxLength\": \"Enter no more than {max} characters.\",\n \"pattern\": \"Enter a value in the correct format.\",\n \"checked\": \"Select this option to continue.\",\n \"sameAs\": \"This value must match {targetLabel}.\",\n \"summaryTitleOne\": \"There is 1 problem with your form.\",\n \"summaryTitleOther\": \"There are {count} problems with your form.\",\n \"summaryItem\": \"{fieldLabel}: {message}\",\n \"genericFallback\": \"Check this field.\"\n}\n","import enMessages from '../locales/en.json' with { type: 'json' };\nimport type {\n A11yFormValidator,\n LocaleMessages,\n MessageResolverContext,\n MessageValue,\n ValidationResult\n} from './A11yFormValidator.js';\nimport type { FieldController } from './FieldController.js';\nimport { applyPlaceholders } from './helpers.js';\n\nexport class MessageResolver {\n readonly validator: A11yFormValidator;\n readonly defaultMessages: LocaleMessages;\n\n constructor(validator: A11yFormValidator) {\n this.validator = validator;\n this.defaultMessages = enMessages;\n }\n\n detectLocale(): string {\n const explicit = this.validator.options.locale;\n const formLang = this.validator.form.getAttribute('lang');\n const documentLang = this.validator.form.ownerDocument.documentElement.getAttribute('lang');\n return explicit || formLang || documentLang || 'en';\n }\n\n getLocaleCandidates(locale = this.detectLocale()): string[] {\n const candidates: string[] = [];\n if (locale) {\n candidates.push(locale);\n const [base] = locale.split('-');\n if (base && base !== locale) {\n candidates.push(base);\n }\n }\n\n candidates.push('en');\n return [...new Set(candidates.filter(Boolean))];\n }\n\n getLocaleMessage(key: string): MessageValue | undefined {\n const candidates = this.getLocaleCandidates();\n const configuredLocales = this.validator.options.locales || {};\n\n for (const locale of candidates) {\n const localeMessages = configuredLocales[locale];\n if (localeMessages && localeMessages[key] != null) {\n return localeMessages[key];\n }\n }\n\n if (this.validator.options.messages?.[key] != null) {\n return this.validator.options.messages[key] as MessageValue;\n }\n\n return this.defaultMessages[key];\n }\n\n resolveValue(message: unknown, context: MessageResolverContext): string {\n if (typeof message === 'function') {\n return message(context);\n }\n\n if (typeof message === 'string') {\n return applyPlaceholders(message, context.params);\n }\n\n return '';\n }\n\n getSummaryTitle(count: number): string {\n const key = count === 1 ? 'summaryTitleOne' : 'summaryTitleOther';\n const message = this.getLocaleMessage(key) || this.getLocaleMessage('summaryTitle');\n return this.resolveValue(message, {\n field: null,\n fieldName: '',\n fieldLabel: '',\n form: this.validator.form,\n rule: key,\n value: count,\n params: { count },\n locale: this.detectLocale()\n }) || `There ${count === 1 ? 'is' : 'are'} ${count} problem${count === 1 ? '' : 's'} with your form.`;\n }\n\n getSummaryItem(field: FieldController, message: string): string {\n const fieldLabel = field.getLabel();\n const params = {\n label: fieldLabel,\n fieldLabel,\n fieldName: field.name,\n message\n };\n const configuredMessage = this.validator.options.messages?.summaryItem;\n const summaryMessage = configuredMessage ?? this.getLocaleMessage('summaryItem');\n const context: MessageResolverContext = {\n field,\n fieldName: field.name,\n fieldLabel,\n form: this.validator.form,\n rule: 'summaryItem',\n value: message,\n params,\n locale: this.detectLocale()\n };\n\n return this.resolveValue(summaryMessage, context) || `${fieldLabel}: ${message}`;\n }\n\n resolve(field: FieldController, ruleName: string, result: ValidationResult): string {\n const target = field.primaryElement;\n const fieldLabel = field.getLabel();\n const params = {\n ...result.params,\n label: fieldLabel,\n fieldLabel,\n targetLabel: result.params?.targetLabel || '',\n value: field.getValue()\n };\n const context: MessageResolverContext = {\n field,\n fieldName: field.name,\n fieldLabel,\n form: this.validator.form,\n rule: ruleName,\n value: field.getValue(),\n params,\n locale: this.detectLocale()\n };\n\n const fieldMessages = this.validator.options.messages?.fields;\n const shouldUseNativeMessage =\n this.validator.options.errorMode === 'native' || Boolean(result.nativeMessage);\n const candidates = [\n field.serverMessage,\n field.getDataMessage(ruleName),\n fieldMessages?.[field.name]?.[ruleName],\n this.validator.options.messages?.[ruleName],\n result.message,\n shouldUseNativeMessage ? result.nativeMessage : '',\n shouldUseNativeMessage && target.validity?.valid === false ? field.getNativeValidationMessage() : '',\n this.getLocaleMessage(result.messageKey || ruleName),\n this.defaultMessages[result.messageKey || ruleName],\n this.defaultMessages.genericFallback,\n 'Check this field.'\n ];\n\n for (const candidate of candidates) {\n const value = this.resolveValue(candidate, context);\n if (value) {\n return value;\n }\n }\n\n return 'Check this field.';\n }\n}\n","import type { ValidationContext, ValidationResult, ValidatorRule } from './A11yFormValidator.js';\n\nexport class RuleRegistry {\n private readonly rules: Map<string, ValidatorRule>;\n\n constructor() {\n this.rules = new Map();\n }\n\n register(name: string, rule: ValidatorRule): this {\n this.rules.set(name, rule);\n return this;\n }\n\n unregister(name: string): this {\n this.rules.delete(name);\n return this;\n }\n\n has(name: string): boolean {\n return this.rules.has(name);\n }\n\n async run(name: string, context: ValidationContext): Promise<ValidationResult> {\n const rule = this.rules.get(name);\n if (!rule) {\n return {\n valid: true,\n messageKey: name,\n params: {}\n };\n }\n\n const rawResult = await rule(context);\n return this.normalize(name, rawResult);\n }\n\n normalize(name: string, result: Awaited<ReturnType<ValidatorRule>>): ValidationResult {\n if (result == null || result === true) {\n return {\n valid: true,\n messageKey: name,\n params: {}\n };\n }\n\n if (result === false) {\n return {\n valid: false,\n messageKey: name,\n params: {}\n };\n }\n\n if (typeof result === 'string') {\n return {\n valid: false,\n messageKey: name,\n message: result,\n params: {}\n };\n }\n\n return {\n valid: Boolean(result.valid),\n messageKey: result.messageKey || name,\n message: result.message,\n params: result.params || {},\n metadata: result.metadata || {},\n nativeMessage: result.nativeMessage\n };\n }\n}\n","export type FormValidationState = 'idle' | 'validating' | 'valid' | 'invalid';\n\nexport interface FieldValidationState {\n pristine: boolean;\n dirty: boolean;\n touched: boolean;\n pending: boolean;\n valid: boolean;\n invalid: boolean;\n disabled: boolean;\n ignored: boolean;\n}\n\nexport interface ValidationStateSnapshot {\n form: FormValidationState;\n fields: Record<string, FieldValidationState>;\n}\n\nexport class ValidationState {\n private formState: FormValidationState;\n private readonly fieldStates: Map<string, FieldValidationState>;\n\n constructor() {\n this.formState = 'idle';\n this.fieldStates = new Map();\n }\n\n ensure(name: string): FieldValidationState {\n if (!this.fieldStates.has(name)) {\n this.fieldStates.set(name, {\n pristine: true,\n dirty: false,\n touched: false,\n pending: false,\n valid: false,\n invalid: false,\n disabled: false,\n ignored: false\n });\n }\n\n return this.fieldStates.get(name)!;\n }\n\n updateField(name: string, patch: Partial<FieldValidationState>): FieldValidationState {\n const current = this.ensure(name);\n this.fieldStates.set(name, { ...current, ...patch });\n return this.fieldStates.get(name)!;\n }\n\n setFormState(state: FormValidationState): void {\n this.formState = state;\n }\n\n snapshot(): ValidationStateSnapshot {\n return {\n form: this.formState,\n fields: Object.fromEntries(this.fieldStates.entries())\n };\n }\n}\n","import checkedRule from '../rules/checked.js';\nimport emailRule from '../rules/email.js';\nimport maxLengthRule from '../rules/maxLength.js';\nimport minLengthRule from '../rules/minLength.js';\nimport patternRule from '../rules/pattern.js';\nimport requiredRule from '../rules/required.js';\nimport sameAsRule from '../rules/same-as.js';\nimport { ErrorRenderer } from './ErrorRenderer.js';\nimport { EventEmitter } from './EventEmitter.js';\nimport { FieldController } from './FieldController.js';\nimport { MessageResolver } from './MessageResolver.js';\nimport { RuleRegistry } from './RuleRegistry.js';\nimport { ValidationState, type ValidationStateSnapshot } from './ValidationState.js';\nimport { mergeOptions, normalizeToArray, toSafeInteger, type RuleOptions } from './helpers.js';\n\nexport type ValidateTrigger = 'submit' | 'blur' | 'input' | 'change';\nexport type ErrorMode = 'inline' | 'native' | 'both';\nexport type FocusOnError = 'summary' | 'first-invalid' | false;\nexport type FieldValue = string | boolean | string[] | File[];\n\nexport interface ValidationResult {\n valid: boolean;\n messageKey?: string;\n message?: string;\n params?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n nativeMessage?: string;\n}\n\nexport type ValidatorRuleResult = boolean | string | Partial<ValidationResult> | null | undefined;\n\nexport interface ValidationContext {\n field: FieldController;\n form: HTMLFormElement;\n value: FieldValue;\n options: RuleOptions;\n allValues: Record<string, FieldValue>;\n validator: A11yFormValidator;\n}\n\nexport type ValidatorRule = (context: ValidationContext) => ValidatorRuleResult | Promise<ValidatorRuleResult>;\n\nexport type MessageResolverContext = {\n field: FieldController | null;\n fieldName: string;\n fieldLabel: string;\n form: HTMLFormElement;\n rule: string;\n value: unknown;\n params: Record<string, unknown>;\n locale: string;\n};\n\nexport type MessageValue = string | ((context: MessageResolverContext) => string);\n\nexport interface ValidatorMessages {\n fields?: Record<string, Record<string, MessageValue>>;\n [key: string]: MessageValue | Record<string, Record<string, MessageValue>> | undefined;\n}\n\nexport type LocaleMessages = Record<string, MessageValue>;\n\nexport interface ValidatorRenderer {\n render(field: FieldController, message: string): void;\n clear(field: FieldController): void;\n destroy?(): void;\n}\n\nexport interface ValidatorAddon {\n install(validator: A11yFormValidator): void;\n destroy?(): void;\n}\n\nexport type AddonInput = ValidatorAddon;\n\nexport interface A11yFormValidatorOptions {\n validateOn: ValidateTrigger | ValidateTrigger[];\n focusOnError: FocusOnError;\n errorMode: ErrorMode;\n useNativeRules: boolean;\n disableNativeUI: boolean;\n validateHidden: boolean;\n ignore: {\n disabled: boolean;\n hidden: boolean;\n selector: string;\n };\n debounce: number;\n messages: ValidatorMessages;\n locales: Record<string, LocaleMessages>;\n locale: string;\n selectors: {\n fields: string;\n };\n addons: AddonInput[];\n renderer: ValidatorRenderer | null;\n rules: Record<string, unknown>;\n}\n\nexport type A11yFormValidatorOptionsInput = Partial<\n Omit<A11yFormValidatorOptions, 'validateOn' | 'addons' | 'ignore' | 'selectors'>\n> & {\n validateOn?: ValidateTrigger | ValidateTrigger[];\n addons?: AddonInput | AddonInput[];\n ignore?: Partial<A11yFormValidatorOptions['ignore']>;\n selectors?: Partial<A11yFormValidatorOptions['selectors']>;\n};\n\nexport interface A11yFormValidatorInstance {\n validate(options?: ValidateOptions): Promise<boolean>;\n validateField(input: FieldInput, options?: ValidateOptions): Promise<boolean>;\n refresh(): this;\n reset(): this;\n clearErrors(): this;\n setErrors(errors?: ServerErrors): this;\n getErrors(): ValidatorErrors;\n getState(): ValidationStateSnapshot;\n enable(): this;\n disable(): this;\n focusOnError(): void;\n destroy(): void;\n}\n\nexport interface ValidateOptions {\n reason?: string;\n}\n\nexport type FieldInput = FieldController | string | HTMLElement | null | undefined;\n\nexport interface ValidatorErrors {\n fields: Record<string, string>;\n form: string[];\n}\n\nexport type ServerErrors = Record<string, string | string[] | undefined> & {\n fields?: Record<string, string | string[] | undefined>;\n form?: string | string[];\n _form?: string | string[];\n};\n\nconst COMPONENT_NAME = 'a11y-form-validator';\n\nexport const EVENTS = Object.freeze({\n init: `${COMPONENT_NAME}:init`,\n beforeValidate: `${COMPONENT_NAME}:before-validate`,\n afterValidate: `${COMPONENT_NAME}:after-validate`,\n fieldValid: `${COMPONENT_NAME}:field-valid`,\n fieldInvalid: `${COMPONENT_NAME}:field-invalid`,\n formValid: `${COMPONENT_NAME}:form-valid`,\n formInvalid: `${COMPONENT_NAME}:form-invalid`,\n submitBlocked: `${COMPONENT_NAME}:submit-blocked`,\n destroy: `${COMPONENT_NAME}:destroy`\n});\n\nexport const SELECTORS = Object.freeze({\n fields: 'input, select, textarea',\n initAll: '[data-a11y-form-validator]'\n});\n\nexport const CLASSES = Object.freeze({\n root: COMPONENT_NAME,\n initialized: 'is-initialized'\n});\n\nexport const ATTRIBUTES = Object.freeze({\n describedBy: 'aria-describedby',\n errorMessage: 'aria-errormessage',\n hidden: 'hidden',\n invalid: 'aria-invalid',\n noValidate: 'novalidate',\n validationState: 'data-validation-state'\n});\n\nexport const DEFAULT_OPTIONS = Object.freeze({\n validateOn: ['submit'] as ValidateTrigger[],\n focusOnError: 'summary' as FocusOnError,\n errorMode: 'inline' as ErrorMode,\n useNativeRules: true,\n disableNativeUI: true,\n validateHidden: false,\n ignore: Object.freeze({\n disabled: true,\n hidden: true,\n selector: ''\n }),\n debounce: 150,\n messages: Object.freeze({}) as ValidatorMessages,\n locales: Object.freeze({}) as Record<string, LocaleMessages>,\n locale: '',\n selectors: Object.freeze({\n fields: SELECTORS.fields\n }),\n addons: [] as AddonInput[],\n renderer: null as ValidatorRenderer | null,\n rules: Object.freeze({}) as Record<string, unknown>\n}) satisfies A11yFormValidatorOptions;\n\nexport class A11yFormValidator implements A11yFormValidatorInstance {\n private static readonly instances = new WeakMap<HTMLFormElement, A11yFormValidator>();\n\n readonly form!: HTMLFormElement;\n readonly options!: A11yFormValidatorOptions;\n readonly events!: EventEmitter;\n readonly state!: ValidationState;\n readonly ruleRegistry!: RuleRegistry;\n readonly messageResolver!: MessageResolver;\n readonly renderer!: ValidatorRenderer;\n\n fields!: FieldController[];\n fieldMap!: Map<string, FieldController>;\n enabled!: boolean;\n hasSubmitted!: boolean;\n formErrors!: string[];\n summaryAddon!: (ValidatorAddon & { hasErrors(): boolean; focus(): void }) | null;\n\n private addons!: ValidatorAddon[];\n private readonly timers!: Map<string, ReturnType<typeof setTimeout>>;\n private readonly addedRootClass!: boolean;\n private readonly addedNoValidate!: boolean;\n private readonly abortController!: AbortController | null;\n private readonly validationRuns!: Map<string, number>;\n private destroyed!: boolean;\n private inlineErrorAnnouncementsMuted!: boolean;\n private readonly onSubmit!: EventListener;\n private readonly onFocusOut!: EventListener;\n private readonly onInput!: EventListener;\n private readonly onChange!: EventListener;\n\n constructor(form: HTMLFormElement, options: A11yFormValidatorOptionsInput = {}) {\n if (!(form instanceof HTMLFormElement)) {\n throw new TypeError('A11yFormValidator expects an HTMLFormElement.');\n }\n\n const existingInstance = A11yFormValidator.instances.get(form);\n if (existingInstance) {\n return existingInstance;\n }\n\n A11yFormValidator.instances.set(form, this);\n\n this.form = form;\n this.options = this.normalizeOptions(options);\n this.events = new EventEmitter(this.form);\n this.state = new ValidationState();\n this.ruleRegistry = new RuleRegistry();\n this.messageResolver = new MessageResolver(this);\n this.renderer = this.options.renderer || new ErrorRenderer(this);\n this.fields = [];\n this.fieldMap = new Map();\n this.enabled = true;\n this.hasSubmitted = false;\n this.formErrors = [];\n this.summaryAddon = null;\n this.addons = [];\n this.timers = new Map();\n this.addedRootClass = !this.form.classList.contains(CLASSES.root);\n this.addedNoValidate =\n this.options.disableNativeUI &&\n this.options.errorMode !== 'native' &&\n !this.form.hasAttribute('novalidate');\n const AbortControllerConstructor = this.form.ownerDocument.defaultView?.AbortController || globalThis.AbortController;\n this.abortController = AbortControllerConstructor ? new AbortControllerConstructor() : null;\n this.validationRuns = new Map();\n this.destroyed = false;\n this.inlineErrorAnnouncementsMuted = false;\n this.onSubmit = this.handleSubmit.bind(this);\n this.onFocusOut = this.handleFocusOut.bind(this);\n this.onInput = this.handleInput.bind(this);\n this.onChange = this.handleChange.bind(this);\n\n this.registerDefaultRules();\n this.form.classList.add(CLASSES.root, CLASSES.initialized);\n\n if (this.addedNoValidate) {\n this.form.setAttribute('novalidate', 'novalidate');\n }\n\n this.refresh();\n this.bindEvents();\n this.installAddons();\n this.emit(EVENTS.init);\n }\n\n static getInstance(form: HTMLFormElement): A11yFormValidator | undefined {\n return A11yFormValidator.instances.get(form);\n }\n\n private normalizeOptions(options: A11yFormValidatorOptionsInput): A11yFormValidatorOptions {\n const merged = mergeOptions(DEFAULT_OPTIONS, options as Record<string, unknown>) as unknown as A11yFormValidatorOptions;\n return {\n ...merged,\n validateOn: normalizeToArray(merged.validateOn) as ValidateTrigger[],\n addons: normalizeToArray(merged.addons) as AddonInput[],\n debounce: toSafeInteger(merged.debounce, DEFAULT_OPTIONS.debounce, { min: 0 }),\n ignore: {\n ...DEFAULT_OPTIONS.ignore,\n ...(options.ignore || {})\n },\n selectors: {\n ...DEFAULT_OPTIONS.selectors,\n ...(options.selectors || {})\n },\n messages: options.messages || DEFAULT_OPTIONS.messages,\n locales: options.locales || DEFAULT_OPTIONS.locales,\n rules: options.rules || DEFAULT_OPTIONS.rules\n };\n }\n\n private emit(name: string, detail: Record<string, unknown> = {}): void {\n this.events.emit(name, {\n instance: this,\n validator: this,\n ...detail\n });\n }\n\n shouldAnnounceInlineErrors(): boolean {\n return !this.inlineErrorAnnouncementsMuted;\n }\n\n private shouldMuteInlineErrorsForBatch(reason: string): boolean {\n return reason === 'submit' && this.options.focusOnError === 'summary' && Boolean(this.summaryAddon);\n }\n\n registerDefaultRules(): void {\n this.registerRule('required', requiredRule);\n this.registerRule('email', emailRule);\n this.registerRule('minLength', minLengthRule);\n this.registerRule('maxLength', maxLengthRule);\n this.registerRule('pattern', patternRule);\n this.registerRule('checked', checkedRule);\n this.registerRule('sameAs', sameAsRule);\n }\n\n registerRule(name: string, rule: ValidatorRule): this {\n this.ruleRegistry.register(name, rule);\n return this;\n }\n\n unregisterRule(name: string): this {\n this.ruleRegistry.unregister(name);\n return this;\n }\n\n installAddons(): void {\n this.addons = normalizeToArray(this.options.addons)\n .filter((addon): addon is ValidatorAddon => {\n return Boolean(addon) && typeof addon === 'object' && typeof addon.install === 'function';\n });\n this.addons.forEach((addon) => addon.install(this));\n }\n\n collectFields(): FieldController[] {\n const nodes = Array.from(this.form.querySelectorAll(this.options.selectors.fields))\n .filter((element): element is HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement => {\n return element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement;\n })\n .filter((element) => element.name || element.id);\n const nameCounts = nodes.reduce<Map<string, number>>((counts, element) => {\n const name = element.name || element.id;\n counts.set(name, (counts.get(name) || 0) + 1);\n return counts;\n }, new Map());\n const grouped = new Map<string, Array<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>>();\n\n nodes.forEach((element) => {\n const name = element.name || element.id;\n const type = (element.type || element.tagName).toLowerCase();\n const shouldGroup = type === 'radio' || (type === 'checkbox' && (nameCounts.get(name) || 0) > 1);\n if (!grouped.has(name)) {\n grouped.set(name, []);\n }\n\n const group = grouped.get(name)!;\n if (shouldGroup) {\n group.push(element);\n return;\n }\n\n if (group.length === 0) {\n group.push(element);\n }\n });\n\n return [...grouped.entries()].map(([name, elements]) => new FieldController(this, name, elements));\n }\n\n refresh(): this {\n this.fields = this.collectFields();\n this.fieldMap = new Map(this.fields.map((field) => [field.name, field]));\n this.fields.forEach((field) => this.state.ensure(field.name));\n return this;\n }\n\n private bindEvents(): void {\n const listenerOptions = this.abortController ? { signal: this.abortController.signal } : undefined;\n this.form.addEventListener('submit', this.onSubmit, listenerOptions);\n this.form.addEventListener('focusout', this.onFocusOut, listenerOptions);\n this.form.addEventListener('input', this.onInput, listenerOptions);\n this.form.addEventListener('change', this.onChange, listenerOptions);\n }\n\n private async handleSubmit(event: Event): Promise<void> {\n if (!this.enabled || !this.options.validateOn.includes('submit')) {\n return;\n }\n\n this.hasSubmitted = true;\n const valid = await this.validate({ reason: 'submit' });\n if (!valid) {\n event.preventDefault();\n this.emit(EVENTS.submitBlocked, { errors: this.getErrors() });\n this.focusOnError();\n }\n }\n\n private handleFocusOut(event: Event): void {\n const field = this.findFieldByElement(event.target);\n if (!field) {\n return;\n }\n\n field.markTouched();\n if (this.options.validateOn.includes('blur') || this.hasSubmitted) {\n void this.validateField(field, { reason: 'blur' });\n }\n }\n\n private handleInput(event: Event): void {\n const field = this.findFieldByElement(event.target);\n if (!field) {\n return;\n }\n\n field.markDirty();\n field.clearServerMessage();\n this.formErrors = [];\n if (this.options.validateOn.includes('input')) {\n this.queueValidation(field, 'input');\n } else if (field.lastError && !field.serverMessage) {\n this.renderer.clear(field);\n field.lastError = '';\n }\n }\n\n private handleChange(event: Event): void {\n const field = this.findFieldByElement(event.target);\n if (!field) {\n return;\n }\n\n field.markDirty();\n field.clearServerMessage();\n if (this.options.validateOn.includes('change')) {\n void this.validateField(field, { reason: 'change' });\n }\n }\n\n queueValidation(field: FieldController, reason: string): void {\n clearTimeout(this.timers.get(field.name));\n const timer = setTimeout(() => {\n void this.validateField(field, { reason });\n this.timers.delete(field.name);\n }, this.options.debounce);\n this.timers.set(field.name, timer);\n }\n\n findFieldByElement(element: EventTarget | null): FieldController | undefined {\n if (!(element instanceof HTMLElement)) {\n return undefined;\n }\n\n return this.fields.find((field) => field.elements.some((fieldElement) => fieldElement === element));\n }\n\n resolveField(input: FieldInput): FieldController | null {\n if (input instanceof FieldController) {\n return input;\n }\n\n if (typeof input === 'string') {\n return this.fieldMap.get(input) || null;\n }\n\n if (input instanceof HTMLElement) {\n return this.findFieldByElement(input) || null;\n }\n\n return null;\n }\n\n getAllValues(): Record<string, FieldValue> {\n return Object.fromEntries(this.fields.map((field) => [field.name, field.getValue()]));\n }\n\n async validate(options: ValidateOptions = {}): Promise<boolean> {\n const reason = options.reason || 'manual';\n const previousInlineErrorAnnouncementsMuted = this.inlineErrorAnnouncementsMuted;\n this.inlineErrorAnnouncementsMuted =\n previousInlineErrorAnnouncementsMuted || this.shouldMuteInlineErrorsForBatch(reason);\n\n try {\n this.emit(EVENTS.beforeValidate, { reason });\n this.state.setFormState('validating');\n\n const results = await Promise.all(this.fields.map((field) => this.validateField(field, options)));\n const valid = results.every(Boolean) && this.formErrors.length === 0;\n\n this.state.setFormState(valid ? 'valid' : 'invalid');\n this.emit(EVENTS.afterValidate, { valid, errors: this.getErrors() });\n this.emit(valid ? EVENTS.formValid : EVENTS.formInvalid, { errors: this.getErrors() });\n return valid;\n } finally {\n this.inlineErrorAnnouncementsMuted = previousInlineErrorAnnouncementsMuted;\n }\n }\n\n async validateField(input: FieldInput, options: ValidateOptions = {}): Promise<boolean> {\n const field = this.resolveField(input);\n if (!field) {\n return true;\n }\n\n const ignoredReason = field.shouldIgnore();\n if (ignoredReason) {\n field.lastError = '';\n this.renderer.clear(field);\n this.state.updateField(field.name, {\n ignored: ignoredReason !== 'disabled',\n disabled: ignoredReason === 'disabled',\n valid: true,\n invalid: false,\n pending: false,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty\n });\n return true;\n }\n\n if (field.serverMessage) {\n this.renderer.render(field, field.serverMessage);\n this.state.updateField(field.name, {\n valid: false,\n invalid: true,\n pending: false,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty\n });\n this.emit(EVENTS.fieldInvalid, { field, message: field.serverMessage, reason: options.reason || 'manual' });\n return false;\n }\n\n const runId = (this.validationRuns.get(field.name) || 0) + 1;\n this.validationRuns.set(field.name, runId);\n field.setVisualState('pending');\n this.state.updateField(field.name, {\n pending: true,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty\n });\n\n const rules = field.getRules();\n const allValues = this.getAllValues();\n for (const [ruleName, ruleOptions] of Object.entries(rules)) {\n const result = await this.ruleRegistry.run(ruleName, field.getValidationContext(ruleName, ruleOptions, allValues));\n if (this.validationRuns.get(field.name) !== runId) {\n return !field.lastError;\n }\n\n if (!result.valid) {\n const message = this.messageResolver.resolve(field, ruleName, result);\n field.lastError = message;\n this.renderer.render(field, message);\n this.state.updateField(field.name, {\n valid: false,\n invalid: true,\n pending: false,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty,\n ignored: false,\n disabled: false\n });\n this.emit(EVENTS.fieldInvalid, { field, message, reason: options.reason || 'manual' });\n return false;\n }\n }\n\n field.lastError = '';\n this.renderer.clear(field);\n this.state.updateField(field.name, {\n valid: true,\n invalid: false,\n pending: false,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty,\n ignored: false,\n disabled: false\n });\n this.emit(EVENTS.fieldValid, { field, reason: options.reason || 'manual' });\n return true;\n }\n\n reset(): this {\n this.form.reset();\n this.hasSubmitted = false;\n this.clearErrors();\n this.fields.forEach((field) => {\n field.dirty = false;\n field.touched = false;\n field.setVisualState('valid');\n this.state.updateField(field.name, {\n pristine: true,\n dirty: false,\n touched: false,\n pending: false,\n valid: false,\n invalid: false,\n disabled: false,\n ignored: false\n });\n });\n this.state.setFormState('idle');\n return this;\n }\n\n clearErrors(): this {\n this.formErrors = [];\n this.fields.forEach((field) => {\n field.clearServerMessage();\n field.lastError = '';\n this.renderer.clear(field);\n });\n this.emit(EVENTS.afterValidate, { valid: true, errors: this.getErrors() });\n return this;\n }\n\n setErrors(errors: ServerErrors = {}): this {\n this.clearErrors();\n const fieldErrors = errors.fields || Object.fromEntries(\n Object.entries(errors).filter(([key]) => !['form', '_form', 'fields'].includes(key))\n );\n const formErrors = errors.form || errors._form || [];\n\n const previousInlineErrorAnnouncementsMuted = this.inlineErrorAnnouncementsMuted;\n this.inlineErrorAnnouncementsMuted =\n previousInlineErrorAnnouncementsMuted ||\n (this.options.focusOnError === 'summary' && Boolean(this.summaryAddon));\n\n try {\n this.formErrors = Array.isArray(formErrors) ? formErrors.map(String) : [formErrors].filter(Boolean).map(String);\n Object.entries(fieldErrors).forEach(([name, message]) => {\n const field = this.fieldMap.get(name);\n if (!field || !message) {\n return;\n }\n\n const text = Array.isArray(message) ? String(message[0]) : String(message);\n field.setServerMessage(text);\n this.renderer.render(field, text);\n this.state.updateField(field.name, {\n valid: false,\n invalid: true,\n pending: false,\n touched: field.touched,\n dirty: field.dirty,\n pristine: !field.dirty,\n ignored: false,\n disabled: false\n });\n });\n } finally {\n this.inlineErrorAnnouncementsMuted = previousInlineErrorAnnouncementsMuted;\n }\n\n this.state.setFormState('invalid');\n this.emit(EVENTS.afterValidate, { valid: false, errors: this.getErrors() });\n this.emit(EVENTS.formInvalid, { errors: this.getErrors() });\n return this;\n }\n\n getErrors(): ValidatorErrors {\n const fields = Object.fromEntries(\n this.fields\n .filter((field) => field.lastError)\n .map((field) => [field.name, field.lastError])\n );\n\n return {\n fields,\n form: [...this.formErrors]\n };\n }\n\n getState(): ValidationStateSnapshot {\n return this.state.snapshot();\n }\n\n enable(): this {\n this.enabled = true;\n return this;\n }\n\n disable(): this {\n this.enabled = false;\n return this;\n }\n\n focusOnError(): void {\n if (this.options.focusOnError === false) {\n return;\n }\n\n if (this.options.focusOnError === 'summary' && this.summaryAddon?.hasErrors()) {\n this.summaryAddon.focus();\n return;\n }\n\n const firstInvalidField = this.fields.find((field) => field.lastError);\n firstInvalidField?.focus();\n }\n\n destroy(): void {\n if (this.destroyed) {\n return;\n }\n\n this.destroyed = true;\n if (this.abortController) {\n this.abortController.abort();\n } else {\n this.form.removeEventListener('submit', this.onSubmit);\n this.form.removeEventListener('focusout', this.onFocusOut);\n this.form.removeEventListener('input', this.onInput);\n this.form.removeEventListener('change', this.onChange);\n }\n\n this.timers.forEach((timer) => clearTimeout(timer));\n this.timers.clear();\n this.renderer.destroy?.();\n this.addons.forEach((addon) => addon.destroy?.());\n this.fields.forEach((field) => field.destroy());\n this.form.classList.remove(CLASSES.initialized);\n if (this.addedRootClass) {\n this.form.classList.remove(CLASSES.root);\n }\n if (this.addedNoValidate) {\n this.form.removeAttribute('novalidate');\n }\n\n this.emit(EVENTS.destroy);\n A11yFormValidator.instances.delete(this.form);\n }\n}\n\nexport function createFormValidator(\n form: HTMLFormElement,\n options: A11yFormValidatorOptionsInput = {}\n): A11yFormValidatorInstance {\n return new A11yFormValidator(form, options);\n}\n\nexport function initFormValidators(\n options: A11yFormValidatorOptionsInput = {},\n root?: ParentNode\n): A11yFormValidatorInstance[] {\n const scope = root || globalThis.document;\n if (!scope) {\n return [];\n }\n\n return Array.from(scope.querySelectorAll(SELECTORS.initAll))\n .filter((element): element is HTMLFormElement => element instanceof HTMLFormElement)\n .map((form) => createFormValidator(form, options));\n}\n\nexport default A11yFormValidator;\n","import type { A11yFormValidator, ValidatorAddon } from '../core/A11yFormValidator.js';\nimport type { FieldController } from '../core/FieldController.js';\nimport { ensureElementId, getPreferredScrollBehavior } from '../core/helpers.js';\n\nexport interface ErrorSummaryAddonOptions {\n titleId?: string;\n}\n\nexport interface SummaryEntry {\n field: FieldController | null;\n message: string;\n key?: string;\n}\n\nexport interface ErrorSummaryAddon extends ValidatorAddon {\n validator: A11yFormValidator | null;\n options: ErrorSummaryAddonOptions;\n container: HTMLElement | null;\n title: HTMLHeadingElement | null;\n list: HTMLUListElement | null;\n unsubscribeAfterValidate?: () => void;\n unsubscribeDestroy?: () => void;\n getErrors(): SummaryEntry[];\n update(): void;\n hasErrors(): boolean;\n focus(): void;\n destroy(): void;\n}\n\nexport function createErrorSummaryAddon(options: ErrorSummaryAddonOptions = {}): ErrorSummaryAddon {\n return {\n validator: null,\n options,\n container: null,\n title: null,\n list: null,\n\n install(validator: A11yFormValidator) {\n this.validator = validator;\n this.options = options;\n const document = validator.form.ownerDocument;\n this.container = document.createElement('section');\n this.container.className = 'a11y-form-validator__summary';\n this.container.hidden = true;\n this.container.tabIndex = -1;\n this.title = document.createElement('h2');\n this.title.id = options.titleId || `${ensureElementId(validator.form, 'a11y-form-validator-form')}-summary-title`;\n this.title.className = 'a11y-form-validator__summary-title';\n this.container.setAttribute('aria-labelledby', this.title.id);\n this.list = document.createElement('ul');\n this.list.className = 'a11y-form-validator__summary-list';\n this.container.append(this.title, this.list);\n validator.form.prepend(this.container);\n validator.summaryAddon = this;\n\n this.unsubscribeAfterValidate = validator.events.on('a11y-form-validator:after-validate', () => this.update());\n this.unsubscribeDestroy = validator.events.on('a11y-form-validator:destroy', () => this.destroy());\n },\n\n getErrors(): SummaryEntry[] {\n if (!this.validator) {\n return [];\n }\n\n const fieldErrors = this.validator.fields\n .filter((field) => field.lastError)\n .map((field) => ({\n field,\n message: field.lastError\n }));\n\n const formErrors = this.validator.formErrors.map((message, index) => ({\n field: null,\n message,\n key: `form-${index}`\n }));\n\n return [...formErrors, ...fieldErrors];\n },\n\n hasErrors(): boolean {\n return this.getErrors().length > 0;\n },\n\n update(): void {\n if (!this.container || !this.list || !this.title || !this.validator) {\n return;\n }\n\n const errors = this.getErrors();\n this.list.replaceChildren();\n if (!errors.length) {\n this.container.hidden = true;\n return;\n }\n\n this.title.textContent = this.validator.messageResolver.getSummaryTitle(errors.length);\n errors.forEach((entry) => {\n const item = this.validator!.form.ownerDocument.createElement('li');\n if (!entry.field) {\n item.textContent = entry.message;\n } else {\n const link = this.validator!.form.ownerDocument.createElement('a');\n link.className = 'a11y-form-validator__summary-link';\n link.href = `#${entry.field.primaryId}`;\n link.textContent = this.validator!.messageResolver.getSummaryItem(entry.field, entry.message);\n const field = entry.field;\n link.addEventListener('click', (event) => {\n event.preventDefault();\n field.focus();\n });\n item.append(link);\n }\n this.list!.append(item);\n });\n this.container.hidden = false;\n },\n\n focus(): void {\n if (this.hasErrors() && this.container) {\n this.container.focus({ preventScroll: true });\n this.container.scrollIntoView?.({\n block: 'start',\n behavior: getPreferredScrollBehavior(this.container)\n });\n }\n },\n\n destroy(): void {\n this.unsubscribeAfterValidate?.();\n this.unsubscribeDestroy?.();\n this.container?.remove();\n if (this.validator) {\n this.validator.summaryAddon = null;\n }\n this.container = null;\n this.title = null;\n this.list = null;\n this.validator = null;\n }\n };\n}\n\nexport default createErrorSummaryAddon;\n","import { createErrorSummaryAddon } from '../addons/error-summary.js';\nimport type { A11yFormValidatorOptionsInput } from '../core/A11yFormValidator.js';\n\nexport function createDefaultPreset(): A11yFormValidatorOptionsInput {\n return {\n validateOn: ['submit', 'blur'],\n focusOnError: 'summary',\n errorMode: 'both',\n useNativeRules: true,\n disableNativeUI: true,\n addons: [createErrorSummaryAddon()]\n };\n}\n\nexport default createDefaultPreset;\n","import type { A11yFormValidatorOptionsInput } from '../core/A11yFormValidator.js';\n\nexport function createNoSummaryPreset(): A11yFormValidatorOptionsInput {\n return {\n validateOn: ['submit', 'blur'],\n focusOnError: 'first-invalid',\n errorMode: 'both',\n useNativeRules: true,\n disableNativeUI: true,\n addons: []\n };\n}\n\nexport default createNoSummaryPreset;\n","import type { A11yFormValidatorOptionsInput } from '../core/A11yFormValidator.js';\n\nexport function createMinimalPreset(): A11yFormValidatorOptionsInput {\n return {\n validateOn: ['submit'],\n focusOnError: 'first-invalid',\n errorMode: 'inline',\n useNativeRules: true,\n disableNativeUI: true\n };\n}\n\nexport default createMinimalPreset;\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ {
2
+ "required": "هذا الحقل مطلوب.",
3
+ "email": "أدخل عنوان بريد إلكتروني صالحًا.",
4
+ "minLength": "أدخل {min} أحرف على الأقل.",
5
+ "maxLength": "أدخل {max} حرفًا كحد أقصى.",
6
+ "pattern": "أدخل قيمة بالتنسيق الصحيح.",
7
+ "checked": "حدد هذا الخيار للمتابعة.",
8
+ "sameAs": "يجب أن تتطابق هذه القيمة مع {targetLabel}.",
9
+ "summaryTitleOne": "توجد مشكلة واحدة في النموذج.",
10
+ "summaryTitleOther": "توجد {count} مشكلات في النموذج.",
11
+ "summaryItem": "{fieldLabel}: {message}",
12
+ "genericFallback": "تحقق من هذا الحقل."
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "required": "This field is required.",
3
+ "email": "Enter a valid email address.",
4
+ "minLength": "Enter at least {min} characters.",
5
+ "maxLength": "Enter no more than {max} characters.",
6
+ "pattern": "Enter a value in the correct format.",
7
+ "checked": "Select this option to continue.",
8
+ "sameAs": "This value must match {targetLabel}.",
9
+ "summaryTitleOne": "There is 1 problem with your form.",
10
+ "summaryTitleOther": "There are {count} problems with your form.",
11
+ "summaryItem": "{fieldLabel}: {message}",
12
+ "genericFallback": "Check this field."
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "required": "Este campo es obligatorio.",
3
+ "email": "Introduce una dirección de correo electrónico válida.",
4
+ "minLength": "Introduce al menos {min} caracteres.",
5
+ "maxLength": "Introduce como máximo {max} caracteres.",
6
+ "pattern": "Introduce un valor con el formato correcto.",
7
+ "checked": "Selecciona esta opción para continuar.",
8
+ "sameAs": "Este valor debe coincidir con {targetLabel}.",
9
+ "summaryTitleOne": "Hay 1 problema con tu formulario.",
10
+ "summaryTitleOther": "Hay {count} problemas con tu formulario.",
11
+ "summaryItem": "{fieldLabel}: {message}",
12
+ "genericFallback": "Revisa este campo."
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "required": "Ce champ est obligatoire.",
3
+ "email": "Saisissez une adresse e-mail valide.",
4
+ "minLength": "Saisissez au moins {min} caractères.",
5
+ "maxLength": "Saisissez au maximum {max} caractères.",
6
+ "pattern": "Saisissez une valeur au bon format.",
7
+ "checked": "Sélectionnez cette option pour continuer.",
8
+ "sameAs": "Cette valeur doit correspondre à {targetLabel}.",
9
+ "summaryTitleOne": "Il y a 1 problème dans votre formulaire.",
10
+ "summaryTitleOther": "Il y a {count} problèmes dans votre formulaire.",
11
+ "summaryItem": "{fieldLabel}: {message}",
12
+ "genericFallback": "Vérifiez ce champ."
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "required": "यह फ़ील्ड आवश्यक है।",
3
+ "email": "एक मान्य ईमेल पता दर्ज करें।",
4
+ "minLength": "कम से कम {min} वर्ण दर्ज करें।",
5
+ "maxLength": "अधिकतम {max} वर्ण दर्ज करें।",
6
+ "pattern": "सही प्रारूप में मान दर्ज करें।",
7
+ "checked": "जारी रखने के लिए यह विकल्प चुनें।",
8
+ "sameAs": "यह मान {targetLabel} से मेल खाना चाहिए।",
9
+ "summaryTitleOne": "आपके फ़ॉर्म में 1 समस्या है।",
10
+ "summaryTitleOther": "आपके फ़ॉर्म में {count} समस्याएँ हैं।",
11
+ "summaryItem": "{fieldLabel}: {message}",
12
+ "genericFallback": "इस फ़ील्ड की जाँच करें।"
13
+ }