@oxog/vld 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,7 +5,28 @@ All notable changes to VLD will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [1.1.0] - 2025-01-11
8
+ ## [1.1.1] - 2025-08-18
9
+
10
+ ### Security
11
+ - **CRITICAL**: Fixed prototype pollution vulnerability in VldObject passthrough mode
12
+ - Added protection against `__proto__`, `constructor`, and `prototype` key pollution
13
+ - Comprehensive security test suite added
14
+
15
+ ### Fixed
16
+ - Removed unnecessary escape characters in regex patterns (URL validation)
17
+ - Fixed escape characters in locale files (Afrikaans)
18
+ - Added ESLint configuration for code quality
19
+
20
+ ### Added
21
+ - Security test suite with prototype pollution prevention tests
22
+ - Coverage improvement tests for better code quality
23
+ - ESLint configuration with TypeScript support
24
+
25
+ ### Changed
26
+ - Improved test coverage to 97.1% statements
27
+ - All linting issues resolved
28
+
29
+ ## [1.1.0] - 2025-08-12
9
30
 
10
31
  ### Added
11
32
  - Professional benchmark suite with real-world performance testing
@@ -46,7 +67,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
46
67
  - Schema creation: 8.22x faster
47
68
  - Overall performance: 2.07x faster average
48
69
 
49
- ## [1.0.0] - 2024-12-15
70
+ ## [1.0.0] - 2025-08-11
50
71
 
51
72
  ### Initial Release
52
73
 
@@ -44,7 +44,7 @@ export class VldCoerceString extends VldString {
44
44
  }
