@viveksinghind/narrative-form-core 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/state/formState.ts","../src/validators/registry.ts","../src/validation/engine.ts","../src/validators/builtins.ts","../src/i18n/strings.ts","../src/dynamic/fetchConfig.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Framework-agnostic form state manager for narrative-form.\r\n * Manages field lifecycle, values, and timing metadata.\r\n *\r\n * @remarks\r\n * This module has zero framework dependencies — it is pure TypeScript logic\r\n * consumed by React/Vue/Angular wrappers.\r\n */\r\n\r\nimport type { NarrativeField, NarrativeFieldValues, NarrativeMeta } from \"../types\";\r\n\r\n/** Possible statuses for a single field in the form flow. */\r\nexport type FieldStatus = \"idle\" | \"typing\" | \"active\" | \"confirmed\" | \"editing\";\r\n\r\n/** Snapshot of the entire form's state at a point in time. */\r\nexport interface FormStateSnapshot {\r\n /** Ordered list of field configurations. */\r\n readonly fields: readonly NarrativeField[];\r\n /** Index of the currently active field (-1 if none are active yet). */\r\n readonly activeIndex: number;\r\n /** Map of field key → current value. */\r\n readonly values: Readonly<NarrativeFieldValues>;\r\n /** Map of field key → current lifecycle status. */\r\n readonly statuses: Readonly<Record<string, FieldStatus>>;\r\n /** Whether every field has been confirmed. */\r\n readonly isComplete: boolean;\r\n}\r\n\r\n/**\r\n * Pure form state engine for narrative-form.\r\n *\r\n * Tracks which field is active, all confirmed values, per-field statuses,\r\n * and timing metadata for analytics. Framework wrappers subscribe to\r\n * state changes via the `onChange` callback.\r\n */\r\nexport class FormStateEngine {\r\n private fields: readonly NarrativeField[];\r\n private activeIndex: number;\r\n private values: NarrativeFieldValues;\r\n private statuses: Record<string, FieldStatus>;\r\n private fieldTimings: Record<string, number>;\r\n private fieldStartTimes: Record<string, number>;\r\n private formStartTime: number;\r\n private onChange: (() => void) | undefined;\r\n\r\n /**\r\n * Create a new FormStateEngine.\r\n *\r\n * @param fields - Ordered array of field configurations\r\n * @param onChange - Optional callback invoked on every state mutation\r\n */\r\n constructor(fields: readonly NarrativeField[], onChange?: () => void) {\r\n this.fields = fields;\r\n this.activeIndex = -1;\r\n this.values = {};\r\n this.statuses = {};\r\n this.fieldTimings = {};\r\n this.fieldStartTimes = {};\r\n this.formStartTime = Date.now();\r\n this.onChange = onChange;\r\n\r\n // Initialise all field statuses to idle\r\n for (const field of fields) {\r\n this.statuses[field.key] = \"idle\";\r\n this.fieldTimings[field.key] = 0;\r\n }\r\n }\r\n\r\n /** Returns a readonly snapshot of the current form state. */\r\n getSnapshot(): FormStateSnapshot {\r\n return {\r\n fields: this.fields,\r\n activeIndex: this.activeIndex,\r\n values: { ...this.values },\r\n statuses: { ...this.statuses },\r\n isComplete: this.fields.every((f) => this.statuses[f.key] === \"confirmed\"),\r\n };\r\n }\r\n\r\n /** Returns a copy of all confirmed field values. */\r\n getValues(): NarrativeFieldValues {\r\n return { ...this.values };\r\n }\r\n\r\n /**\r\n * Returns analytics metadata about the form session.\r\n *\r\n * @param formId - Optional form identifier\r\n * @param formVersion - Optional form version number\r\n */\r\n getMeta(formId?: string, formVersion?: number): NarrativeMeta {\r\n return {\r\n formId,\r\n formVersion,\r\n totalTimeMs: Date.now() - this.formStartTime,\r\n fieldTimings: { ...this.fieldTimings },\r\n };\r\n }\r\n\r\n /**\r\n * Start typing animation for a specific field.\r\n * Transitions the field from `idle` to `typing`.\r\n *\r\n * @param key - The field key to begin typing\r\n */\r\n startTyping(key: string): void {\r\n const index = this.findFieldIndex(key);\r\n if (index === -1) return;\r\n\r\n this.statuses[key] = \"typing\";\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Mark a field as active (typewriter finished, input is now visible).\r\n * Starts the timing clock for this field.\r\n *\r\n * @param key - The field key to activate\r\n */\r\n activateField(key: string): void {\r\n const index = this.findFieldIndex(key);\r\n if (index === -1) return;\r\n\r\n this.activeIndex = index;\r\n this.statuses[key] = \"active\";\r\n this.fieldStartTimes[key] = Date.now();\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Confirm a field with a value.\r\n * Records the time spent on the field and advances to the next one.\r\n *\r\n * @param key - The field key to confirm\r\n * @param value - The confirmed value\r\n */\r\n confirmField(key: string, value: string | string[]): void {\r\n const index = this.findFieldIndex(key);\r\n if (index === -1) return;\r\n\r\n this.values[key] = value;\r\n this.statuses[key] = \"confirmed\";\r\n\r\n // Record timing\r\n const startTime = this.fieldStartTimes[key];\r\n if (startTime !== undefined) {\r\n this.fieldTimings[key] = Date.now() - startTime;\r\n }\r\n\r\n // Advance to next unconfirmed field\r\n const nextIndex = this.findNextUnconfirmedIndex(index);\r\n if (nextIndex !== -1) {\r\n this.activeIndex = nextIndex;\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Reopen a confirmed field for editing.\r\n * The field transitions to `editing` status with its current value preserved.\r\n *\r\n * @param key - The field key to edit\r\n */\r\n editField(key: string): void {\r\n const index = this.findFieldIndex(key);\r\n if (index === -1) return;\r\n if (this.statuses[key] !== \"confirmed\") return;\r\n\r\n this.statuses[key] = \"editing\";\r\n this.activeIndex = index;\r\n this.fieldStartTimes[key] = Date.now();\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Re-confirm a field after editing.\r\n *\r\n * @param key - The field key to re-confirm\r\n * @param value - The new confirmed value\r\n */\r\n reconfirmField(key: string, value: string | string[]): void {\r\n const index = this.findFieldIndex(key);\r\n if (index === -1) return;\r\n\r\n this.values[key] = value;\r\n this.statuses[key] = \"confirmed\";\r\n\r\n // Record updated timing\r\n const startTime = this.fieldStartTimes[key];\r\n if (startTime !== undefined) {\r\n this.fieldTimings[key] = (this.fieldTimings[key] ?? 0) + (Date.now() - startTime);\r\n }\r\n\r\n // Return active index to the furthest unconfirmed field\r\n const nextIndex = this.findNextUnconfirmedIndex(-1);\r\n if (nextIndex !== -1) {\r\n this.activeIndex = nextIndex;\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Move to the next field without confirming the current one.\r\n * Useful for programmatic navigation via ref API.\r\n */\r\n next(): void {\r\n const nextIndex = this.findNextUnconfirmedIndex(this.activeIndex);\r\n if (nextIndex !== -1) {\r\n this.activeIndex = nextIndex;\r\n this.notify();\r\n }\r\n }\r\n\r\n /**\r\n * Focus a specific field by key.\r\n * Only works for confirmed fields (triggers edit) or the current active field.\r\n *\r\n * @param key - The field key to focus\r\n */\r\n focusField(key: string): void {\r\n const index = this.findFieldIndex(key);\r\n if (index === -1) return;\r\n\r\n const status = this.statuses[key];\r\n if (status === \"confirmed\") {\r\n this.editField(key);\r\n } else if (status === \"active\" || status === \"editing\") {\r\n // Already focusable — just ensure activeIndex is correct\r\n this.activeIndex = index;\r\n this.notify();\r\n }\r\n }\r\n\r\n /**\r\n * Reset all form state to initial values.\r\n * Clears all values, statuses, and timings.\r\n */\r\n reset(): void {\r\n this.activeIndex = -1;\r\n this.values = {};\r\n this.fieldTimings = {};\r\n this.fieldStartTimes = {};\r\n this.formStartTime = Date.now();\r\n\r\n for (const field of this.fields) {\r\n this.statuses[field.key] = \"idle\";\r\n this.fieldTimings[field.key] = 0;\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Update the onChange listener.\r\n * Used by framework wrappers to trigger re-renders.\r\n *\r\n * @param fn - Callback to invoke on state changes\r\n */\r\n setOnChange(fn: () => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n // ── Private helpers ──────────────────────────────────────────────\r\n\r\n private findFieldIndex(key: string): number {\r\n return this.fields.findIndex((f) => f.key === key);\r\n }\r\n\r\n private findNextUnconfirmedIndex(afterIndex: number): number {\r\n for (let i = afterIndex + 1; i < this.fields.length; i++) {\r\n const field = this.fields[i];\r\n if (field && this.statuses[field.key] !== \"confirmed\") {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n private notify(): void {\r\n this.onChange?.();\r\n }\r\n}\r\n","/**\r\n * Validator plugin registry for narrative-form.\r\n *\r\n * @remarks\r\n * Allows developers to register reusable named validators globally at app level.\r\n * Fields can then reference them by name via the `use` property.\r\n *\r\n * @example\r\n * ```ts\r\n * registerValidator(\"indianPhone\", (value) => {\r\n * return /^[6-9]\\d{9}$/.test(value) || \"Enter a valid Indian phone number\";\r\n * });\r\n *\r\n * // In field config:\r\n * { key: \"phone\", type: \"tel\", prefix: \"My phone is\", validation: { use: \"indianPhone\" } }\r\n * ```\r\n */\r\n\r\nimport type { NarrativeFieldValues } from \"../types\";\r\n\r\n/** A validator function that returns true on pass or an error string on fail. */\r\nexport type ValidatorFn = (\r\n value: string,\r\n allValues: NarrativeFieldValues,\r\n) => boolean | string | Promise<boolean | string>;\r\n\r\n/** Internal registry map of named validators. */\r\nconst registry = new Map<string, ValidatorFn>();\r\n\r\n/**\r\n * Register a reusable named validator.\r\n *\r\n * @param name - Unique validator name (e.g., \"indianPhone\", \"pan\")\r\n * @param fn - Validator function returning true on pass or error string on fail\r\n */\r\nexport function registerValidator(name: string, fn: ValidatorFn): void {\r\n registry.set(name, fn);\r\n}\r\n\r\n/**\r\n * Retrieve a registered validator by name.\r\n *\r\n * @param name - The validator name to look up\r\n * @returns The validator function, or undefined if not found\r\n */\r\nexport function getValidator(name: string): ValidatorFn | undefined {\r\n return registry.get(name);\r\n}\r\n\r\n/**\r\n * Check if a validator is registered.\r\n *\r\n * @param name - The validator name to check\r\n */\r\nexport function hasValidator(name: string): boolean {\r\n return registry.has(name);\r\n}\r\n\r\n/**\r\n * Remove a registered validator.\r\n *\r\n * @param name - The validator name to remove\r\n */\r\nexport function unregisterValidator(name: string): void {\r\n registry.delete(name);\r\n}\r\n\r\n/**\r\n * Clear all registered validators.\r\n * Useful for testing or hot-reload scenarios.\r\n */\r\nexport function clearValidators(): void {\r\n registry.clear();\r\n}\r\n\r\n/**\r\n * Get all registered validator names.\r\n * Useful for debugging.\r\n */\r\nexport function getRegisteredValidatorNames(): string[] {\r\n return Array.from(registry.keys());\r\n}\r\n","/**\r\n * Validation engine for narrative-form.\r\n *\r\n * @remarks\r\n * Runs validation rules in a strict priority order defined in SPEC.md.\r\n * Supports both `bail` (stop at first failure) and `all` (collect all errors) modes.\r\n *\r\n * **Priority order:**\r\n * 1. required\r\n * 2. minLength / maxLength\r\n * 3. exactLength\r\n * 4. min / max\r\n * 5. pattern / isEmail\r\n * 6. use (registered plugin validators) — in array order\r\n * 7. Sync custom rules — in array order\r\n * 8. Async custom rules — in array order\r\n * 9. serverValidate URL call\r\n * 10. Global cross-field validators (handled externally)\r\n *\r\n * Async rules only run if all sync rules pass first.\r\n */\r\n\r\nimport type {\r\n NarrativeValidation,\r\n NarrativeFieldValues,\r\n NarrativeServerValidation,\r\n} from \"../types\";\r\nimport { getValidator } from \"../validators/registry\";\r\n\r\n/** Result of running the validation engine on a single field. */\r\nexport interface ValidationResult {\r\n /** Whether the field value is valid. */\r\n valid: boolean;\r\n /** Array of error messages (empty if valid). */\r\n errors: string[];\r\n}\r\n\r\n/** Result of async validation — extends sync with an abort handle. */\r\nexport interface AsyncValidationHandle {\r\n /** Promise that resolves with the validation result. */\r\n promise: Promise<ValidationResult>;\r\n /** Abort the in-flight async validation. */\r\n abort: () => void;\r\n}\r\n\r\n/**\r\n * Validate a single field value synchronously.\r\n *\r\n * Runs rules in strict priority order. In `bail` mode (default),\r\n * stops at the first failure. In `all` mode, collects every error.\r\n *\r\n * @param value - The field value to validate\r\n * @param validation - The validation configuration for this field\r\n * @param allValues - All confirmed field values (for cross-field checks)\r\n * @returns Validation result with valid flag and error messages\r\n */\r\nexport function validateField(\r\n value: string,\r\n validation: NarrativeValidation | undefined,\r\n allValues: NarrativeFieldValues = {},\r\n): ValidationResult {\r\n if (!validation) {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n const errors: string[] = [];\r\n const mode = validation.mode ?? \"bail\";\r\n\r\n /**\r\n * Add an error and return true if we should stop (bail mode).\r\n */\r\n const addError = (message: string): boolean => {\r\n errors.push(message);\r\n return mode === \"bail\";\r\n };\r\n\r\n // ── 1. required ──────────────────────────────────────────────────\r\n\r\n if (validation.required) {\r\n const trimmed = value.trim();\r\n if (trimmed.length === 0) {\r\n if (addError(validation.requiredMessage ?? \"This field is required\")) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n }\r\n\r\n // Skip remaining rules if value is empty and not required\r\n if (value.trim().length === 0) {\r\n return { valid: errors.length === 0, errors };\r\n }\r\n\r\n // ── 2. minLength / maxLength ─────────────────────────────────────\r\n\r\n if (validation.minLength !== undefined && value.length < validation.minLength) {\r\n if (\r\n addError(\r\n validation.minLengthMessage ??\r\n `Must be at least ${String(validation.minLength)} characters`,\r\n )\r\n ) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n\r\n if (validation.maxLength !== undefined && value.length > validation.maxLength) {\r\n if (\r\n addError(\r\n validation.maxLengthMessage ??\r\n `Must be at most ${String(validation.maxLength)} characters`,\r\n )\r\n ) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n\r\n // ── 3. exactLength ───────────────────────────────────────────────\r\n\r\n if (validation.exactLength !== undefined && value.length !== validation.exactLength) {\r\n if (\r\n addError(\r\n validation.exactLengthMessage ??\r\n `Must be exactly ${String(validation.exactLength)} characters`,\r\n )\r\n ) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n\r\n // ── 4. min / max (numeric) ───────────────────────────────────────\r\n\r\n if (validation.min !== undefined || validation.max !== undefined) {\r\n const num = Number(value);\r\n if (!isNaN(num)) {\r\n if (validation.min !== undefined && num < validation.min) {\r\n if (\r\n addError(\r\n validation.minMessage ?? `Must be at least ${String(validation.min)}`,\r\n )\r\n ) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n\r\n if (validation.max !== undefined && num > validation.max) {\r\n if (\r\n addError(\r\n validation.maxMessage ?? `Must be at most ${String(validation.max)}`,\r\n )\r\n ) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ── 5. pattern / isEmail ─────────────────────────────────────────\r\n\r\n if (validation.pattern !== undefined && !validation.pattern.test(value)) {\r\n if (addError(validation.patternMessage ?? \"Invalid format\")) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n\r\n if (validation.isEmail) {\r\n const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!emailPattern.test(value.trim())) {\r\n if (addError(validation.isEmailMessage ?? \"Enter a valid email address\")) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n }\r\n\r\n // ── 6. use (registered plugin validators) — sync only ────────────\r\n\r\n if (validation.use !== undefined) {\r\n const names = Array.isArray(validation.use) ? validation.use : [validation.use];\r\n for (const name of names) {\r\n const validatorFn = getValidator(name);\r\n if (validatorFn) {\r\n const result = validatorFn(value, allValues);\r\n // Only handle sync results here — async handled in validateFieldAsync\r\n if (typeof result === \"string\") {\r\n if (addError(result)) {\r\n return { valid: false, errors };\r\n }\r\n } else if (result === false) {\r\n if (addError(`Validation \"${name}\" failed`)) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n // If result is a Promise, skip it — handled by validateFieldAsync\r\n }\r\n }\r\n }\r\n\r\n // ── 7. Sync custom rules ─────────────────────────────────────────\r\n\r\n // Single custom validator function\r\n if (validation.custom !== undefined) {\r\n const result = validation.custom(value, allValues);\r\n // Only handle sync results here\r\n if (typeof result === \"string\") {\r\n if (addError(result)) {\r\n return { valid: false, errors };\r\n }\r\n } else if (result === false) {\r\n if (addError(\"Validation failed\")) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n }\r\n\r\n // Multiple named rules — sync only\r\n if (validation.rules !== undefined) {\r\n for (const rule of validation.rules) {\r\n if (rule.async) continue;\r\n\r\n const result = rule.validate(value, allValues);\r\n if (typeof result === \"string\") {\r\n if (addError(result)) {\r\n return { valid: false, errors };\r\n }\r\n } else if (result === false) {\r\n if (addError(rule.message ?? `Validation \"${rule.name}\" failed`)) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { valid: errors.length === 0, errors };\r\n}\r\n\r\n/**\r\n * Check if a field has any async validation rules that need to run.\r\n *\r\n * @param validation - The validation configuration to check\r\n * @returns Whether async validation is needed\r\n */\r\nexport function hasAsyncValidation(\r\n validation: NarrativeValidation | undefined,\r\n): boolean {\r\n if (!validation) return false;\r\n\r\n // Check for async custom rules\r\n if (validation.rules?.some((r) => r.async)) return true;\r\n\r\n // Check for server validation\r\n if (validation.serverValidate) return true;\r\n\r\n // Check if single custom validator returns a promise (can't know statically)\r\n // We'll handle this at runtime\r\n\r\n // Check if any `use` validators are async (can't know statically)\r\n // We'll handle this at runtime\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Run async validation rules on a field value.\r\n *\r\n * Only runs if all sync rules pass first. Returns an abort handle\r\n * so callers can cancel in-flight requests on new input.\r\n *\r\n * @param value - The field value to validate\r\n * @param validation - The validation configuration\r\n * @param allValues - All confirmed field values\r\n * @returns An abort handle with a promise and abort method\r\n */\r\nexport function validateFieldAsync(\r\n value: string,\r\n validation: NarrativeValidation | undefined,\r\n allValues: NarrativeFieldValues = {},\r\n): AsyncValidationHandle {\r\n const controller = new AbortController();\r\n\r\n const promise = (async (): Promise<ValidationResult> => {\r\n // First run all sync rules — if they fail, don't bother with async\r\n const syncResult = validateField(value, validation, allValues);\r\n if (!syncResult.valid) {\r\n return syncResult;\r\n }\r\n\r\n if (!validation) {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n const errors: string[] = [];\r\n const mode = validation.mode ?? \"bail\";\r\n\r\n const addError = (message: string): boolean => {\r\n errors.push(message);\r\n return mode === \"bail\";\r\n };\r\n\r\n // ── 8. Async custom rules ────────────────────────────────────\r\n\r\n // Single custom validator — might return a promise\r\n if (validation.custom !== undefined) {\r\n const result = validation.custom(value, allValues);\r\n if (result instanceof Promise) {\r\n if (controller.signal.aborted) return { valid: true, errors: [] };\r\n const resolved = await result;\r\n if (controller.signal.aborted) return { valid: true, errors: [] };\r\n if (typeof resolved === \"string\") {\r\n if (addError(resolved)) return { valid: false, errors };\r\n } else if (resolved === false) {\r\n if (addError(\"Validation failed\")) return { valid: false, errors };\r\n }\r\n }\r\n }\r\n\r\n // Async use validators\r\n if (validation.use !== undefined) {\r\n const names = Array.isArray(validation.use) ? validation.use : [validation.use];\r\n for (const name of names) {\r\n const validatorFn = getValidator(name);\r\n if (validatorFn) {\r\n const result = validatorFn(value, allValues);\r\n if (result instanceof Promise) {\r\n if (controller.signal.aborted) return { valid: true, errors: [] };\r\n const resolved = await result;\r\n if (controller.signal.aborted) return { valid: true, errors: [] };\r\n if (typeof resolved === \"string\") {\r\n if (addError(resolved)) return { valid: false, errors };\r\n } else if (resolved === false) {\r\n if (addError(`Validation \"${name}\" failed`))\r\n return { valid: false, errors };\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Multiple named rules — async only\r\n if (validation.rules !== undefined) {\r\n for (const rule of validation.rules) {\r\n if (!rule.async) continue;\r\n if (controller.signal.aborted) return { valid: true, errors: [] };\r\n\r\n const result = await rule.validate(value, allValues);\r\n if (controller.signal.aborted) return { valid: true, errors: [] };\r\n\r\n if (typeof result === \"string\") {\r\n if (addError(result)) return { valid: false, errors };\r\n } else if (result === false) {\r\n if (addError(rule.message ?? `Validation \"${rule.name}\" failed`))\r\n return { valid: false, errors };\r\n }\r\n }\r\n }\r\n\r\n // ── 9. Server-driven validation ──────────────────────────────\r\n\r\n if (validation.serverValidate) {\r\n if (controller.signal.aborted) return { valid: true, errors: [] };\r\n\r\n const serverResult = await runServerValidation(\r\n value,\r\n validation.serverValidate,\r\n allValues,\r\n controller.signal,\r\n );\r\n\r\n if (controller.signal.aborted) return { valid: true, errors: [] };\r\n\r\n if (!serverResult.valid) {\r\n for (const err of serverResult.errors) {\r\n if (addError(err)) return { valid: false, errors };\r\n }\r\n }\r\n }\r\n\r\n return { valid: errors.length === 0, errors };\r\n })();\r\n\r\n return {\r\n promise,\r\n abort: () => controller.abort(),\r\n };\r\n}\r\n\r\n/**\r\n * Execute a server-driven validation call.\r\n *\r\n * @param value - The field value to validate\r\n * @param config - Server validation configuration\r\n * @param allValues - All confirmed values\r\n * @param signal - AbortSignal for cancellation\r\n * @returns Validation result from the server\r\n */\r\nasync function runServerValidation(\r\n value: string,\r\n config: NarrativeServerValidation,\r\n allValues: NarrativeFieldValues,\r\n signal: AbortSignal,\r\n): Promise<ValidationResult> {\r\n const { url, method = \"POST\", headers = {}, timeout = 5000 } = config;\r\n\r\n try {\r\n const timeoutId = setTimeout(() => {\r\n // AbortController doesn't have timeout built-in on all targets\r\n }, timeout);\r\n\r\n const fetchOptions: RequestInit = {\r\n method,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...headers,\r\n },\r\n signal,\r\n };\r\n\r\n if (method === \"POST\") {\r\n fetchOptions.body = JSON.stringify({ value, allValues });\r\n }\r\n\r\n const response = await fetch(url, fetchOptions);\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n return {\r\n valid: false,\r\n errors: [config.timeoutMessage ?? \"Server validation failed\"],\r\n };\r\n }\r\n\r\n const data: unknown = await response.json();\r\n\r\n // Extract pass/fail using responsePath\r\n const isValid = getNestedValue(data, config.responsePath);\r\n\r\n if (isValid === true || isValid === \"true\") {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n // Extract error message using errorPath\r\n const errorMsg = getNestedValue(data, config.errorPath);\r\n const message =\r\n typeof errorMsg === \"string\" && errorMsg.length > 0\r\n ? errorMsg\r\n : \"Server validation failed\";\r\n\r\n return { valid: false, errors: [message] };\r\n } catch (err: unknown) {\r\n if (signal.aborted) {\r\n return { valid: true, errors: [] };\r\n }\r\n const message =\r\n err instanceof Error && err.name === \"AbortError\"\r\n ? \"Validation cancelled\"\r\n : config.timeoutMessage ?? \"Server validation failed\";\r\n return { valid: false, errors: [message] };\r\n }\r\n}\r\n\r\n/**\r\n * Get a nested value from an object using a dot-separated path.\r\n *\r\n * @param obj - The object to traverse\r\n * @param path - Dot-separated path (e.g., \"data.valid\")\r\n * @returns The value at the path, or undefined\r\n */\r\nfunction getNestedValue(obj: unknown, path: string): unknown {\r\n const parts = path.split(\".\");\r\n let current: unknown = obj;\r\n\r\n for (const part of parts) {\r\n if (current === null || current === undefined) return undefined;\r\n if (typeof current !== \"object\") return undefined;\r\n current = (current as Record<string, unknown>)[part];\r\n }\r\n\r\n return current;\r\n}\r\n","/**\r\n * Built-in validators shipped with narrative-form.\r\n *\r\n * @remarks\r\n * These cover common Indian regulatory formats and universal patterns.\r\n * Call `registerBuiltinValidators()` once at app startup to register them all.\r\n *\r\n * **India-specific:** indianPhone, indianPincode, aadhaar, pan, gst, ifsc\r\n * **Universal:** email, url, strongPassword, alphanumeric, noSpaces,\r\n * futureDate, pastDate, minAge\r\n *\r\n * @example\r\n * ```ts\r\n * import { registerBuiltinValidators } from \"@viveksinghind/narrative-form-core\";\r\n * registerBuiltinValidators(); // Call once at app startup\r\n * ```\r\n */\r\n\r\nimport { registerValidator, hasValidator } from \"./registry\";\r\n\r\n/** Whether builtins have already been registered. */\r\nlet registered = false;\r\n\r\n/**\r\n * Register all built-in validators.\r\n * Safe to call multiple times — subsequent calls are no-ops.\r\n */\r\nexport function registerBuiltinValidators(): void {\r\n if (registered) return;\r\n registered = true;\r\n\r\n // ── India-specific validators ──────────────────────────────────\r\n\r\n /** Indian phone number — starts with 6–9, exactly 10 digits. */\r\n registerValidator(\"indianPhone\", (value) => {\r\n const cleaned = value.replace(/\\s+/g, \"\");\r\n return /^[6-9]\\d{9}$/.test(cleaned) || \"Enter a valid 10-digit Indian phone number\";\r\n });\r\n\r\n /** Indian pincode — exactly 6 digits. */\r\n registerValidator(\"indianPincode\", (value) => {\r\n return /^\\d{6}$/.test(value.trim()) || \"Enter a valid 6-digit pincode\";\r\n });\r\n\r\n /** Aadhaar number — exactly 12 digits. */\r\n registerValidator(\"aadhaar\", (value) => {\r\n const cleaned = value.replace(/\\s+/g, \"\");\r\n return /^\\d{12}$/.test(cleaned) || \"Enter a valid 12-digit Aadhaar number\";\r\n });\r\n\r\n /** PAN card — format ABCDE1234F (5 letters, 4 digits, 1 letter). */\r\n registerValidator(\"pan\", (value) => {\r\n return /^[A-Z]{5}\\d{4}[A-Z]$/.test(value.trim().toUpperCase()) ||\r\n \"Enter a valid PAN (e.g., ABCDE1234F)\";\r\n });\r\n\r\n /** GST number — 15 characters: 2 digits, 10 chars PAN, 1 digit, 1 letter, 1 check. */\r\n registerValidator(\"gst\", (value) => {\r\n return /^\\d{2}[A-Z]{5}\\d{4}[A-Z]\\d[A-Z\\d][A-Z]$/.test(value.trim().toUpperCase()) ||\r\n \"Enter a valid 15-character GST number\";\r\n });\r\n\r\n /** Bank IFSC code — 4 letters, 0, 6 alphanumeric characters. */\r\n registerValidator(\"ifsc\", (value) => {\r\n return /^[A-Z]{4}0[A-Z0-9]{6}$/.test(value.trim().toUpperCase()) ||\r\n \"Enter a valid IFSC code (e.g., SBIN0001234)\";\r\n });\r\n\r\n // ── Universal validators ───────────────────────────────────────\r\n\r\n /** Valid email address. */\r\n registerValidator(\"email\", (value) => {\r\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value.trim()) ||\r\n \"Enter a valid email address\";\r\n });\r\n\r\n /** Valid URL. */\r\n registerValidator(\"url\", (value) => {\r\n try {\r\n new URL(value.trim());\r\n return true;\r\n } catch {\r\n return \"Enter a valid URL\";\r\n }\r\n });\r\n\r\n /** Strong password — min 8 chars, upper, lower, number, special character. */\r\n registerValidator(\"strongPassword\", (value) => {\r\n if (value.length < 8) return \"Password must be at least 8 characters\";\r\n if (!/[A-Z]/.test(value)) return \"Password must contain an uppercase letter\";\r\n if (!/[a-z]/.test(value)) return \"Password must contain a lowercase letter\";\r\n if (!/\\d/.test(value)) return \"Password must contain a number\";\r\n if (!/[^A-Za-z0-9]/.test(value)) return \"Password must contain a special character\";\r\n return true;\r\n });\r\n\r\n /** Alphanumeric only — letters and numbers, no spaces or special chars. */\r\n registerValidator(\"alphanumeric\", (value) => {\r\n return /^[A-Za-z0-9]+$/.test(value) || \"Only letters and numbers are allowed\";\r\n });\r\n\r\n /** No spaces allowed. */\r\n registerValidator(\"noSpaces\", (value) => {\r\n return !/\\s/.test(value) || \"Spaces are not allowed\";\r\n });\r\n\r\n /** Date must be in the future. */\r\n registerValidator(\"futureDate\", (value) => {\r\n const date = new Date(value);\r\n if (isNaN(date.getTime())) return \"Enter a valid date\";\r\n return date > new Date() || \"Date must be in the future\";\r\n });\r\n\r\n /** Date must be in the past. */\r\n registerValidator(\"pastDate\", (value) => {\r\n const date = new Date(value);\r\n if (isNaN(date.getTime())) return \"Enter a valid date\";\r\n return date < new Date() || \"Date must be in the past\";\r\n });\r\n\r\n /**\r\n * Minimum age — checks for 18+ years.\r\n */\r\n registerValidator(\"minAge\", (value) => {\r\n const date = new Date(value);\r\n if (isNaN(date.getTime())) return \"Enter a valid date\";\r\n\r\n const today = new Date();\r\n const age = today.getFullYear() - date.getFullYear();\r\n const monthDiff = today.getMonth() - date.getMonth();\r\n const dayDiff = today.getDate() - date.getDate();\r\n\r\n const actualAge =\r\n monthDiff < 0 || (monthDiff === 0 && dayDiff < 0) ? age - 1 : age;\r\n\r\n return actualAge >= 18 || \"You must be at least 18 years old\";\r\n });\r\n}\r\n","/**\r\n * Default internationalisation strings for narrative-form.\r\n *\r\n * @remarks\r\n * All user-facing copy lives here. Consumers override via the `i18n` prop,\r\n * which is deep-merged with these defaults using {@link mergeStrings}.\r\n */\r\n\r\nimport type { NarrativeI18n } from \"../types\";\r\n\r\n/** Default English strings shipped with the package. */\r\nexport const defaultStrings: Readonly<Required<NarrativeI18n>> = {\r\n editLabel: \"Edit\",\r\n requiredMessage: \"This field is required\",\r\n otpResend: \"Resend code\",\r\n otpTimer: \"Resend in {seconds}s\",\r\n submitLabel: \"Submit\",\r\n loadingLabel: \"Checking…\",\r\n successLabel: \"Looks good!\",\r\n retryLabel: \"Try again\",\r\n fetchErrorMessage: \"Something went wrong. Please try again.\",\r\n} as const;\r\n\r\n/**\r\n * Deep-merge user-provided i18n overrides with the default strings.\r\n *\r\n * @param custom - Partial i18n overrides from the consumer\r\n * @returns A complete i18n object with all keys guaranteed to be present\r\n */\r\nexport function mergeStrings(custom?: Partial<NarrativeI18n>): Required<NarrativeI18n> {\r\n if (!custom) return { ...defaultStrings };\r\n return { ...defaultStrings, ...custom };\r\n}\r\n","import { NarrativeFormConfig } from \"../types\";\r\n\r\nexport interface FetchConfigOptions {\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport class ConfigFetchError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = \"ConfigFetchError\";\r\n }\r\n}\r\n\r\nexport async function fetchFormConfig(\r\n url: string,\r\n options?: FetchConfigOptions\r\n): Promise<NarrativeFormConfig> {\r\n try {\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\",\r\n ...options?.headers,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n throw new ConfigFetchError(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n\r\n // Basic schema validation\r\n if (!data || typeof data !== \"object\") {\r\n throw new ConfigFetchError(\"Invalid response: expected a JSON object.\");\r\n }\r\n\r\n if (!Array.isArray(data.fields)) {\r\n throw new ConfigFetchError(\"Invalid schema: 'fields' must be an array.\");\r\n }\r\n \r\n return data as NarrativeFormConfig;\r\n } catch (error) {\r\n if (error instanceof ConfigFetchError) {\r\n throw error;\r\n }\r\n throw new ConfigFetchError(\r\n error instanceof Error ? error.message : \"Failed to fetch form configuration\"\r\n );\r\n }\r\n}\r\n"]}