@oxog/vld 1.5.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +116 -0
- package/README.md +558 -517
- package/dist/chunks/bigint-ZKkWLdmi.js +1628 -0
- package/dist/chunks/bigint-ZKkWLdmi.js.map +1 -0
- package/dist/{coercion/string.js → chunks/date-7Iz2BGsL.js} +271 -5
- package/dist/chunks/date-7Iz2BGsL.js.map +1 -0
- package/dist/chunks/index-BoV-4S1F.js +894 -0
- package/dist/chunks/index-BoV-4S1F.js.map +1 -0
- package/dist/chunks/index-eWXdjyyy.js +426 -0
- package/dist/chunks/index-eWXdjyyy.js.map +1 -0
- package/dist/chunks/json-nIhyRPOU.js +1934 -0
- package/dist/chunks/json-nIhyRPOU.js.map +1 -0
- package/dist/{validators/unknown.js → chunks/unknown-CjSRcELI.js} +6 -3
- package/dist/chunks/unknown-CjSRcELI.js.map +1 -0
- package/dist/cjs/errors.cjs +387 -0
- package/dist/cjs/errors.cjs.map +1 -0
- package/dist/cjs/index.cjs +9815 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/locales/index.cjs +2877 -0
- package/dist/cjs/locales/index.cjs.map +1 -0
- package/dist/cjs/locales/lazy.cjs +3169 -0
- package/dist/cjs/locales/lazy.cjs.map +1 -0
- package/dist/cjs/mini.cjs +7161 -0
- package/dist/cjs/mini.cjs.map +1 -0
- package/dist/codecs/index.js +4 -275
- package/dist/codecs/index.js.map +1 -1
- package/dist/coercion/index.d.ts +11 -0
- package/dist/coercion/index.d.ts.map +1 -0
- package/dist/coercion/{bigint.js → index.js} +7 -4
- package/dist/coercion/index.js.map +1 -0
- package/dist/compat/emitter.js +6 -4
- package/dist/compat/emitter.js.map +1 -1
- package/dist/compat/result.js +21 -19
- package/dist/compat/result.js.map +1 -1
- package/dist/errors.js +13 -10
- package/dist/errors.js.map +1 -1
- package/dist/index.js +225 -126
- package/dist/index.js.map +1 -1
- package/dist/kernel.js +10 -7
- package/dist/kernel.js.map +1 -1
- package/dist/locales/af.js +4 -2
- package/dist/locales/af.js.map +1 -1
- package/dist/locales/ar.js +4 -2
- package/dist/locales/ar.js.map +1 -1
- package/dist/locales/bn.js +4 -2
- package/dist/locales/bn.js.map +1 -1
- package/dist/locales/da.js +4 -2
- package/dist/locales/da.js.map +1 -1
- package/dist/locales/de.js +4 -2
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.js +4 -2
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es-MX.js +4 -2
- package/dist/locales/es-MX.js.map +1 -1
- package/dist/locales/es.js +4 -2
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fi.js +4 -2
- package/dist/locales/fi.js.map +1 -1
- package/dist/locales/fr.js +4 -2
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/hi.js +4 -2
- package/dist/locales/hi.js.map +1 -1
- package/dist/locales/id.js +4 -2
- package/dist/locales/id.js.map +1 -1
- package/dist/locales/index.js +3 -91
- package/dist/locales/index.js.map +1 -1
- package/dist/locales/it.js +4 -2
- package/dist/locales/it.js.map +1 -1
- package/dist/locales/ja.js +4 -2
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +4 -2
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/lazy.d.ts +111 -0
- package/dist/locales/lazy.d.ts.map +1 -0
- package/dist/locales/lazy.js +220 -0
- package/dist/locales/lazy.js.map +1 -0
- package/dist/locales/nl.js +4 -2
- package/dist/locales/nl.js.map +1 -1
- package/dist/locales/no.js +4 -2
- package/dist/locales/no.js.map +1 -1
- package/dist/locales/pl.js +4 -2
- package/dist/locales/pl.js.map +1 -1
- package/dist/locales/pt-BR.js +4 -2
- package/dist/locales/pt-BR.js.map +1 -1
- package/dist/locales/pt.js +4 -2
- package/dist/locales/pt.js.map +1 -1
- package/dist/locales/ru.js +4 -2
- package/dist/locales/ru.js.map +1 -1
- package/dist/locales/sv.js +4 -2
- package/dist/locales/sv.js.map +1 -1
- package/dist/locales/sw.js +4 -2
- package/dist/locales/sw.js.map +1 -1
- package/dist/locales/th.js +4 -2
- package/dist/locales/th.js.map +1 -1
- package/dist/locales/tr.js +4 -2
- package/dist/locales/tr.js.map +1 -1
- package/dist/locales/vi.js +4 -2
- package/dist/locales/vi.js.map +1 -1
- package/dist/locales/zh.js +4 -2
- package/dist/locales/zh.js.map +1 -1
- package/dist/mini.d.ts +182 -0
- package/dist/mini.d.ts.map +1 -0
- package/dist/mini.js +132 -0
- package/dist/mini.js.map +1 -0
- package/dist/pigment.js +8 -7
- package/dist/pigment.js.map +1 -1
- package/dist/validators/index.js +5 -45
- package/dist/validators/index.js.map +1 -1
- package/package.json +69 -11
- package/dist/cli/benchmark.d.ts +0 -15
- package/dist/cli/benchmark.d.ts.map +0 -1
- package/dist/cli/benchmark.js +0 -248
- package/dist/cli/benchmark.js.map +0 -1
- package/dist/cli/bin.js +0 -35
- package/dist/cli/bin.js.map +0 -1
- package/dist/cli/commands/benchmark.js +0 -204
- package/dist/cli/commands/benchmark.js.map +0 -1
- package/dist/cli/commands/validate.js +0 -157
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/generate.d.ts +0 -14
- package/dist/cli/generate.d.ts.map +0 -1
- package/dist/cli/generate.js +0 -233
- package/dist/cli/generate.js.map +0 -1
- package/dist/cli/index.js +0 -182
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/validate.d.ts +0 -15
- package/dist/cli/validate.d.ts.map +0 -1
- package/dist/cli/validate.js +0 -162
- package/dist/cli/validate.js.map +0 -1
- package/dist/coercion/bigint.js.map +0 -1
- package/dist/coercion/boolean.js +0 -59
- package/dist/coercion/boolean.js.map +0 -1
- package/dist/coercion/date.js +0 -52
- package/dist/coercion/date.js.map +0 -1
- package/dist/coercion/number.js +0 -160
- package/dist/coercion/number.js.map +0 -1
- package/dist/coercion/string.js.map +0 -1
- package/dist/compat/index.js +0 -14
- package/dist/compat/index.js.map +0 -1
- package/dist/events.js +0 -8
- package/dist/events.js.map +0 -1
- package/dist/guards.d.ts +0 -143
- package/dist/guards.d.ts.map +0 -1
- package/dist/guards.js +0 -238
- package/dist/guards.js.map +0 -1
- package/dist/index-new.d.ts.map +0 -1
- package/dist/locales/backup-en.js +0 -105
- package/dist/locales/backup-en.js.map +0 -1
- package/dist/locales/types.js +0 -2
- package/dist/locales/types.js.map +0 -1
- package/dist/locales.d.ts +0 -54
- package/dist/locales.d.ts.map +0 -1
- package/dist/locales.js +0 -732
- package/dist/locales.js.map +0 -1
- package/dist/logger.js +0 -184
- package/dist/logger.js.map +0 -1
- package/dist/plugins/codecs.d.ts +0 -17
- package/dist/plugins/codecs.d.ts.map +0 -1
- package/dist/plugins/codecs.js +0 -29
- package/dist/plugins/codecs.js.map +0 -1
- package/dist/plugins/coercion.d.ts +0 -13
- package/dist/plugins/coercion.d.ts.map +0 -1
- package/dist/plugins/coercion.js +0 -34
- package/dist/plugins/coercion.js.map +0 -1
- package/dist/plugins/core-validators.d.ts +0 -13
- package/dist/plugins/core-validators.d.ts.map +0 -1
- package/dist/plugins/core-validators.js +0 -96
- package/dist/plugins/core-validators.js.map +0 -1
- package/dist/plugins/index.js +0 -8
- package/dist/plugins/index.js.map +0 -1
- package/dist/plugins/kernel.d.ts +0 -29
- package/dist/plugins/kernel.d.ts.map +0 -1
- package/dist/plugins/kernel.js +0 -486
- package/dist/plugins/kernel.js.map +0 -1
- package/dist/plugins/types.js +0 -8
- package/dist/plugins/types.js.map +0 -1
- package/dist/style.d.ts +0 -123
- package/dist/style.d.ts.map +0 -1
- package/dist/style.js +0 -369
- package/dist/style.js.map +0 -1
- package/dist/utils/codec-utils.js +0 -229
- package/dist/utils/codec-utils.js.map +0 -1
- package/dist/utils/deep-merge.js +0 -76
- package/dist/utils/deep-merge.js.map +0 -1
- package/dist/utils/ip-validation.js +0 -98
- package/dist/utils/ip-validation.js.map +0 -1
- package/dist/utils/security.js +0 -61
- package/dist/utils/security.js.map +0 -1
- package/dist/validators/any.js +0 -25
- package/dist/validators/any.js.map +0 -1
- package/dist/validators/array.js +0 -190
- package/dist/validators/array.js.map +0 -1
- package/dist/validators/base.js +0 -499
- package/dist/validators/base.js.map +0 -1
- package/dist/validators/base64.js +0 -65
- package/dist/validators/base64.js.map +0 -1
- package/dist/validators/bigint.js +0 -142
- package/dist/validators/bigint.js.map +0 -1
- package/dist/validators/boolean.js +0 -114
- package/dist/validators/boolean.js.map +0 -1
- package/dist/validators/codec.js +0 -182
- package/dist/validators/codec.js.map +0 -1
- package/dist/validators/custom.js +0 -50
- package/dist/validators/custom.js.map +0 -1
- package/dist/validators/date.js +0 -227
- package/dist/validators/date.js.map +0 -1
- package/dist/validators/discriminated-union.js +0 -98
- package/dist/validators/discriminated-union.js.map +0 -1
- package/dist/validators/enum.js +0 -82
- package/dist/validators/enum.js.map +0 -1
- package/dist/validators/file.js +0 -114
- package/dist/validators/file.js.map +0 -1
- package/dist/validators/function.js +0 -45
- package/dist/validators/function.js.map +0 -1
- package/dist/validators/hex.js +0 -62
- package/dist/validators/hex.js.map +0 -1
- package/dist/validators/intersection.js +0 -64
- package/dist/validators/intersection.js.map +0 -1
- package/dist/validators/json.js +0 -64
- package/dist/validators/json.js.map +0 -1
- package/dist/validators/lazy.js +0 -42
- package/dist/validators/lazy.js.map +0 -1
- package/dist/validators/literal.js +0 -45
- package/dist/validators/literal.js.map +0 -1
- package/dist/validators/map.js +0 -54
- package/dist/validators/map.js.map +0 -1
- package/dist/validators/nan.js +0 -32
- package/dist/validators/nan.js.map +0 -1
- package/dist/validators/never.js +0 -29
- package/dist/validators/never.js.map +0 -1
- package/dist/validators/null.js +0 -31
- package/dist/validators/null.js.map +0 -1
- package/dist/validators/number.js +0 -225
- package/dist/validators/number.js.map +0 -1
- package/dist/validators/object-optimized.d.ts +0 -23
- package/dist/validators/object-optimized.d.ts.map +0 -1
- package/dist/validators/object-optimized.js +0 -179
- package/dist/validators/object-optimized.js.map +0 -1
- package/dist/validators/object-ultra.d.ts +0 -34
- package/dist/validators/object-ultra.d.ts.map +0 -1
- package/dist/validators/object-ultra.js +0 -175
- package/dist/validators/object-ultra.js.map +0 -1
- package/dist/validators/object.js +0 -458
- package/dist/validators/object.js.map +0 -1
- package/dist/validators/record.js +0 -128
- package/dist/validators/record.js.map +0 -1
- package/dist/validators/set.js +0 -51
- package/dist/validators/set.js.map +0 -1
- package/dist/validators/string-bool.js +0 -127
- package/dist/validators/string-bool.js.map +0 -1
- package/dist/validators/string-formats.js +0 -120
- package/dist/validators/string-formats.js.map +0 -1
- package/dist/validators/string-ultra.d.ts +0 -49
- package/dist/validators/string-ultra.d.ts.map +0 -1
- package/dist/validators/string-ultra.js +0 -217
- package/dist/validators/string-ultra.js.map +0 -1
- package/dist/validators/string.js +0 -253
- package/dist/validators/string.js.map +0 -1
- package/dist/validators/symbol.js +0 -42
- package/dist/validators/symbol.js.map +0 -1
- package/dist/validators/template-literal.js +0 -102
- package/dist/validators/template-literal.js.map +0 -1
- package/dist/validators/tuple.js +0 -55
- package/dist/validators/tuple.js.map +0 -1
- package/dist/validators/uint8array.js +0 -98
- package/dist/validators/uint8array.js.map +0 -1
- package/dist/validators/undefined.js +0 -31
- package/dist/validators/undefined.js.map +0 -1
- package/dist/validators/union-optimized.d.ts +0 -15
- package/dist/validators/union-optimized.d.ts.map +0 -1
- package/dist/validators/union-optimized.js +0 -92
- package/dist/validators/union-optimized.js.map +0 -1
- package/dist/validators/union.js +0 -126
- package/dist/validators/union.js.map +0 -1
- package/dist/validators/unknown.js.map +0 -1
- package/dist/validators/void.js +0 -35
- package/dist/validators/void.js.map +0 -1
- package/dist/validators/xor.js +0 -64
- package/dist/validators/xor.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
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';\r\nimport { getMessages } from '../locales';\r\nimport { VldString } from './string';\r\nimport { VldNumber } from './number';\r\nimport { VldBoolean } from './boolean';\r\nimport { VldDate } from './date';\r\nimport { VldEnum } from './enum';\r\nimport { VldCoerceString } from '../coercion/string';\r\nimport { VldCoerceNumber } from '../coercion/number';\r\nimport { VldCoerceBoolean } from '../coercion/boolean';\r\nimport { VldCoerceDate } from '../coercion/date';\r\n\r\n/**\r\n * Configuration for object validator\r\n */\r\ninterface ObjectValidatorConfig<T extends Record<string, any>> {\r\n readonly shape: { readonly [K in keyof T]: VldBase<unknown, T[K]> };\r\n readonly strict?: boolean;\r\n readonly passthrough?: boolean;\r\n readonly catchall?: VldBase<unknown, any>;\r\n readonly errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Optimized immutable object validator with chainable methods\r\n * Features pre-computed keys and Set-based lookups for better performance\r\n */\r\nexport class VldObject<T extends Record<string, any>> extends VldBase<unknown, T> {\r\n private readonly config: ObjectValidatorConfig<T>;\r\n private readonly shapeKeys: string[];\r\n private readonly shapeKeysSet: Set<string>;\r\n \r\n /**\r\n * Private constructor to enforce immutability\r\n */\r\n private constructor(config: ObjectValidatorConfig<T>) {\r\n super();\r\n this.config = config;\r\n // Pre-compute shape keys for faster access\r\n this.shapeKeys = Object.keys(config.shape);\r\n this.shapeKeysSet = new Set(this.shapeKeys);\r\n }\r\n \r\n /**\r\n * Create a new object validator\r\n */\r\n static create<T extends Record<string, any>>(\r\n shape: { [K in keyof T]: VldBase<unknown, T[K]> }\r\n ): VldObject<T> {\r\n return new VldObject({ shape });\r\n }\r\n \r\n /**\r\n * Parse and validate an object value\r\n * Ultra-optimized with inline type checks and minimal overhead\r\n */\r\n parse(value: unknown): T {\r\n // Fast type check\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n throw new Error(this.config.errorMessage || getMessages().invalidObject);\r\n }\r\n \r\n const obj = value as Record<string, unknown>;\r\n const result: any = {};\r\n \r\n // Ultra-optimized field validation with inline fast paths\r\n for (let i = 0; i < this.shapeKeys.length; i++) {\r\n const key = this.shapeKeys[i];\r\n const validator = this.config.shape[key];\r\n const fieldValue = obj[key];\r\n\r\n // BUG-NEW-002 FIX: Use instanceof instead of constructor.name\r\n // constructor.name breaks in minified builds where class names become 'a', 'b', etc.\r\n // instanceof checks are reliable regardless of minification\r\n //\r\n // Note: Coercion validators extend their base validators, so we need to check for\r\n // coercion types first (more specific) before checking base types\r\n\r\n // Check for coercion validators first - they need full safeParse for type conversion\r\n if (validator instanceof VldCoerceString ||\r\n validator instanceof VldCoerceNumber ||\r\n validator instanceof VldCoerceBoolean ||\r\n validator instanceof VldCoerceDate) {\r\n // Coercion validators need safeParse to handle type conversion\r\n const parseResult = validator.safeParse(fieldValue);\r\n if (!parseResult.success) {\r\n throw new Error(getMessages().objectField(key, parseResult.error.message));\r\n }\r\n result[key] = parseResult.data;\r\n } else if (validator instanceof VldString) {\r\n // For string with validations, use safeParse to handle email, regex etc.\r\n const parseResult = validator.safeParse(fieldValue);\r\n if (!parseResult.success) {\r\n throw new Error(getMessages().objectField(key, parseResult.error.message));\r\n }\r\n result[key] = parseResult.data;\r\n } else if (validator instanceof VldNumber) {\r\n if (typeof fieldValue !== 'number' || isNaN(fieldValue)) {\r\n throw new Error(getMessages().objectField(key, getMessages().invalidNumber));\r\n }\r\n result[key] = fieldValue;\r\n } else if (validator instanceof VldBoolean) {\r\n if (typeof fieldValue !== 'boolean') {\r\n throw new Error(getMessages().objectField(key, getMessages().invalidBoolean));\r\n }\r\n result[key] = fieldValue;\r\n } else if (validator instanceof VldDate) {\r\n // Use the actual validator for Date parsing (handles string conversion)\r\n const parseResult = validator.safeParse(fieldValue);\r\n if (!parseResult.success) {\r\n throw new Error(getMessages().objectField(key, parseResult.error.message));\r\n }\r\n result[key] = parseResult.data;\r\n } else {\r\n // Fallback to safeParse for complex validators\r\n const parseResult = validator.safeParse(fieldValue);\r\n if (!parseResult.success) {\r\n throw new Error(getMessages().objectField(key, parseResult.error.message));\r\n }\r\n result[key] = parseResult.data;\r\n }\r\n }\r\n \r\n // Handle strict mode - optimized with Set\r\n if (this.config.strict) {\r\n const objKeys = Object.keys(obj);\r\n const extraKeys: string[] = [];\r\n\r\n for (let i = 0; i < objKeys.length; i++) {\r\n if (!this.shapeKeysSet.has(objKeys[i])) {\r\n extraKeys.push(objKeys[i]);\r\n }\r\n }\r\n\r\n if (extraKeys.length > 0) {\r\n throw new Error(getMessages().unexpectedKeys(extraKeys));\r\n }\r\n }\r\n\r\n // Handle passthrough mode - optimized with comprehensive prototype pollution protection\r\n if (this.config.passthrough) {\r\n const objKeys = Object.keys(obj);\r\n for (let i = 0; i < objKeys.length; i++) {\r\n const key = objKeys[i];\r\n // Skip dangerous keys to prevent prototype pollution\r\n if (!this.shapeKeysSet.has(key) && !this.isDangerousKey(key)) {\r\n result[key] = obj[key];\r\n }\r\n }\r\n }\r\n\r\n // Handle catchall - validate extra keys with catchall validator\r\n if (this.config.catchall) {\r\n const objKeys = Object.keys(obj);\r\n for (let i = 0; i < objKeys.length; i++) {\r\n const key = objKeys[i];\r\n // Skip keys already in shape and dangerous keys\r\n if (!this.shapeKeysSet.has(key) && !this.isDangerousKey(key)) {\r\n result[key] = this.config.catchall.parse(obj[key]);\r\n }\r\n }\r\n }\r\n\r\n return result as T;\r\n }\r\n \r\n /**\r\n * Safely parse and validate an object value\r\n * Optimized version using pre-computed keys\r\n */\r\n safeParse(value: unknown): ParseResult<T> {\r\n // Fast type check\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n return {\r\n success: false,\r\n error: new Error(this.config.errorMessage || getMessages().invalidObject)\r\n };\r\n }\r\n \r\n const obj = value as Record<string, unknown>;\r\n const result: any = {};\r\n \r\n // Validate all fields\r\n for (let i = 0; i < this.shapeKeys.length; i++) {\r\n const key = this.shapeKeys[i];\r\n const validator = this.config.shape[key];\r\n const fieldValue = obj[key];\r\n \r\n const parseResult = validator.safeParse(fieldValue);\r\n \r\n if (parseResult.success) {\r\n result[key] = parseResult.data;\r\n } else {\r\n return {\r\n success: false,\r\n error: new Error(getMessages().objectField(key, parseResult.error.message))\r\n };\r\n }\r\n }\r\n \r\n // Handle strict mode\r\n if (this.config.strict) {\r\n const objKeys = Object.keys(obj);\r\n const extraKeys: string[] = [];\r\n\r\n for (let i = 0; i < objKeys.length; i++) {\r\n if (!this.shapeKeysSet.has(objKeys[i])) {\r\n extraKeys.push(objKeys[i]);\r\n }\r\n }\r\n\r\n if (extraKeys.length > 0) {\r\n return {\r\n success: false,\r\n error: new Error(getMessages().unexpectedKeys(extraKeys))\r\n };\r\n }\r\n }\r\n\r\n // Handle passthrough mode with comprehensive prototype pollution protection\r\n if (this.config.passthrough) {\r\n const objKeys = Object.keys(obj);\r\n for (let i = 0; i < objKeys.length; i++) {\r\n const key = objKeys[i];\r\n // Skip dangerous keys to prevent prototype pollution\r\n if (!this.shapeKeysSet.has(key) && !this.isDangerousKey(key)) {\r\n result[key] = obj[key];\r\n }\r\n }\r\n }\r\n\r\n // Handle catchall - validate extra keys with catchall validator\r\n if (this.config.catchall) {\r\n const objKeys = Object.keys(obj);\r\n for (let i = 0; i < objKeys.length; i++) {\r\n const key = objKeys[i];\r\n // Skip keys already in shape and dangerous keys\r\n if (!this.shapeKeysSet.has(key) && !this.isDangerousKey(key)) {\r\n const catchallResult = this.config.catchall.safeParse(obj[key]);\r\n if (!catchallResult.success) {\r\n return {\r\n success: false,\r\n error: new Error(getMessages().objectField(key, catchallResult.error.message))\r\n };\r\n }\r\n result[key] = catchallResult.data;\r\n }\r\n }\r\n }\r\n\r\n return { success: true, data: result as T };\r\n }\r\n\r\n /**\r\n * Comprehensive prototype pollution protection\r\n * Checks for dangerous keys that could modify Object.prototype\r\n */\r\n private isDangerousKey(key: string): boolean {\r\n // Direct dangerous keys\r\n const directDangerousKeys = ['__proto__', 'constructor', 'prototype'];\r\n if (directDangerousKeys.includes(key)) {\r\n return true;\r\n }\r\n\r\n // Nested prototype manipulation vectors\r\n // These patterns could allow prototype pollution through nested access\r\n const nestedPatterns = [\r\n 'constructor.prototype',\r\n '__proto__.toString',\r\n 'prototype.constructor',\r\n '__defineGetter__',\r\n '__defineSetter__',\r\n '__lookupGetter__',\r\n '__lookupSetter__'\r\n ];\r\n\r\n // Check for nested patterns\r\n for (const pattern of nestedPatterns) {\r\n if (key.includes(pattern)) {\r\n return true;\r\n }\r\n }\r\n\r\n // Check for property access chains that could lead to prototype pollution\r\n // This covers patterns like \"x.constructor.prototype.polluted\"\r\n const dangerousChains = [\r\n 'constructor.',\r\n '__proto__.',\r\n 'prototype.'\r\n ];\r\n\r\n for (const chain of dangerousChains) {\r\n if (key.includes(chain)) {\r\n return true;\r\n }\r\n }\r\n\r\n // Additional protection: reject keys that could be used for property shadowing\r\n const shadowingPatterns = [\r\n 'hasOwnProperty',\r\n 'toString',\r\n 'valueOf',\r\n 'isPrototypeOf',\r\n 'propertyIsEnumerable'\r\n ];\r\n\r\n for (const pattern of shadowingPatterns) {\r\n if (key === pattern || key.includes(`.${pattern}`)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n \r\n /**\r\n * Create a new validator in strict mode (no extra keys allowed)\r\n */\r\n strict(message?: string): VldObject<T> {\r\n return new VldObject({\r\n ...this.config,\r\n strict: true,\r\n passthrough: false,\r\n errorMessage: message\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator in passthrough mode (extra keys are preserved)\r\n */\r\n passthrough(): VldObject<T> {\r\n return new VldObject({\r\n ...this.config,\r\n strict: false,\r\n passthrough: true\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with all fields optional\r\n */\r\n partial(): VldObject<{ [K in keyof T]?: T[K] }> {\r\n const partialShape: any = {};\r\n for (const key in this.config.shape) {\r\n partialShape[key] = new VldOptional(this.config.shape[key]);\r\n }\r\n return new VldObject({ \r\n ...this.config, \r\n shape: partialShape \r\n }) as any;\r\n }\r\n \r\n /**\r\n * Create a new validator with deep partial (nested objects also partial)\r\n */\r\n deepPartial(): VldObject<any> {\r\n const deepPartialShape: any = {};\r\n for (const key in this.config.shape) {\r\n const validator = this.config.shape[key];\r\n if (validator instanceof VldObject) {\r\n deepPartialShape[key] = new VldOptional(validator.deepPartial());\r\n } else {\r\n deepPartialShape[key] = new VldOptional(validator);\r\n }\r\n }\r\n return new VldObject({ \r\n ...this.config, \r\n shape: deepPartialShape \r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with only specified keys\r\n */\r\n pick<K extends keyof T>(...keys: K[]): VldObject<Pick<T, K>> {\r\n const pickedShape: any = {};\r\n for (const key of keys) {\r\n if (key in this.config.shape) {\r\n pickedShape[key] = this.config.shape[key];\r\n }\r\n }\r\n return new VldObject({ \r\n ...this.config, \r\n shape: pickedShape \r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator without specified keys\r\n */\r\n omit<K extends keyof T>(...keys: K[]): VldObject<Omit<T, K>> {\r\n const omittedShape: any = {};\r\n const keysToOmit = new Set(keys);\r\n for (const key in this.config.shape) {\r\n if (!keysToOmit.has(key as any)) {\r\n omittedShape[key] = this.config.shape[key];\r\n }\r\n }\r\n return new VldObject({ \r\n ...this.config, \r\n shape: omittedShape \r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with additional fields\r\n */\r\n extend<U extends Record<string, any>>(\r\n extension: { [K in keyof U]: VldBase<unknown, U[K]> }\r\n ): VldObject<T & U> {\r\n return new VldObject({\r\n ...this.config,\r\n shape: { ...this.config.shape, ...extension } as any\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator by merging with another object validator\r\n */\r\n merge<U extends Record<string, any>>(\r\n other: VldObject<U>\r\n ): VldObject<T & U> {\r\n return new VldObject({\r\n ...this.config,\r\n shape: { ...this.config.shape, ...other.config.shape } as any\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with all fields required (removes optional)\r\n */\r\n required(): VldObject<{ [K in keyof T]-?: T[K] }> {\r\n const requiredShape: any = {};\r\n for (const key in this.config.shape) {\r\n const validator = this.config.shape[key];\r\n // If it's optional, unwrap it\r\n if (validator instanceof VldOptional) {\r\n // BUG-001 FIX: Add defensive check for baseValidator property\r\n const unwrapped = (validator as any).baseValidator;\r\n if (!unwrapped || typeof unwrapped.parse !== 'function') {\r\n throw new Error(`Invalid VldOptional structure for field \"${key}\": missing or invalid baseValidator`);\r\n }\r\n requiredShape[key] = unwrapped;\r\n } else {\r\n requiredShape[key] = validator;\r\n }\r\n }\r\n return new VldObject({\r\n ...this.config,\r\n shape: requiredShape\r\n }) as any;\r\n }\r\n\r\n /**\r\n * Create a new validator with a catchall validator for extra keys\r\n * Zod 4 API parity - validates unknown keys with provided schema\r\n */\r\n catchall<U>(schema: VldBase<unknown, U>): VldObject<any> {\r\n return new VldObject({\r\n ...this.config,\r\n catchall: schema,\r\n passthrough: false // catchall overrides passthrough\r\n }) as any;\r\n }\r\n\r\n /**\r\n * Access the inner shape schemas\r\n * Zod 4 API parity - returns the shape object\r\n */\r\n get shape(): { readonly [K in keyof T]: VldBase<unknown, T[K]> } {\r\n return this.config.shape;\r\n }\r\n\r\n /**\r\n * Create an enum validator from object keys\r\n * Zod 4 API parity - creates literal union of keys\r\n */\r\n keyof(): VldEnum<[string, ...string[]]> {\r\n const keys = Object.keys(this.config.shape);\r\n if (keys.length === 0) {\r\n throw new Error('Cannot create keyof enum from empty object');\r\n }\r\n return VldEnum.create(keys as [string, ...string[]]);\r\n }\r\n\r\n /**\r\n * Type-safe extend that throws an error if any key already exists\r\n * Zod 4 API parity - prevents accidental field override\r\n * @param extension The extension shape to add\r\n * @returns A new validator with extended shape\r\n * @throws {Error} If any extension key already exists in the shape\r\n * @example\r\n * const base = v.object({ name: v.string() });\r\n * const extended = base.safeExtend({ age: v.number() }); // OK\r\n * const invalid = base.safeExtend({ name: v.number() }); // Throws error\r\n */\r\n safeExtend<U extends Record<string, any>>(\r\n extension: { [K in keyof U]: VldBase<unknown, U[K]> }\r\n ): VldObject<T & U> {\r\n // Check for overlapping keys\r\n const existingKeys = new Set(Object.keys(this.config.shape));\r\n const extensionKeys = Object.keys(extension);\r\n const overlappingKeys: string[] = [];\r\n\r\n for (const key of extensionKeys) {\r\n if (existingKeys.has(key)) {\r\n overlappingKeys.push(key);\r\n }\r\n }\r\n\r\n if (overlappingKeys.length > 0) {\r\n throw new Error(`safeExtend: ${getMessages().safeExtendOverlap(overlappingKeys)}`);\r\n }\r\n\r\n return new VldObject({\r\n ...this.config,\r\n shape: { ...this.config.shape, ...extension } as any\r\n });\r\n }\r\n}"]}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { VldBase } from './base.js';
|
|
2
|
-
import { getMessages } from '../locales/index.js';
|
|
3
|
-
import { isDangerousKey } from '../utils/security.js';
|
|
4
|
-
/**
|
|
5
|
-
* Immutable record validator for key-value pairs
|
|
6
|
-
* BUG-NEW-018 FIX: Uses comprehensive dangerous key protection
|
|
7
|
-
*/
|
|
8
|
-
export class VldRecord extends VldBase {
|
|
9
|
-
/**
|
|
10
|
-
* Private constructor to enforce immutability
|
|
11
|
-
*/
|
|
12
|
-
constructor(valueValidator, errorMessage) {
|
|
13
|
-
super();
|
|
14
|
-
this.valueValidator = valueValidator;
|
|
15
|
-
this.errorMessage = errorMessage;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Create a new record validator
|
|
19
|
-
*/
|
|
20
|
-
static create(valueValidator) {
|
|
21
|
-
return new VldRecord(valueValidator);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Parse and validate a record value
|
|
25
|
-
* BUG-NEW-018 FIX: Use comprehensive dangerous key protection
|
|
26
|
-
*/
|
|
27
|
-
parse(value) {
|
|
28
|
-
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
29
|
-
throw new Error(this.errorMessage || getMessages().invalidRecord);
|
|
30
|
-
}
|
|
31
|
-
const result = {};
|
|
32
|
-
const obj = value;
|
|
33
|
-
for (const [key, val] of Object.entries(obj)) {
|
|
34
|
-
// Skip dangerous keys to prevent prototype pollution
|
|
35
|
-
// Now using comprehensive protection from shared utility
|
|
36
|
-
if (isDangerousKey(key)) {
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
result[key] = this.valueValidator.parse(val);
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
throw new Error(getMessages().objectField(key, error.message));
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return result;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Safely parse and validate a record value
|
|
50
|
-
*/
|
|
51
|
-
safeParse(value) {
|
|
52
|
-
try {
|
|
53
|
-
return { success: true, data: this.parse(value) };
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
return { success: false, error: error };
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Create a partial record variant (all keys optional)
|
|
61
|
-
* Similar to v.object().partial() but for records
|
|
62
|
-
*/
|
|
63
|
-
partial() {
|
|
64
|
-
const optionalValidator = this.valueValidator.optional();
|
|
65
|
-
return new VldRecord(optionalValidator);
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Create a loose record variant (allows extra keys)
|
|
69
|
-
* Similar to v.object().passthrough() but for records
|
|
70
|
-
* Note: Records already allow any keys, so this mainly affects error handling
|
|
71
|
-
*/
|
|
72
|
-
loose() {
|
|
73
|
-
// For records, "loose" means we don't throw errors for validation failures
|
|
74
|
-
// We return a modified version that catches validation errors
|
|
75
|
-
return new VldLooseRecord(this.valueValidator);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Loose record variant that allows validation failures
|
|
80
|
-
* Used internally by .loose() method
|
|
81
|
-
*/
|
|
82
|
-
class VldLooseRecord extends VldBase {
|
|
83
|
-
constructor(valueValidator) {
|
|
84
|
-
super();
|
|
85
|
-
this.valueValidator = valueValidator;
|
|
86
|
-
}
|
|
87
|
-
parse(value) {
|
|
88
|
-
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
89
|
-
throw new Error(getMessages().invalidRecord);
|
|
90
|
-
}
|
|
91
|
-
const result = {};
|
|
92
|
-
const obj = value;
|
|
93
|
-
for (const [key, val] of Object.entries(obj)) {
|
|
94
|
-
// Skip dangerous keys
|
|
95
|
-
if (isDangerousKey(key)) {
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
// For loose records, skip invalid values instead of throwing
|
|
99
|
-
const parseResult = this.valueValidator.safeParse(val);
|
|
100
|
-
if (parseResult.success) {
|
|
101
|
-
result[key] = parseResult.data;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
return result;
|
|
105
|
-
}
|
|
106
|
-
safeParse(value) {
|
|
107
|
-
try {
|
|
108
|
-
return { success: true, data: this.parse(value) };
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
return { success: false, error: error };
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Create a partial variant (all keys optional)
|
|
116
|
-
*/
|
|
117
|
-
partial() {
|
|
118
|
-
const optionalValidator = this.valueValidator.optional();
|
|
119
|
-
return new VldLooseRecord(optionalValidator);
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Return self (already loose)
|
|
123
|
-
*/
|
|
124
|
-
loose() {
|
|
125
|
-
return this;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
//# sourceMappingURL=record.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/validators/record.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\nimport { isDangerousKey } from '../utils/security';\r\n\r\n/**\r\n * Immutable record validator for key-value pairs\r\n * BUG-NEW-018 FIX: Uses comprehensive dangerous key protection\r\n */\r\nexport class VldRecord<T> extends VldBase<unknown, Record<string, T>> {\r\n /**\r\n * Private constructor to enforce immutability\r\n */\r\n protected constructor(\r\n protected readonly valueValidator: VldBase<unknown, T>,\r\n private readonly errorMessage?: string\r\n ) {\r\n super();\r\n }\r\n \r\n /**\r\n * Create a new record validator\r\n */\r\n static create<T>(valueValidator: VldBase<unknown, T>): VldRecord<T> {\r\n return new VldRecord(valueValidator);\r\n }\r\n \r\n /**\r\n * Parse and validate a record value\r\n * BUG-NEW-018 FIX: Use comprehensive dangerous key protection\r\n */\r\n parse(value: unknown): Record<string, T> {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n throw new Error(this.errorMessage || getMessages().invalidRecord);\r\n }\r\n\r\n const result: Record<string, T> = {};\r\n const obj = value as Record<string, unknown>;\r\n\r\n for (const [key, val] of Object.entries(obj)) {\r\n // Skip dangerous keys to prevent prototype pollution\r\n // Now using comprehensive protection from shared utility\r\n if (isDangerousKey(key)) {\r\n continue;\r\n }\r\n\r\n try {\r\n result[key] = this.valueValidator.parse(val);\r\n } catch (error) {\r\n throw new Error(getMessages().objectField(key, (error as Error).message));\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n \r\n /**\r\n * Safely parse and validate a record value\r\n */\r\n safeParse(value: unknown): ParseResult<Record<string, T>> {\r\n try {\r\n return { success: true, data: this.parse(value) };\r\n } catch (error) {\r\n return { success: false, error: error as Error };\r\n }\r\n }\r\n\r\n /**\r\n * Create a partial record variant (all keys optional)\r\n * Similar to v.object().partial() but for records\r\n */\r\n partial(): VldRecord<T | undefined> {\r\n const optionalValidator = this.valueValidator.optional();\r\n return new VldRecord(optionalValidator);\r\n }\r\n\r\n /**\r\n * Create a loose record variant (allows extra keys)\r\n * Similar to v.object().passthrough() but for records\r\n * Note: Records already allow any keys, so this mainly affects error handling\r\n */\r\n loose(): VldBase<unknown, Record<string, T>> {\r\n // For records, \"loose\" means we don't throw errors for validation failures\r\n // We return a modified version that catches validation errors\r\n return new VldLooseRecord(this.valueValidator);\r\n }\r\n}\r\n\r\n/**\r\n * Loose record variant that allows validation failures\r\n * Used internally by .loose() method\r\n */\r\nclass VldLooseRecord<T> extends VldBase<unknown, Record<string, T>> {\r\n constructor(private readonly valueValidator: VldBase<unknown, T>) {\r\n super();\r\n }\r\n\r\n parse(value: unknown): Record<string, T> {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n throw new Error(getMessages().invalidRecord);\r\n }\r\n\r\n const result: Record<string, T> = {} as Record<string, T>;\r\n const obj = value as Record<string, unknown>;\r\n\r\n for (const [key, val] of Object.entries(obj)) {\r\n // Skip dangerous keys\r\n if (isDangerousKey(key)) {\r\n continue;\r\n }\r\n\r\n // For loose records, skip invalid values instead of throwing\r\n const parseResult = this.valueValidator.safeParse(val);\r\n if (parseResult.success) {\r\n result[key] = parseResult.data;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<Record<string, T>> {\r\n try {\r\n return { success: true, data: this.parse(value) };\r\n } catch (error) {\r\n return { success: false, error: error as Error };\r\n }\r\n }\r\n\r\n /**\r\n * Create a partial variant (all keys optional)\r\n */\r\n partial(): VldLooseRecord<T | undefined> {\r\n const optionalValidator = this.valueValidator.optional();\r\n return new VldLooseRecord(optionalValidator);\r\n }\r\n\r\n /**\r\n * Return self (already loose)\r\n */\r\n loose(): VldLooseRecord<T> {\r\n return this;\r\n }\r\n}"]}
|
package/dist/validators/set.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { VldBase } from './base.js';
|
|
2
|
-
import { getMessages } from '../locales/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* Immutable Set validator
|
|
5
|
-
*/
|
|
6
|
-
export class VldSet extends VldBase {
|
|
7
|
-
/**
|
|
8
|
-
* Private constructor to enforce immutability
|
|
9
|
-
*/
|
|
10
|
-
constructor(itemValidator, errorMessage) {
|
|
11
|
-
super();
|
|
12
|
-
this.itemValidator = itemValidator;
|
|
13
|
-
this.errorMessage = errorMessage;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Create a new Set validator
|
|
17
|
-
*/
|
|
18
|
-
static create(itemValidator) {
|
|
19
|
-
return new VldSet(itemValidator);
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Parse and validate a Set value
|
|
23
|
-
*/
|
|
24
|
-
parse(value) {
|
|
25
|
-
if (!(value instanceof Set)) {
|
|
26
|
-
throw new Error(this.errorMessage || getMessages().invalidSet);
|
|
27
|
-
}
|
|
28
|
-
const result = new Set();
|
|
29
|
-
for (const item of value) {
|
|
30
|
-
try {
|
|
31
|
-
result.add(this.itemValidator.parse(item));
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
throw new Error(error.message);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return result;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Safely parse and validate a Set value
|
|
41
|
-
*/
|
|
42
|
-
safeParse(value) {
|
|
43
|
-
try {
|
|
44
|
-
return { success: true, data: this.parse(value) };
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
return { success: false, error: error };
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=set.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../src/validators/set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,MAAU,SAAQ,OAAwB;IACrD;;OAEG;IACH,YACmB,aAAkC,EAClC,YAAqB;QAEtC,KAAK,EAAE,CAAC;QAHS,kBAAa,GAAb,aAAa,CAAqB;QAClC,iBAAY,GAAZ,YAAY,CAAS;IAGxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAI,aAAkC;QACjD,OAAO,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAK,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Immutable Set validator\n */\nexport class VldSet<T> extends VldBase<unknown, Set<T>> {\n /**\n * Private constructor to enforce immutability\n */\n private constructor(\n private readonly itemValidator: VldBase<unknown, T>,\n private readonly errorMessage?: string\n ) {\n super();\n }\n \n /**\n * Create a new Set validator\n */\n static create<T>(itemValidator: VldBase<unknown, T>): VldSet<T> {\n return new VldSet(itemValidator);\n }\n \n /**\n * Parse and validate a Set value\n */\n parse(value: unknown): Set<T> {\n if (!(value instanceof Set)) {\n throw new Error(this.errorMessage || getMessages().invalidSet);\n }\n \n const result = new Set<T>();\n for (const item of value) {\n try {\n result.add(this.itemValidator.parse(item));\n } catch (error) {\n throw new Error((error as Error).message);\n }\n }\n \n return result;\n }\n \n /**\n * Safely parse and validate a Set value\n */\n safeParse(value: unknown): ParseResult<Set<T>> {\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,127 +0,0 @@
|
|
|
1
|
-
import { VldBase } from './base.js';
|
|
2
|
-
import { getMessages } from '../locales/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* Default truthy and falsy value sets
|
|
5
|
-
*/
|
|
6
|
-
const DEFAULT_TRUTHY = ['true', '1', 'yes', 'on', 'y', 'enabled'];
|
|
7
|
-
const DEFAULT_FALSY = ['false', '0', 'no', 'off', 'n', 'disabled'];
|
|
8
|
-
/**
|
|
9
|
-
* Immutable string boolean validator for flexible boolean parsing
|
|
10
|
-
* Supports string representations like "true", "yes", "on", "1", etc.
|
|
11
|
-
*/
|
|
12
|
-
export class VldStringBool extends VldBase {
|
|
13
|
-
constructor(options) {
|
|
14
|
-
super();
|
|
15
|
-
this.options = options;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Create a new string boolean validator
|
|
19
|
-
*/
|
|
20
|
-
static create(options = {}) {
|
|
21
|
-
return new VldStringBool(options);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Normalize a string value based on case sensitivity setting
|
|
25
|
-
*/
|
|
26
|
-
normalizeValue(value) {
|
|
27
|
-
return this.options.caseSensitive ? value : value.toLowerCase();
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Get the effective truthy values (custom or default)
|
|
31
|
-
*/
|
|
32
|
-
getTruthyValues() {
|
|
33
|
-
return this.options.truthy ?? DEFAULT_TRUTHY;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Get the effective falsy values (custom or default)
|
|
37
|
-
*/
|
|
38
|
-
getFalsyValues() {
|
|
39
|
-
return this.options.falsy ?? DEFAULT_FALSY;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Parse and validate a string boolean value
|
|
43
|
-
*/
|
|
44
|
-
parse(value) {
|
|
45
|
-
// First, ensure we have a string
|
|
46
|
-
if (typeof value !== 'string') {
|
|
47
|
-
// Also accept actual boolean values for convenience
|
|
48
|
-
if (typeof value === 'boolean') {
|
|
49
|
-
return value;
|
|
50
|
-
}
|
|
51
|
-
throw new Error(getMessages().stringExpected(typeof value, 'string'));
|
|
52
|
-
}
|
|
53
|
-
const normalized = this.normalizeValue(value);
|
|
54
|
-
const truthyValues = this.getTruthyValues();
|
|
55
|
-
const falsyValues = this.getFalsyValues();
|
|
56
|
-
// Normalize the value sets for comparison
|
|
57
|
-
const normalizedTruthy = this.options.caseSensitive
|
|
58
|
-
? truthyValues
|
|
59
|
-
: truthyValues.map(v => v.toLowerCase());
|
|
60
|
-
const normalizedFalsy = this.options.caseSensitive
|
|
61
|
-
? falsyValues
|
|
62
|
-
: falsyValues.map(v => v.toLowerCase());
|
|
63
|
-
// Check if value is in truthy set
|
|
64
|
-
if (normalizedTruthy.includes(normalized)) {
|
|
65
|
-
return true;
|
|
66
|
-
}
|
|
67
|
-
// Check if value is in falsy set
|
|
68
|
-
if (normalizedFalsy.includes(normalized)) {
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
// Value is not recognized
|
|
72
|
-
const allValidValues = [...normalizedTruthy, ...normalizedFalsy];
|
|
73
|
-
throw new Error(getMessages().stringBoolExpected(this.options.caseSensitive ? allValidValues.join(', ') : allValidValues.join(', '), value));
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Safely parse and validate a string boolean value
|
|
77
|
-
*/
|
|
78
|
-
safeParse(value) {
|
|
79
|
-
try {
|
|
80
|
-
const result = this.parse(value);
|
|
81
|
-
return { success: true, data: result };
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
return {
|
|
85
|
-
success: false,
|
|
86
|
-
error: error
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Create a new validator with custom truthy values
|
|
92
|
-
*/
|
|
93
|
-
withTruthy(values) {
|
|
94
|
-
return new VldStringBool({
|
|
95
|
-
...this.options,
|
|
96
|
-
truthy: values
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Create a new validator with custom falsy values
|
|
101
|
-
*/
|
|
102
|
-
withFalsy(values) {
|
|
103
|
-
return new VldStringBool({
|
|
104
|
-
...this.options,
|
|
105
|
-
falsy: values
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Create a new validator with case-sensitive matching
|
|
110
|
-
*/
|
|
111
|
-
caseSensitive() {
|
|
112
|
-
return new VldStringBool({
|
|
113
|
-
...this.options,
|
|
114
|
-
caseSensitive: true
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Create a new validator with case-insensitive matching (default)
|
|
119
|
-
*/
|
|
120
|
-
caseInsensitive() {
|
|
121
|
-
return new VldStringBool({
|
|
122
|
-
...this.options,
|
|
123
|
-
caseSensitive: false
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
//# sourceMappingURL=string-bool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"string-bool.js","sourceRoot":"","sources":["../../src/validators/string-bool.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Configuration for string boolean validation\r\n */\r\nexport interface StringBoolOptions {\r\n /** Custom truthy values (default: ['true', '1', 'yes', 'on', 'y', 'enabled']) */\r\n truthy?: readonly string[];\r\n /** Custom falsy values (default: ['false', '0', 'no', 'off', 'n', 'disabled']) */\r\n falsy?: readonly string[];\r\n /** Whether matching should be case-sensitive (default: false) */\r\n caseSensitive?: boolean;\r\n}\r\n\r\n/**\r\n * Default truthy and falsy value sets\r\n */\r\nconst DEFAULT_TRUTHY = ['true', '1', 'yes', 'on', 'y', 'enabled'] as const;\r\nconst DEFAULT_FALSY = ['false', '0', 'no', 'off', 'n', 'disabled'] as const;\r\n\r\n/**\r\n * Immutable string boolean validator for flexible boolean parsing\r\n * Supports string representations like \"true\", \"yes\", \"on\", \"1\", etc.\r\n */\r\nexport class VldStringBool extends VldBase<unknown, boolean> {\r\n private constructor(\r\n private readonly options: StringBoolOptions\r\n ) {\r\n super();\r\n }\r\n\r\n /**\r\n * Create a new string boolean validator\r\n */\r\n static create(options: StringBoolOptions = {}): VldStringBool {\r\n return new VldStringBool(options);\r\n }\r\n\r\n /**\r\n * Normalize a string value based on case sensitivity setting\r\n */\r\n private normalizeValue(value: string): string {\r\n return this.options.caseSensitive ? value : value.toLowerCase();\r\n }\r\n\r\n /**\r\n * Get the effective truthy values (custom or default)\r\n */\r\n private getTruthyValues(): readonly string[] {\r\n return this.options.truthy ?? DEFAULT_TRUTHY;\r\n }\r\n\r\n /**\r\n * Get the effective falsy values (custom or default)\r\n */\r\n private getFalsyValues(): readonly string[] {\r\n return this.options.falsy ?? DEFAULT_FALSY;\r\n }\r\n\r\n /**\r\n * Parse and validate a string boolean value\r\n */\r\n parse(value: unknown): boolean {\r\n // First, ensure we have a string\r\n if (typeof value !== 'string') {\r\n // Also accept actual boolean values for convenience\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n throw new Error(\r\n getMessages().stringExpected(typeof value, 'string')\r\n );\r\n }\r\n\r\n const normalized = this.normalizeValue(value);\r\n const truthyValues = this.getTruthyValues();\r\n const falsyValues = this.getFalsyValues();\r\n\r\n // Normalize the value sets for comparison\r\n const normalizedTruthy = this.options.caseSensitive\r\n ? truthyValues\r\n : truthyValues.map(v => v.toLowerCase());\r\n\r\n const normalizedFalsy = this.options.caseSensitive\r\n ? falsyValues\r\n : falsyValues.map(v => v.toLowerCase());\r\n\r\n // Check if value is in truthy set\r\n if (normalizedTruthy.includes(normalized)) {\r\n return true;\r\n }\r\n\r\n // Check if value is in falsy set\r\n if (normalizedFalsy.includes(normalized)) {\r\n return false;\r\n }\r\n\r\n // Value is not recognized\r\n const allValidValues = [...normalizedTruthy, ...normalizedFalsy];\r\n throw new Error(\r\n getMessages().stringBoolExpected(\r\n this.options.caseSensitive ? allValidValues.join(', ') : allValidValues.join(', '),\r\n value\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Safely parse and validate a string boolean value\r\n */\r\n safeParse(value: unknown): ParseResult<boolean> {\r\n try {\r\n const result = this.parse(value);\r\n return { success: true, data: result };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error as Error\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Create a new validator with custom truthy values\r\n */\r\n withTruthy(values: readonly string[]): VldStringBool {\r\n return new VldStringBool({\r\n ...this.options,\r\n truthy: values\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator with custom falsy values\r\n */\r\n withFalsy(values: readonly string[]): VldStringBool {\r\n return new VldStringBool({\r\n ...this.options,\r\n falsy: values\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator with case-sensitive matching\r\n */\r\n caseSensitive(): VldStringBool {\r\n return new VldStringBool({\r\n ...this.options,\r\n caseSensitive: true\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator with case-insensitive matching (default)\r\n */\r\n caseInsensitive(): VldStringBool {\r\n return new VldStringBool({\r\n ...this.options,\r\n caseSensitive: false\r\n });\r\n }\r\n}\r\n"]}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Top-level string format validators
|
|
3
|
-
* Part of Zod 4 API parity implementation
|
|
4
|
-
* Provides convenient validators for common string formats
|
|
5
|
-
*/
|
|
6
|
-
import { VldBase } from './base.js';
|
|
7
|
-
import { VldString } from './string.js';
|
|
8
|
-
/**
|
|
9
|
-
* Pre-compiled regex patterns for performance
|
|
10
|
-
*/
|
|
11
|
-
const REGEXES = {
|
|
12
|
-
email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
|
13
|
-
uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
|
|
14
|
-
uuidv4: /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
|
|
15
|
-
uuidv6: /^[0-9a-f]{8}-[0-9a-f]{4}-6[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
|
|
16
|
-
uuidv7: /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
|
|
17
|
-
hostname: /^(?=.{1,253}$)(?:(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}$/,
|
|
18
|
-
emoji: /^(?:\p{Emoji_Presentation}|\p{Emoji}\uFE0F)(?:\u200D(?:\p{Emoji_Presentation}|\p{Emoji}\uFE0F))*$/u,
|
|
19
|
-
base64: /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/,
|
|
20
|
-
base64url: /^[A-Za-z0-9_-]*$/,
|
|
21
|
-
hex: /^[0-9a-fA-F]*$/,
|
|
22
|
-
jwt: /^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*$/,
|
|
23
|
-
nanoid: /^[A-Za-z0-9_-]{21}$/,
|
|
24
|
-
cuid: /^c[^\s-]{8,}$/i,
|
|
25
|
-
cuid2: /^[0-9a-z]+$/,
|
|
26
|
-
ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,
|
|
27
|
-
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]?)$/,
|
|
28
|
-
ipv6: /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/,
|
|
29
|
-
mac: /^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$/,
|
|
30
|
-
cidrv4: /^(?:(?: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]?)\/(?:3[0-2]|[12]?[0-9])$/,
|
|
31
|
-
cidrv6: /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^(?:[0-9a-fA-F]{1,4}:){1,7}:\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,
|
|
32
|
-
e164: /^\+[1-9]\d{1,14}$/,
|
|
33
|
-
isoDate: /^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$/,
|
|
34
|
-
isoTime: /^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?$/,
|
|
35
|
-
isoDateTime: /^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?Z?$/,
|
|
36
|
-
md5: /^[a-f0-9]{32}$/i,
|
|
37
|
-
sha1: /^[a-f0-9]{40}$/i,
|
|
38
|
-
sha256: /^[a-f0-9]{64}$/i,
|
|
39
|
-
sha384: /^[a-f0-9]{96}$/i,
|
|
40
|
-
sha512: /^[a-f0-9]{128}$/i,
|
|
41
|
-
};
|
|
42
|
-
/**
|
|
43
|
-
* Generic string format validator
|
|
44
|
-
*/
|
|
45
|
-
class VldStringFormat extends VldBase {
|
|
46
|
-
constructor(_format, _validator, _errorMessage) {
|
|
47
|
-
super();
|
|
48
|
-
this._format = _format;
|
|
49
|
-
this._validator = _validator;
|
|
50
|
-
this._errorMessage = _errorMessage;
|
|
51
|
-
}
|
|
52
|
-
static create(format, validator, errorMessage) {
|
|
53
|
-
return new VldStringFormat(format, validator, errorMessage);
|
|
54
|
-
}
|
|
55
|
-
parse(value) {
|
|
56
|
-
const result = VldString.create().parse(value);
|
|
57
|
-
if (!this._validator(result)) {
|
|
58
|
-
throw new Error(this._errorMessage || `Invalid ${this._format} format`);
|
|
59
|
-
}
|
|
60
|
-
return result;
|
|
61
|
-
}
|
|
62
|
-
safeParse(value) {
|
|
63
|
-
const stringResult = VldString.create().safeParse(value);
|
|
64
|
-
if (!stringResult.success) {
|
|
65
|
-
return stringResult;
|
|
66
|
-
}
|
|
67
|
-
if (!this._validator(stringResult.data)) {
|
|
68
|
-
return {
|
|
69
|
-
success: false,
|
|
70
|
-
error: new Error(this._errorMessage || `Invalid ${this._format} format`)
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
return { success: true, data: stringResult.data };
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Top-level string format validators
|
|
78
|
-
*/
|
|
79
|
-
export const email = (options) => VldStringFormat.create('email', (val) => (options?.pattern ?? REGEXES.email).test(val));
|
|
80
|
-
export const uuid = (options) => {
|
|
81
|
-
const pattern = options?.version ? REGEXES[`uuid${options.version}`] : REGEXES.uuid;
|
|
82
|
-
return VldStringFormat.create('uuid', (val) => pattern.test(val));
|
|
83
|
-
};
|
|
84
|
-
export const uuidv4 = () => VldStringFormat.create('uuid', (val) => REGEXES.uuidv4.test(val));
|
|
85
|
-
export const hostname = () => VldStringFormat.create('hostname', (val) => REGEXES.hostname.test(val));
|
|
86
|
-
export const emoji = () => VldStringFormat.create('emoji', (val) => REGEXES.emoji.test(val));
|
|
87
|
-
export const base64 = () => VldStringFormat.create('base64', (val) => REGEXES.base64.test(val));
|
|
88
|
-
export const base64url = () => VldStringFormat.create('base64url', (val) => REGEXES.base64url.test(val));
|
|
89
|
-
export const hex = () => VldStringFormat.create('hex', (val) => REGEXES.hex.test(val));
|
|
90
|
-
export const jwt = () => VldStringFormat.create('jwt', (val) => REGEXES.jwt.test(val));
|
|
91
|
-
export const nanoid = () => VldStringFormat.create('nanoid', (val) => REGEXES.nanoid.test(val));
|
|
92
|
-
export const cuid = () => VldStringFormat.create('cuid', (val) => REGEXES.cuid.test(val));
|
|
93
|
-
export const cuid2 = () => VldStringFormat.create('cuid2', (val) => REGEXES.cuid2.test(val));
|
|
94
|
-
export const ulid = () => VldStringFormat.create('ulid', (val) => REGEXES.ulid.test(val));
|
|
95
|
-
export const ipv4 = () => VldStringFormat.create('ipv4', (val) => REGEXES.ipv4.test(val));
|
|
96
|
-
export const ipv6 = () => VldStringFormat.create('ipv6', (val) => REGEXES.ipv6.test(val));
|
|
97
|
-
export const mac = () => VldStringFormat.create('mac', (val) => REGEXES.mac.test(val));
|
|
98
|
-
export const cidrv4 = () => VldStringFormat.create('cidrv4', (val) => REGEXES.cidrv4.test(val));
|
|
99
|
-
export const cidrv6 = () => VldStringFormat.create('cidrv6', (val) => REGEXES.cidrv6.test(val));
|
|
100
|
-
export const e164 = () => VldStringFormat.create('e164', (val) => REGEXES.e164.test(val));
|
|
101
|
-
export const hash = (algorithm) => VldStringFormat.create('hash', (val) => REGEXES[algorithm]?.test(val) ?? false, `Invalid ${algorithm} hash`);
|
|
102
|
-
/**
|
|
103
|
-
* ISO date/time validators
|
|
104
|
-
*/
|
|
105
|
-
export const iso = {
|
|
106
|
-
date: () => VldStringFormat.create('date', (val) => REGEXES.isoDate.test(val)),
|
|
107
|
-
time: () => VldStringFormat.create('time', (val) => REGEXES.isoTime.test(val)),
|
|
108
|
-
dateTime: (_options) => VldStringFormat.create('datetime', (val) => REGEXES.isoDateTime.test(val)),
|
|
109
|
-
duration: () => VldStringFormat.create('duration', (val) => /^P/.test(val)),
|
|
110
|
-
};
|
|
111
|
-
/**
|
|
112
|
-
* Custom format validator
|
|
113
|
-
*/
|
|
114
|
-
export const stringFormat = (name, validator) => {
|
|
115
|
-
const fn = validator instanceof RegExp ? (val) => validator.test(val) : validator;
|
|
116
|
-
return VldStringFormat.create(name, fn);
|
|
117
|
-
};
|
|
118
|
-
// Export regexes for external use
|
|
119
|
-
export { REGEXES as regexes };
|
|
120
|
-
//# sourceMappingURL=string-formats.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"string-formats.js","sourceRoot":"","sources":["../../src/validators/string-formats.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC;;GAEG;AACH,MAAM,OAAO,GAAG;IACd,KAAK,EAAE,4BAA4B;IACnC,IAAI,EAAE,iEAAiE;IACvE,MAAM,EAAE,wEAAwE;IAChF,MAAM,EAAE,wEAAwE;IAChF,MAAM,EAAE,wEAAwE;IAChF,QAAQ,EAAE,mEAAmE;IAC7E,KAAK,EAAE,oGAAoG;IAC3G,MAAM,EAAE,qEAAqE;IAC7E,SAAS,EAAE,kBAAkB;IAC7B,GAAG,EAAE,gBAAgB;IACrB,GAAG,EAAE,kDAAkD;IACvD,MAAM,EAAE,qBAAqB;IAC7B,IAAI,EAAE,gBAAgB;IACtB,KAAK,EAAE,aAAa;IACpB,IAAI,EAAE,0BAA0B;IAChC,IAAI,EAAE,6FAA6F;IACnG,IAAI,EAAE,4CAA4C;IAClD,GAAG,EAAE,sCAAsC;IAC3C,MAAM,EAAE,oHAAoH;IAC5H,MAAM,EAAE,qOAAqO;IAC7O,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,mDAAmD;IAC5D,OAAO,EAAE,oDAAoD;IAC7D,WAAW,EAAE,iGAAiG;IAC9G,GAAG,EAAE,iBAAiB;IACtB,IAAI,EAAE,iBAAiB;IACvB,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,kBAAkB;CAClB,CAAC;AAEX;;GAEG;AACH,MAAM,eAAgB,SAAQ,OAAwB;IACpD,YACkB,OAAe,EACf,UAAoC,EACpC,aAAsB;QAEtC,KAAK,EAAE,CAAC;QAJQ,YAAO,GAAP,OAAO,CAAQ;QACf,eAAU,GAAV,UAAU,CAA0B;QACpC,kBAAa,GAAb,aAAa,CAAS;IAGxC,CAAC;IAED,MAAM,CAAC,MAAM,CACX,MAAc,EACd,SAAmC,EACnC,YAAqB;QAErB,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE/C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,aAAa,IAAI,WAAW,IAAI,CAAC,OAAO,SAAS,CACvD,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,KAAK,CACd,IAAI,CAAC,aAAa,IAAI,WAAW,IAAI,CAAC,OAAO,SAAS,CACvD;aACF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAA8B,EAAmB,EAAE,CACvE,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1F,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,OAA0C,EAAmB,EAAE;IAClF,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACpF,OAAO,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,GAAoB,EAAE,CAC1C,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEpE,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAoB,EAAE,CAC5C,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,KAAK,GAAG,GAAoB,EAAE,CACzC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEpE,MAAM,CAAC,MAAM,MAAM,GAAG,GAAoB,EAAE,CAC1C,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,SAAS,GAAG,GAAoB,EAAE,CAC7C,eAAe,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,GAAG,GAAG,GAAoB,EAAE,CACvC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,GAAG,GAAG,GAAoB,EAAE,CACvC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,MAAM,GAAG,GAAoB,EAAE,CAC1C,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAoB,EAAE,CACxC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,KAAK,GAAG,GAAoB,EAAE,CACzC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEpE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAoB,EAAE,CACxC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAoB,EAAE,CACxC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAoB,EAAE,CACxC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,GAAG,GAAG,GAAoB,EAAE,CACvC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,MAAM,GAAG,GAAoB,EAAE,CAC1C,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,MAAM,GAAG,GAAoB,EAAE,CAC1C,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAoB,EAAE,CACxC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,SAA0D,EAAmB,EAAE,CAClG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAE,OAAe,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,WAAW,SAAS,OAAO,CAAC,CAAC;AAExH;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9E,IAAI,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9E,QAAQ,EAAE,CAAC,QAA+B,EAAE,EAAE,CAC5C,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5E,QAAQ,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;CAC5E,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAAY,EACZ,SAA8C,EAC7B,EAAE;IACnB,MAAM,EAAE,GAAG,SAAS,YAAY,MAAM,CAAC,CAAC,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,kCAAkC;AAClC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,CAAC","sourcesContent":["/**\r\n * Top-level string format validators\r\n * Part of Zod 4 API parity implementation\r\n * Provides convenient validators for common string formats\r\n */\r\n\r\nimport { VldBase } from './base';\r\nimport { VldString } from './string';\r\nimport type { ParseResult } from './base';\r\n\r\n/**\r\n * Pre-compiled regex patterns for performance\r\n */\r\nconst REGEXES = {\r\n email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,\r\n uuidv4: /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\r\n uuidv6: /^[0-9a-f]{8}-[0-9a-f]{4}-6[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\r\n uuidv7: /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\r\n hostname: /^(?=.{1,253}$)(?:(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\\.)+[a-zA-Z]{2,63}$/,\r\n emoji: /^(?:\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F)(?:\\u200D(?:\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F))*$/u,\r\n base64: /^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=)?$/,\r\n base64url: /^[A-Za-z0-9_-]*$/,\r\n hex: /^[0-9a-fA-F]*$/,\r\n jwt: /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]*$/,\r\n nanoid: /^[A-Za-z0-9_-]{21}$/,\r\n cuid: /^c[^\\s-]{8,}$/i,\r\n cuid2: /^[0-9a-z]+$/,\r\n ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,\r\n 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]?)$/,\r\n ipv6: /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/,\r\n mac: /^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$/,\r\n cidrv4: /^(?:(?: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]?)\\/(?:3[0-2]|[12]?[0-9])$/,\r\n cidrv6: /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}\\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^(?:[0-9a-fA-F]{1,4}:){1,7}:\\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,\r\n e164: /^\\+[1-9]\\d{1,14}$/,\r\n isoDate: /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$/,\r\n isoTime: /^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?$/,\r\n isoDateTime: /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z?$/,\r\n md5: /^[a-f0-9]{32}$/i,\r\n sha1: /^[a-f0-9]{40}$/i,\r\n sha256: /^[a-f0-9]{64}$/i,\r\n sha384: /^[a-f0-9]{96}$/i,\r\n sha512: /^[a-f0-9]{128}$/i,\r\n} as const;\r\n\r\n/**\r\n * Generic string format validator\r\n */\r\nclass VldStringFormat extends VldBase<unknown, string> {\r\n public constructor(\r\n public readonly _format: string,\r\n public readonly _validator: (val: string) => boolean,\r\n public readonly _errorMessage?: string\r\n ) {\r\n super();\r\n }\r\n\r\n static create(\r\n format: string,\r\n validator: (val: string) => boolean,\r\n errorMessage?: string\r\n ): VldStringFormat {\r\n return new VldStringFormat(format, validator, errorMessage);\r\n }\r\n\r\n parse(value: unknown): string {\r\n const result = VldString.create().parse(value);\r\n\r\n if (!this._validator(result)) {\r\n throw new Error(\r\n this._errorMessage || `Invalid ${this._format} format`\r\n );\r\n }\r\n\r\n return result;\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<string> {\r\n const stringResult = VldString.create().safeParse(value);\r\n if (!stringResult.success) {\r\n return stringResult;\r\n }\r\n\r\n if (!this._validator(stringResult.data)) {\r\n return {\r\n success: false,\r\n error: new Error(\r\n this._errorMessage || `Invalid ${this._format} format`\r\n )\r\n };\r\n }\r\n\r\n return { success: true, data: stringResult.data };\r\n }\r\n}\r\n\r\n/**\r\n * Top-level string format validators\r\n */\r\nexport const email = (options?: { pattern?: RegExp }): VldStringFormat =>\r\n VldStringFormat.create('email', (val) => (options?.pattern ?? REGEXES.email).test(val));\r\n\r\nexport const uuid = (options?: { version?: 'v4' | 'v6' | 'v7' }): VldStringFormat => {\r\n const pattern = options?.version ? REGEXES[`uuid${options.version}`] : REGEXES.uuid;\r\n return VldStringFormat.create('uuid', (val) => pattern.test(val));\r\n};\r\n\r\nexport const uuidv4 = (): VldStringFormat =>\r\n VldStringFormat.create('uuid', (val) => REGEXES.uuidv4.test(val));\r\n\r\nexport const hostname = (): VldStringFormat =>\r\n VldStringFormat.create('hostname', (val) => REGEXES.hostname.test(val));\r\n\r\nexport const emoji = (): VldStringFormat =>\r\n VldStringFormat.create('emoji', (val) => REGEXES.emoji.test(val));\r\n\r\nexport const base64 = (): VldStringFormat =>\r\n VldStringFormat.create('base64', (val) => REGEXES.base64.test(val));\r\n\r\nexport const base64url = (): VldStringFormat =>\r\n VldStringFormat.create('base64url', (val) => REGEXES.base64url.test(val));\r\n\r\nexport const hex = (): VldStringFormat =>\r\n VldStringFormat.create('hex', (val) => REGEXES.hex.test(val));\r\n\r\nexport const jwt = (): VldStringFormat =>\r\n VldStringFormat.create('jwt', (val) => REGEXES.jwt.test(val));\r\n\r\nexport const nanoid = (): VldStringFormat =>\r\n VldStringFormat.create('nanoid', (val) => REGEXES.nanoid.test(val));\r\n\r\nexport const cuid = (): VldStringFormat =>\r\n VldStringFormat.create('cuid', (val) => REGEXES.cuid.test(val));\r\n\r\nexport const cuid2 = (): VldStringFormat =>\r\n VldStringFormat.create('cuid2', (val) => REGEXES.cuid2.test(val));\r\n\r\nexport const ulid = (): VldStringFormat =>\r\n VldStringFormat.create('ulid', (val) => REGEXES.ulid.test(val));\r\n\r\nexport const ipv4 = (): VldStringFormat =>\r\n VldStringFormat.create('ipv4', (val) => REGEXES.ipv4.test(val));\r\n\r\nexport const ipv6 = (): VldStringFormat =>\r\n VldStringFormat.create('ipv6', (val) => REGEXES.ipv6.test(val));\r\n\r\nexport const mac = (): VldStringFormat =>\r\n VldStringFormat.create('mac', (val) => REGEXES.mac.test(val));\r\n\r\nexport const cidrv4 = (): VldStringFormat =>\r\n VldStringFormat.create('cidrv4', (val) => REGEXES.cidrv4.test(val));\r\n\r\nexport const cidrv6 = (): VldStringFormat =>\r\n VldStringFormat.create('cidrv6', (val) => REGEXES.cidrv6.test(val));\r\n\r\nexport const e164 = (): VldStringFormat =>\r\n VldStringFormat.create('e164', (val) => REGEXES.e164.test(val));\r\n\r\nexport const hash = (algorithm: 'md5' | 'sha1' | 'sha256' | 'sha384' | 'sha512'): VldStringFormat =>\r\n VldStringFormat.create('hash', (val) => (REGEXES as any)[algorithm]?.test(val) ?? false, `Invalid ${algorithm} hash`);\r\n\r\n/**\r\n * ISO date/time validators\r\n */\r\nexport const iso = {\r\n date: () => VldStringFormat.create('date', (val) => REGEXES.isoDate.test(val)),\r\n time: () => VldStringFormat.create('time', (val) => REGEXES.isoTime.test(val)),\r\n dateTime: (_options?: { offset?: boolean }) =>\r\n VldStringFormat.create('datetime', (val) => REGEXES.isoDateTime.test(val)),\r\n duration: () => VldStringFormat.create('duration', (val) => /^P/.test(val)),\r\n};\r\n\r\n/**\r\n * Custom format validator\r\n */\r\nexport const stringFormat = (\r\n name: string,\r\n validator: ((val: string) => boolean) | RegExp\r\n): VldStringFormat => {\r\n const fn = validator instanceof RegExp ? (val: string) => validator.test(val) : validator;\r\n return VldStringFormat.create(name, fn);\r\n};\r\n\r\n// Export regexes for external use\r\nexport { REGEXES as regexes };\r\n"]}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { VldBase, ParseResult } from './base';
|
|
2
|
-
/**
|
|
3
|
-
* Ultra-optimized string validator with pre-compiled validations
|
|
4
|
-
*/
|
|
5
|
-
export declare class VldStringUltra extends VldBase<unknown, string> {
|
|
6
|
-
private readonly minLength?;
|
|
7
|
-
private readonly maxLength?;
|
|
8
|
-
private readonly exactLength?;
|
|
9
|
-
private readonly pattern?;
|
|
10
|
-
private readonly isEmail?;
|
|
11
|
-
private readonly isUrl?;
|
|
12
|
-
private readonly transform?;
|
|
13
|
-
private readonly customValidations;
|
|
14
|
-
private static readonly EMAIL_REGEX;
|
|
15
|
-
private static readonly URL_REGEX;
|
|
16
|
-
private constructor();
|
|
17
|
-
static create(): VldStringUltra;
|
|
18
|
-
/**
|
|
19
|
-
* Ultra-fast string validation with minimal overhead
|
|
20
|
-
*/
|
|
21
|
-
parse(value: unknown): string;
|
|
22
|
-
safeParse(value: unknown): ParseResult<string>;
|
|
23
|
-
min(length: number): VldStringUltra;
|
|
24
|
-
max(length: number): VldStringUltra;
|
|
25
|
-
length(length: number): VldStringUltra;
|
|
26
|
-
/**
|
|
27
|
-
* Ultra-fast email validation using simplified regex
|
|
28
|
-
*/
|
|
29
|
-
email(): VldStringUltra;
|
|
30
|
-
/**
|
|
31
|
-
* Ultra-fast URL validation
|
|
32
|
-
*/
|
|
33
|
-
url(): VldStringUltra;
|
|
34
|
-
/**
|
|
35
|
-
* Pattern matching with custom regex
|
|
36
|
-
*/
|
|
37
|
-
regex(pattern: RegExp): VldStringUltra;
|
|
38
|
-
/**
|
|
39
|
-
* Transform string after validation
|
|
40
|
-
*/
|
|
41
|
-
trim(): VldStringUltra;
|
|
42
|
-
toLowerCase(): VldStringUltra;
|
|
43
|
-
toUpperCase(): VldStringUltra;
|
|
44
|
-
nonempty(): VldStringUltra;
|
|
45
|
-
startsWith(prefix: string): VldStringUltra;
|
|
46
|
-
endsWith(suffix: string): VldStringUltra;
|
|
47
|
-
includes(substring: string): VldStringUltra;
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=string-ultra.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"string-ultra.d.ts","sourceRoot":"","sources":["../../src/validators/string-ultra.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,qBAAa,cAAe,SAAQ,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA4B;IACvD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyC;IAG3E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAgC;IAGnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAE1D,OAAO;IAmBP,MAAM,CAAC,MAAM,IAAI,cAAc;IAI/B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAwD7B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;IAS9C,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAYnC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAYnC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAYtC;;OAEG;IACH,KAAK,IAAI,cAAc;IAYvB;;OAEG;IACH,GAAG,IAAI,cAAc;IAYrB;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAYtC;;OAEG;IACH,IAAI,IAAI,cAAc;IAetB,WAAW,IAAI,cAAc;IAe7B,WAAW,IAAI,cAAc;IAe7B,QAAQ,IAAI,cAAc;IAI1B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAK1C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAKxC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc;CAI5C"}
|