unischema 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +634 -230
- package/dist/adapters/backend/index.d.mts +2 -1
- package/dist/adapters/backend/index.d.ts +2 -1
- package/dist/adapters/backend/index.js +17 -423
- package/dist/adapters/backend/index.mjs +9 -415
- package/dist/adapters/frontend/index.d.mts +2 -1
- package/dist/adapters/frontend/index.d.ts +2 -1
- package/dist/adapters/frontend/index.js +10 -403
- package/dist/adapters/frontend/index.mjs +8 -401
- package/dist/chunk-2JYFKT3R.js +103 -0
- package/dist/chunk-3FANCMEF.js +206 -0
- package/dist/chunk-3TS35CVJ.mjs +478 -0
- package/dist/chunk-ASKTY6EG.js +131 -0
- package/dist/chunk-BJLVOIAP.js +491 -0
- package/dist/chunk-BNIB23NQ.js +90 -0
- package/dist/chunk-BVRXGZLS.js +17 -0
- package/dist/chunk-CQYXR2LZ.js +353 -0
- package/dist/chunk-ELL7U7IC.mjs +237 -0
- package/dist/chunk-FKDWSZIV.mjs +39 -0
- package/dist/chunk-FRBZHN4K.mjs +335 -0
- package/dist/chunk-FZ7K2PC7.js +248 -0
- package/dist/chunk-KHHJD6QK.mjs +85 -0
- package/dist/chunk-NUW55QTO.js +48 -0
- package/dist/chunk-TTK77YBI.mjs +15 -0
- package/dist/chunk-VWP24NYS.mjs +194 -0
- package/dist/chunk-XC4DKEXP.mjs +97 -0
- package/dist/chunk-XGTUU27F.mjs +124 -0
- package/dist/index-BQR7OrY7.d.mts +80 -0
- package/dist/index-BQR7OrY7.d.ts +80 -0
- package/dist/index.d.mts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +537 -476
- package/dist/index.mjs +486 -464
- package/dist/{schema-BwQtngae.d.mts → schema-CpAjXgEF.d.ts} +186 -79
- package/dist/{schema-BwQtngae.d.ts → schema-DYU1zGVm.d.mts} +186 -79
- package/dist/validators/array.d.mts +15 -0
- package/dist/validators/array.d.ts +15 -0
- package/dist/validators/array.js +31 -0
- package/dist/validators/array.mjs +2 -0
- package/dist/validators/common.d.mts +13 -0
- package/dist/validators/common.d.ts +13 -0
- package/dist/validators/common.js +27 -0
- package/dist/validators/common.mjs +2 -0
- package/dist/validators/date.d.mts +23 -0
- package/dist/validators/date.d.ts +23 -0
- package/dist/validators/date.js +47 -0
- package/dist/validators/date.mjs +2 -0
- package/dist/validators/index.d.mts +46 -0
- package/dist/validators/index.d.ts +46 -0
- package/dist/validators/index.js +256 -0
- package/dist/validators/index.mjs +7 -0
- package/dist/validators/number.d.mts +25 -0
- package/dist/validators/number.d.ts +25 -0
- package/dist/validators/number.js +51 -0
- package/dist/validators/number.mjs +2 -0
- package/dist/validators/object.d.mts +11 -0
- package/dist/validators/object.d.ts +11 -0
- package/dist/validators/object.js +23 -0
- package/dist/validators/object.mjs +2 -0
- package/dist/validators/string.d.mts +37 -0
- package/dist/validators/string.d.ts +37 -0
- package/dist/validators/string.js +75 -0
- package/dist/validators/string.mjs +2 -0
- package/package.json +36 -1
- package/dist/adapters/backend/index.js.map +0 -1
- package/dist/adapters/backend/index.mjs.map +0 -1
- package/dist/adapters/frontend/index.js.map +0 -1
- package/dist/adapters/frontend/index.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/validators.ts","../../../src/core/engine.ts","../../../src/adapters/frontend/form.ts","../../../src/adapters/frontend/utils.ts"],"names":["validate"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Built-in validators for common validation rules\r\n */\r\n\r\nimport type { ValidatorFn, ValidationError, ValidatorContext } from '../types';\r\n\r\n/**\r\n * Create a validation error\r\n */\r\nfunction createError(\r\n context: ValidatorContext,\r\n code: string,\r\n message: string,\r\n soft: boolean = false\r\n): ValidationError {\r\n return {\r\n field: context.path,\r\n code,\r\n message,\r\n severity: soft ? 'soft' : 'hard',\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Type Validators\r\n// ============================================================================\r\n\r\nexport const typeValidators: Record<string, ValidatorFn> = {\r\n string: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'string') {\r\n return createError(context, 'INVALID_TYPE', `Expected string, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n number: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'number') {\r\n return createError(context, 'INVALID_TYPE', `Expected number, got ${typeof value}`);\r\n }\r\n if (typeof value === 'number' && isNaN(value)) {\r\n return createError(context, 'INVALID_NUMBER', 'Value is not a valid number');\r\n }\r\n return null;\r\n },\r\n\r\n boolean: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'boolean') {\r\n return createError(context, 'INVALID_TYPE', `Expected boolean, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n date: (value, _params, context) => {\r\n if (value === undefined || value === null) return null;\r\n if (value instanceof Date) {\r\n if (isNaN(value.getTime())) {\r\n return createError(context, 'INVALID_DATE', 'Invalid date value');\r\n }\r\n return null;\r\n }\r\n // Try parsing string dates\r\n if (typeof value === 'string') {\r\n const parsed = new Date(value);\r\n if (isNaN(parsed.getTime())) {\r\n return createError(context, 'INVALID_DATE', 'Invalid date format');\r\n }\r\n return null;\r\n }\r\n return createError(context, 'INVALID_TYPE', `Expected date, got ${typeof value}`);\r\n },\r\n\r\n array: (value, _params, context) => {\r\n if (value !== undefined && value !== null && !Array.isArray(value)) {\r\n return createError(context, 'INVALID_TYPE', `Expected array, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n object: (value, _params, context) => {\r\n if (value !== undefined && value !== null) {\r\n if (typeof value !== 'object' || Array.isArray(value)) {\r\n return createError(context, 'INVALID_TYPE', `Expected object, got ${typeof value}`);\r\n }\r\n }\r\n return null;\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Rule Validators\r\n// ============================================================================\r\n\r\nexport const ruleValidators: Record<string, ValidatorFn> = {\r\n required: (value, _params, context) => {\r\n const isEmpty =\r\n value === undefined ||\r\n value === null ||\r\n value === '' ||\r\n (Array.isArray(value) && value.length === 0);\r\n\r\n if (isEmpty) {\r\n return createError(context, 'REQUIRED', 'This field is required');\r\n }\r\n return null;\r\n },\r\n\r\n min: (value, params, context) => {\r\n const min = params?.value as number;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (value === undefined || value === null) return null;\r\n\r\n if (typeof value === 'number') {\r\n if (value < min) {\r\n return createError(\r\n context,\r\n 'MIN_VALUE',\r\n message || `Value must be at least ${min}`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.length < min) {\r\n return createError(\r\n context,\r\n 'MIN_LENGTH',\r\n message || `Must be at least ${min} characters`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length < min) {\r\n return createError(\r\n context,\r\n 'MIN_ITEMS',\r\n message || `Must have at least ${min} items`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n max: (value, params, context) => {\r\n const max = params?.value as number;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (value === undefined || value === null) return null;\r\n\r\n if (typeof value === 'number') {\r\n if (value > max) {\r\n return createError(\r\n context,\r\n 'MAX_VALUE',\r\n message || `Value must be at most ${max}`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.length > max) {\r\n return createError(\r\n context,\r\n 'MAX_LENGTH',\r\n message || `Must be at most ${max} characters`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length > max) {\r\n return createError(\r\n context,\r\n 'MAX_ITEMS',\r\n message || `Must have at most ${max} items`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n email: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') {\r\n return createError(context, 'INVALID_EMAIL', 'Email must be a string', soft);\r\n }\r\n\r\n // RFC 5322 simplified email regex\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!emailRegex.test(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_EMAIL',\r\n message || 'Invalid email address',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n pattern: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const pattern = params?.pattern as string;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') return null;\r\n\r\n const regex = new RegExp(pattern);\r\n if (!regex.test(value)) {\r\n return createError(\r\n context,\r\n 'PATTERN_MISMATCH',\r\n message || `Value does not match required pattern`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n url: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') {\r\n return createError(context, 'INVALID_URL', 'URL must be a string', soft);\r\n }\r\n\r\n try {\r\n new URL(value);\r\n return null;\r\n } catch {\r\n return createError(\r\n context,\r\n 'INVALID_URL',\r\n message || 'Invalid URL format',\r\n soft\r\n );\r\n }\r\n },\r\n\r\n enum: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const values = params?.values as unknown[];\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (!values.includes(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_ENUM',\r\n message || `Value must be one of: ${values.join(', ')}`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n custom: (value, params, context) => {\r\n const validate = params?.validate as (\r\n value: unknown,\r\n context: ValidatorContext\r\n ) => { valid: boolean; message?: string } | boolean;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (!validate) return null;\r\n\r\n const result = validate(value, context);\r\n\r\n if (typeof result === 'boolean') {\r\n if (!result) {\r\n return createError(\r\n context,\r\n 'CUSTOM_VALIDATION',\r\n message || 'Validation failed',\r\n soft\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n if (!result.valid) {\r\n return createError(\r\n context,\r\n 'CUSTOM_VALIDATION',\r\n result.message || message || 'Validation failed',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Enterprise patterns - matches field against another field\r\n matches: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const otherField = params?.field as string;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n const root = context.root as Record<string, unknown>;\r\n\r\n const otherValue = root[otherField];\r\n\r\n if (value !== otherValue) {\r\n return createError(\r\n context,\r\n 'FIELD_MISMATCH',\r\n message || `Must match ${otherField}`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Integer validation\r\n integer: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'number' || !Number.isInteger(value)) {\r\n return createError(\r\n context,\r\n 'NOT_INTEGER',\r\n message || 'Value must be an integer',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Positive number validation\r\n positive: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value === 'number' && value <= 0) {\r\n return createError(\r\n context,\r\n 'NOT_POSITIVE',\r\n message || 'Value must be positive',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Negative number validation\r\n negative: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value === 'number' && value >= 0) {\r\n return createError(\r\n context,\r\n 'NOT_NEGATIVE',\r\n message || 'Value must be negative',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Validator Registry\r\n// ============================================================================\r\n\r\nconst customValidators: Map<string, ValidatorFn> = new Map();\r\n\r\n/**\r\n * Register a custom validator\r\n */\r\nexport function registerValidator(name: string, validator: ValidatorFn): void {\r\n customValidators.set(name, validator);\r\n}\r\n\r\n/**\r\n * Get a validator by name\r\n */\r\nexport function getValidator(name: string): ValidatorFn | undefined {\r\n return ruleValidators[name] ?? customValidators.get(name);\r\n}\r\n\r\n/**\r\n * Get a type validator\r\n */\r\nexport function getTypeValidator(type: string): ValidatorFn | undefined {\r\n return typeValidators[type];\r\n}\r\n","/**\r\n * Core validation engine - runs unchanged in browser and Node.js\r\n */\r\n\r\nimport type {\r\n ValidationResult,\r\n ValidationError,\r\n FieldDefinition,\r\n SchemaDefinition,\r\n ValidatorContext,\r\n} from '../types';\r\n\r\nimport { getValidator, getTypeValidator } from './validators';\r\n\r\n/**\r\n * Validate a single field\r\n */\r\nfunction validateField(\r\n fieldDef: FieldDefinition,\r\n value: unknown,\r\n context: ValidatorContext\r\n): ValidationError[] {\r\n const errors: ValidationError[] = [];\r\n\r\n // Type validation first\r\n const typeValidator = getTypeValidator(fieldDef.type);\r\n if (typeValidator) {\r\n const typeError = typeValidator(value, undefined, context);\r\n if (typeError) {\r\n errors.push(typeError);\r\n // If type is wrong, skip other validations\r\n return errors;\r\n }\r\n }\r\n\r\n // Required validation\r\n if (fieldDef.required) {\r\n const requiredValidator = getValidator('required');\r\n if (requiredValidator) {\r\n const error = requiredValidator(value, undefined, context);\r\n if (error) {\r\n errors.push(error);\r\n // If required and missing, skip other validations\r\n return errors;\r\n }\r\n }\r\n } else if (value === undefined || value === null || value === '') {\r\n // Skip other validations for optional empty fields\r\n return errors;\r\n }\r\n\r\n // Rule validations\r\n for (const rule of fieldDef.rules) {\r\n const validator = getValidator(rule.type);\r\n if (!validator) {\r\n console.warn(`Unknown validator: ${rule.type}`);\r\n continue;\r\n }\r\n\r\n const params = {\r\n ...rule.params,\r\n soft: rule.soft,\r\n message: rule.message,\r\n };\r\n\r\n const error = validator(value, params, context);\r\n if (error) {\r\n errors.push(error);\r\n }\r\n }\r\n\r\n // Nested schema validation (for object fields)\r\n if (fieldDef.type === 'object' && fieldDef.schema && value !== null && value !== undefined) {\r\n const nestedResult = validateSchema(fieldDef.schema, value as Record<string, unknown>, context.path, context.root);\r\n errors.push(...nestedResult.hardErrors, ...nestedResult.softErrors);\r\n }\r\n\r\n // Array item validation\r\n if (fieldDef.type === 'array' && fieldDef.items && Array.isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n const itemContext: ValidatorContext = {\r\n path: `${context.path}[${i}]`,\r\n root: context.root,\r\n parent: value,\r\n };\r\n const itemErrors = validateField(fieldDef.items, value[i], itemContext);\r\n errors.push(...itemErrors);\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Validate data against a schema\r\n */\r\nexport function validateSchema(\r\n schema: SchemaDefinition,\r\n data: Record<string, unknown>,\r\n basePath: string = '',\r\n root?: unknown\r\n): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n const rootData = root ?? data;\r\n\r\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\r\n const value = data[fieldName];\r\n const path = basePath ? `${basePath}.${fieldName}` : fieldName;\r\n\r\n const context: ValidatorContext = {\r\n path,\r\n root: rootData,\r\n parent: data,\r\n };\r\n\r\n const errors = validateField(fieldDef, value, context);\r\n\r\n for (const error of errors) {\r\n if (error.severity === 'soft') {\r\n softErrors.push(error);\r\n } else {\r\n hardErrors.push(error);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Main validation function\r\n */\r\nexport function validate<T extends Record<string, unknown>>(\r\n schema: SchemaDefinition,\r\n data: T\r\n): ValidationResult {\r\n return validateSchema(schema, data);\r\n}\r\n\r\n/**\r\n * Check if data is valid (no hard errors)\r\n */\r\nexport function isValid(schema: SchemaDefinition, data: Record<string, unknown>): boolean {\r\n return validate(schema, data).valid;\r\n}\r\n\r\n/**\r\n * Validate and throw if invalid\r\n */\r\nexport function assertValid<T extends Record<string, unknown>>(\r\n schema: SchemaDefinition,\r\n data: T\r\n): T {\r\n const result = validate(schema, data);\r\n if (!result.valid) {\r\n const error = new Error('Validation failed');\r\n (error as Error & { errors: ValidationError[] }).errors = result.hardErrors;\r\n throw error;\r\n }\r\n return data;\r\n}\r\n\r\n/**\r\n * Merge multiple validation results\r\n */\r\nexport function mergeResults(...results: ValidationResult[]): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n for (const result of results) {\r\n hardErrors.push(...result.hardErrors);\r\n softErrors.push(...result.softErrors);\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Create an empty valid result\r\n */\r\nexport function validResult(): ValidationResult {\r\n return {\r\n valid: true,\r\n hardErrors: [],\r\n softErrors: [],\r\n };\r\n}\r\n\r\n/**\r\n * Create a result with a single error\r\n */\r\nexport function errorResult(\r\n field: string,\r\n code: string,\r\n message: string,\r\n soft: boolean = false\r\n): ValidationResult {\r\n const error: ValidationError = {\r\n field,\r\n code,\r\n message,\r\n severity: soft ? 'soft' : 'hard',\r\n };\r\n\r\n return {\r\n valid: soft,\r\n hardErrors: soft ? [] : [error],\r\n softErrors: soft ? [error] : [],\r\n };\r\n}\r\n","/**\r\n * Headless form utilities for frontend frameworks\r\n * Framework-agnostic - no React, Vue, or Svelte dependencies\r\n */\r\n\r\nimport type { SchemaBuilder, InferInput } from '../../schema';\r\nimport type { ValidationResult, ValidationError } from '../../types';\r\nimport { validate } from '../../core';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface FormState<T> {\r\n /** Current form values */\r\n values: T;\r\n /** Current validation errors by field */\r\n errors: Record<string, ValidationError[]>;\r\n /** Fields that have been touched (blurred) */\r\n touched: Set<string>;\r\n /** Fields that have been modified */\r\n dirty: Set<string>;\r\n /** Whether form is currently submitting */\r\n isSubmitting: boolean;\r\n /** Whether form has been submitted at least once */\r\n isSubmitted: boolean;\r\n /** Whether form is valid (no hard errors) */\r\n isValid: boolean;\r\n /** Soft warnings by field */\r\n warnings: Record<string, ValidationError[]>;\r\n}\r\n\r\nexport interface FormOptions<T> {\r\n /** Initial form values */\r\n initialValues?: Partial<T>;\r\n /** Validate on change */\r\n validateOnChange?: boolean;\r\n /** Validate on blur */\r\n validateOnBlur?: boolean;\r\n /** Custom submit handler */\r\n onSubmit?: (values: T, helpers: FormHelpers<T>) => void | Promise<void>;\r\n /** Called when validation fails */\r\n onValidationError?: (result: ValidationResult) => void;\r\n}\r\n\r\nexport interface FormHelpers<T> {\r\n /** Reset form to initial values */\r\n reset: () => void;\r\n /** Set form submitting state */\r\n setSubmitting: (isSubmitting: boolean) => void;\r\n /** Set field value */\r\n setFieldValue: (field: keyof T, value: unknown) => void;\r\n /** Set field error manually */\r\n setFieldError: (field: keyof T, error: string) => void;\r\n /** Clear all errors */\r\n clearErrors: () => void;\r\n /** Set server errors from API response */\r\n setServerErrors: (errors: ValidationError[]) => void;\r\n}\r\n\r\nexport interface FieldProps {\r\n /** Field name */\r\n name: string;\r\n /** Current value */\r\n value: unknown;\r\n /** Change handler */\r\n onChange: (value: unknown) => void;\r\n /** Blur handler */\r\n onBlur: () => void;\r\n /** Whether field has error */\r\n hasError: boolean;\r\n /** Error message (first error) */\r\n error: string | undefined;\r\n /** All error messages */\r\n errors: string[];\r\n /** Whether field has warning */\r\n hasWarning: boolean;\r\n /** Warning message (first warning) */\r\n warning: string | undefined;\r\n /** All warning messages */\r\n warnings: string[];\r\n /** Whether field has been touched */\r\n touched: boolean;\r\n /** Whether field has been modified */\r\n dirty: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Form Controller (Framework-Agnostic)\r\n// ============================================================================\r\n\r\n/**\r\n * Create a form controller for managing form state and validation\r\n *\r\n * @example\r\n * ```ts\r\n * const form = createForm(UserSchema, {\r\n * initialValues: { email: '', name: '' },\r\n * onSubmit: async (values) => {\r\n * await api.createUser(values);\r\n * },\r\n * });\r\n *\r\n * // In your UI:\r\n * const emailProps = form.getFieldProps('email');\r\n * // { name, value, onChange, onBlur, error, ... }\r\n * ```\r\n */\r\nexport function createForm<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options: FormOptions<InferInput<S>> = {}\r\n): FormController<InferInput<S>> {\r\n return new FormController(\r\n schema as unknown as SchemaBuilder<InferInput<S>>,\r\n options\r\n );\r\n}\r\n\r\nexport class FormController<T extends Record<string, unknown>> {\r\n private schema: SchemaBuilder<T>;\r\n private options: FormOptions<T>;\r\n private state: FormState<T>;\r\n private listeners: Set<() => void> = new Set();\r\n private initialValues: T;\r\n\r\n constructor(schema: SchemaBuilder<T>, options: FormOptions<T> = {}) {\r\n this.schema = schema;\r\n this.options = {\r\n validateOnChange: true,\r\n validateOnBlur: true,\r\n ...options,\r\n };\r\n\r\n // Build initial values from schema defaults and provided values\r\n this.initialValues = this.buildInitialValues();\r\n\r\n this.state = {\r\n values: { ...this.initialValues },\r\n errors: {},\r\n warnings: {},\r\n touched: new Set(),\r\n dirty: new Set(),\r\n isSubmitting: false,\r\n isSubmitted: false,\r\n isValid: true,\r\n };\r\n }\r\n\r\n private buildInitialValues(): T {\r\n const values: Record<string, unknown> = {};\r\n const schemaFields = this.schema.definition.fields;\r\n\r\n for (const [fieldName, fieldDef] of Object.entries(schemaFields)) {\r\n if (this.options.initialValues?.[fieldName as keyof T] !== undefined) {\r\n values[fieldName] = this.options.initialValues[fieldName as keyof T];\r\n } else if (fieldDef.defaultValue !== undefined) {\r\n values[fieldName] = fieldDef.defaultValue;\r\n } else {\r\n // Set appropriate empty value based on type\r\n switch (fieldDef.type) {\r\n case 'string':\r\n values[fieldName] = '';\r\n break;\r\n case 'number':\r\n values[fieldName] = undefined;\r\n break;\r\n case 'boolean':\r\n values[fieldName] = false;\r\n break;\r\n case 'array':\r\n values[fieldName] = [];\r\n break;\r\n case 'object':\r\n values[fieldName] = {};\r\n break;\r\n default:\r\n values[fieldName] = undefined;\r\n }\r\n }\r\n }\r\n\r\n return values as T;\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n */\r\n subscribe(listener: () => void): () => void {\r\n this.listeners.add(listener);\r\n return () => this.listeners.delete(listener);\r\n }\r\n\r\n private notify(): void {\r\n for (const listener of this.listeners) {\r\n listener();\r\n }\r\n }\r\n\r\n /**\r\n * Get current form state\r\n */\r\n getState(): FormState<T> {\r\n return { ...this.state };\r\n }\r\n\r\n /**\r\n * Get current form values\r\n */\r\n getValues(): T {\r\n return { ...this.state.values };\r\n }\r\n\r\n /**\r\n * Set a field value\r\n */\r\n setFieldValue(field: keyof T, value: unknown): void {\r\n this.state.values = {\r\n ...this.state.values,\r\n [field]: value,\r\n };\r\n this.state.dirty.add(field as string);\r\n\r\n if (this.options.validateOnChange) {\r\n this.validateField(field as string);\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Set multiple values at once\r\n */\r\n setValues(values: Partial<T>): void {\r\n this.state.values = {\r\n ...this.state.values,\r\n ...values,\r\n };\r\n\r\n for (const key of Object.keys(values)) {\r\n this.state.dirty.add(key);\r\n }\r\n\r\n if (this.options.validateOnChange) {\r\n this.validate();\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Mark a field as touched (blurred)\r\n */\r\n touchField(field: string): void {\r\n this.state.touched.add(field);\r\n\r\n if (this.options.validateOnBlur) {\r\n this.validateField(field);\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Validate a single field\r\n */\r\n validateField(field: string): ValidationResult {\r\n const result = validate(this.schema.definition, this.state.values as Record<string, unknown>);\r\n\r\n // Extract errors for this field\r\n const fieldHardErrors = result.hardErrors.filter((e) => e.field === field);\r\n const fieldSoftErrors = result.softErrors.filter((e) => e.field === field);\r\n\r\n this.state.errors[field] = fieldHardErrors;\r\n this.state.warnings[field] = fieldSoftErrors;\r\n this.state.isValid = result.valid;\r\n\r\n this.notify();\r\n\r\n return {\r\n valid: fieldHardErrors.length === 0,\r\n hardErrors: fieldHardErrors,\r\n softErrors: fieldSoftErrors,\r\n };\r\n }\r\n\r\n /**\r\n * Validate entire form\r\n */\r\n validate(): ValidationResult {\r\n const result = validate(this.schema.definition, this.state.values as Record<string, unknown>);\r\n\r\n // Group errors by field\r\n const errors: Record<string, ValidationError[]> = {};\r\n const warnings: Record<string, ValidationError[]> = {};\r\n\r\n for (const error of result.hardErrors) {\r\n if (!errors[error.field]) {\r\n errors[error.field] = [];\r\n }\r\n errors[error.field]!.push(error);\r\n }\r\n\r\n for (const warning of result.softErrors) {\r\n if (!warnings[warning.field]) {\r\n warnings[warning.field] = [];\r\n }\r\n warnings[warning.field]!.push(warning);\r\n }\r\n\r\n this.state.errors = errors;\r\n this.state.warnings = warnings;\r\n this.state.isValid = result.valid;\r\n\r\n this.notify();\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get field props for binding to UI\r\n */\r\n getFieldProps(field: keyof T): FieldProps {\r\n const fieldErrors = this.state.errors[field as string] || [];\r\n const fieldWarnings = this.state.warnings[field as string] || [];\r\n\r\n return {\r\n name: field as string,\r\n value: this.state.values[field],\r\n onChange: (value: unknown) => this.setFieldValue(field, value),\r\n onBlur: () => this.touchField(field as string),\r\n hasError: fieldErrors.length > 0,\r\n error: fieldErrors[0]?.message,\r\n errors: fieldErrors.map((e) => e.message),\r\n hasWarning: fieldWarnings.length > 0,\r\n warning: fieldWarnings[0]?.message,\r\n warnings: fieldWarnings.map((w) => w.message),\r\n touched: this.state.touched.has(field as string),\r\n dirty: this.state.dirty.has(field as string),\r\n };\r\n }\r\n\r\n /**\r\n * Get all field props\r\n */\r\n getAllFieldProps(): Record<keyof T, FieldProps> {\r\n const props: Record<string, FieldProps> = {};\r\n for (const field of Object.keys(this.schema.definition.fields)) {\r\n props[field] = this.getFieldProps(field as keyof T);\r\n }\r\n return props as Record<keyof T, FieldProps>;\r\n }\r\n\r\n /**\r\n * Set field error manually (e.g., from server)\r\n */\r\n setFieldError(field: keyof T, message: string): void {\r\n const error: ValidationError = {\r\n field: field as string,\r\n code: 'SERVER_ERROR',\r\n message,\r\n severity: 'hard',\r\n };\r\n\r\n if (!this.state.errors[field as string]) {\r\n this.state.errors[field as string] = [];\r\n }\r\n this.state.errors[field as string]!.push(error);\r\n this.state.isValid = false;\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Set multiple errors from server response\r\n */\r\n setServerErrors(errors: ValidationError[]): void {\r\n for (const error of errors) {\r\n if (!this.state.errors[error.field]) {\r\n this.state.errors[error.field] = [];\r\n }\r\n\r\n if (error.severity === 'soft') {\r\n if (!this.state.warnings[error.field]) {\r\n this.state.warnings[error.field] = [];\r\n }\r\n this.state.warnings[error.field]!.push(error);\r\n } else {\r\n this.state.errors[error.field]!.push(error);\r\n }\r\n }\r\n\r\n this.state.isValid = errors.filter((e) => e.severity === 'hard').length === 0;\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Clear all errors\r\n */\r\n clearErrors(): void {\r\n this.state.errors = {};\r\n this.state.warnings = {};\r\n this.state.isValid = true;\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Reset form to initial values\r\n */\r\n reset(): void {\r\n this.state = {\r\n values: { ...this.initialValues },\r\n errors: {},\r\n warnings: {},\r\n touched: new Set(),\r\n dirty: new Set(),\r\n isSubmitting: false,\r\n isSubmitted: false,\r\n isValid: true,\r\n };\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Handle form submission\r\n */\r\n async handleSubmit(): Promise<ValidationResult> {\r\n // Mark all fields as touched\r\n for (const field of Object.keys(this.schema.definition.fields)) {\r\n this.state.touched.add(field);\r\n }\r\n\r\n // Validate\r\n const result = this.validate();\r\n\r\n if (!result.valid) {\r\n this.options.onValidationError?.(result);\r\n return result;\r\n }\r\n\r\n // Submit\r\n if (this.options.onSubmit) {\r\n this.state.isSubmitting = true;\r\n this.notify();\r\n\r\n try {\r\n const helpers: FormHelpers<T> = {\r\n reset: () => this.reset(),\r\n setSubmitting: (isSubmitting) => {\r\n this.state.isSubmitting = isSubmitting;\r\n this.notify();\r\n },\r\n setFieldValue: (field, value) => this.setFieldValue(field, value),\r\n setFieldError: (field, error) => this.setFieldError(field, error),\r\n clearErrors: () => this.clearErrors(),\r\n setServerErrors: (errors) => this.setServerErrors(errors),\r\n };\r\n\r\n await this.options.onSubmit(this.state.values, helpers);\r\n } finally {\r\n this.state.isSubmitting = false;\r\n this.state.isSubmitted = true;\r\n this.notify();\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a submit handler (for form onSubmit)\r\n */\r\n createSubmitHandler(): (e?: { preventDefault?: () => void }) => Promise<ValidationResult> {\r\n return async (e) => {\r\n e?.preventDefault?.();\r\n return this.handleSubmit();\r\n };\r\n }\r\n}\r\n","/**\r\n * Frontend utility functions for validation and error handling\r\n */\r\n\r\nimport type { ValidationResult, ValidationError } from '../../types';\r\n\r\n// ============================================================================\r\n// Error Formatting\r\n// ============================================================================\r\n\r\n/**\r\n * Get the first error message for a field\r\n */\r\nexport function getFieldError(\r\n result: ValidationResult,\r\n field: string\r\n): string | undefined {\r\n const error = result.hardErrors.find((e) => e.field === field);\r\n return error?.message;\r\n}\r\n\r\n/**\r\n * Get all error messages for a field\r\n */\r\nexport function getFieldErrors(\r\n result: ValidationResult,\r\n field: string\r\n): string[] {\r\n return result.hardErrors\r\n .filter((e) => e.field === field)\r\n .map((e) => e.message);\r\n}\r\n\r\n/**\r\n * Get the first warning message for a field\r\n */\r\nexport function getFieldWarning(\r\n result: ValidationResult,\r\n field: string\r\n): string | undefined {\r\n const warning = result.softErrors.find((e) => e.field === field);\r\n return warning?.message;\r\n}\r\n\r\n/**\r\n * Get all warning messages for a field\r\n */\r\nexport function getFieldWarnings(\r\n result: ValidationResult,\r\n field: string\r\n): string[] {\r\n return result.softErrors\r\n .filter((e) => e.field === field)\r\n .map((e) => e.message);\r\n}\r\n\r\n/**\r\n * Check if a field has errors\r\n */\r\nexport function hasFieldError(result: ValidationResult, field: string): boolean {\r\n return result.hardErrors.some((e) => e.field === field);\r\n}\r\n\r\n/**\r\n * Check if a field has warnings\r\n */\r\nexport function hasFieldWarning(result: ValidationResult, field: string): boolean {\r\n return result.softErrors.some((e) => e.field === field);\r\n}\r\n\r\n/**\r\n * Group errors by field\r\n */\r\nexport function groupErrorsByField(\r\n errors: ValidationError[]\r\n): Record<string, ValidationError[]> {\r\n const grouped: Record<string, ValidationError[]> = {};\r\n\r\n for (const error of errors) {\r\n if (!grouped[error.field]) {\r\n grouped[error.field] = [];\r\n }\r\n grouped[error.field]!.push(error);\r\n }\r\n\r\n return grouped;\r\n}\r\n\r\n/**\r\n * Convert validation result to a simple error map\r\n */\r\nexport function toErrorMap(result: ValidationResult): Record<string, string> {\r\n const map: Record<string, string> = {};\r\n\r\n for (const error of result.hardErrors) {\r\n if (!map[error.field]) {\r\n map[error.field] = error.message;\r\n }\r\n }\r\n\r\n return map;\r\n}\r\n\r\n/**\r\n * Convert validation result to a warnings map\r\n */\r\nexport function toWarningsMap(result: ValidationResult): Record<string, string> {\r\n const map: Record<string, string> = {};\r\n\r\n for (const warning of result.softErrors) {\r\n if (!map[warning.field]) {\r\n map[warning.field] = warning.message;\r\n }\r\n }\r\n\r\n return map;\r\n}\r\n\r\n// ============================================================================\r\n// API Response Handling\r\n// ============================================================================\r\n\r\n/**\r\n * Parse errors from an API response\r\n */\r\nexport function parseApiErrors(response: {\r\n errors?: ValidationError[];\r\n validation?: {\r\n hard_validations?: ValidationError[];\r\n soft_validations?: ValidationError[];\r\n };\r\n}): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n // Handle flat errors array\r\n if (response.errors) {\r\n for (const error of response.errors) {\r\n if (error.severity === 'soft') {\r\n softErrors.push(error);\r\n } else {\r\n hardErrors.push(error);\r\n }\r\n }\r\n }\r\n\r\n // Handle structured validation object\r\n if (response.validation) {\r\n if (response.validation.hard_validations) {\r\n hardErrors.push(...response.validation.hard_validations);\r\n }\r\n if (response.validation.soft_validations) {\r\n softErrors.push(...response.validation.soft_validations);\r\n }\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Debouncing\r\n// ============================================================================\r\n\r\n/**\r\n * Create a debounced validation function\r\n */\r\nexport function debounceValidation<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n delay: number = 300\r\n): T & { cancel: () => void } {\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n const debounced = ((...args: unknown[]) => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n return new Promise((resolve) => {\r\n timeoutId = setTimeout(() => {\r\n resolve(fn(...args));\r\n }, delay);\r\n });\r\n }) as T & { cancel: () => void };\r\n\r\n debounced.cancel = () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n };\r\n\r\n return debounced;\r\n}\r\n\r\n// ============================================================================\r\n// Focus Management\r\n// ============================================================================\r\n\r\n/**\r\n * Get the first field with an error\r\n */\r\nexport function getFirstErrorField(result: ValidationResult): string | undefined {\r\n return result.hardErrors[0]?.field;\r\n}\r\n\r\n/**\r\n * Focus the first field with an error (browser only)\r\n */\r\nexport function focusFirstError(\r\n result: ValidationResult,\r\n options: { scrollIntoView?: boolean } = {}\r\n): void {\r\n const field = getFirstErrorField(result);\r\n if (!field) return;\r\n\r\n // Try to find element by name or id\r\n const element =\r\n document.querySelector<HTMLElement>(`[name=\"${field}\"]`) ||\r\n document.getElementById(field);\r\n\r\n if (element) {\r\n element.focus();\r\n if (options.scrollIntoView) {\r\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Value Coercion\r\n// ============================================================================\r\n\r\n/**\r\n * Coerce form values to appropriate types based on schema\r\n */\r\nexport function coerceValue(value: unknown, type: string): unknown {\r\n if (value === '' || value === undefined || value === null) {\r\n return type === 'string' ? '' : undefined;\r\n }\r\n\r\n switch (type) {\r\n case 'number':\r\n const num = Number(value);\r\n return isNaN(num) ? undefined : num;\r\n\r\n case 'boolean':\r\n if (typeof value === 'boolean') return value;\r\n if (value === 'true' || value === '1') return true;\r\n if (value === 'false' || value === '0') return false;\r\n return Boolean(value);\r\n\r\n case 'date':\r\n if (value instanceof Date) return value;\r\n const date = new Date(value as string);\r\n return isNaN(date.getTime()) ? undefined : date;\r\n\r\n case 'array':\r\n if (Array.isArray(value)) return value;\r\n if (typeof value === 'string') {\r\n try {\r\n const parsed = JSON.parse(value);\r\n return Array.isArray(parsed) ? parsed : [value];\r\n } catch {\r\n return [value];\r\n }\r\n }\r\n return [value];\r\n\r\n default:\r\n return value;\r\n }\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/validators.ts","../../../src/core/engine.ts","../../../src/adapters/frontend/form.ts","../../../src/adapters/frontend/utils.ts"],"names":["validate"],"mappings":";AASA,SAAS,WAAA,CACP,OAAA,EACA,IAAA,EACA,OAAA,EACA,OAAgB,KAAA,EACC;AACjB,EAAA,OAAO;AAAA,IACL,OAAO,OAAA,CAAQ,IAAA;AAAA,IACf,IAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAU,OAAO,MAAA,GAAS;AAAA,GAC5B;AACF;AAMO,IAAM,cAAA,GAA8C;AAAA,EACzD,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACnC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,OAAO,UAAU,QAAA,EAAU;AACtE,MAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,qBAAA,EAAwB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACpF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACnC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,OAAO,UAAU,QAAA,EAAU;AACtE,MAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,qBAAA,EAAwB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACpF;AACA,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,KAAK,CAAA,EAAG;AAC7C,MAAA,OAAO,WAAA,CAAY,OAAA,EAAS,gBAAA,EAAkB,6BAA6B,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,OAAA,EAAS,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACpC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,OAAO,UAAU,SAAA,EAAW;AACvE,MAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,sBAAA,EAAyB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACrF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,IAAA,EAAM,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACjC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAClD,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,IAAI,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG;AAC1B,QAAA,OAAO,WAAA,CAAY,OAAA,EAAS,cAAA,EAAgB,oBAAoB,CAAA;AAAA,MAClE;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,KAAK,CAAA;AAC7B,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,CAAA,EAAG;AAC3B,QAAA,OAAO,WAAA,CAAY,OAAA,EAAS,cAAA,EAAgB,qBAAqB,CAAA;AAAA,MACnE;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,mBAAA,EAAsB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EAClF,CAAA;AAAA,EAEA,KAAA,EAAO,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AAClC,IAAA,IAAI,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAClE,MAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,oBAAA,EAAuB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACnC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,QAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,qBAAA,EAAwB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,MACpF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAMO,IAAM,cAAA,GAA8C;AAAA,EACzD,QAAA,EAAU,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACrC,IAAA,MAAM,OAAA,GACJ,KAAA,KAAU,MAAA,IACV,KAAA,KAAU,IAAA,IACV,KAAA,KAAU,EAAA,IACT,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA,KAAW,CAAA;AAE5C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,WAAA,CAAY,OAAA,EAAS,UAAA,EAAY,wBAAwB,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,GAAA,EAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AAC/B,IAAA,MAAM,MAAM,MAAA,EAAQ,KAAA;AACpB,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,IAAW,0BAA0B,GAAG,CAAA,CAAA;AAAA,UACxC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACtB,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,YAAA;AAAA,UACA,OAAA,IAAW,oBAAoB,GAAG,CAAA,WAAA,CAAA;AAAA,UAClC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACtB,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,IAAW,sBAAsB,GAAG,CAAA,MAAA,CAAA;AAAA,UACpC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,GAAA,EAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AAC/B,IAAA,MAAM,MAAM,MAAA,EAAQ,KAAA;AACpB,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,IAAW,yBAAyB,GAAG,CAAA,CAAA;AAAA,UACvC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACtB,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,YAAA;AAAA,UACA,OAAA,IAAW,mBAAmB,GAAG,CAAA,WAAA,CAAA;AAAA,UACjC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACtB,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,IAAW,qBAAqB,GAAG,CAAA,MAAA,CAAA;AAAA,UACnC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,KAAA,EAAO,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACjC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,IAAA;AAElE,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,WAAA,CAAY,OAAA,EAAS,eAAA,EAAiB,wBAAA,EAA0B,IAAI,CAAA;AAAA,IAC7E;AAGA,IAAA,MAAM,UAAA,GAAa,4BAAA;AACnB,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA,IAAW,uBAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACnC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,IAAA;AAElE,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AACxB,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA;AAEtC,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACtB,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,kBAAA;AAAA,QACA,OAAA,IAAW,CAAA,qCAAA,CAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,GAAA,EAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AAC/B,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,IAAA;AAElE,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,WAAA,CAAY,OAAA,EAAS,aAAA,EAAe,sBAAA,EAAwB,IAAI,CAAA;AAAA,IACzE;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,IAAI,KAAK,CAAA;AACb,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA,IAAW,oBAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA;AAAA,EAEA,IAAA,EAAM,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AAChC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,MAAM,SAAS,MAAA,EAAQ,MAAA;AACvB,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA,IAAW,CAAA,sBAAA,EAAyB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QACrD;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AAClC,IAAA,MAAMA,YAAW,MAAA,EAAQ,QAAA;AAIzB,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,CAACA,WAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,MAAA,GAASA,SAAAA,CAAS,KAAA,EAAO,OAAO,CAAA;AAEtC,IAAA,IAAI,OAAO,WAAW,SAAA,EAAW;AAC/B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,mBAAA;AAAA,UACA,OAAA,IAAW,mBAAA;AAAA,UACX;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,mBAAA;AAAA,QACA,MAAA,CAAO,WAAW,OAAA,IAAW,mBAAA;AAAA,QAC7B;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA;AAAA,EAGA,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACnC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,MAAM,aAAa,MAAA,EAAQ,KAAA;AAC3B,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AACxB,IAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AAErB,IAAA,MAAM,UAAA,GAAa,KAAK,UAAU,CAAA;AAElC,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,gBAAA;AAAA,QACA,OAAA,IAAW,cAAc,UAAU,CAAA,CAAA;AAAA,QACnC;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA;AAAA,EAGA,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACnC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AACzD,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA,IAAW,0BAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA;AAAA,EAGA,QAAA,EAAU,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACpC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,IAAS,CAAA,EAAG;AAC3C,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA,IAAW,wBAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA;AAAA,EAGA,QAAA,EAAU,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACpC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,IAAS,CAAA,EAAG;AAC3C,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA,IAAW,wBAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAMA,IAAM,gBAAA,uBAAiD,GAAA,EAAI;AAYpD,SAAS,aAAa,IAAA,EAAuC;AAClE,EAAA,OAAO,cAAA,CAAe,IAAI,CAAA,IAAK,gBAAA,CAAiB,IAAI,IAAI,CAAA;AAC1D;AAKO,SAAS,iBAAiB,IAAA,EAAuC;AACtE,EAAA,OAAO,eAAe,IAAI,CAAA;AAC5B;;;ACrZA,SAAS,aAAA,CACP,QAAA,EACA,KAAA,EACA,OAAA,EACmB;AACnB,EAAA,MAAM,SAA4B,EAAC;AAGnC,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,QAAA,CAAS,IAAI,CAAA;AACpD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,KAAA,EAAO,MAAA,EAAW,OAAO,CAAA;AACzD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAErB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,iBAAA,GAAoB,aAAa,UAAU,CAAA;AACjD,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,KAAA,EAAO,MAAA,EAAW,OAAO,CAAA;AACzD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAEjB,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF,WAAW,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AAEhE,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,EAAO;AACjC,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK;AAAA,KAChB;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAC9C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,CAAS,SAAS,QAAA,IAAY,QAAA,CAAS,UAAU,KAAA,KAAU,IAAA,IAAQ,UAAU,MAAA,EAAW;AAC1F,IAAA,MAAM,YAAA,GAAe,eAAe,QAAA,CAAS,MAAA,EAAQ,OAAkC,OAAA,CAAQ,IAAA,EAAM,QAAQ,IAAI,CAAA;AACjH,IAAA,MAAA,CAAO,KAAK,GAAG,YAAA,CAAa,UAAA,EAAY,GAAG,aAAa,UAAU,CAAA;AAAA,EACpE;AAGA,EAAA,IAAI,QAAA,CAAS,SAAS,OAAA,IAAW,QAAA,CAAS,SAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,WAAA,GAAgC;AAAA,QACpC,IAAA,EAAM,CAAA,EAAG,OAAA,CAAQ,IAAI,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,QAC1B,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AACA,MAAA,MAAM,aAAa,aAAA,CAAc,QAAA,CAAS,OAAO,KAAA,CAAM,CAAC,GAAG,WAAW,CAAA;AACtE,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,cAAA,CACd,MAAA,EACA,IAAA,EACA,QAAA,GAAmB,IACnB,IAAA,EACkB;AAClB,EAAA,MAAM,aAAgC,EAAC;AACvC,EAAA,MAAM,aAAgC,EAAC;AAEvC,EAAA,MAAM,WAAW,IAAA,IAAQ,IAAA;AAEzB,EAAA,KAAA,MAAW,CAAC,WAAW,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AACjE,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAS,CAAA;AAC5B,IAAA,MAAM,OAAO,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,SAAA;AAErD,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,IAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,KAAA,EAAO,OAAO,CAAA;AAErD,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAQ;AAC7B,QAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,WAAW,MAAA,KAAW,CAAA;AAAA,IAC7B,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,QAAA,CACd,QACA,IAAA,EACkB;AAClB,EAAA,OAAO,cAAA,CAAe,QAAQ,IAAI,CAAA;AACpC;;;ACnCO,SAAS,UAAA,CACd,MAAA,EACA,OAAA,GAAsC,EAAC,EACR;AAC/B,EAAA,OAAO,IAAI,cAAA;AAAA,IACT,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,IAAM,iBAAN,MAAwD;AAAA,EAO7D,WAAA,CAAY,MAAA,EAA0B,OAAA,GAA0B,EAAC,EAAG;AAHpE,IAAA,IAAA,CAAQ,SAAA,uBAAiC,GAAA,EAAI;AAI3C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,gBAAA,EAAkB,IAAA;AAAA,MAClB,cAAA,EAAgB,IAAA;AAAA,MAChB,GAAG;AAAA,KACL;AAGA,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,kBAAA,EAAmB;AAE7C,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,aAAA,EAAc;AAAA,MAChC,QAAQ,EAAC;AAAA,MACT,UAAU,EAAC;AAAA,MACX,OAAA,sBAAa,GAAA,EAAI;AAAA,MACjB,KAAA,sBAAW,GAAA,EAAI;AAAA,MACf,YAAA,EAAc,KAAA;AAAA,MACd,WAAA,EAAa,KAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA,EAEQ,kBAAA,GAAwB;AAC9B,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,MAAA;AAE5C,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAChE,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,aAAA,GAAgB,SAAoB,MAAM,MAAA,EAAW;AACpE,QAAA,MAAA,CAAO,SAAS,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,cAAc,SAAoB,CAAA;AAAA,MACrE,CAAA,MAAA,IAAW,QAAA,CAAS,YAAA,KAAiB,MAAA,EAAW;AAC9C,QAAA,MAAA,CAAO,SAAS,IAAI,QAAA,CAAS,YAAA;AAAA,MAC/B,CAAA,MAAO;AAEL,QAAA,QAAQ,SAAS,IAAA;AAAM,UACrB,KAAK,QAAA;AACH,YAAA,MAAA,CAAO,SAAS,CAAA,GAAI,EAAA;AACpB,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AACpB,YAAA;AAAA,UACF,KAAK,SAAA;AACH,YAAA,MAAA,CAAO,SAAS,CAAA,GAAI,KAAA;AACpB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAA,CAAO,SAAS,IAAI,EAAC;AACrB,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,MAAA,CAAO,SAAS,IAAI,EAAC;AACrB,YAAA;AAAA,UACF;AACE,YAAA,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AAAA;AACxB,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAAA,EAAkC;AAC1C,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC7C;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAyB;AACvB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAe;AACb,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,OAAgB,KAAA,EAAsB;AAClD,IAAA,IAAA,CAAK,MAAM,MAAA,GAAS;AAAA,MAClB,GAAG,KAAK,KAAA,CAAM,MAAA;AAAA,MACd,CAAC,KAAK,GAAG;AAAA,KACX;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,KAAe,CAAA;AAEpC,IAAA,IAAI,IAAA,CAAK,QAAQ,gBAAA,EAAkB;AACjC,MAAA,IAAA,CAAK,cAAc,KAAe,CAAA;AAAA,IACpC;AAEA,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAA0B;AAClC,IAAA,IAAA,CAAK,MAAM,MAAA,GAAS;AAAA,MAClB,GAAG,KAAK,KAAA,CAAM,MAAA;AAAA,MACd,GAAG;AAAA,KACL;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,gBAAA,EAAkB;AACjC,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,KAAA,EAAqB;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAE5B,IAAA,IAAI,IAAA,CAAK,QAAQ,cAAA,EAAgB;AAC/B,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAA,EAAiC;AAC7C,IAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,OAAO,UAAA,EAAY,IAAA,CAAK,MAAM,MAAiC,CAAA;AAG5F,IAAA,MAAM,eAAA,GAAkB,OAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACzE,IAAA,MAAM,eAAA,GAAkB,OAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAEzE,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,GAAI,eAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,GAAI,eAAA;AAC7B,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,MAAA,CAAO,KAAA;AAE5B,IAAA,IAAA,CAAK,MAAA,EAAO;AAEZ,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,gBAAgB,MAAA,KAAW,CAAA;AAAA,MAClC,UAAA,EAAY,eAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA6B;AAC3B,IAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,OAAO,UAAA,EAAY,IAAA,CAAK,MAAM,MAAiC,CAAA;AAG5F,IAAA,MAAM,SAA4C,EAAC;AACnD,IAAA,MAAM,WAA8C,EAAC;AAErD,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,UAAA,EAAY;AACrC,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG;AACxB,QAAA,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,GAAI,EAAC;AAAA,MACzB;AACA,MAAA,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,CAAG,IAAA,CAAK,KAAK,CAAA;AAAA,IACjC;AAEA,IAAA,KAAA,MAAW,OAAA,IAAW,OAAO,UAAA,EAAY;AACvC,MAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC5B,QAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAC;AAAA,MAC7B;AACA,MAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,CAAG,IAAA,CAAK,OAAO,CAAA;AAAA,IACvC;AAEA,IAAA,IAAA,CAAK,MAAM,MAAA,GAAS,MAAA;AACpB,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AACtB,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,MAAA,CAAO,KAAA;AAE5B,IAAA,IAAA,CAAK,MAAA,EAAO;AAEZ,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAA,EAA4B;AACxC,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAe,KAAK,EAAC;AAC3D,IAAA,MAAM,gBAAgB,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,KAAe,KAAK,EAAC;AAE/D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAAA,MAC9B,UAAU,CAAC,KAAA,KAAmB,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA;AAAA,MAC7D,MAAA,EAAQ,MAAM,IAAA,CAAK,UAAA,CAAW,KAAe,CAAA;AAAA,MAC7C,QAAA,EAAU,YAAY,MAAA,GAAS,CAAA;AAAA,MAC/B,KAAA,EAAO,WAAA,CAAY,CAAC,CAAA,EAAG,OAAA;AAAA,MACvB,QAAQ,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,MACxC,UAAA,EAAY,cAAc,MAAA,GAAS,CAAA;AAAA,MACnC,OAAA,EAAS,aAAA,CAAc,CAAC,CAAA,EAAG,OAAA;AAAA,MAC3B,UAAU,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,MAC5C,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,KAAe,CAAA;AAAA,MAC/C,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,KAAe;AAAA,KAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAAgD;AAC9C,IAAA,MAAM,QAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,EAAG;AAC9D,MAAA,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA,CAAK,aAAA,CAAc,KAAgB,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,OAAgB,OAAA,EAAuB;AACnD,IAAA,MAAM,KAAA,GAAyB;AAAA,MAC7B,KAAA;AAAA,MACA,IAAA,EAAM,cAAA;AAAA,MACN,OAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAe,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAe,CAAA,GAAI,EAAC;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAe,CAAA,CAAG,KAAK,KAAK,CAAA;AAC9C,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,KAAA;AAErB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAA,EAAiC;AAC/C,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG;AACnC,QAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,KAAK,IAAI,EAAC;AAAA,MACpC;AAEA,MAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAQ;AAC7B,QAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,EAAG;AACrC,UAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAK,IAAI,EAAC;AAAA,QACtC;AACA,QAAA,IAAA,CAAK,MAAM,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,CAAG,KAAK,KAAK,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,MAAM,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,CAAG,KAAK,KAAK,CAAA;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,MAAM,CAAA,CAAE,MAAA,KAAW,CAAA;AAC5E,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,KAAA,CAAM,SAAS,EAAC;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,WAAW,EAAC;AACvB,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,IAAA;AACrB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,aAAA,EAAc;AAAA,MAChC,QAAQ,EAAC;AAAA,MACT,UAAU,EAAC;AAAA,MACX,OAAA,sBAAa,GAAA,EAAI;AAAA,MACjB,KAAA,sBAAW,GAAA,EAAI;AAAA,MACf,YAAA,EAAc,KAAA;AAAA,MACd,WAAA,EAAa,KAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACX;AACA,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAA0C;AAE9C,IAAA,KAAA,MAAW,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,EAAG;AAC9D,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,IAC9B;AAGA,IAAA,MAAM,MAAA,GAAS,KAAK,QAAA,EAAS;AAE7B,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,OAAA,CAAQ,oBAAoB,MAAM,CAAA;AACvC,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,EAAU;AACzB,MAAA,IAAA,CAAK,MAAM,YAAA,GAAe,IAAA;AAC1B,MAAA,IAAA,CAAK,MAAA,EAAO;AAEZ,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAA0B;AAAA,UAC9B,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,UACxB,aAAA,EAAe,CAAC,YAAA,KAAiB;AAC/B,YAAA,IAAA,CAAK,MAAM,YAAA,GAAe,YAAA;AAC1B,YAAA,IAAA,CAAK,MAAA,EAAO;AAAA,UACd,CAAA;AAAA,UACA,eAAe,CAAC,KAAA,EAAO,UAAU,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA;AAAA,UAChE,eAAe,CAAC,KAAA,EAAO,UAAU,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA;AAAA,UAChE,WAAA,EAAa,MAAM,IAAA,CAAK,WAAA,EAAY;AAAA,UACpC,eAAA,EAAiB,CAAC,MAAA,KAAW,IAAA,CAAK,gBAAgB,MAAM;AAAA,SAC1D;AAEA,QAAA,MAAM,KAAK,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,OAAO,CAAA;AAAA,MACxD,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,MAAM,YAAA,GAAe,KAAA;AAC1B,QAAA,IAAA,CAAK,MAAM,WAAA,GAAc,IAAA;AACzB,QAAA,IAAA,CAAK,MAAA,EAAO;AAAA,MACd;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA0F;AACxF,IAAA,OAAO,OAAO,CAAA,KAAM;AAClB,MAAA,CAAA,EAAG,cAAA,IAAiB;AACpB,MAAA,OAAO,KAAK,YAAA,EAAa;AAAA,IAC3B,CAAA;AAAA,EACF;AACF;;;AChdO,SAAS,aAAA,CACd,QACA,KAAA,EACoB;AACpB,EAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAC7D,EAAA,OAAO,KAAA,EAAO,OAAA;AAChB;AAKO,SAAS,cAAA,CACd,QACA,KAAA,EACU;AACV,EAAA,OAAO,MAAA,CAAO,UAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACzB;AAKO,SAAS,eAAA,CACd,QACA,KAAA,EACoB;AACpB,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAC/D,EAAA,OAAO,OAAA,EAAS,OAAA;AAClB;AAKO,SAAS,gBAAA,CACd,QACA,KAAA,EACU;AACV,EAAA,OAAO,MAAA,CAAO,UAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACzB;AAKO,SAAS,aAAA,CAAc,QAA0B,KAAA,EAAwB;AAC9E,EAAA,OAAO,OAAO,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACxD;AAKO,SAAS,eAAA,CAAgB,QAA0B,KAAA,EAAwB;AAChF,EAAA,OAAO,OAAO,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACxD;AAKO,SAAS,mBACd,MAAA,EACmC;AACnC,EAAA,MAAM,UAA6C,EAAC;AAEpD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,GAAI,EAAC;AAAA,IAC1B;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,CAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,WAAW,MAAA,EAAkD;AAC3E,EAAA,MAAM,MAA8B,EAAC;AAErC,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,UAAA,EAAY;AACrC,IAAA,IAAI,CAAC,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,EAAG;AACrB,MAAA,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,GAAI,KAAA,CAAM,OAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,cAAc,MAAA,EAAkD;AAC9E,EAAA,MAAM,MAA8B,EAAC;AAErC,EAAA,KAAA,MAAW,OAAA,IAAW,OAAO,UAAA,EAAY;AACvC,IAAA,IAAI,CAAC,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvB,MAAA,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,GAAI,OAAA,CAAQ,OAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AASO,SAAS,eAAe,QAAA,EAMV;AACnB,EAAA,MAAM,aAAgC,EAAC;AACvC,EAAA,MAAM,aAAgC,EAAC;AAGvC,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,KAAA,MAAW,KAAA,IAAS,SAAS,MAAA,EAAQ;AACnC,MAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAQ;AAC7B,QAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,IAAI,QAAA,CAAS,WAAW,gBAAA,EAAkB;AACxC,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,QAAA,CAAS,UAAA,CAAW,gBAAgB,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,QAAA,CAAS,WAAW,gBAAA,EAAkB;AACxC,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,QAAA,CAAS,UAAA,CAAW,gBAAgB,CAAA;AAAA,IACzD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,WAAW,MAAA,KAAW,CAAA;AAAA,IAC7B,UAAA;AAAA,IACA;AAAA,GACF;AACF;AASO,SAAS,kBAAA,CACd,EAAA,EACA,KAAA,GAAgB,GAAA,EACY;AAC5B,EAAA,IAAI,SAAA;AAEJ,EAAA,MAAM,SAAA,IAAa,IAAI,IAAA,KAAoB;AACzC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,QAAA,OAAA,CAAQ,EAAA,CAAG,GAAG,IAAI,CAAC,CAAA;AAAA,MACrB,GAAG,KAAK,CAAA;AAAA,IACV,CAAC,CAAA;AAAA,EACH,CAAA,CAAA;AAEA,EAAA,SAAA,CAAU,SAAS,MAAM;AACvB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,SAAA;AACT;AASO,SAAS,mBAAmB,MAAA,EAA8C;AAC/E,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,EAAG,KAAA;AAC/B;AAKO,SAAS,eAAA,CACd,MAAA,EACA,OAAA,GAAwC,EAAC,EACnC;AACN,EAAA,MAAM,KAAA,GAAQ,mBAAmB,MAAM,CAAA;AACvC,EAAA,IAAI,CAAC,KAAA,EAAO;AAGZ,EAAA,MAAM,OAAA,GACJ,SAAS,aAAA,CAA2B,CAAA,OAAA,EAAU,KAAK,CAAA,EAAA,CAAI,CAAA,IACvD,QAAA,CAAS,cAAA,CAAe,KAAK,CAAA;AAE/B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAA,EAAM;AACd,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,OAAA,CAAQ,eAAe,EAAE,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,UAAU,CAAA;AAAA,IAChE;AAAA,EACF;AACF;AASO,SAAS,WAAA,CAAY,OAAgB,IAAA,EAAuB;AACjE,EAAA,IAAI,KAAA,KAAU,EAAA,IAAM,KAAA,KAAU,MAAA,IAAa,UAAU,IAAA,EAAM;AACzD,IAAA,OAAO,IAAA,KAAS,WAAW,EAAA,GAAK,MAAA;AAAA,EAClC;AAEA,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AACH,MAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,MAAA,OAAO,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA,GAAY,GAAA;AAAA,IAElC,KAAK,SAAA;AACH,MAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,KAAA;AACvC,MAAA,IAAI,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,GAAA,EAAK,OAAO,IAAA;AAC9C,MAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,GAAA,EAAK,OAAO,KAAA;AAC/C,MAAA,OAAO,QAAQ,KAAK,CAAA;AAAA,IAEtB,KAAK,MAAA;AACH,MAAA,IAAI,KAAA,YAAiB,MAAM,OAAO,KAAA;AAClC,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAe,CAAA;AACrC,MAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAI,MAAA,GAAY,IAAA;AAAA,IAE7C,KAAK,OAAA;AACH,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AACjC,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,UAAA,OAAO,MAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,KAAK,CAAA;AAAA,QAChD,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,CAAC,KAAK,CAAA;AAAA,QACf;AAAA,MACF;AACA,MAAA,OAAO,CAAC,KAAK,CAAA;AAAA,IAEf;AACE,MAAA,OAAO,KAAA;AAAA;AAEb","file":"index.mjs","sourcesContent":["/**\r\n * Built-in validators for common validation rules\r\n */\r\n\r\nimport type { ValidatorFn, ValidationError, ValidatorContext } from '../types';\r\n\r\n/**\r\n * Create a validation error\r\n */\r\nfunction createError(\r\n context: ValidatorContext,\r\n code: string,\r\n message: string,\r\n soft: boolean = false\r\n): ValidationError {\r\n return {\r\n field: context.path,\r\n code,\r\n message,\r\n severity: soft ? 'soft' : 'hard',\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Type Validators\r\n// ============================================================================\r\n\r\nexport const typeValidators: Record<string, ValidatorFn> = {\r\n string: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'string') {\r\n return createError(context, 'INVALID_TYPE', `Expected string, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n number: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'number') {\r\n return createError(context, 'INVALID_TYPE', `Expected number, got ${typeof value}`);\r\n }\r\n if (typeof value === 'number' && isNaN(value)) {\r\n return createError(context, 'INVALID_NUMBER', 'Value is not a valid number');\r\n }\r\n return null;\r\n },\r\n\r\n boolean: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'boolean') {\r\n return createError(context, 'INVALID_TYPE', `Expected boolean, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n date: (value, _params, context) => {\r\n if (value === undefined || value === null) return null;\r\n if (value instanceof Date) {\r\n if (isNaN(value.getTime())) {\r\n return createError(context, 'INVALID_DATE', 'Invalid date value');\r\n }\r\n return null;\r\n }\r\n // Try parsing string dates\r\n if (typeof value === 'string') {\r\n const parsed = new Date(value);\r\n if (isNaN(parsed.getTime())) {\r\n return createError(context, 'INVALID_DATE', 'Invalid date format');\r\n }\r\n return null;\r\n }\r\n return createError(context, 'INVALID_TYPE', `Expected date, got ${typeof value}`);\r\n },\r\n\r\n array: (value, _params, context) => {\r\n if (value !== undefined && value !== null && !Array.isArray(value)) {\r\n return createError(context, 'INVALID_TYPE', `Expected array, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n object: (value, _params, context) => {\r\n if (value !== undefined && value !== null) {\r\n if (typeof value !== 'object' || Array.isArray(value)) {\r\n return createError(context, 'INVALID_TYPE', `Expected object, got ${typeof value}`);\r\n }\r\n }\r\n return null;\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Rule Validators\r\n// ============================================================================\r\n\r\nexport const ruleValidators: Record<string, ValidatorFn> = {\r\n required: (value, _params, context) => {\r\n const isEmpty =\r\n value === undefined ||\r\n value === null ||\r\n value === '' ||\r\n (Array.isArray(value) && value.length === 0);\r\n\r\n if (isEmpty) {\r\n return createError(context, 'REQUIRED', 'This field is required');\r\n }\r\n return null;\r\n },\r\n\r\n min: (value, params, context) => {\r\n const min = params?.value as number;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (value === undefined || value === null) return null;\r\n\r\n if (typeof value === 'number') {\r\n if (value < min) {\r\n return createError(\r\n context,\r\n 'MIN_VALUE',\r\n message || `Value must be at least ${min}`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.length < min) {\r\n return createError(\r\n context,\r\n 'MIN_LENGTH',\r\n message || `Must be at least ${min} characters`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length < min) {\r\n return createError(\r\n context,\r\n 'MIN_ITEMS',\r\n message || `Must have at least ${min} items`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n max: (value, params, context) => {\r\n const max = params?.value as number;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (value === undefined || value === null) return null;\r\n\r\n if (typeof value === 'number') {\r\n if (value > max) {\r\n return createError(\r\n context,\r\n 'MAX_VALUE',\r\n message || `Value must be at most ${max}`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.length > max) {\r\n return createError(\r\n context,\r\n 'MAX_LENGTH',\r\n message || `Must be at most ${max} characters`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length > max) {\r\n return createError(\r\n context,\r\n 'MAX_ITEMS',\r\n message || `Must have at most ${max} items`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n email: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') {\r\n return createError(context, 'INVALID_EMAIL', 'Email must be a string', soft);\r\n }\r\n\r\n // RFC 5322 simplified email regex\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!emailRegex.test(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_EMAIL',\r\n message || 'Invalid email address',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n pattern: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const pattern = params?.pattern as string;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') return null;\r\n\r\n const regex = new RegExp(pattern);\r\n if (!regex.test(value)) {\r\n return createError(\r\n context,\r\n 'PATTERN_MISMATCH',\r\n message || `Value does not match required pattern`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n url: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') {\r\n return createError(context, 'INVALID_URL', 'URL must be a string', soft);\r\n }\r\n\r\n try {\r\n new URL(value);\r\n return null;\r\n } catch {\r\n return createError(\r\n context,\r\n 'INVALID_URL',\r\n message || 'Invalid URL format',\r\n soft\r\n );\r\n }\r\n },\r\n\r\n enum: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const values = params?.values as unknown[];\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (!values.includes(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_ENUM',\r\n message || `Value must be one of: ${values.join(', ')}`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n custom: (value, params, context) => {\r\n const validate = params?.validate as (\r\n value: unknown,\r\n context: ValidatorContext\r\n ) => { valid: boolean; message?: string } | boolean;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (!validate) return null;\r\n\r\n const result = validate(value, context);\r\n\r\n if (typeof result === 'boolean') {\r\n if (!result) {\r\n return createError(\r\n context,\r\n 'CUSTOM_VALIDATION',\r\n message || 'Validation failed',\r\n soft\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n if (!result.valid) {\r\n return createError(\r\n context,\r\n 'CUSTOM_VALIDATION',\r\n result.message || message || 'Validation failed',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Enterprise patterns - matches field against another field\r\n matches: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const otherField = params?.field as string;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n const root = context.root as Record<string, unknown>;\r\n\r\n const otherValue = root[otherField];\r\n\r\n if (value !== otherValue) {\r\n return createError(\r\n context,\r\n 'FIELD_MISMATCH',\r\n message || `Must match ${otherField}`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Integer validation\r\n integer: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'number' || !Number.isInteger(value)) {\r\n return createError(\r\n context,\r\n 'NOT_INTEGER',\r\n message || 'Value must be an integer',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Positive number validation\r\n positive: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value === 'number' && value <= 0) {\r\n return createError(\r\n context,\r\n 'NOT_POSITIVE',\r\n message || 'Value must be positive',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Negative number validation\r\n negative: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value === 'number' && value >= 0) {\r\n return createError(\r\n context,\r\n 'NOT_NEGATIVE',\r\n message || 'Value must be negative',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Validator Registry\r\n// ============================================================================\r\n\r\nconst customValidators: Map<string, ValidatorFn> = new Map();\r\n\r\n/**\r\n * Register a custom validator\r\n */\r\nexport function registerValidator(name: string, validator: ValidatorFn): void {\r\n customValidators.set(name, validator);\r\n}\r\n\r\n/**\r\n * Get a validator by name\r\n */\r\nexport function getValidator(name: string): ValidatorFn | undefined {\r\n return ruleValidators[name] ?? customValidators.get(name);\r\n}\r\n\r\n/**\r\n * Get a type validator\r\n */\r\nexport function getTypeValidator(type: string): ValidatorFn | undefined {\r\n return typeValidators[type];\r\n}\r\n","/**\r\n * Core validation engine - runs unchanged in browser and Node.js\r\n */\r\n\r\nimport type {\r\n ValidationResult,\r\n ValidationError,\r\n FieldDefinition,\r\n SchemaDefinition,\r\n ValidatorContext,\r\n} from '../types';\r\n\r\nimport { getValidator, getTypeValidator } from './validators';\r\n\r\n/**\r\n * Validate a single field\r\n */\r\nfunction validateField(\r\n fieldDef: FieldDefinition,\r\n value: unknown,\r\n context: ValidatorContext\r\n): ValidationError[] {\r\n const errors: ValidationError[] = [];\r\n\r\n // Type validation first\r\n const typeValidator = getTypeValidator(fieldDef.type);\r\n if (typeValidator) {\r\n const typeError = typeValidator(value, undefined, context);\r\n if (typeError) {\r\n errors.push(typeError);\r\n // If type is wrong, skip other validations\r\n return errors;\r\n }\r\n }\r\n\r\n // Required validation\r\n if (fieldDef.required) {\r\n const requiredValidator = getValidator('required');\r\n if (requiredValidator) {\r\n const error = requiredValidator(value, undefined, context);\r\n if (error) {\r\n errors.push(error);\r\n // If required and missing, skip other validations\r\n return errors;\r\n }\r\n }\r\n } else if (value === undefined || value === null || value === '') {\r\n // Skip other validations for optional empty fields\r\n return errors;\r\n }\r\n\r\n // Rule validations\r\n for (const rule of fieldDef.rules) {\r\n const validator = getValidator(rule.type);\r\n if (!validator) {\r\n console.warn(`Unknown validator: ${rule.type}`);\r\n continue;\r\n }\r\n\r\n const params = {\r\n ...rule.params,\r\n soft: rule.soft,\r\n message: rule.message,\r\n };\r\n\r\n const error = validator(value, params, context);\r\n if (error) {\r\n errors.push(error);\r\n }\r\n }\r\n\r\n // Nested schema validation (for object fields)\r\n if (fieldDef.type === 'object' && fieldDef.schema && value !== null && value !== undefined) {\r\n const nestedResult = validateSchema(fieldDef.schema, value as Record<string, unknown>, context.path, context.root);\r\n errors.push(...nestedResult.hardErrors, ...nestedResult.softErrors);\r\n }\r\n\r\n // Array item validation\r\n if (fieldDef.type === 'array' && fieldDef.items && Array.isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n const itemContext: ValidatorContext = {\r\n path: `${context.path}[${i}]`,\r\n root: context.root,\r\n parent: value,\r\n };\r\n const itemErrors = validateField(fieldDef.items, value[i], itemContext);\r\n errors.push(...itemErrors);\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Validate data against a schema\r\n */\r\nexport function validateSchema(\r\n schema: SchemaDefinition,\r\n data: Record<string, unknown>,\r\n basePath: string = '',\r\n root?: unknown\r\n): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n const rootData = root ?? data;\r\n\r\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\r\n const value = data[fieldName];\r\n const path = basePath ? `${basePath}.${fieldName}` : fieldName;\r\n\r\n const context: ValidatorContext = {\r\n path,\r\n root: rootData,\r\n parent: data,\r\n };\r\n\r\n const errors = validateField(fieldDef, value, context);\r\n\r\n for (const error of errors) {\r\n if (error.severity === 'soft') {\r\n softErrors.push(error);\r\n } else {\r\n hardErrors.push(error);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Main validation function\r\n */\r\nexport function validate<T extends Record<string, unknown>>(\r\n schema: SchemaDefinition,\r\n data: T\r\n): ValidationResult {\r\n return validateSchema(schema, data);\r\n}\r\n\r\n/**\r\n * Check if data is valid (no hard errors)\r\n */\r\nexport function isValid(schema: SchemaDefinition, data: Record<string, unknown>): boolean {\r\n return validate(schema, data).valid;\r\n}\r\n\r\n/**\r\n * Validate and throw if invalid\r\n */\r\nexport function assertValid<T extends Record<string, unknown>>(\r\n schema: SchemaDefinition,\r\n data: T\r\n): T {\r\n const result = validate(schema, data);\r\n if (!result.valid) {\r\n const error = new Error('Validation failed');\r\n (error as Error & { errors: ValidationError[] }).errors = result.hardErrors;\r\n throw error;\r\n }\r\n return data;\r\n}\r\n\r\n/**\r\n * Merge multiple validation results\r\n */\r\nexport function mergeResults(...results: ValidationResult[]): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n for (const result of results) {\r\n hardErrors.push(...result.hardErrors);\r\n softErrors.push(...result.softErrors);\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Create an empty valid result\r\n */\r\nexport function validResult(): ValidationResult {\r\n return {\r\n valid: true,\r\n hardErrors: [],\r\n softErrors: [],\r\n };\r\n}\r\n\r\n/**\r\n * Create a result with a single error\r\n */\r\nexport function errorResult(\r\n field: string,\r\n code: string,\r\n message: string,\r\n soft: boolean = false\r\n): ValidationResult {\r\n const error: ValidationError = {\r\n field,\r\n code,\r\n message,\r\n severity: soft ? 'soft' : 'hard',\r\n };\r\n\r\n return {\r\n valid: soft,\r\n hardErrors: soft ? [] : [error],\r\n softErrors: soft ? [error] : [],\r\n };\r\n}\r\n","/**\r\n * Headless form utilities for frontend frameworks\r\n * Framework-agnostic - no React, Vue, or Svelte dependencies\r\n */\r\n\r\nimport type { SchemaBuilder, InferInput } from '../../schema';\r\nimport type { ValidationResult, ValidationError } from '../../types';\r\nimport { validate } from '../../core';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface FormState<T> {\r\n /** Current form values */\r\n values: T;\r\n /** Current validation errors by field */\r\n errors: Record<string, ValidationError[]>;\r\n /** Fields that have been touched (blurred) */\r\n touched: Set<string>;\r\n /** Fields that have been modified */\r\n dirty: Set<string>;\r\n /** Whether form is currently submitting */\r\n isSubmitting: boolean;\r\n /** Whether form has been submitted at least once */\r\n isSubmitted: boolean;\r\n /** Whether form is valid (no hard errors) */\r\n isValid: boolean;\r\n /** Soft warnings by field */\r\n warnings: Record<string, ValidationError[]>;\r\n}\r\n\r\nexport interface FormOptions<T> {\r\n /** Initial form values */\r\n initialValues?: Partial<T>;\r\n /** Validate on change */\r\n validateOnChange?: boolean;\r\n /** Validate on blur */\r\n validateOnBlur?: boolean;\r\n /** Custom submit handler */\r\n onSubmit?: (values: T, helpers: FormHelpers<T>) => void | Promise<void>;\r\n /** Called when validation fails */\r\n onValidationError?: (result: ValidationResult) => void;\r\n}\r\n\r\nexport interface FormHelpers<T> {\r\n /** Reset form to initial values */\r\n reset: () => void;\r\n /** Set form submitting state */\r\n setSubmitting: (isSubmitting: boolean) => void;\r\n /** Set field value */\r\n setFieldValue: (field: keyof T, value: unknown) => void;\r\n /** Set field error manually */\r\n setFieldError: (field: keyof T, error: string) => void;\r\n /** Clear all errors */\r\n clearErrors: () => void;\r\n /** Set server errors from API response */\r\n setServerErrors: (errors: ValidationError[]) => void;\r\n}\r\n\r\nexport interface FieldProps {\r\n /** Field name */\r\n name: string;\r\n /** Current value */\r\n value: unknown;\r\n /** Change handler */\r\n onChange: (value: unknown) => void;\r\n /** Blur handler */\r\n onBlur: () => void;\r\n /** Whether field has error */\r\n hasError: boolean;\r\n /** Error message (first error) */\r\n error: string | undefined;\r\n /** All error messages */\r\n errors: string[];\r\n /** Whether field has warning */\r\n hasWarning: boolean;\r\n /** Warning message (first warning) */\r\n warning: string | undefined;\r\n /** All warning messages */\r\n warnings: string[];\r\n /** Whether field has been touched */\r\n touched: boolean;\r\n /** Whether field has been modified */\r\n dirty: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Form Controller (Framework-Agnostic)\r\n// ============================================================================\r\n\r\n/**\r\n * Create a form controller for managing form state and validation\r\n *\r\n * @example\r\n * ```ts\r\n * const form = createForm(UserSchema, {\r\n * initialValues: { email: '', name: '' },\r\n * onSubmit: async (values) => {\r\n * await api.createUser(values);\r\n * },\r\n * });\r\n *\r\n * // In your UI:\r\n * const emailProps = form.getFieldProps('email');\r\n * // { name, value, onChange, onBlur, error, ... }\r\n * ```\r\n */\r\nexport function createForm<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options: FormOptions<InferInput<S>> = {}\r\n): FormController<InferInput<S>> {\r\n return new FormController(\r\n schema as unknown as SchemaBuilder<InferInput<S>>,\r\n options\r\n );\r\n}\r\n\r\nexport class FormController<T extends Record<string, unknown>> {\r\n private schema: SchemaBuilder<T>;\r\n private options: FormOptions<T>;\r\n private state: FormState<T>;\r\n private listeners: Set<() => void> = new Set();\r\n private initialValues: T;\r\n\r\n constructor(schema: SchemaBuilder<T>, options: FormOptions<T> = {}) {\r\n this.schema = schema;\r\n this.options = {\r\n validateOnChange: true,\r\n validateOnBlur: true,\r\n ...options,\r\n };\r\n\r\n // Build initial values from schema defaults and provided values\r\n this.initialValues = this.buildInitialValues();\r\n\r\n this.state = {\r\n values: { ...this.initialValues },\r\n errors: {},\r\n warnings: {},\r\n touched: new Set(),\r\n dirty: new Set(),\r\n isSubmitting: false,\r\n isSubmitted: false,\r\n isValid: true,\r\n };\r\n }\r\n\r\n private buildInitialValues(): T {\r\n const values: Record<string, unknown> = {};\r\n const schemaFields = this.schema.definition.fields;\r\n\r\n for (const [fieldName, fieldDef] of Object.entries(schemaFields)) {\r\n if (this.options.initialValues?.[fieldName as keyof T] !== undefined) {\r\n values[fieldName] = this.options.initialValues[fieldName as keyof T];\r\n } else if (fieldDef.defaultValue !== undefined) {\r\n values[fieldName] = fieldDef.defaultValue;\r\n } else {\r\n // Set appropriate empty value based on type\r\n switch (fieldDef.type) {\r\n case 'string':\r\n values[fieldName] = '';\r\n break;\r\n case 'number':\r\n values[fieldName] = undefined;\r\n break;\r\n case 'boolean':\r\n values[fieldName] = false;\r\n break;\r\n case 'array':\r\n values[fieldName] = [];\r\n break;\r\n case 'object':\r\n values[fieldName] = {};\r\n break;\r\n default:\r\n values[fieldName] = undefined;\r\n }\r\n }\r\n }\r\n\r\n return values as T;\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n */\r\n subscribe(listener: () => void): () => void {\r\n this.listeners.add(listener);\r\n return () => this.listeners.delete(listener);\r\n }\r\n\r\n private notify(): void {\r\n for (const listener of this.listeners) {\r\n listener();\r\n }\r\n }\r\n\r\n /**\r\n * Get current form state\r\n */\r\n getState(): FormState<T> {\r\n return { ...this.state };\r\n }\r\n\r\n /**\r\n * Get current form values\r\n */\r\n getValues(): T {\r\n return { ...this.state.values };\r\n }\r\n\r\n /**\r\n * Set a field value\r\n */\r\n setFieldValue(field: keyof T, value: unknown): void {\r\n this.state.values = {\r\n ...this.state.values,\r\n [field]: value,\r\n };\r\n this.state.dirty.add(field as string);\r\n\r\n if (this.options.validateOnChange) {\r\n this.validateField(field as string);\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Set multiple values at once\r\n */\r\n setValues(values: Partial<T>): void {\r\n this.state.values = {\r\n ...this.state.values,\r\n ...values,\r\n };\r\n\r\n for (const key of Object.keys(values)) {\r\n this.state.dirty.add(key);\r\n }\r\n\r\n if (this.options.validateOnChange) {\r\n this.validate();\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Mark a field as touched (blurred)\r\n */\r\n touchField(field: string): void {\r\n this.state.touched.add(field);\r\n\r\n if (this.options.validateOnBlur) {\r\n this.validateField(field);\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Validate a single field\r\n */\r\n validateField(field: string): ValidationResult {\r\n const result = validate(this.schema.definition, this.state.values as Record<string, unknown>);\r\n\r\n // Extract errors for this field\r\n const fieldHardErrors = result.hardErrors.filter((e) => e.field === field);\r\n const fieldSoftErrors = result.softErrors.filter((e) => e.field === field);\r\n\r\n this.state.errors[field] = fieldHardErrors;\r\n this.state.warnings[field] = fieldSoftErrors;\r\n this.state.isValid = result.valid;\r\n\r\n this.notify();\r\n\r\n return {\r\n valid: fieldHardErrors.length === 0,\r\n hardErrors: fieldHardErrors,\r\n softErrors: fieldSoftErrors,\r\n };\r\n }\r\n\r\n /**\r\n * Validate entire form\r\n */\r\n validate(): ValidationResult {\r\n const result = validate(this.schema.definition, this.state.values as Record<string, unknown>);\r\n\r\n // Group errors by field\r\n const errors: Record<string, ValidationError[]> = {};\r\n const warnings: Record<string, ValidationError[]> = {};\r\n\r\n for (const error of result.hardErrors) {\r\n if (!errors[error.field]) {\r\n errors[error.field] = [];\r\n }\r\n errors[error.field]!.push(error);\r\n }\r\n\r\n for (const warning of result.softErrors) {\r\n if (!warnings[warning.field]) {\r\n warnings[warning.field] = [];\r\n }\r\n warnings[warning.field]!.push(warning);\r\n }\r\n\r\n this.state.errors = errors;\r\n this.state.warnings = warnings;\r\n this.state.isValid = result.valid;\r\n\r\n this.notify();\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get field props for binding to UI\r\n */\r\n getFieldProps(field: keyof T): FieldProps {\r\n const fieldErrors = this.state.errors[field as string] || [];\r\n const fieldWarnings = this.state.warnings[field as string] || [];\r\n\r\n return {\r\n name: field as string,\r\n value: this.state.values[field],\r\n onChange: (value: unknown) => this.setFieldValue(field, value),\r\n onBlur: () => this.touchField(field as string),\r\n hasError: fieldErrors.length > 0,\r\n error: fieldErrors[0]?.message,\r\n errors: fieldErrors.map((e) => e.message),\r\n hasWarning: fieldWarnings.length > 0,\r\n warning: fieldWarnings[0]?.message,\r\n warnings: fieldWarnings.map((w) => w.message),\r\n touched: this.state.touched.has(field as string),\r\n dirty: this.state.dirty.has(field as string),\r\n };\r\n }\r\n\r\n /**\r\n * Get all field props\r\n */\r\n getAllFieldProps(): Record<keyof T, FieldProps> {\r\n const props: Record<string, FieldProps> = {};\r\n for (const field of Object.keys(this.schema.definition.fields)) {\r\n props[field] = this.getFieldProps(field as keyof T);\r\n }\r\n return props as Record<keyof T, FieldProps>;\r\n }\r\n\r\n /**\r\n * Set field error manually (e.g., from server)\r\n */\r\n setFieldError(field: keyof T, message: string): void {\r\n const error: ValidationError = {\r\n field: field as string,\r\n code: 'SERVER_ERROR',\r\n message,\r\n severity: 'hard',\r\n };\r\n\r\n if (!this.state.errors[field as string]) {\r\n this.state.errors[field as string] = [];\r\n }\r\n this.state.errors[field as string]!.push(error);\r\n this.state.isValid = false;\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Set multiple errors from server response\r\n */\r\n setServerErrors(errors: ValidationError[]): void {\r\n for (const error of errors) {\r\n if (!this.state.errors[error.field]) {\r\n this.state.errors[error.field] = [];\r\n }\r\n\r\n if (error.severity === 'soft') {\r\n if (!this.state.warnings[error.field]) {\r\n this.state.warnings[error.field] = [];\r\n }\r\n this.state.warnings[error.field]!.push(error);\r\n } else {\r\n this.state.errors[error.field]!.push(error);\r\n }\r\n }\r\n\r\n this.state.isValid = errors.filter((e) => e.severity === 'hard').length === 0;\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Clear all errors\r\n */\r\n clearErrors(): void {\r\n this.state.errors = {};\r\n this.state.warnings = {};\r\n this.state.isValid = true;\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Reset form to initial values\r\n */\r\n reset(): void {\r\n this.state = {\r\n values: { ...this.initialValues },\r\n errors: {},\r\n warnings: {},\r\n touched: new Set(),\r\n dirty: new Set(),\r\n isSubmitting: false,\r\n isSubmitted: false,\r\n isValid: true,\r\n };\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Handle form submission\r\n */\r\n async handleSubmit(): Promise<ValidationResult> {\r\n // Mark all fields as touched\r\n for (const field of Object.keys(this.schema.definition.fields)) {\r\n this.state.touched.add(field);\r\n }\r\n\r\n // Validate\r\n const result = this.validate();\r\n\r\n if (!result.valid) {\r\n this.options.onValidationError?.(result);\r\n return result;\r\n }\r\n\r\n // Submit\r\n if (this.options.onSubmit) {\r\n this.state.isSubmitting = true;\r\n this.notify();\r\n\r\n try {\r\n const helpers: FormHelpers<T> = {\r\n reset: () => this.reset(),\r\n setSubmitting: (isSubmitting) => {\r\n this.state.isSubmitting = isSubmitting;\r\n this.notify();\r\n },\r\n setFieldValue: (field, value) => this.setFieldValue(field, value),\r\n setFieldError: (field, error) => this.setFieldError(field, error),\r\n clearErrors: () => this.clearErrors(),\r\n setServerErrors: (errors) => this.setServerErrors(errors),\r\n };\r\n\r\n await this.options.onSubmit(this.state.values, helpers);\r\n } finally {\r\n this.state.isSubmitting = false;\r\n this.state.isSubmitted = true;\r\n this.notify();\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a submit handler (for form onSubmit)\r\n */\r\n createSubmitHandler(): (e?: { preventDefault?: () => void }) => Promise<ValidationResult> {\r\n return async (e) => {\r\n e?.preventDefault?.();\r\n return this.handleSubmit();\r\n };\r\n }\r\n}\r\n","/**\r\n * Frontend utility functions for validation and error handling\r\n */\r\n\r\nimport type { ValidationResult, ValidationError } from '../../types';\r\n\r\n// ============================================================================\r\n// Error Formatting\r\n// ============================================================================\r\n\r\n/**\r\n * Get the first error message for a field\r\n */\r\nexport function getFieldError(\r\n result: ValidationResult,\r\n field: string\r\n): string | undefined {\r\n const error = result.hardErrors.find((e) => e.field === field);\r\n return error?.message;\r\n}\r\n\r\n/**\r\n * Get all error messages for a field\r\n */\r\nexport function getFieldErrors(\r\n result: ValidationResult,\r\n field: string\r\n): string[] {\r\n return result.hardErrors\r\n .filter((e) => e.field === field)\r\n .map((e) => e.message);\r\n}\r\n\r\n/**\r\n * Get the first warning message for a field\r\n */\r\nexport function getFieldWarning(\r\n result: ValidationResult,\r\n field: string\r\n): string | undefined {\r\n const warning = result.softErrors.find((e) => e.field === field);\r\n return warning?.message;\r\n}\r\n\r\n/**\r\n * Get all warning messages for a field\r\n */\r\nexport function getFieldWarnings(\r\n result: ValidationResult,\r\n field: string\r\n): string[] {\r\n return result.softErrors\r\n .filter((e) => e.field === field)\r\n .map((e) => e.message);\r\n}\r\n\r\n/**\r\n * Check if a field has errors\r\n */\r\nexport function hasFieldError(result: ValidationResult, field: string): boolean {\r\n return result.hardErrors.some((e) => e.field === field);\r\n}\r\n\r\n/**\r\n * Check if a field has warnings\r\n */\r\nexport function hasFieldWarning(result: ValidationResult, field: string): boolean {\r\n return result.softErrors.some((e) => e.field === field);\r\n}\r\n\r\n/**\r\n * Group errors by field\r\n */\r\nexport function groupErrorsByField(\r\n errors: ValidationError[]\r\n): Record<string, ValidationError[]> {\r\n const grouped: Record<string, ValidationError[]> = {};\r\n\r\n for (const error of errors) {\r\n if (!grouped[error.field]) {\r\n grouped[error.field] = [];\r\n }\r\n grouped[error.field]!.push(error);\r\n }\r\n\r\n return grouped;\r\n}\r\n\r\n/**\r\n * Convert validation result to a simple error map\r\n */\r\nexport function toErrorMap(result: ValidationResult): Record<string, string> {\r\n const map: Record<string, string> = {};\r\n\r\n for (const error of result.hardErrors) {\r\n if (!map[error.field]) {\r\n map[error.field] = error.message;\r\n }\r\n }\r\n\r\n return map;\r\n}\r\n\r\n/**\r\n * Convert validation result to a warnings map\r\n */\r\nexport function toWarningsMap(result: ValidationResult): Record<string, string> {\r\n const map: Record<string, string> = {};\r\n\r\n for (const warning of result.softErrors) {\r\n if (!map[warning.field]) {\r\n map[warning.field] = warning.message;\r\n }\r\n }\r\n\r\n return map;\r\n}\r\n\r\n// ============================================================================\r\n// API Response Handling\r\n// ============================================================================\r\n\r\n/**\r\n * Parse errors from an API response\r\n */\r\nexport function parseApiErrors(response: {\r\n errors?: ValidationError[];\r\n validation?: {\r\n hard_validations?: ValidationError[];\r\n soft_validations?: ValidationError[];\r\n };\r\n}): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n // Handle flat errors array\r\n if (response.errors) {\r\n for (const error of response.errors) {\r\n if (error.severity === 'soft') {\r\n softErrors.push(error);\r\n } else {\r\n hardErrors.push(error);\r\n }\r\n }\r\n }\r\n\r\n // Handle structured validation object\r\n if (response.validation) {\r\n if (response.validation.hard_validations) {\r\n hardErrors.push(...response.validation.hard_validations);\r\n }\r\n if (response.validation.soft_validations) {\r\n softErrors.push(...response.validation.soft_validations);\r\n }\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Debouncing\r\n// ============================================================================\r\n\r\n/**\r\n * Create a debounced validation function\r\n */\r\nexport function debounceValidation<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n delay: number = 300\r\n): T & { cancel: () => void } {\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n const debounced = ((...args: unknown[]) => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n return new Promise((resolve) => {\r\n timeoutId = setTimeout(() => {\r\n resolve(fn(...args));\r\n }, delay);\r\n });\r\n }) as T & { cancel: () => void };\r\n\r\n debounced.cancel = () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n };\r\n\r\n return debounced;\r\n}\r\n\r\n// ============================================================================\r\n// Focus Management\r\n// ============================================================================\r\n\r\n/**\r\n * Get the first field with an error\r\n */\r\nexport function getFirstErrorField(result: ValidationResult): string | undefined {\r\n return result.hardErrors[0]?.field;\r\n}\r\n\r\n/**\r\n * Focus the first field with an error (browser only)\r\n */\r\nexport function focusFirstError(\r\n result: ValidationResult,\r\n options: { scrollIntoView?: boolean } = {}\r\n): void {\r\n const field = getFirstErrorField(result);\r\n if (!field) return;\r\n\r\n // Try to find element by name or id\r\n const element =\r\n document.querySelector<HTMLElement>(`[name=\"${field}\"]`) ||\r\n document.getElementById(field);\r\n\r\n if (element) {\r\n element.focus();\r\n if (options.scrollIntoView) {\r\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Value Coercion\r\n// ============================================================================\r\n\r\n/**\r\n * Coerce form values to appropriate types based on schema\r\n */\r\nexport function coerceValue(value: unknown, type: string): unknown {\r\n if (value === '' || value === undefined || value === null) {\r\n return type === 'string' ? '' : undefined;\r\n }\r\n\r\n switch (type) {\r\n case 'number':\r\n const num = Number(value);\r\n return isNaN(num) ? undefined : num;\r\n\r\n case 'boolean':\r\n if (typeof value === 'boolean') return value;\r\n if (value === 'true' || value === '1') return true;\r\n if (value === 'false' || value === '0') return false;\r\n return Boolean(value);\r\n\r\n case 'date':\r\n if (value instanceof Date) return value;\r\n const date = new Date(value as string);\r\n return isNaN(date.getTime()) ? undefined : date;\r\n\r\n case 'array':\r\n if (Array.isArray(value)) return value;\r\n if (typeof value === 'string') {\r\n try {\r\n const parsed = JSON.parse(value);\r\n return Array.isArray(parsed) ? parsed : [value];\r\n } catch {\r\n return [value];\r\n }\r\n }\r\n return [value];\r\n\r\n default:\r\n return value;\r\n }\r\n}\r\n"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/validators.ts","../src/core/engine.ts","../src/schema/field.ts","../src/schema/schema.ts","../src/types/index.ts"],"names":["validate","schema","field"],"mappings":";;;AASA,SAAS,WAAA,CACP,OAAA,EACA,IAAA,EACA,OAAA,EACA,OAAgB,KAAA,EACC;AACjB,EAAA,OAAO;AAAA,IACL,OAAO,OAAA,CAAQ,IAAA;AAAA,IACf,IAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAU,OAAO,MAAA,GAAS;AAAA,GAC5B;AACF;AAMO,IAAM,cAAA,GAA8C;AAAA,EACzD,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACnC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,OAAO,UAAU,QAAA,EAAU;AACtE,MAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,qBAAA,EAAwB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACpF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACnC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,OAAO,UAAU,QAAA,EAAU;AACtE,MAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,qBAAA,EAAwB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACpF;AACA,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,KAAK,CAAA,EAAG;AAC7C,MAAA,OAAO,WAAA,CAAY,OAAA,EAAS,gBAAA,EAAkB,6BAA6B,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,OAAA,EAAS,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACpC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,OAAO,UAAU,SAAA,EAAW;AACvE,MAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,sBAAA,EAAyB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACrF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,IAAA,EAAM,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACjC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAClD,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,IAAI,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG;AAC1B,QAAA,OAAO,WAAA,CAAY,OAAA,EAAS,cAAA,EAAgB,oBAAoB,CAAA;AAAA,MAClE;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,KAAK,CAAA;AAC7B,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,CAAA,EAAG;AAC3B,QAAA,OAAO,WAAA,CAAY,OAAA,EAAS,cAAA,EAAgB,qBAAqB,CAAA;AAAA,MACnE;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,mBAAA,EAAsB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EAClF,CAAA;AAAA,EAEA,KAAA,EAAO,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AAClC,IAAA,IAAI,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAClE,MAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,oBAAA,EAAuB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACnC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,QAAA,OAAO,YAAY,OAAA,EAAS,cAAA,EAAgB,CAAA,qBAAA,EAAwB,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,MACpF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMO,IAAM,cAAA,GAA8C;AAAA,EACzD,QAAA,EAAU,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,KAAY;AACrC,IAAA,MAAM,OAAA,GACJ,KAAA,KAAU,MAAA,IACV,KAAA,KAAU,IAAA,IACV,KAAA,KAAU,EAAA,IACT,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA,KAAW,CAAA;AAE5C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,WAAA,CAAY,OAAA,EAAS,UAAA,EAAY,wBAAwB,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,GAAA,EAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AAC/B,IAAA,MAAM,MAAM,MAAA,EAAQ,KAAA;AACpB,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,IAAW,0BAA0B,GAAG,CAAA,CAAA;AAAA,UACxC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACtB,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,YAAA;AAAA,UACA,OAAA,IAAW,oBAAoB,GAAG,CAAA,WAAA,CAAA;AAAA,UAClC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACtB,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,IAAW,sBAAsB,GAAG,CAAA,MAAA,CAAA;AAAA,UACpC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,GAAA,EAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AAC/B,IAAA,MAAM,MAAM,MAAA,EAAQ,KAAA;AACpB,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,IAAW,yBAAyB,GAAG,CAAA,CAAA;AAAA,UACvC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACtB,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,YAAA;AAAA,UACA,OAAA,IAAW,mBAAmB,GAAG,CAAA,WAAA,CAAA;AAAA,UACjC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACtB,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,IAAW,qBAAqB,GAAG,CAAA,MAAA,CAAA;AAAA,UACnC;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,KAAA,EAAO,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACjC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,IAAA;AAElE,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,WAAA,CAAY,OAAA,EAAS,eAAA,EAAiB,wBAAA,EAA0B,IAAI,CAAA;AAAA,IAC7E;AAGA,IAAA,MAAM,UAAA,GAAa,4BAAA;AACnB,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA,IAAW,uBAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACnC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,IAAA;AAElE,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AACxB,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA;AAEtC,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACtB,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,kBAAA;AAAA,QACA,OAAA,IAAW,CAAA,qCAAA,CAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,GAAA,EAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AAC/B,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,IAAA;AAElE,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,WAAA,CAAY,OAAA,EAAS,aAAA,EAAe,sBAAA,EAAwB,IAAI,CAAA;AAAA,IACzE;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,IAAI,KAAK,CAAA;AACb,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA,IAAW,oBAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA;AAAA,EAEA,IAAA,EAAM,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AAChC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,MAAM,SAAS,MAAA,EAAQ,MAAA;AACvB,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA,IAAW,CAAA,sBAAA,EAAyB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QACrD;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AAClC,IAAA,MAAMA,YAAW,MAAA,EAAQ,QAAA;AAIzB,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,CAACA,WAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,MAAA,GAASA,SAAAA,CAAS,KAAA,EAAO,OAAO,CAAA;AAEtC,IAAA,IAAI,OAAO,WAAW,SAAA,EAAW;AAC/B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,WAAA;AAAA,UACL,OAAA;AAAA,UACA,mBAAA;AAAA,UACA,OAAA,IAAW,mBAAA;AAAA,UACX;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,mBAAA;AAAA,QACA,MAAA,CAAO,WAAW,OAAA,IAAW,mBAAA;AAAA,QAC7B;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA;AAAA,EAGA,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACnC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,MAAM,aAAa,MAAA,EAAQ,KAAA;AAC3B,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AACxB,IAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AAErB,IAAA,MAAM,UAAA,GAAa,KAAK,UAAU,CAAA;AAElC,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,gBAAA;AAAA,QACA,OAAA,IAAW,cAAc,UAAU,CAAA,CAAA;AAAA,QACnC;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA;AAAA,EAGA,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACnC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AACzD,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA,IAAW,0BAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA;AAAA,EAGA,QAAA,EAAU,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACpC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,IAAS,CAAA,EAAG;AAC3C,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA,IAAW,wBAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA;AAAA,EAGA,QAAA,EAAU,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY;AACpC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAElD,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,IAAS,CAAA,EAAG;AAC3C,MAAA,OAAO,WAAA;AAAA,QACL,OAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA,IAAW,wBAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,IAAM,gBAAA,uBAAiD,GAAA,EAAI;AAKpD,SAAS,iBAAA,CAAkB,MAAc,SAAA,EAA8B;AAC5E,EAAA,gBAAA,CAAiB,GAAA,CAAI,MAAM,SAAS,CAAA;AACtC;AAKO,SAAS,aAAa,IAAA,EAAuC;AAClE,EAAA,OAAO,cAAA,CAAe,IAAI,CAAA,IAAK,gBAAA,CAAiB,IAAI,IAAI,CAAA;AAC1D;AAKO,SAAS,iBAAiB,IAAA,EAAuC;AACtE,EAAA,OAAO,eAAe,IAAI,CAAA;AAC5B;;;ACrZA,SAAS,aAAA,CACP,QAAA,EACA,KAAA,EACA,OAAA,EACmB;AACnB,EAAA,MAAM,SAA4B,EAAC;AAGnC,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,QAAA,CAAS,IAAI,CAAA;AACpD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,KAAA,EAAO,MAAA,EAAW,OAAO,CAAA;AACzD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAErB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,iBAAA,GAAoB,aAAa,UAAU,CAAA;AACjD,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,KAAA,EAAO,MAAA,EAAW,OAAO,CAAA;AACzD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAEjB,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF,WAAW,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AAEhE,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,EAAO;AACjC,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK;AAAA,KAChB;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAC9C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,CAAS,SAAS,QAAA,IAAY,QAAA,CAAS,UAAU,KAAA,KAAU,IAAA,IAAQ,UAAU,MAAA,EAAW;AAC1F,IAAA,MAAM,YAAA,GAAe,eAAe,QAAA,CAAS,MAAA,EAAQ,OAAkC,OAAA,CAAQ,IAAA,EAAM,QAAQ,IAAI,CAAA;AACjH,IAAA,MAAA,CAAO,KAAK,GAAG,YAAA,CAAa,UAAA,EAAY,GAAG,aAAa,UAAU,CAAA;AAAA,EACpE;AAGA,EAAA,IAAI,QAAA,CAAS,SAAS,OAAA,IAAW,QAAA,CAAS,SAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,WAAA,GAAgC;AAAA,QACpC,IAAA,EAAM,CAAA,EAAG,OAAA,CAAQ,IAAI,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,QAC1B,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AACA,MAAA,MAAM,aAAa,aAAA,CAAc,QAAA,CAAS,OAAO,KAAA,CAAM,CAAC,GAAG,WAAW,CAAA;AACtE,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,cAAA,CACdC,OAAAA,EACA,IAAA,EACA,QAAA,GAAmB,IACnB,IAAA,EACkB;AAClB,EAAA,MAAM,aAAgC,EAAC;AACvC,EAAA,MAAM,aAAgC,EAAC;AAEvC,EAAA,MAAM,WAAW,IAAA,IAAQ,IAAA;AAEzB,EAAA,KAAA,MAAW,CAAC,WAAW,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQA,OAAAA,CAAO,MAAM,CAAA,EAAG;AACjE,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAS,CAAA;AAC5B,IAAA,MAAM,OAAO,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,SAAA;AAErD,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,IAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,KAAA,EAAO,OAAO,CAAA;AAErD,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAQ;AAC7B,QAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,WAAW,MAAA,KAAW,CAAA;AAAA,IAC7B,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,QAAA,CACdA,SACA,IAAA,EACkB;AAClB,EAAA,OAAO,cAAA,CAAeA,SAAQ,IAAI,CAAA;AACpC;AAKO,SAAS,OAAA,CAAQA,SAA0B,IAAA,EAAwC;AACxF,EAAA,OAAO,QAAA,CAASA,OAAAA,EAAQ,IAAI,CAAA,CAAE,KAAA;AAChC;AAKO,SAAS,WAAA,CACdA,SACA,IAAA,EACG;AACH,EAAA,MAAM,MAAA,GAAS,QAAA,CAASA,OAAAA,EAAQ,IAAI,CAAA;AACpC,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,mBAAmB,CAAA;AAC3C,IAAC,KAAA,CAAgD,SAAS,MAAA,CAAO,UAAA;AACjE,IAAA,MAAM,KAAA;AAAA,EACR;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,gBAAgB,OAAA,EAA+C;AAC7E,EAAA,MAAM,aAAgC,EAAC;AACvC,EAAA,MAAM,aAAgC,EAAC;AAEvC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,MAAA,CAAO,UAAU,CAAA;AACpC,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,MAAA,CAAO,UAAU,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,WAAW,MAAA,KAAW,CAAA;AAAA,IAC7B,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,WAAA,GAAgC;AAC9C,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,YAAY,EAAC;AAAA,IACb,YAAY;AAAC,GACf;AACF;AAKO,SAAS,WAAA,CACdC,MAAAA,EACA,IAAA,EACA,OAAA,EACA,OAAgB,KAAA,EACE;AAClB,EAAA,MAAM,KAAA,GAAyB;AAAA,IAC7B,KAAA,EAAAA,MAAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAU,OAAO,MAAA,GAAS;AAAA,GAC5B;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,UAAA,EAAY,IAAA,GAAO,EAAC,GAAI,CAAC,KAAK,CAAA;AAAA,IAC9B,UAAA,EAAY,IAAA,GAAO,CAAC,KAAK,IAAI;AAAC,GAChC;AACF;;;ACjNO,IAAM,mBAAN,MAA0B;AAAA,EAO/B,YAAY,IAAA,EAA+B;AAL3C,IAAA,IAAA,CAAU,SAA2B,EAAC;AACtC,IAAA,IAAA,CAAU,SAAA,GAAqB,KAAA;AAE/B,IAAA,IAAA,CAAU,QAAiC,EAAC;AAG1C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAA,EAAwB;AAC/B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,SAAS,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAA,EAAgB;AACtB,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CACEF,WACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,EAAE,QAAA,EAAAA,SAAAA,EAAS;AAAA,MACnB;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACEA,WACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,EAAE,QAAA,EAAAA,SAAAA,EAAS;AAAA,MACnB,OAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAAqC;AACxC,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,IAAA,EAAK;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAA4B;AAC1B,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAAA,MACtB,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ;AAAA,KAC1D;AAAA,EACF;AACF;AAMO,IAAM,kBAAA,GAAN,cAAiC,gBAAA,CAAyB;AAAA,EAC/D,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,QAAgB,OAAA,EAAwB;AAC1C,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,MACxB;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,QAAgB,OAAA,EAAwB;AAC9C,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,MACxB,OAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,QAAgB,OAAA,EAAwB;AAC1C,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,MACxB;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,QAAgB,OAAA,EAAwB;AAC9C,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,MACxB,OAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,EAAwB;AAC5B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,OAAA;AAAA,MACN;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,EAAwB;AAC1B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,OAAwB,OAAA,EAAwB;AACtD,IAAA,MAAM,OAAA,GAAU,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,CAAM,MAAA;AAC1D,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,EAAE,OAAA,EAAQ;AAAA,MAClB;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAuB,QAAsB,OAAA,EAAuC;AAClF,IAAA,MAAM,OAAA,GAAU,IAAI,gBAAA,CAAoB,MAAA,EAAQ,KAAK,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,KAAK,CAAA;AACvF,IAAA,OAAA,CAAQ,WAAA,CAAY,QAAQ,OAAO,CAAA;AACnC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQE,QAAe,OAAA,EAAwB;AAC7C,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,EAAE,KAAA,EAAAA,MAAAA,EAAM;AAAA,MAChB;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAA,EAAuB;AAE1B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,OAAO,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,OACjC;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMO,IAAM,gBAAA,GAAN,cAAiD,gBAAA,CAAoB;AAAA,EAG1E,WAAA,CACE,QACA,KAAA,GAA0B,IAC1B,QAAA,GAAoB,KAAA,EACpB,IAAA,GAAgC,EAAC,EACjC;AACA,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,GAAG,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,QAAsB,OAAA,EAAwB;AACxD,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,EAAE,MAAA,EAAO;AAAA,MACjB;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAA4B;AAC1B,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAAA,MACtB,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,IAAA,EAAM;AAAA,QACJ,GAAG,IAAA,CAAK,KAAA;AAAA,QACR,YAAY,IAAA,CAAK;AAAA;AACnB,KACF;AAAA,EACF;AACF;AAMO,IAAM,kBAAA,GAAN,cAAiC,gBAAA,CAAyB;AAAA,EAC/D,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,OAAe,OAAA,EAAwB;AACzC,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,EAAE,KAAA,EAAM;AAAA,MAChB;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,OAAe,OAAA,EAAwB;AAC7C,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,EAAE,KAAA,EAAM;AAAA,MAChB,OAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,OAAe,OAAA,EAAwB;AACzC,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,EAAE,KAAA,EAAM;AAAA,MAChB;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,OAAe,OAAA,EAAwB;AAC7C,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,EAAE,KAAA,EAAM;AAAA,MAChB,OAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAAwB;AAC9B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,SAAA;AAAA,MACN;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAA,EAAwB;AAC/B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,UAAA;AAAA,MACN;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAA,EAAwB;AAC/B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,UAAA;AAAA,MACN;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAA,EAAuB;AAC1B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,OAAO,EAAE,KAAA,EAAO,OAAO,OAAA,EAAQ;AAAA,OAC3C;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,OAAe,OAAA,EAAwB;AAC/C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,OAAe,OAAA,EAAwB;AAC/C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,OAAO,CAAA;AAAA,EACpC;AACF;AAMO,IAAM,mBAAA,GAAN,cAAkC,gBAAA,CAA0B;AAAA,EACjE,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,SAAS,CAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAA,EAAwB;AAC7B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,CAAC,KAAA,KAAmB,KAAA,KAAU;AAAA,OAC1C;AAAA,MACA,SAAS,OAAA,IAAW;AAAA,KACrB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAAwB;AAC9B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,CAAC,KAAA,KAAmB,KAAA,KAAU;AAAA,OAC1C;AAAA,MACA,SAAS,OAAA,IAAW;AAAA,KACrB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMO,IAAM,gBAAA,GAAN,cAA+B,gBAAA,CAAuB;AAAA,EAC3D,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,MAAqB,OAAA,EAAwB;AACjD,IAAA,MAAM,YAAY,OAAO,IAAA,KAAS,WAAW,IAAI,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC9D,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,CAAC,KAAA,KAAmB;AAC5B,UAAA,IAAI,EAAE,KAAA,YAAiB,IAAA,CAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAClE,UAAA,MAAM,IAAI,KAAA,YAAiB,IAAA,GAAO,KAAA,GAAQ,IAAI,KAAK,KAAK,CAAA;AACxD,UAAA,OAAO,CAAA,GAAI,SAAA;AAAA,QACb;AAAA,OACF;AAAA,MACA,OAAA,EAAS,OAAA,IAAW,CAAA,cAAA,EAAiB,SAAA,CAAU,aAAa,CAAA;AAAA,KAC7D,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,MAAqB,OAAA,EAAwB;AAClD,IAAA,MAAM,YAAY,OAAO,IAAA,KAAS,WAAW,IAAI,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC9D,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,CAAC,KAAA,KAAmB;AAC5B,UAAA,IAAI,EAAE,KAAA,YAAiB,IAAA,CAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAClE,UAAA,MAAM,IAAI,KAAA,YAAiB,IAAA,GAAO,KAAA,GAAQ,IAAI,KAAK,KAAK,CAAA;AACxD,UAAA,OAAO,CAAA,GAAI,SAAA;AAAA,QACb;AAAA,OACF;AAAA,MACA,OAAA,EAAS,OAAA,IAAW,CAAA,eAAA,EAAkB,SAAA,CAAU,aAAa,CAAA;AAAA,KAC9D,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAA,EAAwB;AAC3B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,CAAC,KAAA,KAAmB;AAC5B,UAAA,IAAI,EAAE,KAAA,YAAiB,IAAA,CAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAClE,UAAA,MAAM,IAAI,KAAA,YAAiB,IAAA,GAAO,KAAA,GAAQ,IAAI,KAAK,KAAK,CAAA;AACxD,UAAA,OAAO,CAAA,uBAAQ,IAAA,EAAK;AAAA,QACtB;AAAA,OACF;AAAA,MACA,SAAS,OAAA,IAAW;AAAA,KACrB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAA,EAAwB;AAC7B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,CAAC,KAAA,KAAmB;AAC5B,UAAA,IAAI,EAAE,KAAA,YAAiB,IAAA,CAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAClE,UAAA,MAAM,IAAI,KAAA,YAAiB,IAAA,GAAO,KAAA,GAAQ,IAAI,KAAK,KAAK,CAAA;AACxD,UAAA,OAAO,CAAA,uBAAQ,IAAA,EAAK;AAAA,QACtB;AAAA,OACF;AAAA,MACA,SAAS,OAAA,IAAW;AAAA,KACrB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMO,IAAM,iBAAA,GAAN,cAAmC,gBAAA,CAAsB;AAAA,EAG9D,YAAY,WAAA,EAAmC;AAC7C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAA,CAAK,QAAA,GAAW,YAAY,KAAA,EAAM;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,OAAe,OAAA,EAAwB;AACzC,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA,EAAM;AAAA,MACvB;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,OAAe,OAAA,EAAwB;AACzC,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA,EAAM;AAAA,MACvB;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,OAAe,OAAA,EAAwB;AAC5C,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,CAAC,KAAA,KAAmB;AAC5B,UAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA;AAClC,UAAA,OAAO,MAAM,MAAA,KAAW,KAAA;AAAA,QAC1B;AAAA,OACF;AAAA,MACA,OAAA,EAAS,OAAA,IAAW,CAAA,kBAAA,EAAqB,KAAK,CAAA,MAAA;AAAA,KAC/C,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAA,EAAwB;AAC7B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,CAAC,KAAA,KAAmB;AAC5B,UAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,IAAA;AAClC,UAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAC,CAAA;AACvD,UAAA,OAAO,GAAA,CAAI,SAAS,KAAA,CAAM,MAAA;AAAA,QAC5B;AAAA,OACF;AAAA,MACA,SAAS,OAAA,IAAW;AAAA,KACrB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAA8B;AAC5B,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAAA,MACtB,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,OAAO,IAAA,CAAK,QAAA;AAAA,MACZ,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ;AAAA,KAC1D;AAAA,EACF;AACF;AAMO,IAAM,kBAAA,GAAN,cAAoE,gBAAA,CAAoB;AAAA,EAG7F,YAAY,YAAA,EAAyD;AACnE,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,QAAQ,MAAA,CAAO,WAAA;AAAA,QACb,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,OAAO,MAAM,CAAC,GAAA,EAAK,OAAA,CAAQ,KAAA,EAAO,CAAC;AAAA;AAC7E,KACF;AAAA,EACF;AAAA,EAEA,KAAA,GAA4B;AAC1B,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAAA,MACtB,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ;AAAA,KAC1D;AAAA,EACF;AACF;;;ACjmBO,SAAS,OAEd,MAAA,EAA0C;AAC1C,EAAA,MAAM,UAAA,GAA+B;AAAA,IACnC,QAAQ,MAAA,CAAO,WAAA;AAAA,MACb,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,OAAO,MAAM,CAAC,GAAA,EAAK,OAAA,CAAQ,KAAA,EAAO,CAAC;AAAA;AACvE,GACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,OAAA,EAAS,MAAA;AAAA,IACT,OAAO;AAAC,GACV;AACF;AAKO,SAAS,MAAA,CAId,YACA,gBAAA,EACmC;AACnC,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,GAAG,UAAA,CAAW,OAAA;AAAA,IACd,GAAG;AAAA,GACL;AAEA,EAAA,OAAO,OAAO,SAAS,CAAA;AACzB;AAKO,SAAS,IAAA,CAId,YACA,IAAA,EAC2B;AAC3B,EAAA,MAAM,eAA0D,EAAC;AACjE,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,GAAa,CAAA,EAAG;AACrC,MAAA,YAAA,CAAa,GAAa,CAAA,GAAI,UAAA,CAAW,OAAA,CAAQ,GAAa,CAAA;AAAA,IAChE;AAAA,EACF;AACA,EAAA,OAAO,OAAO,YAAY,CAAA;AAC5B;AAKO,SAAS,IAAA,CAId,YACA,IAAA,EAC2B;AAC3B,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAgB,CAAA;AACxC,EAAA,MAAM,kBAA6D,EAAC;AACpE,EAAA,KAAA,MAAW,CAAC,KAAK,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/D,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,MAAA,eAAA,CAAgB,GAAG,CAAA,GAAI,OAAA;AAAA,IACzB;AAAA,EACF;AACA,EAAA,OAAO,OAAO,eAAe,CAAA;AAC/B;AAKO,SAAS,QACd,UAAA,EAC2B;AAC3B,EAAA,MAAM,gBAA2D,EAAC;AAClE,EAAA,KAAA,MAAW,CAAC,KAAK,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAE/D,IAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAO,CAAC,CAAA;AAClE,IAAA,MAAA,CAAO,MAAA,CAAO,eAAe,OAAO,CAAA;AACpC,IAAA,aAAA,CAAc,SAAA,GAAY,KAAA;AAC1B,IAAA,aAAA,CAAc,GAAG,CAAA,GAAI,aAAA;AAAA,EACvB;AACA,EAAA,OAAO,OAAO,aAAa,CAAA;AAC7B;AAKO,SAAS,KAAA,CAId,SACA,OAAA,EACwB;AACxB,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,GAAG,OAAA,CAAQ,OAAA;AAAA,IACX,GAAG,OAAA,CAAQ;AAAA,GACZ,CAAA;AACH;AAyBA,SAAS,gBACP,KAAA,EAC2B;AAC3B,EAAA,OAAO,YAAA,IAAgB,SAAS,SAAA,IAAa,KAAA;AAC/C;AASO,IAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA,EAInB,MAAA,GAA6B;AAC3B,IAAA,OAAO,IAAI,kBAAA,EAAmB;AAAA,EAChC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAA6B;AAC3B,IAAA,OAAO,IAAI,kBAAA,EAAmB;AAAA,EAChC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAA+B;AAC7B,IAAA,OAAO,IAAI,mBAAA,EAAoB;AAAA,EACjC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAyB;AACvB,IAAA,OAAO,IAAI,gBAAA,EAAiB;AAAA,EAC9B,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAS,WAAA,EAAyD;AAChE,IAAA,OAAO,IAAI,kBAAqB,WAAW,CAAA;AAAA,EAC7C,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OACE,cAAA,EACuB;AACvB,IAAA,IAAI,eAAA,CAAgB,cAAc,CAAA,EAAG;AACnC,MAAA,OAAO,IAAI,kBAAA,CAAsB,cAAA,CAAe,OAAO,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,IAAI,mBAAsB,cAAc,CAAA;AAAA,EACjD,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAuB,MAAA,EAA0C;AAC/D,IAAA,OAAO,IAAI,kBAAA,EAAmB,CAAE,IAAA,CAAK,MAAM,CAAA;AAAA,EAC7C;AACF;;;ACxFO,SAAS,oBAAA,CACd,QACA,IAAA,EAC8B;AAC9B,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA,CAAO,KAAA,GAAQ,SAAA,GAAY,kBAAA;AAAA,IACnC,IAAA,EAAM,MAAA,CAAO,KAAA,GAAQ,IAAA,GAAO,MAAA;AAAA,IAC5B,QAAQ,CAAC,GAAG,OAAO,UAAA,EAAY,GAAG,OAAO,UAAU,CAAA;AAAA,IACnD,GAAA,EAAK,MAAA,CAAO,KAAA,GAAQ,uBAAA,GAA0B,mBAAA;AAAA,IAC9C,UAAA,EAAY;AAAA,MACV,kBAAkB,MAAA,CAAO,UAAA;AAAA,MACzB,kBAAkB,MAAA,CAAO;AAAA;AAC3B,GACF;AACF","file":"index.js","sourcesContent":["/**\r\n * Built-in validators for common validation rules\r\n */\r\n\r\nimport type { ValidatorFn, ValidationError, ValidatorContext } from '../types';\r\n\r\n/**\r\n * Create a validation error\r\n */\r\nfunction createError(\r\n context: ValidatorContext,\r\n code: string,\r\n message: string,\r\n soft: boolean = false\r\n): ValidationError {\r\n return {\r\n field: context.path,\r\n code,\r\n message,\r\n severity: soft ? 'soft' : 'hard',\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Type Validators\r\n// ============================================================================\r\n\r\nexport const typeValidators: Record<string, ValidatorFn> = {\r\n string: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'string') {\r\n return createError(context, 'INVALID_TYPE', `Expected string, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n number: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'number') {\r\n return createError(context, 'INVALID_TYPE', `Expected number, got ${typeof value}`);\r\n }\r\n if (typeof value === 'number' && isNaN(value)) {\r\n return createError(context, 'INVALID_NUMBER', 'Value is not a valid number');\r\n }\r\n return null;\r\n },\r\n\r\n boolean: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'boolean') {\r\n return createError(context, 'INVALID_TYPE', `Expected boolean, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n date: (value, _params, context) => {\r\n if (value === undefined || value === null) return null;\r\n if (value instanceof Date) {\r\n if (isNaN(value.getTime())) {\r\n return createError(context, 'INVALID_DATE', 'Invalid date value');\r\n }\r\n return null;\r\n }\r\n // Try parsing string dates\r\n if (typeof value === 'string') {\r\n const parsed = new Date(value);\r\n if (isNaN(parsed.getTime())) {\r\n return createError(context, 'INVALID_DATE', 'Invalid date format');\r\n }\r\n return null;\r\n }\r\n return createError(context, 'INVALID_TYPE', `Expected date, got ${typeof value}`);\r\n },\r\n\r\n array: (value, _params, context) => {\r\n if (value !== undefined && value !== null && !Array.isArray(value)) {\r\n return createError(context, 'INVALID_TYPE', `Expected array, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n object: (value, _params, context) => {\r\n if (value !== undefined && value !== null) {\r\n if (typeof value !== 'object' || Array.isArray(value)) {\r\n return createError(context, 'INVALID_TYPE', `Expected object, got ${typeof value}`);\r\n }\r\n }\r\n return null;\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Rule Validators\r\n// ============================================================================\r\n\r\nexport const ruleValidators: Record<string, ValidatorFn> = {\r\n required: (value, _params, context) => {\r\n const isEmpty =\r\n value === undefined ||\r\n value === null ||\r\n value === '' ||\r\n (Array.isArray(value) && value.length === 0);\r\n\r\n if (isEmpty) {\r\n return createError(context, 'REQUIRED', 'This field is required');\r\n }\r\n return null;\r\n },\r\n\r\n min: (value, params, context) => {\r\n const min = params?.value as number;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (value === undefined || value === null) return null;\r\n\r\n if (typeof value === 'number') {\r\n if (value < min) {\r\n return createError(\r\n context,\r\n 'MIN_VALUE',\r\n message || `Value must be at least ${min}`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.length < min) {\r\n return createError(\r\n context,\r\n 'MIN_LENGTH',\r\n message || `Must be at least ${min} characters`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length < min) {\r\n return createError(\r\n context,\r\n 'MIN_ITEMS',\r\n message || `Must have at least ${min} items`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n max: (value, params, context) => {\r\n const max = params?.value as number;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (value === undefined || value === null) return null;\r\n\r\n if (typeof value === 'number') {\r\n if (value > max) {\r\n return createError(\r\n context,\r\n 'MAX_VALUE',\r\n message || `Value must be at most ${max}`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.length > max) {\r\n return createError(\r\n context,\r\n 'MAX_LENGTH',\r\n message || `Must be at most ${max} characters`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length > max) {\r\n return createError(\r\n context,\r\n 'MAX_ITEMS',\r\n message || `Must have at most ${max} items`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n email: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') {\r\n return createError(context, 'INVALID_EMAIL', 'Email must be a string', soft);\r\n }\r\n\r\n // RFC 5322 simplified email regex\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!emailRegex.test(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_EMAIL',\r\n message || 'Invalid email address',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n pattern: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const pattern = params?.pattern as string;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') return null;\r\n\r\n const regex = new RegExp(pattern);\r\n if (!regex.test(value)) {\r\n return createError(\r\n context,\r\n 'PATTERN_MISMATCH',\r\n message || `Value does not match required pattern`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n url: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') {\r\n return createError(context, 'INVALID_URL', 'URL must be a string', soft);\r\n }\r\n\r\n try {\r\n new URL(value);\r\n return null;\r\n } catch {\r\n return createError(\r\n context,\r\n 'INVALID_URL',\r\n message || 'Invalid URL format',\r\n soft\r\n );\r\n }\r\n },\r\n\r\n enum: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const values = params?.values as unknown[];\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (!values.includes(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_ENUM',\r\n message || `Value must be one of: ${values.join(', ')}`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n custom: (value, params, context) => {\r\n const validate = params?.validate as (\r\n value: unknown,\r\n context: ValidatorContext\r\n ) => { valid: boolean; message?: string } | boolean;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (!validate) return null;\r\n\r\n const result = validate(value, context);\r\n\r\n if (typeof result === 'boolean') {\r\n if (!result) {\r\n return createError(\r\n context,\r\n 'CUSTOM_VALIDATION',\r\n message || 'Validation failed',\r\n soft\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n if (!result.valid) {\r\n return createError(\r\n context,\r\n 'CUSTOM_VALIDATION',\r\n result.message || message || 'Validation failed',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Enterprise patterns - matches field against another field\r\n matches: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const otherField = params?.field as string;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n const root = context.root as Record<string, unknown>;\r\n\r\n const otherValue = root[otherField];\r\n\r\n if (value !== otherValue) {\r\n return createError(\r\n context,\r\n 'FIELD_MISMATCH',\r\n message || `Must match ${otherField}`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Integer validation\r\n integer: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'number' || !Number.isInteger(value)) {\r\n return createError(\r\n context,\r\n 'NOT_INTEGER',\r\n message || 'Value must be an integer',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Positive number validation\r\n positive: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value === 'number' && value <= 0) {\r\n return createError(\r\n context,\r\n 'NOT_POSITIVE',\r\n message || 'Value must be positive',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Negative number validation\r\n negative: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value === 'number' && value >= 0) {\r\n return createError(\r\n context,\r\n 'NOT_NEGATIVE',\r\n message || 'Value must be negative',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Validator Registry\r\n// ============================================================================\r\n\r\nconst customValidators: Map<string, ValidatorFn> = new Map();\r\n\r\n/**\r\n * Register a custom validator\r\n */\r\nexport function registerValidator(name: string, validator: ValidatorFn): void {\r\n customValidators.set(name, validator);\r\n}\r\n\r\n/**\r\n * Get a validator by name\r\n */\r\nexport function getValidator(name: string): ValidatorFn | undefined {\r\n return ruleValidators[name] ?? customValidators.get(name);\r\n}\r\n\r\n/**\r\n * Get a type validator\r\n */\r\nexport function getTypeValidator(type: string): ValidatorFn | undefined {\r\n return typeValidators[type];\r\n}\r\n","/**\r\n * Core validation engine - runs unchanged in browser and Node.js\r\n */\r\n\r\nimport type {\r\n ValidationResult,\r\n ValidationError,\r\n FieldDefinition,\r\n SchemaDefinition,\r\n ValidatorContext,\r\n} from '../types';\r\n\r\nimport { getValidator, getTypeValidator } from './validators';\r\n\r\n/**\r\n * Validate a single field\r\n */\r\nfunction validateField(\r\n fieldDef: FieldDefinition,\r\n value: unknown,\r\n context: ValidatorContext\r\n): ValidationError[] {\r\n const errors: ValidationError[] = [];\r\n\r\n // Type validation first\r\n const typeValidator = getTypeValidator(fieldDef.type);\r\n if (typeValidator) {\r\n const typeError = typeValidator(value, undefined, context);\r\n if (typeError) {\r\n errors.push(typeError);\r\n // If type is wrong, skip other validations\r\n return errors;\r\n }\r\n }\r\n\r\n // Required validation\r\n if (fieldDef.required) {\r\n const requiredValidator = getValidator('required');\r\n if (requiredValidator) {\r\n const error = requiredValidator(value, undefined, context);\r\n if (error) {\r\n errors.push(error);\r\n // If required and missing, skip other validations\r\n return errors;\r\n }\r\n }\r\n } else if (value === undefined || value === null || value === '') {\r\n // Skip other validations for optional empty fields\r\n return errors;\r\n }\r\n\r\n // Rule validations\r\n for (const rule of fieldDef.rules) {\r\n const validator = getValidator(rule.type);\r\n if (!validator) {\r\n console.warn(`Unknown validator: ${rule.type}`);\r\n continue;\r\n }\r\n\r\n const params = {\r\n ...rule.params,\r\n soft: rule.soft,\r\n message: rule.message,\r\n };\r\n\r\n const error = validator(value, params, context);\r\n if (error) {\r\n errors.push(error);\r\n }\r\n }\r\n\r\n // Nested schema validation (for object fields)\r\n if (fieldDef.type === 'object' && fieldDef.schema && value !== null && value !== undefined) {\r\n const nestedResult = validateSchema(fieldDef.schema, value as Record<string, unknown>, context.path, context.root);\r\n errors.push(...nestedResult.hardErrors, ...nestedResult.softErrors);\r\n }\r\n\r\n // Array item validation\r\n if (fieldDef.type === 'array' && fieldDef.items && Array.isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n const itemContext: ValidatorContext = {\r\n path: `${context.path}[${i}]`,\r\n root: context.root,\r\n parent: value,\r\n };\r\n const itemErrors = validateField(fieldDef.items, value[i], itemContext);\r\n errors.push(...itemErrors);\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Validate data against a schema\r\n */\r\nexport function validateSchema(\r\n schema: SchemaDefinition,\r\n data: Record<string, unknown>,\r\n basePath: string = '',\r\n root?: unknown\r\n): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n const rootData = root ?? data;\r\n\r\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\r\n const value = data[fieldName];\r\n const path = basePath ? `${basePath}.${fieldName}` : fieldName;\r\n\r\n const context: ValidatorContext = {\r\n path,\r\n root: rootData,\r\n parent: data,\r\n };\r\n\r\n const errors = validateField(fieldDef, value, context);\r\n\r\n for (const error of errors) {\r\n if (error.severity === 'soft') {\r\n softErrors.push(error);\r\n } else {\r\n hardErrors.push(error);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Main validation function\r\n */\r\nexport function validate<T extends Record<string, unknown>>(\r\n schema: SchemaDefinition,\r\n data: T\r\n): ValidationResult {\r\n return validateSchema(schema, data);\r\n}\r\n\r\n/**\r\n * Check if data is valid (no hard errors)\r\n */\r\nexport function isValid(schema: SchemaDefinition, data: Record<string, unknown>): boolean {\r\n return validate(schema, data).valid;\r\n}\r\n\r\n/**\r\n * Validate and throw if invalid\r\n */\r\nexport function assertValid<T extends Record<string, unknown>>(\r\n schema: SchemaDefinition,\r\n data: T\r\n): T {\r\n const result = validate(schema, data);\r\n if (!result.valid) {\r\n const error = new Error('Validation failed');\r\n (error as Error & { errors: ValidationError[] }).errors = result.hardErrors;\r\n throw error;\r\n }\r\n return data;\r\n}\r\n\r\n/**\r\n * Merge multiple validation results\r\n */\r\nexport function mergeResults(...results: ValidationResult[]): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n for (const result of results) {\r\n hardErrors.push(...result.hardErrors);\r\n softErrors.push(...result.softErrors);\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Create an empty valid result\r\n */\r\nexport function validResult(): ValidationResult {\r\n return {\r\n valid: true,\r\n hardErrors: [],\r\n softErrors: [],\r\n };\r\n}\r\n\r\n/**\r\n * Create a result with a single error\r\n */\r\nexport function errorResult(\r\n field: string,\r\n code: string,\r\n message: string,\r\n soft: boolean = false\r\n): ValidationResult {\r\n const error: ValidationError = {\r\n field,\r\n code,\r\n message,\r\n severity: soft ? 'soft' : 'hard',\r\n };\r\n\r\n return {\r\n valid: soft,\r\n hardErrors: soft ? [] : [error],\r\n softErrors: soft ? [error] : [],\r\n };\r\n}\r\n","/**\r\n * Fluent field builder for schema definitions\r\n */\r\n\r\nimport type { FieldDefinition, ValidationRule, ValidatorContext } from '../types';\r\n\r\n// ============================================================================\r\n// Base Field Builder\r\n// ============================================================================\r\n\r\nexport class BaseFieldBuilder<T> {\r\n protected _type: FieldDefinition['type'];\r\n protected _rules: ValidationRule[] = [];\r\n protected _required: boolean = false;\r\n protected _defaultValue?: T;\r\n protected _meta: Record<string, unknown> = {};\r\n\r\n constructor(type: FieldDefinition['type']) {\r\n this._type = type;\r\n }\r\n\r\n /**\r\n * Mark field as required\r\n */\r\n required(message?: string): this {\r\n this._required = true;\r\n if (message) {\r\n this._rules.push({ type: 'required', message });\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Mark field as optional (default)\r\n */\r\n optional(): this {\r\n this._required = false;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set default value\r\n */\r\n default(value: T): this {\r\n this._defaultValue = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add custom validation\r\n */\r\n custom(\r\n validate: (value: unknown, context: ValidatorContext) => { valid: boolean; message?: string } | boolean,\r\n message?: string\r\n ): this {\r\n this._rules.push({\r\n type: 'custom',\r\n params: { validate },\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a soft (warning) custom validation\r\n */\r\n softCustom(\r\n validate: (value: unknown, context: ValidatorContext) => { valid: boolean; message?: string } | boolean,\r\n message?: string\r\n ): this {\r\n this._rules.push({\r\n type: 'custom',\r\n params: { validate },\r\n message,\r\n soft: true,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Add field metadata\r\n */\r\n meta(data: Record<string, unknown>): this {\r\n this._meta = { ...this._meta, ...data };\r\n return this;\r\n }\r\n\r\n /**\r\n * Build the field definition\r\n */\r\n build(): FieldDefinition<T> {\r\n return {\r\n type: this._type,\r\n rules: [...this._rules],\r\n required: this._required,\r\n defaultValue: this._defaultValue,\r\n meta: Object.keys(this._meta).length > 0 ? this._meta : undefined,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// String Field Builder\r\n// ============================================================================\r\n\r\nexport class StringFieldBuilder extends BaseFieldBuilder<string> {\r\n constructor() {\r\n super('string');\r\n }\r\n\r\n /**\r\n * Minimum length\r\n */\r\n min(length: number, message?: string): this {\r\n this._rules.push({\r\n type: 'min',\r\n params: { value: length },\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Minimum length (soft validation - warning only)\r\n */\r\n minSoft(length: number, message?: string): this {\r\n this._rules.push({\r\n type: 'min',\r\n params: { value: length },\r\n message,\r\n soft: true,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Maximum length\r\n */\r\n max(length: number, message?: string): this {\r\n this._rules.push({\r\n type: 'max',\r\n params: { value: length },\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Maximum length (soft validation - warning only)\r\n */\r\n maxSoft(length: number, message?: string): this {\r\n this._rules.push({\r\n type: 'max',\r\n params: { value: length },\r\n message,\r\n soft: true,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Validate as email\r\n */\r\n email(message?: string): this {\r\n this._rules.push({\r\n type: 'email',\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Validate as URL\r\n */\r\n url(message?: string): this {\r\n this._rules.push({\r\n type: 'url',\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Match a regex pattern\r\n */\r\n pattern(regex: RegExp | string, message?: string): this {\r\n const pattern = typeof regex === 'string' ? regex : regex.source;\r\n this._rules.push({\r\n type: 'pattern',\r\n params: { pattern },\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Must be one of specified values\r\n */\r\n enum<E extends string>(values: readonly E[], message?: string): EnumFieldBuilder<E> {\r\n const builder = new EnumFieldBuilder<E>(values, this._rules, this._required, this._meta);\r\n builder.addEnumRule(values, message);\r\n return builder;\r\n }\r\n\r\n /**\r\n * Must match another field\r\n */\r\n matches(field: string, message?: string): this {\r\n this._rules.push({\r\n type: 'matches',\r\n params: { field },\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a soft validation (warning only)\r\n */\r\n soft(message: string): this {\r\n // Adds a custom soft validation that always passes but shows a warning\r\n this._rules.push({\r\n type: 'custom',\r\n params: {\r\n validate: () => ({ valid: true }),\r\n },\r\n message,\r\n soft: true,\r\n });\r\n return this;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Enum Field Builder\r\n// ============================================================================\r\n\r\nexport class EnumFieldBuilder<E extends string> extends BaseFieldBuilder<E> {\r\n private _values: readonly E[];\r\n\r\n constructor(\r\n values: readonly E[],\r\n rules: ValidationRule[] = [],\r\n required: boolean = false,\r\n meta: Record<string, unknown> = {}\r\n ) {\r\n super('string');\r\n this._values = values;\r\n this._rules = [...rules];\r\n this._required = required;\r\n this._meta = { ...meta };\r\n }\r\n\r\n /**\r\n * Add enum validation rule (internal use)\r\n */\r\n addEnumRule(values: readonly E[], message?: string): void {\r\n this._rules.push({\r\n type: 'enum',\r\n params: { values },\r\n message,\r\n });\r\n }\r\n\r\n /**\r\n * Get the allowed values\r\n */\r\n get values(): readonly E[] {\r\n return this._values;\r\n }\r\n\r\n build(): FieldDefinition<E> {\r\n return {\r\n type: this._type,\r\n rules: [...this._rules],\r\n required: this._required,\r\n defaultValue: this._defaultValue,\r\n meta: {\r\n ...this._meta,\r\n enumValues: this._values,\r\n },\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Number Field Builder\r\n// ============================================================================\r\n\r\nexport class NumberFieldBuilder extends BaseFieldBuilder<number> {\r\n constructor() {\r\n super('number');\r\n }\r\n\r\n /**\r\n * Minimum value\r\n */\r\n min(value: number, message?: string): this {\r\n this._rules.push({\r\n type: 'min',\r\n params: { value },\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Minimum value (soft validation - warning only)\r\n */\r\n minSoft(value: number, message?: string): this {\r\n this._rules.push({\r\n type: 'min',\r\n params: { value },\r\n message,\r\n soft: true,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Maximum value\r\n */\r\n max(value: number, message?: string): this {\r\n this._rules.push({\r\n type: 'max',\r\n params: { value },\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Maximum value (soft validation - warning only)\r\n */\r\n maxSoft(value: number, message?: string): this {\r\n this._rules.push({\r\n type: 'max',\r\n params: { value },\r\n message,\r\n soft: true,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Must be an integer\r\n */\r\n integer(message?: string): this {\r\n this._rules.push({\r\n type: 'integer',\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Must be positive\r\n */\r\n positive(message?: string): this {\r\n this._rules.push({\r\n type: 'positive',\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Must be negative\r\n */\r\n negative(message?: string): this {\r\n this._rules.push({\r\n type: 'negative',\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a soft validation with message\r\n */\r\n soft(message: string): this {\r\n this._rules.push({\r\n type: 'custom',\r\n params: {\r\n validate: () => ({ valid: false, message }),\r\n },\r\n message,\r\n soft: true,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Soft minimum value (warning only)\r\n */\r\n warnBelow(value: number, message?: string): this {\r\n return this.minSoft(value, message);\r\n }\r\n\r\n /**\r\n * Soft maximum value (warning only)\r\n */\r\n warnAbove(value: number, message?: string): this {\r\n return this.maxSoft(value, message);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Boolean Field Builder\r\n// ============================================================================\r\n\r\nexport class BooleanFieldBuilder extends BaseFieldBuilder<boolean> {\r\n constructor() {\r\n super('boolean');\r\n }\r\n\r\n /**\r\n * Must be true\r\n */\r\n isTrue(message?: string): this {\r\n this._rules.push({\r\n type: 'custom',\r\n params: {\r\n validate: (value: unknown) => value === true,\r\n },\r\n message: message || 'Must be true',\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Must be false\r\n */\r\n isFalse(message?: string): this {\r\n this._rules.push({\r\n type: 'custom',\r\n params: {\r\n validate: (value: unknown) => value === false,\r\n },\r\n message: message || 'Must be false',\r\n });\r\n return this;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Date Field Builder\r\n// ============================================================================\r\n\r\nexport class DateFieldBuilder extends BaseFieldBuilder<Date> {\r\n constructor() {\r\n super('date');\r\n }\r\n\r\n /**\r\n * Must be after a specific date\r\n */\r\n after(date: Date | string, message?: string): this {\r\n const threshold = typeof date === 'string' ? new Date(date) : date;\r\n this._rules.push({\r\n type: 'custom',\r\n params: {\r\n validate: (value: unknown) => {\r\n if (!(value instanceof Date) && typeof value !== 'string') return false;\r\n const d = value instanceof Date ? value : new Date(value);\r\n return d > threshold;\r\n },\r\n },\r\n message: message || `Must be after ${threshold.toISOString()}`,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Must be before a specific date\r\n */\r\n before(date: Date | string, message?: string): this {\r\n const threshold = typeof date === 'string' ? new Date(date) : date;\r\n this._rules.push({\r\n type: 'custom',\r\n params: {\r\n validate: (value: unknown) => {\r\n if (!(value instanceof Date) && typeof value !== 'string') return false;\r\n const d = value instanceof Date ? value : new Date(value);\r\n return d < threshold;\r\n },\r\n },\r\n message: message || `Must be before ${threshold.toISOString()}`,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Must be in the past\r\n */\r\n past(message?: string): this {\r\n this._rules.push({\r\n type: 'custom',\r\n params: {\r\n validate: (value: unknown) => {\r\n if (!(value instanceof Date) && typeof value !== 'string') return false;\r\n const d = value instanceof Date ? value : new Date(value);\r\n return d < new Date();\r\n },\r\n },\r\n message: message || 'Must be a past date',\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Must be in the future\r\n */\r\n future(message?: string): this {\r\n this._rules.push({\r\n type: 'custom',\r\n params: {\r\n validate: (value: unknown) => {\r\n if (!(value instanceof Date) && typeof value !== 'string') return false;\r\n const d = value instanceof Date ? value : new Date(value);\r\n return d > new Date();\r\n },\r\n },\r\n message: message || 'Must be a future date',\r\n });\r\n return this;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Array Field Builder\r\n// ============================================================================\r\n\r\nexport class ArrayFieldBuilder<T> extends BaseFieldBuilder<T[]> {\r\n private _itemDef?: FieldDefinition;\r\n\r\n constructor(itemBuilder?: BaseFieldBuilder<T>) {\r\n super('array');\r\n if (itemBuilder) {\r\n this._itemDef = itemBuilder.build();\r\n }\r\n }\r\n\r\n /**\r\n * Minimum items\r\n */\r\n min(count: number, message?: string): this {\r\n this._rules.push({\r\n type: 'min',\r\n params: { value: count },\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Maximum items\r\n */\r\n max(count: number, message?: string): this {\r\n this._rules.push({\r\n type: 'max',\r\n params: { value: count },\r\n message,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Exactly N items\r\n */\r\n length(count: number, message?: string): this {\r\n this._rules.push({\r\n type: 'custom',\r\n params: {\r\n validate: (value: unknown) => {\r\n if (!Array.isArray(value)) return false;\r\n return value.length === count;\r\n },\r\n },\r\n message: message || `Must have exactly ${count} items`,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * All items must be unique\r\n */\r\n unique(message?: string): this {\r\n this._rules.push({\r\n type: 'custom',\r\n params: {\r\n validate: (value: unknown) => {\r\n if (!Array.isArray(value)) return true;\r\n const set = new Set(value.map((v) => JSON.stringify(v)));\r\n return set.size === value.length;\r\n },\r\n },\r\n message: message || 'All items must be unique',\r\n });\r\n return this;\r\n }\r\n\r\n build(): FieldDefinition<T[]> {\r\n return {\r\n type: this._type,\r\n rules: [...this._rules],\r\n required: this._required,\r\n defaultValue: this._defaultValue,\r\n items: this._itemDef,\r\n meta: Object.keys(this._meta).length > 0 ? this._meta : undefined,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Object Field Builder (for nested schemas)\r\n// ============================================================================\r\n\r\nexport class ObjectFieldBuilder<T extends Record<string, unknown>> extends BaseFieldBuilder<T> {\r\n private _schema: { fields: Record<string, FieldDefinition> };\r\n\r\n constructor(schemaFields: Record<string, BaseFieldBuilder<unknown>>) {\r\n super('object');\r\n this._schema = {\r\n fields: Object.fromEntries(\r\n Object.entries(schemaFields).map(([key, builder]) => [key, builder.build()])\r\n ),\r\n };\r\n }\r\n\r\n build(): FieldDefinition<T> {\r\n return {\r\n type: this._type,\r\n rules: [...this._rules],\r\n required: this._required,\r\n defaultValue: this._defaultValue,\r\n schema: this._schema,\r\n meta: Object.keys(this._meta).length > 0 ? this._meta : undefined,\r\n };\r\n }\r\n}\r\n","/**\r\n * Schema builder and type inference\r\n */\r\n\r\nimport type { SchemaDefinition } from '../types';\r\nimport {\r\n BaseFieldBuilder,\r\n StringFieldBuilder,\r\n NumberFieldBuilder,\r\n BooleanFieldBuilder,\r\n DateFieldBuilder,\r\n ArrayFieldBuilder,\r\n ObjectFieldBuilder,\r\n} from './field';\r\n\r\n// ============================================================================\r\n// Schema Builder\r\n// ============================================================================\r\n\r\nexport interface SchemaBuilder<T extends Record<string, unknown>> {\r\n /** The built schema definition */\r\n definition: SchemaDefinition;\r\n /** Field definitions for type inference */\r\n _fields: Record<string, BaseFieldBuilder<unknown>>;\r\n /** Type marker (not used at runtime) */\r\n _type: T;\r\n}\r\n\r\n/**\r\n * Create a new schema from field definitions\r\n */\r\nexport function schema<\r\n F extends Record<string, BaseFieldBuilder<unknown>>\r\n>(fields: F): SchemaBuilder<InferFields<F>> {\r\n const definition: SchemaDefinition = {\r\n fields: Object.fromEntries(\r\n Object.entries(fields).map(([key, builder]) => [key, builder.build()])\r\n ),\r\n };\r\n\r\n return {\r\n definition,\r\n _fields: fields,\r\n _type: {} as InferFields<F>,\r\n };\r\n}\r\n\r\n/**\r\n * Extend an existing schema with additional fields\r\n */\r\nexport function extend<\r\n T extends Record<string, unknown>,\r\n F extends Record<string, BaseFieldBuilder<unknown>>\r\n>(\r\n baseSchema: SchemaBuilder<T>,\r\n additionalFields: F\r\n): SchemaBuilder<T & InferFields<F>> {\r\n const newFields = {\r\n ...baseSchema._fields,\r\n ...additionalFields,\r\n };\r\n\r\n return schema(newFields) as SchemaBuilder<T & InferFields<F>>;\r\n}\r\n\r\n/**\r\n * Pick specific fields from a schema\r\n */\r\nexport function pick<\r\n T extends Record<string, unknown>,\r\n K extends keyof T\r\n>(\r\n baseSchema: SchemaBuilder<T>,\r\n keys: K[]\r\n): SchemaBuilder<Pick<T, K>> {\r\n const pickedFields: Record<string, BaseFieldBuilder<unknown>> = {};\r\n for (const key of keys) {\r\n if (baseSchema._fields[key as string]) {\r\n pickedFields[key as string] = baseSchema._fields[key as string]!;\r\n }\r\n }\r\n return schema(pickedFields) as SchemaBuilder<Pick<T, K>>;\r\n}\r\n\r\n/**\r\n * Omit specific fields from a schema\r\n */\r\nexport function omit<\r\n T extends Record<string, unknown>,\r\n K extends keyof T\r\n>(\r\n baseSchema: SchemaBuilder<T>,\r\n keys: K[]\r\n): SchemaBuilder<Omit<T, K>> {\r\n const omitSet = new Set(keys as string[]);\r\n const remainingFields: Record<string, BaseFieldBuilder<unknown>> = {};\r\n for (const [key, builder] of Object.entries(baseSchema._fields)) {\r\n if (!omitSet.has(key)) {\r\n remainingFields[key] = builder;\r\n }\r\n }\r\n return schema(remainingFields) as SchemaBuilder<Omit<T, K>>;\r\n}\r\n\r\n/**\r\n * Make all fields optional\r\n */\r\nexport function partial<T extends Record<string, unknown>>(\r\n baseSchema: SchemaBuilder<T>\r\n): SchemaBuilder<Partial<T>> {\r\n const partialFields: Record<string, BaseFieldBuilder<unknown>> = {};\r\n for (const [key, builder] of Object.entries(baseSchema._fields)) {\r\n // Clone the builder and make it optional\r\n const clonedBuilder = Object.create(Object.getPrototypeOf(builder));\r\n Object.assign(clonedBuilder, builder);\r\n clonedBuilder._required = false;\r\n partialFields[key] = clonedBuilder;\r\n }\r\n return schema(partialFields) as SchemaBuilder<Partial<T>>;\r\n}\r\n\r\n/**\r\n * Merge multiple schemas\r\n */\r\nexport function merge<\r\n T1 extends Record<string, unknown>,\r\n T2 extends Record<string, unknown>\r\n>(\r\n schema1: SchemaBuilder<T1>,\r\n schema2: SchemaBuilder<T2>\r\n): SchemaBuilder<T1 & T2> {\r\n return schema({\r\n ...schema1._fields,\r\n ...schema2._fields,\r\n }) as SchemaBuilder<T1 & T2>;\r\n}\r\n\r\n// ============================================================================\r\n// Type Inference Helpers\r\n// ============================================================================\r\n\r\n/** Infer the type from a field builder */\r\ntype InferFieldBuilder<F> =\r\n F extends BaseFieldBuilder<infer T> ? T : never;\r\n\r\n/** Infer the type from a record of field builders */\r\ntype InferFields<F extends Record<string, BaseFieldBuilder<unknown>>> = {\r\n [K in keyof F]: InferFieldBuilder<F[K]>;\r\n};\r\n\r\n/** Infer input type from a schema (what you pass to validate) */\r\nexport type InferInput<S> = S extends SchemaBuilder<infer T> ? T : never;\r\n\r\n/** Infer output type from a schema (validated data) */\r\nexport type InferOutput<S> = S extends SchemaBuilder<infer T> ? T : never;\r\n\r\n// ============================================================================\r\n// Type Guards\r\n// ============================================================================\r\n\r\nfunction isSchemaBuilder<T extends Record<string, unknown>>(\r\n value: SchemaBuilder<T> | Record<string, BaseFieldBuilder<unknown>>\r\n): value is SchemaBuilder<T> {\r\n return 'definition' in value && '_fields' in value;\r\n}\r\n\r\n// ============================================================================\r\n// Field Factory\r\n// ============================================================================\r\n\r\n/**\r\n * Field factory for creating typed field builders\r\n */\r\nexport const field = {\r\n /**\r\n * Create a string field\r\n */\r\n string(): StringFieldBuilder {\r\n return new StringFieldBuilder();\r\n },\r\n\r\n /**\r\n * Create a number field\r\n */\r\n number(): NumberFieldBuilder {\r\n return new NumberFieldBuilder();\r\n },\r\n\r\n /**\r\n * Create a boolean field\r\n */\r\n boolean(): BooleanFieldBuilder {\r\n return new BooleanFieldBuilder();\r\n },\r\n\r\n /**\r\n * Create a date field\r\n */\r\n date(): DateFieldBuilder {\r\n return new DateFieldBuilder();\r\n },\r\n\r\n /**\r\n * Create an array field\r\n */\r\n array<T>(itemBuilder?: BaseFieldBuilder<T>): ArrayFieldBuilder<T> {\r\n return new ArrayFieldBuilder<T>(itemBuilder);\r\n },\r\n\r\n /**\r\n * Create a nested object field from a schema\r\n */\r\n object<T extends Record<string, unknown>>(\r\n schemaOrFields: SchemaBuilder<T> | Record<string, BaseFieldBuilder<unknown>>\r\n ): ObjectFieldBuilder<T> {\r\n if (isSchemaBuilder(schemaOrFields)) {\r\n return new ObjectFieldBuilder<T>(schemaOrFields._fields);\r\n }\r\n return new ObjectFieldBuilder<T>(schemaOrFields);\r\n },\r\n\r\n /**\r\n * Create an enum field (shorthand)\r\n */\r\n enum<E extends string>(values: readonly E[]): StringFieldBuilder {\r\n return new StringFieldBuilder().enum(values) as unknown as StringFieldBuilder;\r\n },\r\n};\r\n","/**\r\n * Core types for the FormSchema validation engine\r\n */\r\n\r\n// ============================================================================\r\n// Validation Result Types\r\n// ============================================================================\r\n\r\nexport type ValidationSeverity = 'hard' | 'soft';\r\n\r\nexport interface ValidationError {\r\n /** Field path (e.g., \"email\" or \"address.city\") */\r\n field: string;\r\n /** Error code for programmatic handling */\r\n code: string;\r\n /** Human-readable error message */\r\n message: string;\r\n /** Severity level - hard errors block submission, soft are warnings */\r\n severity: ValidationSeverity;\r\n}\r\n\r\nexport interface ValidationResult {\r\n /** True if no hard errors exist */\r\n valid: boolean;\r\n /** Errors that block form submission */\r\n hardErrors: ValidationError[];\r\n /** Warnings that don't block submission */\r\n softErrors: ValidationError[];\r\n}\r\n\r\n// ============================================================================\r\n// Field Definition Types\r\n// ============================================================================\r\n\r\nexport type FieldType =\r\n | 'string'\r\n | 'number'\r\n | 'boolean'\r\n | 'date'\r\n | 'array'\r\n | 'object';\r\n\r\nexport interface ValidationRule {\r\n /** Rule type identifier */\r\n type: string;\r\n /** Rule parameters */\r\n params?: Record<string, unknown>;\r\n /** Custom error message */\r\n message?: string;\r\n /** Is this a soft validation (warning only)? */\r\n soft?: boolean;\r\n}\r\n\r\nexport interface FieldDefinition<T = unknown> {\r\n /** The base type of this field */\r\n type: FieldType;\r\n /** Validation rules to apply */\r\n rules: ValidationRule[];\r\n /** Is this field required? */\r\n required: boolean;\r\n /** Default value */\r\n defaultValue?: T;\r\n /** For nested schemas */\r\n schema?: SchemaDefinition;\r\n /** For array items */\r\n items?: FieldDefinition;\r\n /** Field metadata */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Schema Types\r\n// ============================================================================\r\n\r\nexport interface SchemaDefinition {\r\n /** Field definitions keyed by field name */\r\n fields: Record<string, FieldDefinition>;\r\n /** Schema metadata */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Type Inference Utilities\r\n// ============================================================================\r\n\r\n/** Infer TypeScript type from a field definition */\r\nexport type InferFieldType<F extends FieldDefinition> =\r\n F['type'] extends 'string' ? string :\r\n F['type'] extends 'number' ? number :\r\n F['type'] extends 'boolean' ? boolean :\r\n F['type'] extends 'date' ? Date :\r\n F['type'] extends 'array' ?\r\n F['items'] extends FieldDefinition ? InferFieldType<F['items']>[] : unknown[] :\r\n F['type'] extends 'object' ?\r\n F['schema'] extends SchemaDefinition ? InferSchemaType<F['schema']> : Record<string, unknown> :\r\n unknown;\r\n\r\n/** Infer TypeScript type from a schema definition */\r\nexport type InferSchemaType<S extends SchemaDefinition> = {\r\n [K in keyof S['fields']]: InferFieldType<S['fields'][K]>;\r\n};\r\n\r\n// ============================================================================\r\n// Validator Function Types\r\n// ============================================================================\r\n\r\nexport interface ValidatorContext {\r\n /** Current field path */\r\n path: string;\r\n /** Full data object being validated */\r\n root: unknown;\r\n /** Parent object containing this field */\r\n parent?: unknown;\r\n}\r\n\r\nexport type ValidatorFn = (\r\n value: unknown,\r\n params: Record<string, unknown> | undefined,\r\n context: ValidatorContext\r\n) => ValidationError | null;\r\n\r\n// ============================================================================\r\n// Enterprise-Compatible Response Types\r\n// ============================================================================\r\n\r\nexport interface EnterpriseValidationResponse {\r\n status: 'success' | 'validation_error';\r\n data?: unknown;\r\n errors: ValidationError[];\r\n msg: string;\r\n validation: {\r\n hard_validations: ValidationError[];\r\n soft_validations: ValidationError[];\r\n };\r\n}\r\n\r\n/**\r\n * Convert ValidationResult to enterprise-compatible response format\r\n */\r\nexport function toEnterpriseResponse(\r\n result: ValidationResult,\r\n data?: unknown\r\n): EnterpriseValidationResponse {\r\n return {\r\n status: result.valid ? 'success' : 'validation_error',\r\n data: result.valid ? data : undefined,\r\n errors: [...result.hardErrors, ...result.softErrors],\r\n msg: result.valid ? 'Validation successful' : 'Validation failed',\r\n validation: {\r\n hard_validations: result.hardErrors,\r\n soft_validations: result.softErrors,\r\n },\r\n };\r\n}\r\n"]}
|