unischema 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +634 -231
  2. package/dist/adapters/backend/index.d.mts +2 -1
  3. package/dist/adapters/backend/index.d.ts +2 -1
  4. package/dist/adapters/backend/index.js +17 -441
  5. package/dist/adapters/backend/index.mjs +9 -433
  6. package/dist/adapters/frontend/index.d.mts +2 -1
  7. package/dist/adapters/frontend/index.d.ts +2 -1
  8. package/dist/adapters/frontend/index.js +10 -421
  9. package/dist/adapters/frontend/index.mjs +8 -419
  10. package/dist/chunk-2JYFKT3R.js +103 -0
  11. package/dist/chunk-3FANCMEF.js +206 -0
  12. package/dist/chunk-3TS35CVJ.mjs +478 -0
  13. package/dist/chunk-ASKTY6EG.js +131 -0
  14. package/dist/chunk-BJLVOIAP.js +491 -0
  15. package/dist/chunk-BNIB23NQ.js +90 -0
  16. package/dist/chunk-BVRXGZLS.js +17 -0
  17. package/dist/chunk-CQYXR2LZ.js +353 -0
  18. package/dist/chunk-ELL7U7IC.mjs +237 -0
  19. package/dist/chunk-FKDWSZIV.mjs +39 -0
  20. package/dist/chunk-FRBZHN4K.mjs +335 -0
  21. package/dist/chunk-FZ7K2PC7.js +248 -0
  22. package/dist/chunk-KHHJD6QK.mjs +85 -0
  23. package/dist/chunk-NUW55QTO.js +48 -0
  24. package/dist/chunk-TTK77YBI.mjs +15 -0
  25. package/dist/chunk-VWP24NYS.mjs +194 -0
  26. package/dist/chunk-XC4DKEXP.mjs +97 -0
  27. package/dist/chunk-XGTUU27F.mjs +124 -0
  28. package/dist/index-BQR7OrY7.d.mts +80 -0
  29. package/dist/index-BQR7OrY7.d.ts +80 -0
  30. package/dist/index.d.mts +3 -2
  31. package/dist/index.d.ts +3 -2
  32. package/dist/index.js +527 -494
  33. package/dist/index.mjs +476 -482
  34. package/dist/{schema-D9DGC9E_.d.mts → schema-CpAjXgEF.d.ts} +182 -79
  35. package/dist/{schema-D9DGC9E_.d.ts → schema-DYU1zGVm.d.mts} +182 -79
  36. package/dist/validators/array.d.mts +15 -0
  37. package/dist/validators/array.d.ts +15 -0
  38. package/dist/validators/array.js +31 -0
  39. package/dist/validators/array.mjs +2 -0
  40. package/dist/validators/common.d.mts +13 -0
  41. package/dist/validators/common.d.ts +13 -0
  42. package/dist/validators/common.js +27 -0
  43. package/dist/validators/common.mjs +2 -0
  44. package/dist/validators/date.d.mts +23 -0
  45. package/dist/validators/date.d.ts +23 -0
  46. package/dist/validators/date.js +47 -0
  47. package/dist/validators/date.mjs +2 -0
  48. package/dist/validators/index.d.mts +46 -0
  49. package/dist/validators/index.d.ts +46 -0
  50. package/dist/validators/index.js +256 -0
  51. package/dist/validators/index.mjs +7 -0
  52. package/dist/validators/number.d.mts +25 -0
  53. package/dist/validators/number.d.ts +25 -0
  54. package/dist/validators/number.js +51 -0
  55. package/dist/validators/number.mjs +2 -0
  56. package/dist/validators/object.d.mts +11 -0
  57. package/dist/validators/object.d.ts +11 -0
  58. package/dist/validators/object.js +23 -0
  59. package/dist/validators/object.mjs +2 -0
  60. package/dist/validators/string.d.mts +37 -0
  61. package/dist/validators/string.d.ts +37 -0
  62. package/dist/validators/string.js +75 -0
  63. package/dist/validators/string.mjs +2 -0
  64. package/package.json +36 -1
  65. package/dist/adapters/backend/index.js.map +0 -1
  66. package/dist/adapters/backend/index.mjs.map +0 -1
  67. package/dist/adapters/frontend/index.js.map +0 -1
  68. package/dist/adapters/frontend/index.mjs.map +0 -1
  69. package/dist/index.js.map +0 -1
  70. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,37 @@
