unischema 1.0.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +780 -228
- 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 -441
- package/dist/adapters/backend/index.mjs +9 -433
- 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 -421
- package/dist/adapters/frontend/index.mjs +8 -419
- package/dist/chunk-5A4ITJVD.mjs +124 -0
- package/dist/chunk-66RFUBVU.js +131 -0
- package/dist/chunk-75YSYC4K.mjs +85 -0
- package/dist/chunk-76BBWQDH.js +90 -0
- package/dist/chunk-7XES4A3M.mjs +237 -0
- package/dist/chunk-BVRXGZLS.js +17 -0
- package/dist/chunk-COMVAVFU.mjs +335 -0
- package/dist/chunk-DT2TQZU7.js +796 -0
- package/dist/chunk-FPCCH55A.js +103 -0
- package/dist/chunk-IUXRLMET.js +206 -0
- package/dist/chunk-JEW6U6CB.js +353 -0
- package/dist/chunk-KZCV5IW4.mjs +97 -0
- package/dist/chunk-KZZ7NVU3.mjs +41 -0
- package/dist/chunk-MFEBMQAU.mjs +779 -0
- package/dist/chunk-OIYG5D2I.js +50 -0
- package/dist/chunk-RW6HDA5H.mjs +194 -0
- package/dist/chunk-TTK77YBI.mjs +15 -0
- package/dist/chunk-TXT36BCE.js +248 -0
- package/dist/index-C17xs-fU.d.mts +140 -0
- package/dist/index-C17xs-fU.d.ts +140 -0
- package/dist/index.d.mts +26 -7
- package/dist/index.d.ts +26 -7
- package/dist/index.js +769 -499
- package/dist/index.mjs +695 -487
- package/dist/{schema-D9DGC9E_.d.ts → schema-DYE8Wz8X.d.mts} +264 -79
- package/dist/{schema-D9DGC9E_.d.mts → schema-Dtp-joeT.d.ts} +264 -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 +82 -5
- 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
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unischema",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "TypeScript-first schema validation library with 53+ validators, async validation, transforms, hard/soft errors. Alternative to Zod, Yup, Joi. Works everywhere (browser, Node.js, serverless).",
|
|
5
5
|
"author": "Gaurav Pasi <gauravpasi9594@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -31,6 +31,41 @@
|
|
|
31
31
|
"types": "./dist/adapters/frontend/index.d.ts",
|
|
32
32
|
"import": "./dist/adapters/frontend/index.mjs",
|
|
33
33
|
"require": "./dist/adapters/frontend/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./validators": {
|
|
36
|
+
"types": "./dist/validators/index.d.ts",
|
|
37
|
+
"import": "./dist/validators/index.mjs",
|
|
38
|
+
"require": "./dist/validators/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./validators/string": {
|
|
41
|
+
"types": "./dist/validators/string.d.ts",
|
|
42
|
+
"import": "./dist/validators/string.mjs",
|
|
43
|
+
"require": "./dist/validators/string.js"
|
|
44
|
+
},
|
|
45
|
+
"./validators/number": {
|
|
46
|
+
"types": "./dist/validators/number.d.ts",
|
|
47
|
+
"import": "./dist/validators/number.mjs",
|
|
48
|
+
"require": "./dist/validators/number.js"
|
|
49
|
+
},
|
|
50
|
+
"./validators/date": {
|
|
51
|
+
"types": "./dist/validators/date.d.ts",
|
|
52
|
+
"import": "./dist/validators/date.mjs",
|
|
53
|
+
"require": "./dist/validators/date.js"
|
|
54
|
+
},
|
|
55
|
+
"./validators/array": {
|
|
56
|
+
"types": "./dist/validators/array.d.ts",
|
|
57
|
+
"import": "./dist/validators/array.mjs",
|
|
58
|
+
"require": "./dist/validators/array.js"
|
|
59
|
+
},
|
|
60
|
+
"./validators/object": {
|
|
61
|
+
"types": "./dist/validators/object.d.ts",
|
|
62
|
+
"import": "./dist/validators/object.mjs",
|
|
63
|
+
"require": "./dist/validators/object.js"
|
|
64
|
+
},
|
|
65
|
+
"./validators/common": {
|
|
66
|
+
"types": "./dist/validators/common.d.ts",
|
|
67
|
+
"import": "./dist/validators/common.mjs",
|
|
68
|
+
"require": "./dist/validators/common.js"
|
|
34
69
|
}
|
|
35
70
|
},
|
|
36
71
|
"scripts": {
|
|
@@ -42,12 +77,54 @@
|
|
|
42
77
|
"prepublishOnly": "npm run build"
|
|
43
78
|
},
|
|
44
79
|
"keywords": [
|
|
45
|
-
"forms",
|
|
46
80
|
"validation",
|
|
81
|
+
"validator",
|
|
47
82
|
"schema",
|
|
48
|
-
"isomorphic",
|
|
49
83
|
"typescript",
|
|
50
|
-
"
|
|
84
|
+
"zod",
|
|
85
|
+
"yup",
|
|
86
|
+
"joi",
|
|
87
|
+
"form-validation",
|
|
88
|
+
"data-validation",
|
|
89
|
+
"async-validation",
|
|
90
|
+
"schema-validation",
|
|
91
|
+
"type-safe",
|
|
92
|
+
"runtime-validation",
|
|
93
|
+
"form",
|
|
94
|
+
"forms",
|
|
95
|
+
"react-form",
|
|
96
|
+
"vue-form",
|
|
97
|
+
"next.js",
|
|
98
|
+
"express",
|
|
99
|
+
"isomorphic",
|
|
100
|
+
"universal",
|
|
101
|
+
"frontend",
|
|
102
|
+
"backend",
|
|
103
|
+
"serverless",
|
|
104
|
+
"api-validation",
|
|
105
|
+
"input-validation",
|
|
106
|
+
"email-validator",
|
|
107
|
+
"url-validator",
|
|
108
|
+
"date-validator",
|
|
109
|
+
"string-validator",
|
|
110
|
+
"number-validator",
|
|
111
|
+
"type-checking",
|
|
112
|
+
"runtime-type-checking",
|
|
113
|
+
"typescript-validation",
|
|
114
|
+
"schema-builder",
|
|
115
|
+
"form-builder",
|
|
116
|
+
"data-schema",
|
|
117
|
+
"json-schema",
|
|
118
|
+
"enterprise",
|
|
119
|
+
"hard-soft-validation",
|
|
120
|
+
"soft-errors",
|
|
121
|
+
"warnings",
|
|
122
|
+
"transform",
|
|
123
|
+
"coerce",
|
|
124
|
+
"sanitize",
|
|
125
|
+
"parse",
|
|
126
|
+
"validate",
|
|
127
|
+
"check"
|
|
51
128
|
],
|
|
52
129
|
"devDependencies": {
|
|
53
130
|
"@types/express": "^5.0.6",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/validators.ts","../../../src/core/engine.ts","../../../src/types/index.ts","../../../src/adapters/backend/express.ts","../../../src/adapters/backend/handler.ts"],"names":["validate","error"],"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 * 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","/**\r\n * Express.js middleware adapter for FormSchema validation\r\n */\r\n\r\nimport type { Request, Response, NextFunction, RequestHandler } from 'express';\r\nimport type { SchemaBuilder, InferInput } from '../../schema';\r\nimport type { ValidationResult, EnterpriseValidationResponse } from '../../types';\r\nimport { validate } from '../../core';\r\nimport { toEnterpriseResponse } from '../../types';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface ValidateRequestOptions {\r\n /** Source of data to validate: body, query, or params */\r\n source?: 'body' | 'query' | 'params';\r\n /** Whether to allow soft errors to pass */\r\n allowSoftErrors?: boolean;\r\n /** Custom error response handler */\r\n onError?: (\r\n result: ValidationResult,\r\n req: Request,\r\n res: Response\r\n ) => void;\r\n /** Transform data before validation */\r\n transform?: (data: unknown) => unknown;\r\n}\r\n\r\nexport interface ValidatedRequest<T> extends Request {\r\n /** Validated and typed data */\r\n validatedData: T;\r\n /** Full validation result */\r\n validationResult: ValidationResult;\r\n}\r\n\r\n// ============================================================================\r\n// Default Error Handler\r\n// ============================================================================\r\n\r\nfunction defaultErrorHandler(\r\n result: ValidationResult,\r\n _req: Request,\r\n res: Response\r\n): void {\r\n const response: EnterpriseValidationResponse = toEnterpriseResponse(result);\r\n res.status(400).json(response);\r\n}\r\n\r\n// ============================================================================\r\n// Middleware Factory\r\n// ============================================================================\r\n\r\n/**\r\n * Create validation middleware for Express\r\n *\r\n * @example\r\n * ```ts\r\n * app.post('/users', validateRequest(UserSchema), (req, res) => {\r\n * const data = req.validatedData; // Typed!\r\n * });\r\n * ```\r\n */\r\nexport function validateRequest<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options: ValidateRequestOptions = {}\r\n): RequestHandler {\r\n const {\r\n source = 'body',\r\n allowSoftErrors = true,\r\n onError = defaultErrorHandler,\r\n transform,\r\n } = options;\r\n\r\n return (req: Request, res: Response, next: NextFunction): void => {\r\n // Get data from the specified source\r\n let data: unknown;\r\n switch (source) {\r\n case 'body':\r\n data = req.body;\r\n break;\r\n case 'query':\r\n data = req.query;\r\n break;\r\n case 'params':\r\n data = req.params;\r\n break;\r\n }\r\n\r\n // Apply transformation if provided\r\n if (transform) {\r\n data = transform(data);\r\n }\r\n\r\n // Validate\r\n const result = validate(schema.definition, data as Record<string, unknown>);\r\n\r\n // Attach validation result to request\r\n (req as ValidatedRequest<InferInput<S>>).validationResult = result;\r\n\r\n // Check for hard errors\r\n if (!result.valid) {\r\n onError(result, req, res);\r\n return;\r\n }\r\n\r\n // Check for soft errors if not allowed\r\n if (!allowSoftErrors && result.softErrors.length > 0) {\r\n onError(result, req, res);\r\n return;\r\n }\r\n\r\n // Attach validated data\r\n (req as ValidatedRequest<InferInput<S>>).validatedData = data as InferInput<S>;\r\n\r\n next();\r\n };\r\n}\r\n\r\n/**\r\n * Create middleware that validates body\r\n */\r\nexport function validateBody<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options?: Omit<ValidateRequestOptions, 'source'>\r\n): RequestHandler {\r\n return validateRequest(schema, { ...options, source: 'body' });\r\n}\r\n\r\n/**\r\n * Create middleware that validates query parameters\r\n */\r\nexport function validateQuery<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options?: Omit<ValidateRequestOptions, 'source'>\r\n): RequestHandler {\r\n return validateRequest(schema, { ...options, source: 'query' });\r\n}\r\n\r\n/**\r\n * Create middleware that validates route parameters\r\n */\r\nexport function validateParams<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options?: Omit<ValidateRequestOptions, 'source'>\r\n): RequestHandler {\r\n return validateRequest(schema, { ...options, source: 'params' });\r\n}\r\n\r\n// ============================================================================\r\n// Handler Wrapper\r\n// ============================================================================\r\n\r\ntype TypedHandler<T> = (\r\n req: ValidatedRequest<T>,\r\n res: Response,\r\n next: NextFunction\r\n) => void | Promise<void>;\r\n\r\n/**\r\n * Wrap a handler with schema validation\r\n *\r\n * @example\r\n * ```ts\r\n * app.post('/users', withValidation(UserSchema, async (req, res) => {\r\n * const { email, name } = req.validatedData; // Typed!\r\n * // ...\r\n * }));\r\n * ```\r\n */\r\nexport function withValidation<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n handler: TypedHandler<InferInput<S>>,\r\n options?: ValidateRequestOptions\r\n): RequestHandler[] {\r\n return [\r\n validateRequest(schema, options),\r\n handler as RequestHandler,\r\n ];\r\n}\r\n\r\n// ============================================================================\r\n// Response Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Send a successful validation response\r\n */\r\nexport function sendValidationSuccess(\r\n res: Response,\r\n data: unknown,\r\n message: string = 'Success'\r\n): void {\r\n res.json({\r\n status: 'success',\r\n data,\r\n errors: [],\r\n msg: message,\r\n validation: {\r\n hard_validations: [],\r\n soft_validations: [],\r\n },\r\n } as EnterpriseValidationResponse);\r\n}\r\n\r\n/**\r\n * Send a validation error response\r\n */\r\nexport function sendValidationError(\r\n res: Response,\r\n result: ValidationResult,\r\n statusCode: number = 400\r\n): void {\r\n res.status(statusCode).json(toEnterpriseResponse(result));\r\n}\r\n","/**\r\n * Generic backend handler wrapper for serverless functions\r\n */\r\n\r\nimport type { SchemaBuilder, InferInput } from '../../schema';\r\nimport type { ValidationResult, EnterpriseValidationResponse } from '../../types';\r\nimport { validate } from '../../core';\r\nimport { toEnterpriseResponse } from '../../types';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface HandlerContext<T> {\r\n /** Validated input data */\r\n data: T;\r\n /** Full validation result (includes soft errors) */\r\n validation: ValidationResult;\r\n}\r\n\r\nexport interface HandlerResult<R> {\r\n /** Response data */\r\n data?: R;\r\n /** HTTP status code */\r\n statusCode: number;\r\n /** Response headers */\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport type ValidatedHandler<T, R> = (\r\n context: HandlerContext<T>\r\n) => Promise<R | HandlerResult<R>>;\r\n\r\nexport interface CreateHandlerOptions {\r\n /** Allow soft errors to pass */\r\n allowSoftErrors?: boolean;\r\n /** Transform input before validation */\r\n transform?: (input: unknown) => unknown;\r\n}\r\n\r\n// ============================================================================\r\n// Handler Factory\r\n// ============================================================================\r\n\r\n/**\r\n * Create a validated handler for serverless functions\r\n *\r\n * @example\r\n * ```ts\r\n * export const handler = createHandler(UserSchema, async ({ data }) => {\r\n * const user = await createUser(data);\r\n * return { user };\r\n * });\r\n *\r\n * // In your serverless function:\r\n * const result = await handler(event.body);\r\n * return {\r\n * statusCode: result.statusCode,\r\n * body: JSON.stringify(result.body),\r\n * };\r\n * ```\r\n */\r\nexport function createHandler<\r\n S extends SchemaBuilder<Record<string, unknown>>,\r\n R\r\n>(\r\n schema: S,\r\n handler: ValidatedHandler<InferInput<S>, R>,\r\n options: CreateHandlerOptions = {}\r\n): (input: unknown) => Promise<{\r\n statusCode: number;\r\n body: R | EnterpriseValidationResponse;\r\n headers?: Record<string, string>;\r\n}> {\r\n const { allowSoftErrors = true, transform } = options;\r\n\r\n return async (input: unknown) => {\r\n // Transform input if needed\r\n let data = transform ? transform(input) : input;\r\n\r\n // Parse JSON string if needed\r\n if (typeof data === 'string') {\r\n try {\r\n data = JSON.parse(data);\r\n } catch {\r\n return {\r\n statusCode: 400,\r\n body: {\r\n status: 'validation_error',\r\n errors: [\r\n {\r\n field: '_root',\r\n code: 'INVALID_JSON',\r\n message: 'Invalid JSON input',\r\n severity: 'hard',\r\n },\r\n ],\r\n msg: 'Invalid JSON input',\r\n validation: {\r\n hard_validations: [\r\n {\r\n field: '_root',\r\n code: 'INVALID_JSON',\r\n message: 'Invalid JSON input',\r\n severity: 'hard',\r\n },\r\n ],\r\n soft_validations: [],\r\n },\r\n } as EnterpriseValidationResponse,\r\n };\r\n }\r\n }\r\n\r\n // Validate\r\n const validation = validate(schema.definition, data as Record<string, unknown>);\r\n\r\n // Check validation result\r\n if (!validation.valid) {\r\n return {\r\n statusCode: 400,\r\n body: toEnterpriseResponse(validation),\r\n };\r\n }\r\n\r\n if (!allowSoftErrors && validation.softErrors.length > 0) {\r\n return {\r\n statusCode: 400,\r\n body: toEnterpriseResponse(validation),\r\n };\r\n }\r\n\r\n // Execute handler\r\n try {\r\n const result = await handler({\r\n data: data as InferInput<S>,\r\n validation,\r\n });\r\n\r\n // Check if result is a HandlerResult\r\n if (\r\n result !== null &&\r\n typeof result === 'object' &&\r\n 'statusCode' in result\r\n ) {\r\n const handlerResult = result as HandlerResult<R>;\r\n return {\r\n statusCode: handlerResult.statusCode,\r\n body: handlerResult.data as R,\r\n headers: handlerResult.headers,\r\n };\r\n }\r\n\r\n // Plain result\r\n return {\r\n statusCode: 200,\r\n body: result as R,\r\n };\r\n } catch (error) {\r\n // Handle errors\r\n const message = error instanceof Error ? error.message : 'Internal server error';\r\n return {\r\n statusCode: 500,\r\n body: {\r\n status: 'validation_error',\r\n errors: [\r\n {\r\n field: '_root',\r\n code: 'INTERNAL_ERROR',\r\n message,\r\n severity: 'hard',\r\n },\r\n ],\r\n msg: message,\r\n validation: {\r\n hard_validations: [],\r\n soft_validations: [],\r\n },\r\n } as EnterpriseValidationResponse,\r\n };\r\n }\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Validate data without a handler (useful for manual validation)\r\n */\r\nexport function validateInput<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n input: unknown\r\n): {\r\n valid: boolean;\r\n data: InferInput<S> | null;\r\n result: ValidationResult;\r\n response: EnterpriseValidationResponse;\r\n} {\r\n const data = typeof input === 'string' ? JSON.parse(input) : input;\r\n const result = validate(schema.definition, data as Record<string, unknown>);\r\n\r\n return {\r\n valid: result.valid,\r\n data: result.valid ? (data as InferInput<S>) : null,\r\n result,\r\n response: toEnterpriseResponse(result, result.valid ? data : undefined),\r\n };\r\n}\r\n\r\n/**\r\n * Create a success response\r\n */\r\nexport function success<T>(data: T, statusCode: number = 200): HandlerResult<T> {\r\n return { data, statusCode };\r\n}\r\n\r\n/**\r\n * Create an error response\r\n */\r\nexport function error<T>(\r\n message: string,\r\n statusCode: number = 400\r\n): HandlerResult<T> {\r\n return {\r\n statusCode,\r\n data: {\r\n status: 'validation_error',\r\n errors: [{ field: '_root', code: 'ERROR', message, severity: 'hard' }],\r\n msg: message,\r\n validation: { hard_validations: [], soft_validations: [] },\r\n } as unknown as T,\r\n };\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/validators.ts","../../../src/core/engine.ts","../../../src/types/index.ts","../../../src/adapters/backend/express.ts","../../../src/adapters/backend/handler.ts"],"names":["validate","error"],"mappings":"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","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 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 * 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","/**\r\n * Express.js middleware adapter for FormSchema validation\r\n */\r\n\r\nimport type { Request, Response, NextFunction, RequestHandler } from 'express';\r\nimport type { SchemaBuilder, InferInput } from '../../schema';\r\nimport type { ValidationResult, EnterpriseValidationResponse } from '../../types';\r\nimport { validate } from '../../core';\r\nimport { toEnterpriseResponse } from '../../types';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface ValidateRequestOptions {\r\n /** Source of data to validate: body, query, or params */\r\n source?: 'body' | 'query' | 'params';\r\n /** Whether to allow soft errors to pass */\r\n allowSoftErrors?: boolean;\r\n /** Custom error response handler */\r\n onError?: (\r\n result: ValidationResult,\r\n req: Request,\r\n res: Response\r\n ) => void;\r\n /** Transform data before validation */\r\n transform?: (data: unknown) => unknown;\r\n}\r\n\r\nexport interface ValidatedRequest<T> extends Request {\r\n /** Validated and typed data */\r\n validatedData: T;\r\n /** Full validation result */\r\n validationResult: ValidationResult;\r\n}\r\n\r\n// ============================================================================\r\n// Default Error Handler\r\n// ============================================================================\r\n\r\nfunction defaultErrorHandler(\r\n result: ValidationResult,\r\n _req: Request,\r\n res: Response\r\n): void {\r\n const response: EnterpriseValidationResponse = toEnterpriseResponse(result);\r\n res.status(400).json(response);\r\n}\r\n\r\n// ============================================================================\r\n// Middleware Factory\r\n// ============================================================================\r\n\r\n/**\r\n * Create validation middleware for Express\r\n *\r\n * @example\r\n * ```ts\r\n * app.post('/users', validateRequest(UserSchema), (req, res) => {\r\n * const data = req.validatedData; // Typed!\r\n * });\r\n * ```\r\n */\r\nexport function validateRequest<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options: ValidateRequestOptions = {}\r\n): RequestHandler {\r\n const {\r\n source = 'body',\r\n allowSoftErrors = true,\r\n onError = defaultErrorHandler,\r\n transform,\r\n } = options;\r\n\r\n return (req: Request, res: Response, next: NextFunction): void => {\r\n // Get data from the specified source\r\n let data: unknown;\r\n switch (source) {\r\n case 'body':\r\n data = req.body;\r\n break;\r\n case 'query':\r\n data = req.query;\r\n break;\r\n case 'params':\r\n data = req.params;\r\n break;\r\n }\r\n\r\n // Apply transformation if provided\r\n if (transform) {\r\n data = transform(data);\r\n }\r\n\r\n // Validate\r\n const result = validate(schema.definition, data as Record<string, unknown>);\r\n\r\n // Attach validation result to request\r\n (req as ValidatedRequest<InferInput<S>>).validationResult = result;\r\n\r\n // Check for hard errors\r\n if (!result.valid) {\r\n onError(result, req, res);\r\n return;\r\n }\r\n\r\n // Check for soft errors if not allowed\r\n if (!allowSoftErrors && result.softErrors.length > 0) {\r\n onError(result, req, res);\r\n return;\r\n }\r\n\r\n // Attach validated data\r\n (req as ValidatedRequest<InferInput<S>>).validatedData = data as InferInput<S>;\r\n\r\n next();\r\n };\r\n}\r\n\r\n/**\r\n * Create middleware that validates body\r\n */\r\nexport function validateBody<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options?: Omit<ValidateRequestOptions, 'source'>\r\n): RequestHandler {\r\n return validateRequest(schema, { ...options, source: 'body' });\r\n}\r\n\r\n/**\r\n * Create middleware that validates query parameters\r\n */\r\nexport function validateQuery<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options?: Omit<ValidateRequestOptions, 'source'>\r\n): RequestHandler {\r\n return validateRequest(schema, { ...options, source: 'query' });\r\n}\r\n\r\n/**\r\n * Create middleware that validates route parameters\r\n */\r\nexport function validateParams<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options?: Omit<ValidateRequestOptions, 'source'>\r\n): RequestHandler {\r\n return validateRequest(schema, { ...options, source: 'params' });\r\n}\r\n\r\n// ============================================================================\r\n// Handler Wrapper\r\n// ============================================================================\r\n\r\ntype TypedHandler<T> = (\r\n req: ValidatedRequest<T>,\r\n res: Response,\r\n next: NextFunction\r\n) => void | Promise<void>;\r\n\r\n/**\r\n * Wrap a handler with schema validation\r\n *\r\n * @example\r\n * ```ts\r\n * app.post('/users', withValidation(UserSchema, async (req, res) => {\r\n * const { email, name } = req.validatedData; // Typed!\r\n * // ...\r\n * }));\r\n * ```\r\n */\r\nexport function withValidation<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n handler: TypedHandler<InferInput<S>>,\r\n options?: ValidateRequestOptions\r\n): RequestHandler[] {\r\n return [\r\n validateRequest(schema, options),\r\n handler as RequestHandler,\r\n ];\r\n}\r\n\r\n// ============================================================================\r\n// Response Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Send a successful validation response\r\n */\r\nexport function sendValidationSuccess(\r\n res: Response,\r\n data: unknown,\r\n message: string = 'Success'\r\n): void {\r\n res.json({\r\n status: 'success',\r\n data,\r\n errors: [],\r\n msg: message,\r\n validation: {\r\n hard_validations: [],\r\n soft_validations: [],\r\n },\r\n } as EnterpriseValidationResponse);\r\n}\r\n\r\n/**\r\n * Send a validation error response\r\n */\r\nexport function sendValidationError(\r\n res: Response,\r\n result: ValidationResult,\r\n statusCode: number = 400\r\n): void {\r\n res.status(statusCode).json(toEnterpriseResponse(result));\r\n}\r\n","/**\r\n * Generic backend handler wrapper for serverless functions\r\n */\r\n\r\nimport type { SchemaBuilder, InferInput } from '../../schema';\r\nimport type { ValidationResult, EnterpriseValidationResponse } from '../../types';\r\nimport { validate } from '../../core';\r\nimport { toEnterpriseResponse } from '../../types';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface HandlerContext<T> {\r\n /** Validated input data */\r\n data: T;\r\n /** Full validation result (includes soft errors) */\r\n validation: ValidationResult;\r\n}\r\n\r\nexport interface HandlerResult<R> {\r\n /** Response data */\r\n data?: R;\r\n /** HTTP status code */\r\n statusCode: number;\r\n /** Response headers */\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport type ValidatedHandler<T, R> = (\r\n context: HandlerContext<T>\r\n) => Promise<R | HandlerResult<R>>;\r\n\r\nexport interface CreateHandlerOptions {\r\n /** Allow soft errors to pass */\r\n allowSoftErrors?: boolean;\r\n /** Transform input before validation */\r\n transform?: (input: unknown) => unknown;\r\n}\r\n\r\n// ============================================================================\r\n// Handler Factory\r\n// ============================================================================\r\n\r\n/**\r\n * Create a validated handler for serverless functions\r\n *\r\n * @example\r\n * ```ts\r\n * export const handler = createHandler(UserSchema, async ({ data }) => {\r\n * const user = await createUser(data);\r\n * return { user };\r\n * });\r\n *\r\n * // In your serverless function:\r\n * const result = await handler(event.body);\r\n * return {\r\n * statusCode: result.statusCode,\r\n * body: JSON.stringify(result.body),\r\n * };\r\n * ```\r\n */\r\nexport function createHandler<\r\n S extends SchemaBuilder<Record<string, unknown>>,\r\n R\r\n>(\r\n schema: S,\r\n handler: ValidatedHandler<InferInput<S>, R>,\r\n options: CreateHandlerOptions = {}\r\n): (input: unknown) => Promise<{\r\n statusCode: number;\r\n body: R | EnterpriseValidationResponse;\r\n headers?: Record<string, string>;\r\n}> {\r\n const { allowSoftErrors = true, transform } = options;\r\n\r\n return async (input: unknown) => {\r\n // Transform input if needed\r\n let data = transform ? transform(input) : input;\r\n\r\n // Parse JSON string if needed\r\n if (typeof data === 'string') {\r\n try {\r\n data = JSON.parse(data);\r\n } catch {\r\n return {\r\n statusCode: 400,\r\n body: {\r\n status: 'validation_error',\r\n errors: [\r\n {\r\n field: '_root',\r\n code: 'INVALID_JSON',\r\n message: 'Invalid JSON input',\r\n severity: 'hard',\r\n },\r\n ],\r\n msg: 'Invalid JSON input',\r\n validation: {\r\n hard_validations: [\r\n {\r\n field: '_root',\r\n code: 'INVALID_JSON',\r\n message: 'Invalid JSON input',\r\n severity: 'hard',\r\n },\r\n ],\r\n soft_validations: [],\r\n },\r\n } as EnterpriseValidationResponse,\r\n };\r\n }\r\n }\r\n\r\n // Validate\r\n const validation = validate(schema.definition, data as Record<string, unknown>);\r\n\r\n // Check validation result\r\n if (!validation.valid) {\r\n return {\r\n statusCode: 400,\r\n body: toEnterpriseResponse(validation),\r\n };\r\n }\r\n\r\n if (!allowSoftErrors && validation.softErrors.length > 0) {\r\n return {\r\n statusCode: 400,\r\n body: toEnterpriseResponse(validation),\r\n };\r\n }\r\n\r\n // Execute handler\r\n try {\r\n const result = await handler({\r\n data: data as InferInput<S>,\r\n validation,\r\n });\r\n\r\n // Check if result is a HandlerResult\r\n if (\r\n result !== null &&\r\n typeof result === 'object' &&\r\n 'statusCode' in result\r\n ) {\r\n const handlerResult = result as HandlerResult<R>;\r\n return {\r\n statusCode: handlerResult.statusCode,\r\n body: handlerResult.data as R,\r\n headers: handlerResult.headers,\r\n };\r\n }\r\n\r\n // Plain result\r\n return {\r\n statusCode: 200,\r\n body: result as R,\r\n };\r\n } catch (error) {\r\n // Handle errors\r\n const message = error instanceof Error ? error.message : 'Internal server error';\r\n return {\r\n statusCode: 500,\r\n body: {\r\n status: 'validation_error',\r\n errors: [\r\n {\r\n field: '_root',\r\n code: 'INTERNAL_ERROR',\r\n message,\r\n severity: 'hard',\r\n },\r\n ],\r\n msg: message,\r\n validation: {\r\n hard_validations: [],\r\n soft_validations: [],\r\n },\r\n } as EnterpriseValidationResponse,\r\n };\r\n }\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Validate data without a handler (useful for manual validation)\r\n */\r\nexport function validateInput<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n input: unknown\r\n): {\r\n valid: boolean;\r\n data: InferInput<S> | null;\r\n result: ValidationResult;\r\n response: EnterpriseValidationResponse;\r\n} {\r\n const data = typeof input === 'string' ? JSON.parse(input) : input;\r\n const result = validate(schema.definition, data as Record<string, unknown>);\r\n\r\n return {\r\n valid: result.valid,\r\n data: result.valid ? (data as InferInput<S>) : null,\r\n result,\r\n response: toEnterpriseResponse(result, result.valid ? data : undefined),\r\n };\r\n}\r\n\r\n/**\r\n * Create a success response\r\n */\r\nexport function success<T>(data: T, statusCode: number = 200): HandlerResult<T> {\r\n return { data, statusCode };\r\n}\r\n\r\n/**\r\n * Create an error response\r\n */\r\nexport function error<T>(\r\n message: string,\r\n statusCode: number = 400\r\n): HandlerResult<T> {\r\n return {\r\n statusCode,\r\n data: {\r\n status: 'validation_error',\r\n errors: [{ field: '_root', code: 'ERROR', message, severity: 'hard' }],\r\n msg: message,\r\n validation: { hard_validations: [], soft_validations: [] },\r\n } as unknown as T,\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":"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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 * 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"]}
|