unischema 1.0.0 → 1.0.1
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 +1 -0
- package/dist/adapters/backend/index.d.mts +1 -1
- package/dist/adapters/backend/index.d.ts +1 -1
- package/dist/adapters/backend/index.js +18 -0
- package/dist/adapters/backend/index.js.map +1 -1
- package/dist/adapters/backend/index.mjs +18 -0
- package/dist/adapters/backend/index.mjs.map +1 -1
- package/dist/adapters/frontend/index.d.mts +1 -1
- package/dist/adapters/frontend/index.d.ts +1 -1
- package/dist/adapters/frontend/index.js +18 -0
- package/dist/adapters/frontend/index.js.map +1 -1
- package/dist/adapters/frontend/index.mjs +18 -0
- package/dist/adapters/frontend/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +28 -0
- package/dist/index.mjs.map +1 -1
- package/dist/{schema-BwQtngae.d.mts → schema-D9DGC9E_.d.mts} +4 -0
- package/dist/{schema-BwQtngae.d.ts → schema-D9DGC9E_.d.ts} +4 -0
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":"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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 * 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"]}
|
|
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":"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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 ipAddress: (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_IP', 'IP address must be a string', soft);\r\n }\r\n\r\n // Validate IPv4 address with proper octet range (0-255)\r\n const ipv4Pattern = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\r\n\r\n if (!ipv4Pattern.test(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_IP',\r\n message || 'Invalid IP address format',\r\n soft\r\n );\r\n }\r\n\r\n return null;\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 * Validate as IP address (IPv4)\r\n */\r\n ipAddress(message?: string): this {\r\n this._rules.push({\r\n type: 'ipAddress',\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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -197,6 +197,24 @@ var ruleValidators = {
|
|
|
197
197
|
);
|
|
198
198
|
}
|
|
199
199
|
},
|
|
200
|
+
ipAddress: (value, params, context) => {
|
|
201
|
+
if (value === void 0 || value === null || value === "") return null;
|
|
202
|
+
const soft = params?.soft;
|
|
203
|
+
const message = params?.message;
|
|
204
|
+
if (typeof value !== "string") {
|
|
205
|
+
return createError(context, "INVALID_IP", "IP address must be a string", soft);
|
|
206
|
+
}
|
|
207
|
+
const ipv4Pattern = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
208
|
+
if (!ipv4Pattern.test(value)) {
|
|
209
|
+
return createError(
|
|
210
|
+
context,
|
|
211
|
+
"INVALID_IP",
|
|
212
|
+
message || "Invalid IP address format",
|
|
213
|
+
soft
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
},
|
|
200
218
|
enum: (value, params, context) => {
|
|
201
219
|
if (value === void 0 || value === null) return null;
|
|
202
220
|
const values = params?.values;
|
|
@@ -591,6 +609,16 @@ var StringFieldBuilder = class extends BaseFieldBuilder {
|
|
|
591
609
|
});
|
|
592
610
|
return this;
|
|
593
611
|
}
|
|
612
|
+
/**
|
|
613
|
+
* Validate as IP address (IPv4)
|
|
614
|
+
*/
|
|
615
|
+
ipAddress(message) {
|
|
616
|
+
this._rules.push({
|
|
617
|
+
type: "ipAddress",
|
|
618
|
+
message
|
|
619
|
+
});
|
|
620
|
+
return this;
|
|
621
|
+
}
|
|
594
622
|
/**
|
|
595
623
|
* Match a regex pattern
|
|
596
624
|
*/
|