1
+ import { c as ValidatorFn } from '../index-BQR7OrY7.mjs';
2
+
3
+ declare const emailValidator: ValidatorFn;
4
+
5
+ declare const urlValidator: ValidatorFn;
6
+
7
+ declare const ipAddressValidator: ValidatorFn;
8
+
9
+ declare const ipv6Validator: ValidatorFn;
10
+
11
+ declare const alphaValidator: ValidatorFn;
12
+
13
+ declare const alphanumericValidator: ValidatorFn;
14
+
15
+ declare const numericValidator: ValidatorFn;
16
+
17
+ declare const lowercaseValidator: ValidatorFn;
18
+
19
+ declare const uppercaseValidator: ValidatorFn;
20
+
21
+ declare const slugValidator: ValidatorFn;
22
+
23
+ declare const hexValidator: ValidatorFn;
24
+
25
+ declare const base64Validator: ValidatorFn;
26
+
27
+ declare const jsonValidator: ValidatorFn;
28
+
29
+ declare const lengthValidator: ValidatorFn;
30
+
31
+ declare const containsValidator: ValidatorFn;
32
+
33
+ declare const startsWithValidator: ValidatorFn;
34
+
35
+ declare const endsWithValidator: ValidatorFn;
36
+
37
+ export { alphaValidator, alphanumericValidator, base64Validator, containsValidator, emailValidator, endsWithValidator, hexValidator, ipAddressValidator, ipv6Validator, jsonValidator, lengthValidator, lowercaseValidator, numericValidator, slugValidator, startsWithValidator, uppercaseValidator, urlValidator };
@@ -0,0 +1,37 @@
1
+ import { c as ValidatorFn } from '../index-BQR7OrY7.js';
2
+
3
+ declare const emailValidator: ValidatorFn;
4
+
5
+ declare const urlValidator: ValidatorFn;
6
+
7
+ declare const ipAddressValidator: ValidatorFn;
8
+
9
+ declare const ipv6Validator: ValidatorFn;
10
+
11
+ declare const alphaValidator: ValidatorFn;
12
+
13
+ declare const alphanumericValidator: ValidatorFn;
14
+
15
+ declare const numericValidator: ValidatorFn;
16
+
17
+ declare const lowercaseValidator: ValidatorFn;
18
+
19
+ declare const uppercaseValidator: ValidatorFn;
20
+
21
+ declare const slugValidator: ValidatorFn;
22
+
23
+ declare const hexValidator: ValidatorFn;
24
+
25
+ declare const base64Validator: ValidatorFn;
26
+
27
+ declare const jsonValidator: ValidatorFn;
28
+
29
+ declare const lengthValidator: ValidatorFn;
30
+
31
+ declare const containsValidator: ValidatorFn;
32
+
33
+ declare const startsWithValidator: ValidatorFn;
34
+
35
+ declare const endsWithValidator: ValidatorFn;
36
+
37
+ export { alphaValidator, alphanumericValidator, base64Validator, containsValidator, emailValidator, endsWithValidator, hexValidator, ipAddressValidator, ipv6Validator, jsonValidator, lengthValidator, lowercaseValidator, numericValidator, slugValidator, startsWithValidator, uppercaseValidator, urlValidator };
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ var chunkCQYXR2LZ_js = require('../chunk-CQYXR2LZ.js');
4
+ require('../chunk-NUW55QTO.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "alphaValidator", {
9
+ enumerable: true,
10
+ get: function () { return chunkCQYXR2LZ_js.alphaValidator; }
11
+ });
12
+ Object.defineProperty(exports, "alphanumericValidator", {
13
+ enumerable: true,
14
+ get: function () { return chunkCQYXR2LZ_js.alphanumericValidator; }
15
+ });
16
+ Object.defineProperty(exports, "base64Validator", {
17
+ enumerable: true,
18
+ get: function () { return chunkCQYXR2LZ_js.base64Validator; }
19
+ });
20
+ Object.defineProperty(exports, "containsValidator", {
21
+ enumerable: true,
22
+ get: function () { return chunkCQYXR2LZ_js.containsValidator; }
23
+ });
24
+ Object.defineProperty(exports, "emailValidator", {
25
+ enumerable: true,
26
+ get: function () { return chunkCQYXR2LZ_js.emailValidator; }
27
+ });
28
+ Object.defineProperty(exports, "endsWithValidator", {
29
+ enumerable: true,
30
+ get: function () { return chunkCQYXR2LZ_js.endsWithValidator; }
31
+ });
32
+ Object.defineProperty(exports, "hexValidator", {
33
+ enumerable: true,
34
+ get: function () { return chunkCQYXR2LZ_js.hexValidator; }
35
+ });
36
+ Object.defineProperty(exports, "ipAddressValidator", {
37
+ enumerable: true,
38
+ get: function () { return chunkCQYXR2LZ_js.ipAddressValidator; }
39
+ });
40
+ Object.defineProperty(exports, "ipv6Validator", {
41
+ enumerable: true,
42
+ get: function () { return chunkCQYXR2LZ_js.ipv6Validator; }
43
+ });
44
+ Object.defineProperty(exports, "jsonValidator", {
45
+ enumerable: true,
46
+ get: function () { return chunkCQYXR2LZ_js.jsonValidator; }
47
+ });
48
+ Object.defineProperty(exports, "lengthValidator", {
49
+ enumerable: true,
50
+ get: function () { return chunkCQYXR2LZ_js.lengthValidator; }
51
+ });
52
+ Object.defineProperty(exports, "lowercaseValidator", {
53
+ enumerable: true,
54
+ get: function () { return chunkCQYXR2LZ_js.lowercaseValidator; }
55
+ });
56
+ Object.defineProperty(exports, "numericValidator", {
57
+ enumerable: true,
58
+ get: function () { return chunkCQYXR2LZ_js.numericValidator; }
59
+ });
60
+ Object.defineProperty(exports, "slugValidator", {
61
+ enumerable: true,
62
+ get: function () { return chunkCQYXR2LZ_js.slugValidator; }
63
+ });
64
+ Object.defineProperty(exports, "startsWithValidator", {
65
+ enumerable: true,
66
+ get: function () { return chunkCQYXR2LZ_js.startsWithValidator; }
67
+ });
68
+ Object.defineProperty(exports, "uppercaseValidator", {
69
+ enumerable: true,
70
+ get: function () { return chunkCQYXR2LZ_js.uppercaseValidator; }
71
+ });
72
+ Object.defineProperty(exports, "urlValidator", {
73
+ enumerable: true,
74
+ get: function () { return chunkCQYXR2LZ_js.urlValidator; }
75
+ });
@@ -0,0 +1,2 @@
1
+ export { alphaValidator, alphanumericValidator, base64Validator, containsValidator, emailValidator, endsWithValidator, hexValidator, ipAddressValidator, ipv6Validator, jsonValidator, lengthValidator, lowercaseValidator, numericValidator, slugValidator, startsWithValidator, uppercaseValidator, urlValidator } from '../chunk-FRBZHN4K.mjs';
2
+ import '../chunk-FKDWSZIV.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unischema",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "Schema-Driven, Isomorphic Form & Validation Engine",
5
5
  "author": "Gaurav Pasi <gauravpasi9594@gmail.com>",
6
6
  "license": "MIT",
@@ -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": {
@@ -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"]}