45
45
  url(message) {
46
46
  return new VldCoerceString({
47
- checks: [...this.config.checks, (v) => /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$/.test(v)],
47
+ checks: [...this.config.checks, (v) => /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/.test(v)],
48
48
  transforms: this.config.transforms,
49
49
  errorMessage: message || getMessages().stringUrl
50
50
  });
@@ -1 +1 @@
1
- {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/coercion/string.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldString } from '../validators/string';\nimport { ParseResult } from '../validators/base';\nimport { getMessages } from '../locales';\n\n/**\n * String coercion validator that attempts to convert values to strings\n */\nexport class VldCoerceString extends VldString {\n protected constructor(config?: any) {\n super(config);\n }\n \n /**\n * Create a new coerce string validator\n */\n static create(): VldCoerceString {\n return new VldCoerceString();\n }\n \n // Override all chain methods to return VldCoerceString instances\n min(length: number, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length >= length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringMin(length)\n });\n }\n \n max(length: number, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length <= length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringMax(length)\n });\n }\n \n length(length: number, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length === length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringLength(length)\n });\n }\n \n email(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEmail\n });\n }\n \n url(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringUrl\n });\n }\n \n uuid(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringUuid\n });\n }\n \n regex(pattern: RegExp, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => pattern.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringRegex\n });\n }\n \n trim(): VldCoerceString {\n return new VldCoerceString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.trim()],\n errorMessage: this.config.errorMessage\n });\n }\n \n toLowerCase(): VldCoerceString {\n return new VldCoerceString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.toLowerCase()],\n errorMessage: this.config.errorMessage\n });\n }\n \n toUpperCase(): VldCoerceString {\n return new VldCoerceString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.toUpperCase()],\n errorMessage: this.config.errorMessage\n });\n }\n \n startsWith(str: string, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.startsWith(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringStartsWith(str)\n });\n }\n \n endsWith(str: string, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.endsWith(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEndsWith(str)\n });\n }\n \n includes(str: string, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.includes(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIncludes(str)\n });\n }\n \n ip(message?: string): VldCoerceString {\n const ipv4 = /^(?:(?: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]?)$/;\n const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => ipv4.test(v) || ipv6.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIp\n });\n }\n \n ipv4(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^(?:(?: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]?)$/.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIpv4\n });\n }\n \n ipv6(message?: string): VldCoerceString {\n const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => ipv6.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIpv6\n });\n }\n \n nonempty(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length > 0],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEmpty\n });\n }\n \n /**\n * Parse and coerce a value to string\n */\n parse(value: unknown): string {\n // If it's already a string, use parent validation directly\n if (typeof value === 'string') {\n return super.parse(value);\n }\n \n // Handle null and undefined explicitly\n if (value === null || value === undefined) {\n throw new Error(getMessages().coercionFailed('string', value));\n }\n \n // Coerce to string\n const coerced = String(value);\n \n // Use parent validation with coerced value\n return super.parse(coerced);\n }\n \n /**\n * Safely parse and coerce a value to string\n */\n safeParse(value: unknown): ParseResult<string> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}"]}
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/coercion/string.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldString } from '../validators/string';\nimport { ParseResult } from '../validators/base';\nimport { getMessages } from '../locales';\n\n/**\n * String coercion validator that attempts to convert values to strings\n */\nexport class VldCoerceString extends VldString {\n protected constructor(config?: any) {\n super(config);\n }\n \n /**\n * Create a new coerce string validator\n */\n static create(): VldCoerceString {\n return new VldCoerceString();\n }\n \n // Override all chain methods to return VldCoerceString instances\n min(length: number, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length >= length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringMin(length)\n });\n }\n \n max(length: number, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length <= length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringMax(length)\n });\n }\n \n length(length: number, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length === length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringLength(length)\n });\n }\n \n email(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEmail\n });\n }\n \n url(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringUrl\n });\n }\n \n uuid(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringUuid\n });\n }\n \n regex(pattern: RegExp, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => pattern.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringRegex\n });\n }\n \n trim(): VldCoerceString {\n return new VldCoerceString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.trim()],\n errorMessage: this.config.errorMessage\n });\n }\n \n toLowerCase(): VldCoerceString {\n return new VldCoerceString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.toLowerCase()],\n errorMessage: this.config.errorMessage\n });\n }\n \n toUpperCase(): VldCoerceString {\n return new VldCoerceString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.toUpperCase()],\n errorMessage: this.config.errorMessage\n });\n }\n \n startsWith(str: string, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.startsWith(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringStartsWith(str)\n });\n }\n \n endsWith(str: string, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.endsWith(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEndsWith(str)\n });\n }\n \n includes(str: string, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.includes(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIncludes(str)\n });\n }\n \n ip(message?: string): VldCoerceString {\n const ipv4 = /^(?:(?: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]?)$/;\n const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => ipv4.test(v) || ipv6.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIp\n });\n }\n \n ipv4(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^(?:(?: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]?)$/.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIpv4\n });\n }\n \n ipv6(message?: string): VldCoerceString {\n const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => ipv6.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIpv6\n });\n }\n \n nonempty(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length > 0],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEmpty\n });\n }\n \n /**\n * Parse and coerce a value to string\n */\n parse(value: unknown): string {\n // If it's already a string, use parent validation directly\n if (typeof value === 'string') {\n return super.parse(value);\n }\n \n // Handle null and undefined explicitly\n if (value === null || value === undefined) {\n throw new Error(getMessages().coercionFailed('string', value));\n }\n \n // Coerce to string\n const coerced = String(value);\n \n // Use parent validation with coerced value\n return super.parse(coerced);\n }\n \n /**\n * Safely parse and coerce a value to string\n */\n safeParse(value: unknown): ParseResult<string> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}"]}
@@ -19,14 +19,14 @@ export const af = {
19
19
  invalidNumber: 'Ongeldige getal',
20
20
  numberMin: (min) => `Getal moet ten minste ${min} wees`,
21
21
  numberMax: (max) => `Getal mag hoogstens ${max} wees`,
22
- numberInt: 'Getal moet \'n heelgetal wees',
22
+ numberInt: "Getal moet 'n heelgetal wees",
23
23
  numberPositive: 'Getal moet positief wees',
24
24
  numberNegative: 'Getal moet negatief wees',
25
25
  numberNonnegative: 'Getal mag nie negatief wees nie',
26
26
  numberNonpositive: 'Getal mag nie positief wees nie',
27
27
  numberFinite: 'Getal moet eindig wees',
28
- numberSafe: 'Getal moet \'n veilige heelgetal wees',
29
- numberMultipleOf: (value) => `Getal moet \'n veelvoud van ${value} wees`,
28
+ numberSafe: "Getal moet 'n veilige heelgetal wees",
29
+ numberMultipleOf: (value) => `Getal moet 'n veelvoud van ${value} wees`,
30
30
  // Boolean validation messages
31
31
  invalidBoolean: 'Ongeldige boolean waarde',
32
32
  // Date validation messages
@@ -1 +1 @@
1
- {"version":3,"file":"af.js","sourceRoot":"","sources":["../../src/locales/af.ts"],"names":[],"mappings":"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","sourcesContent":["import { LocaleMessages } from './types';\n\nexport const af: LocaleMessages = {\n // String validation messages\n invalidString: 'Ongeldige string',\n stringMin: (min: number) => `String moet ten minste ${min} karakters lank wees`,\n stringMax: (max: number) => `String mag hoogstens ${max} karakters lank wees`,\n stringLength: (length: number) => `String moet presies ${length} karakters lank wees`,\n stringEmail: 'Ongeldige e-pos adres',\n stringUrl: 'Ongeldige URL',\n stringUuid: 'Ongeldige UUID',\n stringRegex: 'Ongeldige formaat',\n stringStartsWith: (prefix: string) => `String moet begin met \"${prefix}\"`,\n stringEndsWith: (suffix: string) => `String moet eindig met \"${suffix}\"`,\n stringIncludes: (substring: string) => `String moet \"${substring}\" bevat`,\n stringIp: 'Ongeldige IP adres',\n stringIpv4: 'Ongeldige IPv4 adres',\n stringIpv6: 'Ongeldige IPv6 adres',\n stringEmpty: 'String mag nie leeg wees nie',\n\n // Number validation messages\n invalidNumber: 'Ongeldige getal',\n numberMin: (min: number) => `Getal moet ten minste ${min} wees`,\n numberMax: (max: number) => `Getal mag hoogstens ${max} wees`,\n numberInt: 'Getal moet \\'n heelgetal wees',\n numberPositive: 'Getal moet positief wees',\n numberNegative: 'Getal moet negatief wees',\n numberNonnegative: 'Getal mag nie negatief wees nie',\n numberNonpositive: 'Getal mag nie positief wees nie',\n numberFinite: 'Getal moet eindig wees',\n numberSafe: 'Getal moet \\'n veilige heelgetal wees',\n numberMultipleOf: (value: number) => `Getal moet \\'n veelvoud van ${value} wees`,\n\n // Boolean validation messages\n invalidBoolean: 'Ongeldige boolean waarde',\n\n // Date validation messages\n invalidDate: 'Ongeldige datum',\n dateMin: (date: Date) => `Datum moet na ${date.toISOString()} wees`,\n dateMax: (date: Date) => `Datum moet voor ${date.toISOString()} wees`,\n\n // Object validation messages\n invalidObject: 'Ongeldige objek',\n unexpectedKeys: (keys: string[]) => `Onverwagte sleutels: ${keys.join(', ')}`,\n\n // Array validation messages\n invalidArray: 'Ongeldige skikking',\n arrayMin: (min: number) => `Skikking moet ten minste ${min} elemente hê`,\n arrayMax: (max: number) => `Skikking mag hoogstens ${max} elemente hê`,\n arrayLength: (length: number) => `Skikking moet presies ${length} elemente hê`,\n arrayEmpty: 'Skikking mag nie leeg wees nie',\n arrayItem: (index: number, error: string) => `Ongeldige element by indeks ${index}: ${error}`,\n\n // Object field validation\n objectField: (field: string, error: string) => `Ongeldige veld \"${field}\": ${error}`,\n\n // Union validation messages\n unionNoMatch: (errors: string[]) => `Geen union lid het gepas nie: ${errors.join(', ')}`,\n\n // Intersection validation messages\n intersectionError: (error: string) => `Intersection validasie het gefaal: ${error}`,\n\n // Literal validation messages\n literalExpected: (expected: string, received: string) => `Verwag ${expected}, ontvang ${received}`,\n\n // Enum validation messages\n enumExpected: (values: any[], received: string) => `Verwag een van [${values.join(', ')}], ontvang ${received}`,\n\n // Special type validation messages\n expectedUndefined: 'Verwag undefined',\n neverType: 'Never tipe kan nie geparseer word nie',\n\n // New advanced type validation messages\n invalidBigint: 'Ongeldige bigint',\n invalidSymbol: 'Ongeldige simbool',\n invalidTuple: 'Ongeldige tupel',\n tupleLength: (expected: number, received: number) => `Tupel moet presies ${expected} elemente hê, ontvang ${received}`,\n invalidRecord: 'Ongeldige rekord',\n invalidSet: 'Ongeldige Set',\n invalidMap: 'Ongeldige Map',\n \n // Transformation and refinement messages\n transformError: (error: string) => `Transformasie het gefaal: ${error}`,\n refinementError: (error: string) => `Verfyning het gefaal: ${error}`,\n customValidationError: (error: string) => `Pasgemaakte validasie het misluk: ${error}`,\n \n // Coercion messages\n coercionFailed: (type: string, value: unknown) => `Kan nie ${JSON.stringify(value)} na ${type} dwing nie`\n};"]}
1
+ {"version":3,"file":"af.js","sourceRoot":"","sources":["../../src/locales/af.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAmB;IAChC,6BAA6B;IAC7B,aAAa,EAAE,kBAAkB;IACjC,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,0BAA0B,GAAG,sBAAsB;IAC/E,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,wBAAwB,GAAG,sBAAsB;IAC7E,YAAY,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,uBAAuB,MAAM,sBAAsB;IACrF,WAAW,EAAE,uBAAuB;IACpC,SAAS,EAAE,eAAe;IAC1B,UAAU,EAAE,gBAAgB;IAC5B,WAAW,EAAE,mBAAmB;IAChC,gBAAgB,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,0BAA0B,MAAM,GAAG;IACzE,cAAc,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,2BAA2B,MAAM,GAAG;IACxE,cAAc,EAAE,CAAC,SAAiB,EAAE,EAAE,CAAC,gBAAgB,SAAS,SAAS;IACzE,QAAQ,EAAE,oBAAoB;IAC9B,UAAU,EAAE,sBAAsB;IAClC,UAAU,EAAE,sBAAsB;IAClC,WAAW,EAAE,8BAA8B;IAE3C,6BAA6B;IAC7B,aAAa,EAAE,iBAAiB;IAChC,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,yBAAyB,GAAG,OAAO;IAC/D,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,uBAAuB,GAAG,OAAO;IAC7D,SAAS,EAAE,8BAA8B;IACzC,cAAc,EAAE,0BAA0B;IAC1C,cAAc,EAAE,0BAA0B;IAC1C,iBAAiB,EAAE,iCAAiC;IACpD,iBAAiB,EAAE,iCAAiC;IACpD,YAAY,EAAE,wBAAwB;IACtC,UAAU,EAAE,sCAAsC;IAClD,gBAAgB,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,8BAA8B,KAAK,OAAO;IAE/E,8BAA8B;IAC9B,cAAc,EAAE,0BAA0B;IAE1C,2BAA2B;IAC3B,WAAW,EAAE,iBAAiB;IAC9B,OAAO,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,OAAO;IACnE,OAAO,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,mBAAmB,IAAI,CAAC,WAAW,EAAE,OAAO;IAErE,6BAA6B;IAC7B,aAAa,EAAE,iBAAiB;IAChC,cAAc,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;IAE7E,4BAA4B;IAC5B,YAAY,EAAE,oBAAoB;IAClC,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,4BAA4B,GAAG,cAAc;IACxE,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,0BAA0B,GAAG,cAAc;IACtE,WAAW,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,yBAAyB,MAAM,cAAc;IAC9E,UAAU,EAAE,gCAAgC;IAC5C,SAAS,EAAE,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE,CAAC,+BAA+B,KAAK,KAAK,KAAK,EAAE;IAE7F,0BAA0B;IAC1B,WAAW,EAAE,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE,CAAC,mBAAmB,KAAK,MAAM,KAAK,EAAE;IAEpF,4BAA4B;IAC5B,YAAY,EAAE,CAAC,MAAgB,EAAE,EAAE,CAAC,iCAAiC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;IAExF,mCAAmC;IACnC,iBAAiB,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,sCAAsC,KAAK,EAAE;IAEnF,8BAA8B;IAC9B,eAAe,EAAE,CAAC,QAAgB,EAAE,QAAgB,EAAE,EAAE,CAAC,UAAU,QAAQ,aAAa,QAAQ,EAAE;IAElG,2BAA2B;IAC3B,YAAY,EAAE,CAAC,MAAa,EAAE,QAAgB,EAAE,EAAE,CAAC,mBAAmB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,QAAQ,EAAE;IAE/G,mCAAmC;IACnC,iBAAiB,EAAE,kBAAkB;IACrC,SAAS,EAAE,uCAAuC;IAElD,wCAAwC;IACxC,aAAa,EAAE,kBAAkB;IACjC,aAAa,EAAE,mBAAmB;IAClC,YAAY,EAAE,iBAAiB;IAC/B,WAAW,EAAE,CAAC,QAAgB,EAAE,QAAgB,EAAE,EAAE,CAAC,sBAAsB,QAAQ,yBAAyB,QAAQ,EAAE;IACtH,aAAa,EAAE,kBAAkB;IACjC,UAAU,EAAE,eAAe;IAC3B,UAAU,EAAE,eAAe;IAE3B,yCAAyC;IACzC,cAAc,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,6BAA6B,KAAK,EAAE;IACvE,eAAe,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,yBAAyB,KAAK,EAAE;IACpE,qBAAqB,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,qCAAqC,KAAK,EAAE;IAEtF,oBAAoB;IACpB,cAAc,EAAE,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,YAAY;CAC1G,CAAC","sourcesContent":["import { LocaleMessages } from './types';\n\nexport const af: LocaleMessages = {\n // String validation messages\n invalidString: 'Ongeldige string',\n stringMin: (min: number) => `String moet ten minste ${min} karakters lank wees`,\n stringMax: (max: number) => `String mag hoogstens ${max} karakters lank wees`,\n stringLength: (length: number) => `String moet presies ${length} karakters lank wees`,\n stringEmail: 'Ongeldige e-pos adres',\n stringUrl: 'Ongeldige URL',\n stringUuid: 'Ongeldige UUID',\n stringRegex: 'Ongeldige formaat',\n stringStartsWith: (prefix: string) => `String moet begin met \"${prefix}\"`,\n stringEndsWith: (suffix: string) => `String moet eindig met \"${suffix}\"`,\n stringIncludes: (substring: string) => `String moet \"${substring}\" bevat`,\n stringIp: 'Ongeldige IP adres',\n stringIpv4: 'Ongeldige IPv4 adres',\n stringIpv6: 'Ongeldige IPv6 adres',\n stringEmpty: 'String mag nie leeg wees nie',\n\n // Number validation messages\n invalidNumber: 'Ongeldige getal',\n numberMin: (min: number) => `Getal moet ten minste ${min} wees`,\n numberMax: (max: number) => `Getal mag hoogstens ${max} wees`,\n numberInt: \"Getal moet 'n heelgetal wees\",\n numberPositive: 'Getal moet positief wees',\n numberNegative: 'Getal moet negatief wees',\n numberNonnegative: 'Getal mag nie negatief wees nie',\n numberNonpositive: 'Getal mag nie positief wees nie',\n numberFinite: 'Getal moet eindig wees',\n numberSafe: \"Getal moet 'n veilige heelgetal wees\",\n numberMultipleOf: (value: number) => `Getal moet 'n veelvoud van ${value} wees`,\n\n // Boolean validation messages\n invalidBoolean: 'Ongeldige boolean waarde',\n\n // Date validation messages\n invalidDate: 'Ongeldige datum',\n dateMin: (date: Date) => `Datum moet na ${date.toISOString()} wees`,\n dateMax: (date: Date) => `Datum moet voor ${date.toISOString()} wees`,\n\n // Object validation messages\n invalidObject: 'Ongeldige objek',\n unexpectedKeys: (keys: string[]) => `Onverwagte sleutels: ${keys.join(', ')}`,\n\n // Array validation messages\n invalidArray: 'Ongeldige skikking',\n arrayMin: (min: number) => `Skikking moet ten minste ${min} elemente hê`,\n arrayMax: (max: number) => `Skikking mag hoogstens ${max} elemente hê`,\n arrayLength: (length: number) => `Skikking moet presies ${length} elemente hê`,\n arrayEmpty: 'Skikking mag nie leeg wees nie',\n arrayItem: (index: number, error: string) => `Ongeldige element by indeks ${index}: ${error}`,\n\n // Object field validation\n objectField: (field: string, error: string) => `Ongeldige veld \"${field}\": ${error}`,\n\n // Union validation messages\n unionNoMatch: (errors: string[]) => `Geen union lid het gepas nie: ${errors.join(', ')}`,\n\n // Intersection validation messages\n intersectionError: (error: string) => `Intersection validasie het gefaal: ${error}`,\n\n // Literal validation messages\n literalExpected: (expected: string, received: string) => `Verwag ${expected}, ontvang ${received}`,\n\n // Enum validation messages\n enumExpected: (values: any[], received: string) => `Verwag een van [${values.join(', ')}], ontvang ${received}`,\n\n // Special type validation messages\n expectedUndefined: 'Verwag undefined',\n neverType: 'Never tipe kan nie geparseer word nie',\n\n // New advanced type validation messages\n invalidBigint: 'Ongeldige bigint',\n invalidSymbol: 'Ongeldige simbool',\n invalidTuple: 'Ongeldige tupel',\n tupleLength: (expected: number, received: number) => `Tupel moet presies ${expected} elemente hê, ontvang ${received}`,\n invalidRecord: 'Ongeldige rekord',\n invalidSet: 'Ongeldige Set',\n invalidMap: 'Ongeldige Map',\n \n // Transformation and refinement messages\n transformError: (error: string) => `Transformasie het gefaal: ${error}`,\n refinementError: (error: string) => `Verfyning het gefaal: ${error}`,\n customValidationError: (error: string) => `Pasgemaakte validasie het misluk: ${error}`,\n \n // Coercion messages\n coercionFailed: (type: string, value: unknown) => `Kan nie ${JSON.stringify(value)} na ${type} dwing nie`\n};"]}
@@ -1 +1 @@
1
- {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAe,MAAM,QAAQ,CAAC;AAa3D;;;GAGG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAE3C;;OAEG;IACH,OAAO;IAQP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzC,KAAK,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GAChD,SAAS,CAAC,CAAC,CAAC;IAIf;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC;IAkFxB;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;IA+DzC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAStC;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC;IAQ3B;;OAEG;IACH,OAAO,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;IAW/C;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,GAAG,CAAC;IAgB7B;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAa5D;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAc5D;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,SAAS,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GACpD,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAClB,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,QAAQ,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;CAgBlD"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAe,MAAM,QAAQ,CAAC;AAa3D;;;GAGG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAE3C;;OAEG;IACH,OAAO;IAQP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzC,KAAK,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GAChD,SAAS,CAAC,CAAC,CAAC;IAIf;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC;IAoFxB;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;IAiEzC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAStC;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC;IAQ3B;;OAEG;IACH,OAAO,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;IAW/C;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,GAAG,CAAC;IAgB7B;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAa5D;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAc5D;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,SAAS,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GACpD,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAClB,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,QAAQ,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;CAgBlD"}
@@ -89,12 +89,14 @@ export class VldObject extends VldBase {
89
89
  throw new Error(getMessages().unexpectedKeys(extraKeys));
90
90
  }
91
91
  }
92
- // Handle passthrough mode - optimized
92
+ // Handle passthrough mode - optimized with prototype pollution protection
93
93
  if (this.config.passthrough) {
94
+ const DANGEROUS_KEYS = ['__proto__', 'constructor', 'prototype'];
94
95
  const objKeys = Object.keys(obj);
95
96
  for (let i = 0; i < objKeys.length; i++) {
96
97
  const key = objKeys[i];
97
- if (!this.shapeKeysSet.has(key)) {
98
+ // Skip dangerous keys to prevent prototype pollution
99
+ if (!this.shapeKeysSet.has(key) && !DANGEROUS_KEYS.includes(key)) {
98
100
  result[key] = obj[key];
99
101
  }
100
102
  }
@@ -147,12 +149,14 @@ export class VldObject extends VldBase {
147
149
  };
148
150
  }
149
151
  }
150
- // Handle passthrough mode
152
+ // Handle passthrough mode with prototype pollution protection
151
153
  if (this.config.passthrough) {
154
+ const DANGEROUS_KEYS = ['__proto__', 'constructor', 'prototype'];
152
155
  const objKeys = Object.keys(obj);
153
156
  for (let i = 0; i < objKeys.length; i++) {
154
157
  const key = objKeys[i];
155
- if (!this.shapeKeysSet.has(key)) {
158
+ // Skip dangerous keys to prevent prototype pollution
159
+ if (!this.shapeKeysSet.has(key) && !DANGEROUS_KEYS.includes(key)) {
156
160
  result[key] = obj[key];
157
161
  }
158
162
  }
@@ -1 +1 @@
1
- {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult, VldOptional } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Configuration for object validator\n */\ninterface ObjectValidatorConfig<T extends Record<string, any>> {\n readonly shape: { readonly [K in keyof T]: VldBase<unknown, T[K]> };\n readonly strict?: boolean;\n readonly passthrough?: boolean;\n readonly errorMessage?: string;\n}\n\n/**\n * Optimized immutable object validator with chainable methods\n * Features pre-computed keys and Set-based lookups for better performance\n */\nexport class VldObject<T extends Record<string, any>> extends VldBase<unknown, T> {\n private readonly config: ObjectValidatorConfig<T>;\n private readonly shapeKeys: string[];\n private readonly shapeKeysSet: Set<string>;\n \n /**\n * Private constructor to enforce immutability\n */\n private constructor(config: ObjectValidatorConfig<T>) {\n super();\n this.config = config;\n // Pre-compute shape keys for faster access\n this.shapeKeys = Object.keys(config.shape);\n this.shapeKeysSet = new Set(this.shapeKeys);\n }\n \n /**\n * Create a new object validator\n */\n static create<T extends Record<string, any>>(\n shape: { [K in keyof T]: VldBase<unknown, T[K]> }\n ): VldObject<T> {\n return new VldObject({ shape });\n }\n \n /**\n * Parse and validate an object value\n * Ultra-optimized with inline type checks and minimal overhead\n */\n parse(value: unknown): T {\n // Fast type check\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidObject);\n }\n \n const obj = value as Record<string, unknown>;\n const result: any = {};\n \n // Ultra-optimized field validation with inline fast paths\n for (let i = 0; i < this.shapeKeys.length; i++) {\n const key = this.shapeKeys[i];\n const validator = this.config.shape[key];\n const fieldValue = obj[key];\n \n // Inline fast-path validation for common types\n const validatorType = validator.constructor.name;\n \n if (validatorType === 'VldString') {\n // For string with validations, use safeParse to handle email, regex etc.\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n } else if (validatorType === 'VldNumber') {\n if (typeof fieldValue !== 'number' || isNaN(fieldValue)) {\n throw new Error(getMessages().objectField(key, getMessages().invalidNumber));\n }\n result[key] = fieldValue;\n } else if (validatorType === 'VldBoolean') {\n if (typeof fieldValue !== 'boolean') {\n throw new Error(getMessages().objectField(key, getMessages().invalidBoolean));\n }\n result[key] = fieldValue;\n } else if (validatorType === 'VldDate') {\n // Use the actual validator for Date parsing (handles string conversion)\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n } else {\n // Fallback to safeParse for complex validators\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n }\n }\n \n // Handle strict mode - optimized with Set\n if (this.config.strict) {\n const objKeys = Object.keys(obj);\n const extraKeys: string[] = [];\n \n for (let i = 0; i < objKeys.length; i++) {\n if (!this.shapeKeysSet.has(objKeys[i])) {\n extraKeys.push(objKeys[i]);\n }\n }\n \n if (extraKeys.length > 0) {\n throw new Error(getMessages().unexpectedKeys(extraKeys));\n }\n }\n \n // Handle passthrough mode - optimized\n if (this.config.passthrough) {\n const objKeys = Object.keys(obj);\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n if (!this.shapeKeysSet.has(key)) {\n result[key] = obj[key];\n }\n }\n }\n \n return result as T;\n }\n \n /**\n * Safely parse and validate an object value\n * Optimized version using pre-computed keys\n */\n safeParse(value: unknown): ParseResult<T> {\n // Fast type check\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return {\n success: false,\n error: new Error(this.config.errorMessage || getMessages().invalidObject)\n };\n }\n \n const obj = value as Record<string, unknown>;\n const result: any = {};\n \n // Validate all fields\n for (let i = 0; i < this.shapeKeys.length; i++) {\n const key = this.shapeKeys[i];\n const validator = this.config.shape[key];\n const fieldValue = obj[key];\n \n const parseResult = validator.safeParse(fieldValue);\n \n if (parseResult.success) {\n result[key] = parseResult.data;\n } else {\n return {\n success: false,\n error: new Error(getMessages().objectField(key, parseResult.error.message))\n };\n }\n }\n \n // Handle strict mode\n if (this.config.strict) {\n const objKeys = Object.keys(obj);\n const extraKeys: string[] = [];\n \n for (let i = 0; i < objKeys.length; i++) {\n if (!this.shapeKeysSet.has(objKeys[i])) {\n extraKeys.push(objKeys[i]);\n }\n }\n \n if (extraKeys.length > 0) {\n return {\n success: false,\n error: new Error(getMessages().unexpectedKeys(extraKeys))\n };\n }\n }\n \n // Handle passthrough mode\n if (this.config.passthrough) {\n const objKeys = Object.keys(obj);\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n if (!this.shapeKeysSet.has(key)) {\n result[key] = obj[key];\n }\n }\n }\n \n return { success: true, data: result as T };\n }\n \n /**\n * Create a new validator in strict mode (no extra keys allowed)\n */\n strict(message?: string): VldObject<T> {\n return new VldObject({\n ...this.config,\n strict: true,\n passthrough: false,\n errorMessage: message\n });\n }\n \n /**\n * Create a new validator in passthrough mode (extra keys are preserved)\n */\n passthrough(): VldObject<T> {\n return new VldObject({\n ...this.config,\n strict: false,\n passthrough: true\n });\n }\n \n /**\n * Create a new validator with all fields optional\n */\n partial(): VldObject<{ [K in keyof T]?: T[K] }> {\n const partialShape: any = {};\n for (const key in this.config.shape) {\n partialShape[key] = new VldOptional(this.config.shape[key]);\n }\n return new VldObject({ \n ...this.config, \n shape: partialShape \n }) as any;\n }\n \n /**\n * Create a new validator with deep partial (nested objects also partial)\n */\n deepPartial(): VldObject<any> {\n const deepPartialShape: any = {};\n for (const key in this.config.shape) {\n const validator = this.config.shape[key];\n if (validator instanceof VldObject) {\n deepPartialShape[key] = new VldOptional(validator.deepPartial());\n } else {\n deepPartialShape[key] = new VldOptional(validator);\n }\n }\n return new VldObject({ \n ...this.config, \n shape: deepPartialShape \n });\n }\n \n /**\n * Create a new validator with only specified keys\n */\n pick<K extends keyof T>(...keys: K[]): VldObject<Pick<T, K>> {\n const pickedShape: any = {};\n for (const key of keys) {\n if (key in this.config.shape) {\n pickedShape[key] = this.config.shape[key];\n }\n }\n return new VldObject({ \n ...this.config, \n shape: pickedShape \n });\n }\n \n /**\n * Create a new validator without specified keys\n */\n omit<K extends keyof T>(...keys: K[]): VldObject<Omit<T, K>> {\n const omittedShape: any = {};\n const keysToOmit = new Set(keys);\n for (const key in this.config.shape) {\n if (!keysToOmit.has(key as any)) {\n omittedShape[key] = this.config.shape[key];\n }\n }\n return new VldObject({ \n ...this.config, \n shape: omittedShape \n });\n }\n \n /**\n * Create a new validator with additional fields\n */\n extend<U extends Record<string, any>>(\n extension: { [K in keyof U]: VldBase<unknown, U[K]> }\n ): VldObject<T & U> {\n return new VldObject({\n ...this.config,\n shape: { ...this.config.shape, ...extension } as any\n });\n }\n \n /**\n * Create a new validator by merging with another object validator\n */\n merge<U extends Record<string, any>>(\n other: VldObject<U>\n ): VldObject<T & U> {\n return new VldObject({\n ...this.config,\n shape: { ...this.config.shape, ...other.config.shape } as any\n });\n }\n \n /**\n * Create a new validator with all fields required (removes optional)\n */\n required(): VldObject<{ [K in keyof T]-?: T[K] }> {\n const requiredShape: any = {};\n for (const key in this.config.shape) {\n const validator = this.config.shape[key];\n // If it's optional, unwrap it\n if (validator instanceof VldOptional) {\n requiredShape[key] = (validator as any).baseValidator;\n } else {\n requiredShape[key] = validator;\n }\n }\n return new VldObject({ \n ...this.config, \n shape: requiredShape \n }) as any;\n }\n}"]}
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult, VldOptional } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Configuration for object validator\n */\ninterface ObjectValidatorConfig<T extends Record<string, any>> {\n readonly shape: { readonly [K in keyof T]: VldBase<unknown, T[K]> };\n readonly strict?: boolean;\n readonly passthrough?: boolean;\n readonly errorMessage?: string;\n}\n\n/**\n * Optimized immutable object validator with chainable methods\n * Features pre-computed keys and Set-based lookups for better performance\n */\nexport class VldObject<T extends Record<string, any>> extends VldBase<unknown, T> {\n private readonly config: ObjectValidatorConfig<T>;\n private readonly shapeKeys: string[];\n private readonly shapeKeysSet: Set<string>;\n \n /**\n * Private constructor to enforce immutability\n */\n private constructor(config: ObjectValidatorConfig<T>) {\n super();\n this.config = config;\n // Pre-compute shape keys for faster access\n this.shapeKeys = Object.keys(config.shape);\n this.shapeKeysSet = new Set(this.shapeKeys);\n }\n \n /**\n * Create a new object validator\n */\n static create<T extends Record<string, any>>(\n shape: { [K in keyof T]: VldBase<unknown, T[K]> }\n ): VldObject<T> {\n return new VldObject({ shape });\n }\n \n /**\n * Parse and validate an object value\n * Ultra-optimized with inline type checks and minimal overhead\n */\n parse(value: unknown): T {\n // Fast type check\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidObject);\n }\n \n const obj = value as Record<string, unknown>;\n const result: any = {};\n \n // Ultra-optimized field validation with inline fast paths\n for (let i = 0; i < this.shapeKeys.length; i++) {\n const key = this.shapeKeys[i];\n const validator = this.config.shape[key];\n const fieldValue = obj[key];\n \n // Inline fast-path validation for common types\n const validatorType = validator.constructor.name;\n \n if (validatorType === 'VldString') {\n // For string with validations, use safeParse to handle email, regex etc.\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n } else if (validatorType === 'VldNumber') {\n if (typeof fieldValue !== 'number' || isNaN(fieldValue)) {\n throw new Error(getMessages().objectField(key, getMessages().invalidNumber));\n }\n result[key] = fieldValue;\n } else if (validatorType === 'VldBoolean') {\n if (typeof fieldValue !== 'boolean') {\n throw new Error(getMessages().objectField(key, getMessages().invalidBoolean));\n }\n result[key] = fieldValue;\n } else if (validatorType === 'VldDate') {\n // Use the actual validator for Date parsing (handles string conversion)\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n } else {\n // Fallback to safeParse for complex validators\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n }\n }\n \n // Handle strict mode - optimized with Set\n if (this.config.strict) {\n const objKeys = Object.keys(obj);\n const extraKeys: string[] = [];\n \n for (let i = 0; i < objKeys.length; i++) {\n if (!this.shapeKeysSet.has(objKeys[i])) {\n extraKeys.push(objKeys[i]);\n }\n }\n \n if (extraKeys.length > 0) {\n throw new Error(getMessages().unexpectedKeys(extraKeys));\n }\n }\n \n // Handle passthrough mode - optimized with prototype pollution protection\n if (this.config.passthrough) {\n const DANGEROUS_KEYS = ['__proto__', 'constructor', 'prototype'];\n const objKeys = Object.keys(obj);\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n // Skip dangerous keys to prevent prototype pollution\n if (!this.shapeKeysSet.has(key) && !DANGEROUS_KEYS.includes(key)) {\n result[key] = obj[key];\n }\n }\n }\n \n return result as T;\n }\n \n /**\n * Safely parse and validate an object value\n * Optimized version using pre-computed keys\n */\n safeParse(value: unknown): ParseResult<T> {\n // Fast type check\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return {\n success: false,\n error: new Error(this.config.errorMessage || getMessages().invalidObject)\n };\n }\n \n const obj = value as Record<string, unknown>;\n const result: any = {};\n \n // Validate all fields\n for (let i = 0; i < this.shapeKeys.length; i++) {\n const key = this.shapeKeys[i];\n const validator = this.config.shape[key];\n const fieldValue = obj[key];\n \n const parseResult = validator.safeParse(fieldValue);\n \n if (parseResult.success) {\n result[key] = parseResult.data;\n } else {\n return {\n success: false,\n error: new Error(getMessages().objectField(key, parseResult.error.message))\n };\n }\n }\n \n // Handle strict mode\n if (this.config.strict) {\n const objKeys = Object.keys(obj);\n const extraKeys: string[] = [];\n \n for (let i = 0; i < objKeys.length; i++) {\n if (!this.shapeKeysSet.has(objKeys[i])) {\n extraKeys.push(objKeys[i]);\n }\n }\n \n if (extraKeys.length > 0) {\n return {\n success: false,\n error: new Error(getMessages().unexpectedKeys(extraKeys))\n };\n }\n }\n \n // Handle passthrough mode with prototype pollution protection\n if (this.config.passthrough) {\n const DANGEROUS_KEYS = ['__proto__', 'constructor', 'prototype'];\n const objKeys = Object.keys(obj);\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n // Skip dangerous keys to prevent prototype pollution\n if (!this.shapeKeysSet.has(key) && !DANGEROUS_KEYS.includes(key)) {\n result[key] = obj[key];\n }\n }\n }\n \n return { success: true, data: result as T };\n }\n \n /**\n * Create a new validator in strict mode (no extra keys allowed)\n */\n strict(message?: string): VldObject<T> {\n return new VldObject({\n ...this.config,\n strict: true,\n passthrough: false,\n errorMessage: message\n });\n }\n \n /**\n * Create a new validator in passthrough mode (extra keys are preserved)\n */\n passthrough(): VldObject<T> {\n return new VldObject({\n ...this.config,\n strict: false,\n passthrough: true\n });\n }\n \n /**\n * Create a new validator with all fields optional\n */\n partial(): VldObject<{ [K in keyof T]?: T[K] }> {\n const partialShape: any = {};\n for (const key in this.config.shape) {\n partialShape[key] = new VldOptional(this.config.shape[key]);\n }\n return new VldObject({ \n ...this.config, \n shape: partialShape \n }) as any;\n }\n \n /**\n * Create a new validator with deep partial (nested objects also partial)\n */\n deepPartial(): VldObject<any> {\n const deepPartialShape: any = {};\n for (const key in this.config.shape) {\n const validator = this.config.shape[key];\n if (validator instanceof VldObject) {\n deepPartialShape[key] = new VldOptional(validator.deepPartial());\n } else {\n deepPartialShape[key] = new VldOptional(validator);\n }\n }\n return new VldObject({ \n ...this.config, \n shape: deepPartialShape \n });\n }\n \n /**\n * Create a new validator with only specified keys\n */\n pick<K extends keyof T>(...keys: K[]): VldObject<Pick<T, K>> {\n const pickedShape: any = {};\n for (const key of keys) {\n if (key in this.config.shape) {\n pickedShape[key] = this.config.shape[key];\n }\n }\n return new VldObject({ \n ...this.config, \n shape: pickedShape \n });\n }\n \n /**\n * Create a new validator without specified keys\n */\n omit<K extends keyof T>(...keys: K[]): VldObject<Omit<T, K>> {\n const omittedShape: any = {};\n const keysToOmit = new Set(keys);\n for (const key in this.config.shape) {\n if (!keysToOmit.has(key as any)) {\n omittedShape[key] = this.config.shape[key];\n }\n }\n return new VldObject({ \n ...this.config, \n shape: omittedShape \n });\n }\n \n /**\n * Create a new validator with additional fields\n */\n extend<U extends Record<string, any>>(\n extension: { [K in keyof U]: VldBase<unknown, U[K]> }\n ): VldObject<T & U> {\n return new VldObject({\n ...this.config,\n shape: { ...this.config.shape, ...extension } as any\n });\n }\n \n /**\n * Create a new validator by merging with another object validator\n */\n merge<U extends Record<string, any>>(\n other: VldObject<U>\n ): VldObject<T & U> {\n return new VldObject({\n ...this.config,\n shape: { ...this.config.shape, ...other.config.shape } as any\n });\n }\n \n /**\n * Create a new validator with all fields required (removes optional)\n */\n required(): VldObject<{ [K in keyof T]-?: T[K] }> {\n const requiredShape: any = {};\n for (const key in this.config.shape) {\n const validator = this.config.shape[key];\n // If it's optional, unwrap it\n if (validator instanceof VldOptional) {\n requiredShape[key] = (validator as any).baseValidator;\n } else {\n requiredShape[key] = validator;\n }\n }\n return new VldObject({ \n ...this.config, \n shape: requiredShape \n }) as any;\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxog/vld",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Ultra-fast TypeScript-first schema validation with zero dependencies and 27+ language support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",