@zipbul/baker 0.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/LICENSE +21 -0
- package/README.ko.md +448 -0
- package/README.md +448 -0
- package/dist/index-6pbm9cq6.js +15 -0
- package/dist/index-6pbm9cq6.js.map +17 -0
- package/dist/index-fww37qs9.js +5 -0
- package/dist/index-fww37qs9.js.map +20 -0
- package/dist/index-w36xamck.js +6 -0
- package/dist/index-w36xamck.js.map +10 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +145 -0
- package/dist/index.js.map +18 -0
- package/dist/src/aot/array.d.ts +7 -0
- package/dist/src/aot/common.d.ts +15 -0
- package/dist/src/aot/date.d.ts +3 -0
- package/dist/src/aot/index.d.ts +9 -0
- package/dist/src/aot/index.js +5 -0
- package/dist/src/aot/index.js.map +18 -0
- package/dist/src/aot/locales.d.ts +5 -0
- package/dist/src/aot/number.d.ts +6 -0
- package/dist/src/aot/object.d.ts +6 -0
- package/dist/src/aot/string.d.ts +72 -0
- package/dist/src/aot/transform.d.ts +25 -0
- package/dist/src/aot/typechecker.d.ts +10 -0
- package/dist/src/collect.d.ts +12 -0
- package/dist/src/create-rule.d.ts +31 -0
- package/dist/src/decorators/array.d.ts +13 -0
- package/dist/src/decorators/common.d.ts +33 -0
- package/dist/src/decorators/date.d.ts +5 -0
- package/dist/src/decorators/index.d.ts +11 -0
- package/dist/src/decorators/index.js +5 -0
- package/dist/src/decorators/index.js.map +9 -0
- package/dist/src/decorators/locales.d.ts +9 -0
- package/dist/src/decorators/number.d.ts +11 -0
- package/dist/src/decorators/object.d.ts +9 -0
- package/dist/src/decorators/string.d.ts +72 -0
- package/dist/src/decorators/transform.d.ts +68 -0
- package/dist/src/decorators/typechecker.d.ts +18 -0
- package/dist/src/errors.d.ts +37 -0
- package/dist/src/functions/deserialize.d.ts +8 -0
- package/dist/src/functions/index.d.ts +2 -0
- package/dist/src/functions/serialize.d.ts +8 -0
- package/dist/src/interfaces.d.ts +47 -0
- package/dist/src/registry.d.ts +16 -0
- package/dist/src/rules/array.d.ts +7 -0
- package/dist/src/rules/common.d.ts +7 -0
- package/dist/src/rules/date.d.ts +3 -0
- package/dist/src/rules/index.d.ts +11 -0
- package/dist/src/rules/index.js +5 -0
- package/dist/src/rules/index.js.map +9 -0
- package/dist/src/rules/locales.d.ts +5 -0
- package/dist/src/rules/number.d.ts +6 -0
- package/dist/src/rules/object.d.ts +7 -0
- package/dist/src/rules/string.d.ts +145 -0
- package/dist/src/rules/typechecker.d.ts +14 -0
- package/dist/src/seal/circular-analyzer.d.ts +13 -0
- package/dist/src/seal/deserialize-builder.d.ts +5 -0
- package/dist/src/seal/expose-validator.d.ts +11 -0
- package/dist/src/seal/index.d.ts +5 -0
- package/dist/src/seal/seal.d.ts +27 -0
- package/dist/src/seal/serialize-builder.d.ts +7 -0
- package/dist/src/symbols.d.ts +8 -0
- package/dist/src/symbols.js +5 -0
- package/dist/src/symbols.js.map +9 -0
- package/dist/src/types.d.ts +119 -0
- package/package.json +83 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/rules/common.ts", "../src/rules/typechecker.ts", "../src/rules/number.ts", "../src/rules/date.ts", "../src/rules/string.ts", "../src/rules/array.ts", "../src/rules/object.ts", "../src/rules/locales.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// equals — strict equality (===). refs로 비교값 전달 (§4.8 C)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function equals(comparison: unknown): EmittableRule {\n const fn = (value: unknown): boolean => value === comparison;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(comparison);\n return `if (${varName} !== _refs[${i}]) ${ctx.fail('equals')};`;\n };\n\n (fn as any).ruleName = 'equals';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// notEquals — strict inequality (!==). refs로 비교값 전달\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function notEquals(comparison: unknown): EmittableRule {\n const fn = (value: unknown): boolean => value !== comparison;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(comparison);\n return `if (${varName} === _refs[${i}]) ${ctx.fail('notEquals')};`;\n };\n\n (fn as any).ruleName = 'notEquals';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isEmpty — undefined | null | '' 만 empty로 취급 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isEmpty = (value: unknown): boolean =>\n value === undefined || value === null || value === '';\n\n(_isEmpty as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} !== undefined && ${varName} !== null && ${varName} !== '') ${ctx.fail('isEmpty')};`;\n\n(_isEmpty as any).ruleName = 'isEmpty';\n\nexport const isEmpty = _isEmpty as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isNotEmpty — undefined | null | '' 이외의 값 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isNotEmpty = (value: unknown): boolean =>\n value !== undefined && value !== null && value !== '';\n\n(_isNotEmpty as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} === undefined || ${varName} === null || ${varName} === '') ${ctx.fail('isNotEmpty')};`;\n\n(_isNotEmpty as any).ruleName = 'isNotEmpty';\n\nexport const isNotEmpty = _isNotEmpty as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isIn — 배열 내 포함 여부. refs로 배열 전달 (§4.8 C)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function isIn(array: unknown[]): EmittableRule {\n const fn = (value: unknown): boolean => array.indexOf(value) !== -1;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(array);\n return `if (_refs[${i}].indexOf(${varName}) === -1) ${ctx.fail('isIn')};`;\n };\n\n (fn as any).ruleName = 'isIn';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isNotIn — 배열 외 여부. refs로 배열 전달 (§4.8 C)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function isNotIn(array: unknown[]): EmittableRule {\n const fn = (value: unknown): boolean => array.indexOf(value) === -1;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(array);\n return `if (_refs[${i}].indexOf(${varName}) !== -1) ${ctx.fail('isNotIn')};`;\n };\n\n (fn as any).ruleName = 'isNotIn';\n\n return fn as EmittableRule;\n}\n",
|
|
6
|
+
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isString — typeof 체크 (§4.8 A: 연산자 인라인)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isString = (value: unknown): boolean => typeof value === 'string';\n\n(_isString as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (typeof ${varName} !== 'string') ${ctx.fail('isString')};`;\n\n(_isString as any).ruleName = 'isString';\n// requiresType은 undefined — 자체 typeof 포함 (§4.7)\n\nexport const isString = _isString as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isNumber — typeof + NaN/Infinity/maxDecimalPlaces 옵션 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface IsNumberOptions {\n allowNaN?: boolean;\n allowInfinity?: boolean;\n maxDecimalPlaces?: number;\n}\n\nexport function isNumber(options?: IsNumberOptions): EmittableRule {\n const allowNaN = options?.allowNaN ?? false;\n const allowInfinity = options?.allowInfinity ?? false;\n const maxDecimalPlaces = options?.maxDecimalPlaces;\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'number') return false;\n // NaN 먼저 체크 — isFinite(NaN)도 false이므로 순서가 중요\n if (isNaN(value)) return allowNaN;\n // NaN이 아닌 비유한수 (Infinity / -Infinity)\n if (!isFinite(value)) return allowInfinity;\n if (maxDecimalPlaces !== undefined) {\n const str = value.toString();\n const dotIdx = str.indexOf('.');\n if (dotIdx !== -1 && str.length - dotIdx - 1 > maxDecimalPlaces) return false;\n }\n return true;\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n let code = `if (typeof ${varName} !== 'number') ${ctx.fail('isNumber')};`;\n if (!allowNaN) {\n code += `\\nelse if (isNaN(${varName})) ${ctx.fail('isNumber')};`;\n }\n if (!allowInfinity) {\n // !isFinite 대신 명시적 Infinity 체크 — isNaN(NaN)=false지만 !isFinite(NaN)=true이므로 분리 필요\n code += `\\nelse if (${varName} === Infinity || ${varName} === -Infinity) ${ctx.fail('isNumber')};`;\n }\n if (maxDecimalPlaces !== undefined) {\n code += `\\nelse { var _s=${varName}.toString(); var _d=_s.indexOf('.'); if(_d!==-1&&_s.length-_d-1>${maxDecimalPlaces}) ${ctx.fail('isNumber')}; }`;\n }\n return code;\n };\n\n (fn as any).ruleName = 'isNumber';\n // requiresType은 undefined — 자체 typeof 포함\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isBoolean — typeof 체크 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isBoolean = (value: unknown): boolean => typeof value === 'boolean';\n\n(_isBoolean as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (typeof ${varName} !== 'boolean') ${ctx.fail('isBoolean')};`;\n\n(_isBoolean as any).ruleName = 'isBoolean';\n\nexport const isBoolean = _isBoolean as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isDate — instanceof Date + getTime() NaN 체크 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isDate = (value: unknown): boolean =>\n value instanceof Date && !isNaN((value as Date).getTime());\n\n(_isDate as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (!(${varName} instanceof Date) || isNaN(${varName}.getTime())) ${ctx.fail('isDate')};`;\n\n(_isDate as any).ruleName = 'isDate';\n\nexport const isDate = _isDate as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isEnum — factory: Object.values 배열로 indexOf 검사 (§4.8 C)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function isEnum(entity: object): EmittableRule {\n const values = Object.values(entity);\n\n const fn = (value: unknown): boolean => values.indexOf(value) !== -1;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(values);\n return `if (_refs[${i}].indexOf(${varName}) === -1) ${ctx.fail('isEnum')};`;\n };\n\n (fn as any).ruleName = 'isEnum';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isInt — typeof + Number.isInteger 체크 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isInt = (value: unknown): boolean =>\n typeof value === 'number' && Number.isInteger(value);\n\n(_isInt as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (typeof ${varName} !== 'number' || !Number.isInteger(${varName})) ${ctx.fail('isInt')};`;\n\n(_isInt as any).ruleName = 'isInt';\n\nexport const isInt = _isInt as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isArray — Array.isArray 체크 (§4.8 A: 연산자 인라인)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isArray = (value: unknown): boolean => Array.isArray(value);\n\n(_isArray as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (!Array.isArray(${varName})) ${ctx.fail('isArray')};`;\n\n(_isArray as any).ruleName = 'isArray';\n// requiresType은 undefined — 자체 Array.isArray 체크 포함\n\nexport const isArray = _isArray as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isObject — typeof object + non-null + non-array (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isObject = (value: unknown): boolean =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n(_isObject as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (typeof ${varName} !== 'object' || ${varName} === null || Array.isArray(${varName})) ${ctx.fail('isObject')};`;\n\n(_isObject as any).ruleName = 'isObject';\n// requiresType은 undefined — 자체 typeof + null + Array.isArray 체크 포함\n\nexport const isObject = _isObject as EmittableRule;\n",
|
|
7
|
+
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// min — v >= n 검사. requiresType='number' (§4.7, §4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function min(n: number): EmittableRule {\n const fn = (value: unknown): boolean => (value as number) >= n;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} < ${n}) ${ctx.fail('min')};`;\n\n (fn as any).ruleName = 'min';\n (fn as any).requiresType = 'number';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// max — v <= n 검사. requiresType='number' (§4.7, §4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function max(n: number): EmittableRule {\n const fn = (value: unknown): boolean => (value as number) <= n;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} > ${n}) ${ctx.fail('max')};`;\n\n (fn as any).ruleName = 'max';\n (fn as any).requiresType = 'number';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isPositive — v > 0 (0 포함 불가). requiresType='number' (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isPositive = (value: unknown): boolean => (value as number) > 0;\n\n(_isPositive as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} <= 0) ${ctx.fail('isPositive')};`;\n\n(_isPositive as any).ruleName = 'isPositive';\n(_isPositive as any).requiresType = 'number';\n\nexport const isPositive = _isPositive as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isNegative — v < 0 (0 포함 불가). requiresType='number' (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isNegative = (value: unknown): boolean => (value as number) < 0;\n\n(_isNegative as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} >= 0) ${ctx.fail('isNegative')};`;\n\n(_isNegative as any).ruleName = 'isNegative';\n(_isNegative as any).requiresType = 'number';\n\nexport const isNegative = _isNegative as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isDivisibleBy — v % n === 0 검사. requiresType='number' (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function isDivisibleBy(n: number): EmittableRule {\n const fn = (value: unknown): boolean => (value as number) % n === 0;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} % ${n} !== 0) ${ctx.fail('isDivisibleBy')};`;\n\n (fn as any).ruleName = 'isDivisibleBy';\n (fn as any).requiresType = 'number';\n\n return fn as EmittableRule;\n}\n",
|
|
8
|
+
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// minDate — v >= date (inclusive, getTime 비교). (§4.8 C — refs 함수 호출)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function minDate(date: Date): EmittableRule {\n const timestamp = date.getTime();\n\n const fn = (value: unknown): boolean =>\n value instanceof Date && value.getTime() >= timestamp;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(timestamp);\n return `if (!(${varName} instanceof Date) || ${varName}.getTime() < _refs[${i}]) ${ctx.fail('minDate')};`;\n };\n\n (fn as any).ruleName = 'minDate';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// maxDate — v <= date (inclusive, getTime 비교). (§4.8 C — refs 함수 호출)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function maxDate(date: Date): EmittableRule {\n const timestamp = date.getTime();\n\n const fn = (value: unknown): boolean =>\n value instanceof Date && value.getTime() <= timestamp;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(timestamp);\n return `if (!(${varName} instanceof Date) || ${varName}.getTime() > _refs[${i}]) ${ctx.fail('maxDate')};`;\n };\n\n (fn as any).ruleName = 'maxDate';\n\n return fn as EmittableRule;\n}\n",
|
|
9
|
+
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction makeStringRule(\n name: string,\n validate: (v: string) => boolean,\n buildEmit: (varName: string, ctx: EmitContext) => string,\n requiresType: 'string' | undefined = 'string',\n): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return validate(value);\n };\n (fn as any).emit = buildEmit;\n (fn as any).ruleName = name;\n if (requiresType !== undefined) (fn as any).requiresType = requiresType;\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group A: Length / Range\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function minLength(min: number): EmittableRule {\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && value.length >= min;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length < ${min}) ${ctx.fail('minLength')};`;\n (fn as any).ruleName = 'minLength';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\nexport function maxLength(max: number): EmittableRule {\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && value.length <= max;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length > ${max}) ${ctx.fail('maxLength')};`;\n (fn as any).ruleName = 'maxLength';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\nexport function length(minLen: number, maxLen: number): EmittableRule {\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && value.length >= minLen && value.length <= maxLen;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length < ${minLen} || ${varName}.length > ${maxLen}) ${ctx.fail('length')};`;\n (fn as any).ruleName = 'length';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\nexport function contains(seed: string): EmittableRule {\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && value.includes(seed);\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(seed);\n return `if (${varName}.indexOf(_refs[${i}]) === -1) ${ctx.fail('contains')};`;\n };\n (fn as any).ruleName = 'contains';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\nexport function notContains(seed: string): EmittableRule {\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && !value.includes(seed);\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(seed);\n return `if (${varName}.indexOf(_refs[${i}]) !== -1) ${ctx.fail('notContains')};`;\n };\n (fn as any).ruleName = 'notContains';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\nexport function matches(pattern: string | RegExp, modifiers?: string): EmittableRule {\n const re = pattern instanceof RegExp ? pattern : new RegExp(pattern, modifiers);\n\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && re.test(value);\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('matches')};`;\n };\n (fn as any).ruleName = 'matches';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group B: Simple Boolean Checks\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isLowercase = (value: unknown): boolean =>\n typeof value === 'string' && value === value.toLowerCase();\n\n(_isLowercase as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} !== ${varName}.toLowerCase()) ${ctx.fail('isLowercase')};`;\n(_isLowercase as any).ruleName = 'isLowercase';\n(_isLowercase as any).requiresType = 'string';\nexport const isLowercase = _isLowercase as EmittableRule;\n\nconst _isUppercase = (value: unknown): boolean =>\n typeof value === 'string' && value === value.toUpperCase();\n\n(_isUppercase as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} !== ${varName}.toUpperCase()) ${ctx.fail('isUppercase')};`;\n(_isUppercase as any).ruleName = 'isUppercase';\n(_isUppercase as any).requiresType = 'string';\nexport const isUppercase = _isUppercase as EmittableRule;\n\n// ASCII: all code points in [0x00, 0x7F]\nconst ASCII_RE = /^[\\x00-\\x7F]*$/;\nexport const isAscii = makeStringRule(\n 'isAscii',\n (v) => ASCII_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(ASCII_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isAscii')};`;\n },\n);\n\n// Alpha — default en-US locale singleton that also acts as factory\n// Usage: isAlpha('HelloWorld') → boolean OR isAlpha() → EmittableRule\nconst ALPHA_DEFAULT_RE = /^[a-zA-Z]+$/;\n\nfunction _alphaValidate(value: unknown): boolean {\n return typeof value === 'string' && value.length > 0 && ALPHA_DEFAULT_RE.test(value);\n}\n\n// The exported symbol is itself an EmittableRule (validates with default en-US)\n// but when called with no arguments returns itself (for factory-like usage)\nconst _isAlpha = function isAlpha(value?: unknown): boolean | EmittableRule {\n if (value === undefined) return isAlpha as unknown as EmittableRule;\n return _alphaValidate(value);\n} as unknown as EmittableRule;\n\n(_isAlpha as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRegex(ALPHA_DEFAULT_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isAlpha')};`;\n};\n(_isAlpha as any).ruleName = 'isAlpha';\n(_isAlpha as any).requiresType = 'string';\nexport const isAlpha = _isAlpha;\n\n// Alphanumeric — same dual pattern\nconst ALNUM_DEFAULT_RE = /^[a-zA-Z0-9]+$/;\n\nfunction _alnumValidate(value: unknown): boolean {\n return typeof value === 'string' && value.length > 0 && ALNUM_DEFAULT_RE.test(value);\n}\n\nconst _isAlphanumeric = function isAlphanumeric(value?: unknown): boolean | EmittableRule {\n if (value === undefined) return isAlphanumeric as unknown as EmittableRule;\n return _alnumValidate(value);\n} as unknown as EmittableRule;\n\n(_isAlphanumeric as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRegex(ALNUM_DEFAULT_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isAlphanumeric')};`;\n};\n(_isAlphanumeric as any).ruleName = 'isAlphanumeric';\n(_isAlphanumeric as any).requiresType = 'string';\nexport const isAlphanumeric = _isAlphanumeric;\n\n// BooleanString: 'true' | 'false' | '1' | '0'\nconst _isBooleanString = (value: unknown): boolean =>\n value === 'true' || value === 'false' || value === '1' || value === '0';\n\n(_isBooleanString as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} !== 'true' && ${varName} !== 'false' && ${varName} !== '1' && ${varName} !== '0') ${ctx.fail('isBooleanString')};`;\n(_isBooleanString as any).ruleName = 'isBooleanString';\n(_isBooleanString as any).requiresType = 'string';\nexport const isBooleanString = _isBooleanString as EmittableRule;\n\nexport interface IsNumberStringOptions {\n no_symbols?: boolean;\n}\n\nexport function isNumberString(options?: IsNumberStringOptions): EmittableRule {\n return makeStringRule(\n 'isNumberString',\n (v) => {\n if (v.length === 0) return false;\n const n = Number(v);\n return !isNaN(n) && isFinite(n);\n },\n (varName, ctx) => {\n // emit: ref-based (Number() conversion + NaN/Infinity check)\n const checkFn = (s: string): boolean => {\n if (s.length === 0) return false;\n const n = Number(s);\n return !isNaN(n) && isFinite(n);\n };\n const i = ctx.addRef(checkFn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isNumberString')};`;\n },\n );\n}\n\nexport interface IsDecimalOptions {\n decimal_digits?: string;\n force_decimal?: boolean;\n locale?: string;\n}\n\nexport function isDecimal(options?: IsDecimalOptions): EmittableRule {\n const decimalRe = /^[-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)$/;\n return makeStringRule(\n 'isDecimal',\n (v) => decimalRe.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(decimalRe);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isDecimal')};`;\n },\n );\n}\n\n// Full-width characters (Unicode fullwidth forms)\nconst FULLWIDTH_RE = /[^\\u0020-\\u007E\\uFF61-\\uFF9F]/;\nexport const isFullWidth = makeStringRule(\n 'isFullWidth',\n (v) => v.length > 0 && FULLWIDTH_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(FULLWIDTH_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isFullWidth')};`;\n },\n);\n\n// Half-width characters\nconst HALFWIDTH_RE = /[\\u0020-\\u007E\\uFF61-\\uFF9F]/;\nexport const isHalfWidth = makeStringRule(\n 'isHalfWidth',\n (v) => v.length > 0 && HALFWIDTH_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(HALFWIDTH_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isHalfWidth')};`;\n },\n);\n\n// Variable-width: must contain both full-width AND half-width\nexport const isVariableWidth = makeStringRule(\n 'isVariableWidth',\n (v) => FULLWIDTH_RE.test(v) && HALFWIDTH_RE.test(v),\n (varName, ctx) => {\n const i1 = ctx.addRegex(FULLWIDTH_RE);\n const i2 = ctx.addRegex(HALFWIDTH_RE);\n return `if (!_re[${i1}].test(${varName}) || !_re[${i2}].test(${varName})) ${ctx.fail('isVariableWidth')};`;\n },\n);\n\n// Multibyte: any character outside Latin-1 / half-width range\nconst MULTIBYTE_RE = /[^\\x00-\\xFF]/;\nexport const isMultibyte = makeStringRule(\n 'isMultibyte',\n (v) => v.length > 0 && MULTIBYTE_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(MULTIBYTE_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isMultibyte')};`;\n },\n);\n\n// Surrogate pairs\nconst SURROGATE_RE = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/;\nexport const isSurrogatePair = makeStringRule(\n 'isSurrogatePair',\n (v) => v.length > 0 && SURROGATE_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(SURROGATE_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isSurrogatePair')};`;\n },\n);\n\n// Hexadecimal\nconst HEX_RE = /^[0-9a-fA-F]+$/;\nexport const isHexadecimal = makeStringRule(\n 'isHexadecimal',\n (v) => HEX_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(HEX_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isHexadecimal')};`;\n },\n);\n\n// Octal\nconst OCTAL_RE = /^(0[oO])?[0-7]+$/;\nexport const isOctal = makeStringRule(\n 'isOctal',\n (v) => v.length > 0 && OCTAL_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(OCTAL_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isOctal')};`;\n },\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group C: Regex-based\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Email — RFC 5322 simplified\nexport interface IsEmailOptions {\n allow_display_name?: boolean;\n allow_utf8_local_part?: boolean;\n require_tld?: boolean;\n}\n\nconst EMAIL_RE = /^[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])?)*\\.[a-zA-Z]{2,}$/;\n\nexport function isEmail(_options?: IsEmailOptions): EmittableRule {\n return makeStringRule(\n 'isEmail',\n (v) => EMAIL_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(EMAIL_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isEmail')};`;\n },\n );\n}\n\n// URL — RFC 3986 simplified\nexport interface IsURLOptions {\n protocols?: string[];\n require_tld?: boolean;\n require_protocol?: boolean;\n allow_underscores?: boolean;\n allow_trailing_dot?: boolean;\n allow_protocol_relative_urls?: boolean;\n}\n\nconst URL_PROTOCOLS_DEFAULT = ['http', 'https', 'ftp'];\n\nexport function isURL(options?: IsURLOptions): EmittableRule {\n const protocols = options?.protocols ?? URL_PROTOCOLS_DEFAULT;\n const protocolPattern = protocols.map(p => p.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|');\n const re = new RegExp(\n `^(?:${protocolPattern}):\\\\/\\\\/(?:[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])?)*)(?::\\\\d{1,5})?(?:\\\\/[^\\\\s]*)?$`,\n );\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string' || value.length === 0) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isURL')};`;\n };\n (fn as any).ruleName = 'isURL';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// UUID\nconst UUID_RE: Record<string | number, RegExp> = {\n all: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/,\n 1: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-1[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,\n 2: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-2[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,\n 3: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-3[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,\n 4: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,\n 5: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-5[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,\n};\n\nexport function isUUID(version?: 1 | 2 | 3 | 4 | 5 | 'all'): EmittableRule {\n const re = (version != null ? (UUID_RE[version] ?? UUID_RE.all) : UUID_RE.all)!;\n return makeStringRule(\n 'isUUID',\n (v) => re.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isUUID')};`;\n },\n );\n}\n\n// IP\nconst IPV4_RE = /^(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)$/;\nconst IPV6_RE = /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[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}$|^::$|^::1$|^::(?:ffff(?::0{1,4})?:)?(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^(?:[0-9a-fA-F]{1,4}:){1,4}:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/;\n\nexport function isIP(version?: 4 | 6): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (version === 4) return IPV4_RE.test(value);\n if (version === 6) return IPV6_RE.test(value);\n return IPV4_RE.test(value) || IPV6_RE.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (version === 4) {\n const i = ctx.addRegex(IPV4_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isIP')};`;\n }\n if (version === 6) {\n const i = ctx.addRegex(IPV6_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isIP')};`;\n }\n const i4 = ctx.addRegex(IPV4_RE);\n const i6 = ctx.addRegex(IPV6_RE);\n return `if (!_re[${i4}].test(${varName}) && !_re[${i6}].test(${varName})) ${ctx.fail('isIP')};`;\n };\n (fn as any).ruleName = 'isIP';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// HexColor: #RGB or #RRGGBB\nconst HEX_COLOR_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\nexport const isHexColor = makeStringRule(\n 'isHexColor',\n (v) => HEX_COLOR_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(HEX_COLOR_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isHexColor')};`;\n },\n);\n\n// RgbColor\nconst RGB_RE = /^rgb\\(\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*\\)$/;\nconst RGBA_RE = /^rgba\\(\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(0|0?\\.\\d+|1(\\.0+)?)\\s*\\)$/;\nconst RGB_PERCENT_RE = /^rgba?\\(\\s*(\\d{1,2}|100)%\\s*,\\s*(\\d{1,2}|100)%\\s*,\\s*(\\d{1,2}|100)%(?:\\s*,\\s*(0|0?\\.\\d+|1(?:\\.0+)?))?\\s*\\)$/;\n\nexport function isRgbColor(includePercentValues: boolean = false): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (includePercentValues) return RGB_PERCENT_RE.test(value);\n return RGB_RE.test(value) || RGBA_RE.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (includePercentValues) {\n const i = ctx.addRegex(RGB_PERCENT_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isRgbColor')};`;\n }\n const i1 = ctx.addRegex(RGB_RE);\n const i2 = ctx.addRegex(RGBA_RE);\n return `if (!_re[${i1}].test(${varName}) && !_re[${i2}].test(${varName})) ${ctx.fail('isRgbColor')};`;\n };\n (fn as any).ruleName = 'isRgbColor';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// HSL: hsl(H, S%, L%) or hsla(H, S%, L%, A)\nconst HSL_RE = /^hsla?\\(\\s*(360|3[0-5]\\d|[12]\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(100|[1-9]\\d|\\d)%\\s*,\\s*(100|[1-9]\\d|\\d)%(?:\\s*,\\s*(0|0?\\.\\d+|1(?:\\.0+)?))?\\s*\\)$/;\nexport const isHSL = makeStringRule(\n 'isHSL',\n (v) => HSL_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(HSL_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isHSL')};`;\n },\n);\n\n// MAC Address\nexport interface IsMACAddressOptions {\n no_separators?: boolean;\n}\n\nconst MAC_COLON_RE = /^[0-9a-fA-F]{2}(?::[0-9a-fA-F]{2}){5}$/;\nconst MAC_HYPHEN_RE = /^[0-9a-fA-F]{2}(?:-[0-9a-fA-F]{2}){5}$/;\nconst MAC_NO_SEP_RE = /^[0-9a-fA-F]{12}$/;\n\nexport function isMACAddress(options?: IsMACAddressOptions): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (options?.no_separators) return MAC_NO_SEP_RE.test(value);\n return MAC_COLON_RE.test(value) || MAC_HYPHEN_RE.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (options?.no_separators) {\n const i = ctx.addRegex(MAC_NO_SEP_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMACAddress')};`;\n }\n const i1 = ctx.addRegex(MAC_COLON_RE);\n const i2 = ctx.addRegex(MAC_HYPHEN_RE);\n return `if (!_re[${i1}].test(${varName}) && !_re[${i2}].test(${varName})) ${ctx.fail('isMACAddress')};`;\n };\n (fn as any).ruleName = 'isMACAddress';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// ISBN\nfunction _validateISBN10(str: string): boolean {\n const s = str.replace(/[-\\s]/g, '');\n if (!/^\\d{9}[\\dX]$/.test(s)) return false;\n let sum = 0;\n for (let i = 0; i < 9; i++) sum += (10 - i) * (s.charCodeAt(i) - 48);\n const last = s[9] === 'X' ? 10 : (s.charCodeAt(9) - 48);\n sum += last;\n return sum % 11 === 0;\n}\n\nfunction _validateISBN13(str: string): boolean {\n const s = str.replace(/[-\\s]/g, '');\n if (!/^\\d{13}$/.test(s)) return false;\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n sum += (s.charCodeAt(i) - 48) * (i % 2 === 0 ? 1 : 3);\n }\n const check = (10 - (sum % 10)) % 10;\n return check === (s.charCodeAt(12) - 48);\n}\n\nexport function isISBN(version?: 10 | 13): EmittableRule {\n const validateFn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (version === 10) return _validateISBN10(value);\n if (version === 13) return _validateISBN13(value);\n return _validateISBN10(value) || _validateISBN13(value);\n };\n\n (validateFn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(validateFn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isISBN')};`;\n };\n (validateFn as any).ruleName = 'isISBN';\n (validateFn as any).requiresType = 'string';\n\n return validateFn as EmittableRule;\n}\n\n// ISIN — ISO 6166\nconst ISIN_RE = /^[A-Z]{2}[A-Z0-9]{9}[0-9]$/;\n\nfunction _validateISINStr(v: string): boolean {\n if (!ISIN_RE.test(v)) return false;\n // Luhn mod10 on expanded digits\n const expanded = v\n .split('')\n .map((c) => {\n const code = c.charCodeAt(0);\n return code >= 65 ? String(code - 55) : c;\n })\n .join('');\n let sum = 0;\n let alternate = false;\n for (let i = expanded.length - 1; i >= 0; i--) {\n let n = parseInt(expanded[i]!, 10);\n if (alternate) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alternate = !alternate;\n }\n return sum % 10 === 0;\n}\n\nexport const isISIN = makeStringRule(\n 'isISIN',\n _validateISINStr,\n (varName, ctx) => {\n const i = ctx.addRef(_validateISINStr);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isISIN')};`;\n },\n);\n\n// ISO 8601\nconst ISO8601_RE = /^\\d{4}(?:-\\d{2}(?:-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:?\\d{2})?)?)?)?$/;\n\nexport interface IsISO8601Options {\n strict?: boolean;\n}\n\n// Strict ISO8601: requires month/day to be valid values\nfunction _validateISO8601Strict(v: string): boolean {\n if (!ISO8601_RE.test(v)) return false;\n // Extract date components if present\n const m = v.match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\n if (!m) return true; // year-only or year-month partial — still ok per regex\n const month = Number(m[2]);\n const day = Number(m[3]);\n if (month < 1 || month > 12) return false;\n const maxDay = new Date(Number(m[1]), month, 0).getDate();\n return day >= 1 && day <= maxDay;\n}\n\nexport function isISO8601(options?: IsISO8601Options): EmittableRule {\n if (options?.strict) {\n // strict: validate and emit use the same function ref to stay in sync\n const fn = (v: unknown): boolean => {\n if (typeof v !== 'string') return false;\n return _validateISO8601Strict(v);\n };\n (fn as any).ruleName = 'isISO8601';\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(fn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isISO8601')};`;\n };\n return fn as unknown as EmittableRule;\n }\n // non-strict: both validate and emit use same ISO8601_RE\n return makeStringRule(\n 'isISO8601',\n (v) => ISO8601_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(ISO8601_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isISO8601')};`;\n },\n );\n}\n\n// ISRC — ISO 3901\nconst ISRC_RE = /^[A-Z]{2}-[A-Z0-9]{3}-\\d{2}-\\d{5}$|^[A-Z]{2}[A-Z0-9]{3}\\d{7}$/;\nexport const isISRC = makeStringRule(\n 'isISRC',\n (v) => ISRC_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(ISRC_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isISRC')};`;\n },\n);\n\n// ISSN\nexport interface IsISSNOptions {\n case_sensitive?: boolean;\n requireHyphen?: boolean;\n}\n\nfunction _validateISSN(value: string, options?: IsISSNOptions): boolean {\n const requireHyphen = options?.requireHyphen !== false;\n const s = requireHyphen ? value : value.replace(/-/g, '');\n // Format with hyphen: NNNN-NNNX, without: NNNNNNXX\n const re = requireHyphen ? /^\\d{4}-\\d{3}[\\dX]$/ : /^\\d{7}[\\dX]$/;\n if (!re.test(s)) return false;\n const digits = s.replace(/-/g, '');\n let sum = 0;\n for (let i = 0; i < 7; i++) {\n sum += (8 - i) * (digits.charCodeAt(i) - 48);\n }\n const last = digits[7] === 'X' ? 10 : (digits.charCodeAt(7) - 48);\n sum += last;\n return sum % 11 === 0;\n}\n\nexport function isISSN(options?: IsISSNOptions): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return _validateISSN(value, options);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(fn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isISSN')};`;\n };\n (fn as any).ruleName = 'isISSN';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// JWT — 3-part dot-separated base64url\nconst JWT_RE = /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/;\nexport const isJWT = makeStringRule(\n 'isJWT',\n (v) => JWT_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(JWT_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isJWT')};`;\n },\n);\n\n// LatLong\nexport interface IsLatLongOptions {\n checkDMS?: boolean;\n}\n\nconst LAT_LONG_RE = /^[-+]?([1-8]?\\d(?:\\.\\d+)?|90(?:\\.0+)?),\\s*[-+]?(180(?:\\.0+)?|1[0-7]\\d(?:\\.\\d+)?|\\d{1,2}(?:\\.\\d+)?)$/;\n\nexport function isLatLong(options?: IsLatLongOptions): EmittableRule {\n return makeStringRule(\n 'isLatLong',\n (v) => LAT_LONG_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(LAT_LONG_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isLatLong')};`;\n },\n );\n}\n\n// Locale — BCP 47 simplified\nconst LOCALE_RE = /^[a-zA-Z]{2,3}(?:-[a-zA-Z]{4})?(?:-(?:[a-zA-Z]{2}|\\d{3}))?(?:-[a-zA-Z\\d]{5,8})*$/;\nexport const isLocale = makeStringRule(\n 'isLocale',\n (v) => LOCALE_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(LOCALE_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isLocale')};`;\n },\n);\n\n// DataURI\nconst DATA_URI_RE = /^data:([a-zA-Z0-9!#$&\\-^_]+\\/[a-zA-Z0-9!#$&\\-^_]+)(?:;[a-zA-Z0-9\\-]+=[a-zA-Z0-9\\-]+)*(?:;base64)?,[\\s\\S]*$/;\nexport const isDataURI = makeStringRule(\n 'isDataURI',\n (v) => DATA_URI_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(DATA_URI_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isDataURI')};`;\n },\n);\n\n// FQDN\nexport interface IsFQDNOptions {\n require_tld?: boolean;\n allow_underscores?: boolean;\n allow_trailing_dot?: boolean;\n}\n\nexport function isFQDN(options?: IsFQDNOptions): EmittableRule {\n const requireTld = options?.require_tld !== false;\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n let str = value;\n if (options?.allow_trailing_dot && str.endsWith('.')) str = str.slice(0, -1);\n if (str.length === 0) return false;\n const parts = str.split('.');\n // Must have at least 2 parts (host + tld) when requireTld is true\n if (requireTld && parts.length < 2) return false;\n if (requireTld) {\n const tld = parts[parts.length - 1];\n if (!tld || tld.length < 2 || !/^[a-zA-Z]{2,}$/.test(tld)) return false;\n }\n return parts.every((part) => {\n if (part.length === 0 || part.length > 63) return false;\n if (options?.allow_underscores) return /^[a-zA-Z0-9_-]+$/.test(part);\n return /^[a-zA-Z0-9-]+$/.test(part) && !part.startsWith('-') && !part.endsWith('-');\n });\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(fn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isFQDN')};`;\n };\n (fn as any).ruleName = 'isFQDN';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// Port — 0 to 65535\nconst PORT_RE = /^(?:6553[0-5]|655[0-2]\\d|65[0-4]\\d{2}|6[0-4]\\d{3}|[1-5]\\d{4}|[1-9]\\d{1,3}|\\d)$/;\nexport const isPort = makeStringRule(\n 'isPort',\n (v) => PORT_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(PORT_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isPort')};`;\n },\n);\n\n// EAN (EAN-8 and EAN-13 with checksum)\nfunction _validateEAN(value: string): boolean {\n if (!/^\\d{8}$/.test(value) && !/^\\d{13}$/.test(value)) return false;\n const digits = value.split('').map(Number);\n const len = digits.length;\n let sum = 0;\n for (let i = 0; i < len - 1; i++) {\n sum += digits[i]! * (len === 8 ? (i % 2 === 0 ? 3 : 1) : (i % 2 === 0 ? 1 : 3));\n }\n const check = (10 - (sum % 10)) % 10;\n return check === digits[len - 1]!;\n}\n\nexport const isEAN = makeStringRule(\n 'isEAN',\n _validateEAN,\n (varName, ctx) => {\n const i = ctx.addRef(_validateEAN);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isEAN')};`;\n },\n);\n\n// ISO 3166-1 Alpha-2\nconst ISO31661A2_CODES = new Set([\n 'AD','AE','AF','AG','AI','AL','AM','AO','AQ','AR','AS','AT','AU','AW','AX','AZ',\n 'BA','BB','BD','BE','BF','BG','BH','BI','BJ','BL','BM','BN','BO','BQ','BR','BS','BT','BV','BW','BY','BZ',\n 'CA','CC','CD','CF','CG','CH','CI','CK','CL','CM','CN','CO','CR','CU','CV','CW','CX','CY','CZ',\n 'DE','DJ','DK','DM','DO','DZ','EC','EE','EG','EH','ER','ES','ET',\n 'FI','FJ','FK','FM','FO','FR','GA','GB','GD','GE','GF','GG','GH','GI','GL','GM','GN','GP','GQ','GR','GS','GT','GU','GW','GY',\n 'HK','HM','HN','HR','HT','HU','ID','IE','IL','IM','IN','IO','IQ','IR','IS','IT',\n 'JE','JM','JO','JP','KE','KG','KH','KI','KM','KN','KP','KR','KW','KY','KZ',\n 'LA','LB','LC','LI','LK','LR','LS','LT','LU','LV','LY',\n 'MA','MC','MD','ME','MF','MG','MH','MK','ML','MM','MN','MO','MP','MQ','MR','MS','MT','MU','MV','MW','MX','MY','MZ',\n 'NA','NC','NE','NF','NG','NI','NL','NO','NP','NR','NU','NZ',\n 'OM','PA','PE','PF','PG','PH','PK','PL','PM','PN','PR','PS','PT','PW','PY',\n 'QA','RE','RO','RS','RU','RW',\n 'SA','SB','SC','SD','SE','SG','SH','SI','SJ','SK','SL','SM','SN','SO','SR','SS','ST','SV','SX','SY','SZ',\n 'TC','TD','TF','TG','TH','TJ','TK','TL','TM','TN','TO','TR','TT','TV','TW','TZ',\n 'UA','UG','UM','US','UY','UZ','VA','VC','VE','VG','VI','VN','VU',\n 'WF','WS','YE','YT','ZA','ZM','ZW',\n]);\n\nconst _isISO31661Alpha2 = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return ISO31661A2_CODES.has(value.toUpperCase());\n};\n\n(_isISO31661Alpha2 as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(ISO31661A2_CODES);\n return `if (!_refs[${i}].has(${varName}.toUpperCase())) ${ctx.fail('isISO31661Alpha2')};`;\n};\n(_isISO31661Alpha2 as any).ruleName = 'isISO31661Alpha2';\n(_isISO31661Alpha2 as any).requiresType = 'string';\nexport const isISO31661Alpha2 = _isISO31661Alpha2 as EmittableRule;\n\n// ISO 3166-1 Alpha-3\nconst ISO31661A3_CODES = new Set([\n 'ABW','AFG','AGO','AIA','ALA','ALB','AND','ANT','ARE','ARG','ARM','ASM','ATA','ATF','ATG','AUS','AUT','AZE',\n 'BDI','BEL','BEN','BES','BFA','BGD','BGR','BHR','BHS','BIH','BLM','BLR','BLZ','BMU','BOL','BRA','BRB','BRN','BTN','BVT','BWA',\n 'CAF','CAN','CCK','CHE','CHL','CHN','CIV','CMR','COD','COG','COK','COL','COM','CPV','CRI','CUB','CUW','CXR','CYM','CYP','CZE',\n 'DEU','DJI','DMA','DNK','DOM','DZA','ECU','EGY','ERI','ESH','ESP','EST','ETH',\n 'FIN','FJI','FLK','FRA','FRO','FSM','GAB','GBR','GEO','GGY','GHA','GIB','GIN','GLP','GMB','GNB','GNQ','GRC','GRD','GRL','GTM','GUF','GUM','GUY',\n 'HKG','HMD','HND','HRV','HTI','HUN','IDN','IMN','IND','IOT','IRL','IRN','IRQ','ISL','ISR','ITA',\n 'JAM','JEY','JOR','JPN','KAZ','KEN','KGZ','KHM','KIR','KNA','KOR','KWT',\n 'LAO','LBN','LBR','LBY','LCA','LIE','LKA','LSO','LTU','LUX','LVA',\n 'MAC','MAF','MAR','MCO','MDA','MDG','MDV','MEX','MHL','MKD','MLI','MLT','MMR','MNE','MNG','MNP','MOZ','MRT','MSR','MTQ','MUS','MWI','MYS','MYT',\n 'NAM','NCL','NER','NFK','NGA','NIC','NIU','NLD','NOR','NPL','NRU','NZL',\n 'OMN','PAK','PAN','PCN','PER','PHL','PLW','PNG','POL','PRI','PRK','PRT','PRY','PSE','PYF',\n 'QAT','REU','ROU','RUS','RWA',\n 'SAU','SDN','SEN','SGP','SGS','SHN','SJM','SLB','SLE','SLV','SMR','SOM','SPM','SRB','SSD','STP','SUR','SVK','SVN','SWE','SWZ','SXM','SYC','SYR',\n 'TCA','TCD','TGO','THA','TJK','TKL','TKM','TLS','TON','TTO','TUN','TUR','TUV','TWN','TZA',\n 'UGA','UKR','UMI','URY','USA','UZB','VAT','VCT','VEN','VGB','VIR','VNM','VUT',\n 'WLF','WSM','YEM','ZAF','ZMB','ZWE',\n]);\n\nconst _isISO31661Alpha3 = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return ISO31661A3_CODES.has(value.toUpperCase());\n};\n\n(_isISO31661Alpha3 as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(ISO31661A3_CODES);\n return `if (!_refs[${i}].has(${varName}.toUpperCase())) ${ctx.fail('isISO31661Alpha3')};`;\n};\n(_isISO31661Alpha3 as any).ruleName = 'isISO31661Alpha3';\n(_isISO31661Alpha3 as any).requiresType = 'string';\nexport const isISO31661Alpha3 = _isISO31661Alpha3 as EmittableRule;\n\n// BIC / SWIFT code\nconst BIC_RE = /^[A-Z]{6}[A-Z0-9]{2}(?:[A-Z0-9]{3})?$/;\nexport const isBIC = makeStringRule(\n 'isBIC',\n (v) => BIC_RE.test(v.toUpperCase()),\n (varName, ctx) => {\n const i = ctx.addRegex(BIC_RE);\n return `if (!_re[${i}].test(${varName}.toUpperCase())) ${ctx.fail('isBIC')};`;\n },\n);\n\n// Firebase Push ID — 20 chars, base64url charset (-0-9A-Za-z_)\nconst FIREBASE_RE = /^[a-zA-Z0-9_-]{20}$/;\nexport const isFirebasePushId = makeStringRule(\n 'isFirebasePushId',\n (v) => FIREBASE_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(FIREBASE_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isFirebasePushId')};`;\n },\n);\n\n// SemVer — Semantic Versioning 2.0\nconst SEMVER_RE = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\nexport const isSemVer = makeStringRule(\n 'isSemVer',\n (v) => SEMVER_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(SEMVER_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isSemVer')};`;\n },\n);\n\n// MongoDB ObjectId — 24-char hex\nconst MONGO_ID_RE = /^[0-9a-fA-F]{24}$/;\nexport const isMongoId = makeStringRule(\n 'isMongoId',\n (v) => MONGO_ID_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(MONGO_ID_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMongoId')};`;\n },\n);\n\n// JSON\nconst _isJSON = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n};\n\n(_isJSON as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef((s: string) => {\n try { JSON.parse(s); return true; } catch { return false; }\n });\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isJSON')};`;\n};\n(_isJSON as any).ruleName = 'isJSON';\n(_isJSON as any).requiresType = 'string';\nexport const isJSON = _isJSON as EmittableRule;\n\n// Base32\nconst BASE32_RE = /^[A-Z2-7]+=*$/i;\nconst BASE32_HEX_RE = /^[0-9A-V]+=*$/i;\n\nexport interface IsBase32Options {\n crockford?: boolean;\n}\n\nexport function isBase32(options?: IsBase32Options): EmittableRule {\n const re = BASE32_RE;\n return makeStringRule(\n 'isBase32',\n (v) => {\n if (v.length === 0) return false;\n if (v.length % 8 !== 0) return false;\n return re.test(v);\n },\n (varName, ctx) => {\n const i = ctx.addRegex(re);\n return `if (${varName}.length === 0 || ${varName}.length % 8 !== 0 || !_re[${i}].test(${varName})) ${ctx.fail('isBase32')};`;\n },\n );\n}\n\n// Base58\nconst BASE58_RE = /^[1-9A-HJ-NP-Za-km-z]+$/;\nexport const isBase58 = makeStringRule(\n 'isBase58',\n (v) => BASE58_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(BASE58_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isBase58')};`;\n },\n);\n\n// Base64\nconst BASE64_RE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/;\nconst BASE64_URL_RE = /^[A-Za-z0-9_-]+={0,2}$/;\n\nexport interface IsBase64Options {\n urlSafe?: boolean;\n}\n\nexport function isBase64(options?: IsBase64Options): EmittableRule {\n const re = options?.urlSafe ? BASE64_URL_RE : BASE64_RE;\n return makeStringRule(\n 'isBase64',\n (v) => {\n if (v.length === 0) return false;\n return re.test(v);\n },\n (varName, ctx) => {\n const i = ctx.addRegex(re);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isBase64')};`;\n },\n );\n}\n\n// DateString — ISO 8601 date only (YYYY-MM-DD)\nconst DATE_STRING_RE = /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$/;\n\nexport interface IsDateStringOptions {\n strictMode?: boolean;\n}\n\nexport function isDateString(options?: IsDateStringOptions): EmittableRule {\n return makeStringRule(\n 'isDateString',\n (v) => DATE_STRING_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(DATE_STRING_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isDateString')};`;\n },\n );\n}\n\n// MimeType\nconst MIME_TYPE_RE = /^(application|audio|font|image|message|model|multipart|text|video)\\/[a-zA-Z0-9][a-zA-Z0-9!#$&\\-^_.+]*(?:;.+)?$/;\nexport const isMimeType = makeStringRule(\n 'isMimeType',\n (v) => MIME_TYPE_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(MIME_TYPE_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMimeType')};`;\n },\n);\n\n// Currency\nexport interface IsCurrencyOptions {\n symbol?: string;\n require_symbol?: boolean;\n allow_space_after_symbol?: boolean;\n symbol_after_digits?: boolean;\n allow_negatives?: boolean;\n parens_for_negatives?: boolean;\n negative_sign_before_digits?: boolean;\n negative_sign_after_digits?: boolean;\n allow_negative_sign_placeholder?: boolean;\n thousands_separator?: string;\n decimal_separator?: string;\n allow_decimal?: boolean;\n require_decimal?: boolean;\n digits_after_decimal?: number[];\n allow_space_after_digits?: boolean;\n}\n\nconst CURRENCY_RE = /^[-+]?(?:[,.\\d]+)(?:[.,]\\d{2})?$|^\\$?-?(?:\\d+|\\d{1,3}(?:,\\d{3})*)(?:\\.\\d{1,2})?$/;\n\nexport function isCurrency(options?: IsCurrencyOptions): EmittableRule {\n return makeStringRule(\n 'isCurrency',\n (v) => {\n if (v.length === 0) return false;\n return CURRENCY_RE.test(v);\n },\n (varName, ctx) => {\n const i = ctx.addRegex(CURRENCY_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isCurrency')};`;\n },\n );\n}\n\n// Magnet URI\nconst MAGNET_URI_RE = /^magnet:\\?xt=urn:[a-z0-9]+:[a-z0-9]{32,40}/i;\nexport const isMagnetURI = makeStringRule(\n 'isMagnetURI',\n (v) => MAGNET_URI_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(MAGNET_URI_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMagnetURI')};`;\n },\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group D: Algorithm-based\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Credit Card — Luhn algorithm (§4.8 C)\nfunction _luhn(str: string): boolean {\n const s = str.replace(/[\\s-]/g, '');\n if (s.length === 0 || !/^\\d+$/.test(s)) return false;\n let sum = 0;\n let alternate = false;\n for (let i = s.length - 1; i >= 0; i--) {\n let n = s.charCodeAt(i) - 48;\n if (alternate) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alternate = !alternate;\n }\n return sum % 10 === 0;\n}\n\nconst _isCreditCard = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return _luhn(value);\n};\n\n// emit: Luhn algorithm펼침 (§4.8 C 패턴)\n(_isCreditCard as any).emit = (varName: string, ctx: EmitContext): string => `{\n var _cs=${varName}.replace(/[\\\\s-]/g,'');\n if(_cs.length===0||!/^\\\\d+$/.test(_cs)){${ctx.fail('isCreditCard')}}\n else{var _sum=0,_alt=false;\n for(var _ci=_cs.length-1;_ci>=0;_ci--){var _cn=_cs.charCodeAt(_ci)-48;if(_alt){_cn*=2;if(_cn>9)_cn-=9;}_sum+=_cn;_alt=!_alt;}\n if(_sum%10!==0)${ctx.fail('isCreditCard')};}\n}`;\n(_isCreditCard as any).ruleName = 'isCreditCard';\n(_isCreditCard as any).requiresType = 'string';\nexport const isCreditCard = _isCreditCard as EmittableRule;\n\n// IBAN — ISO 13616 mod-97\nexport interface IsIBANOptions {\n allowSpaces?: boolean;\n}\n\nconst IBAN_COUNTRY_LENGTH: Record<string, number> = {\n 'AD': 24, 'AE': 23, 'AL': 28, 'AT': 20, 'AZ': 28, 'BA': 20, 'BE': 16, 'BG': 22, 'BH': 22,\n 'BR': 29, 'CH': 21, 'CR': 22, 'CY': 28, 'CZ': 24, 'DE': 22, 'DK': 18, 'DO': 28, 'EE': 20,\n 'ES': 24, 'FI': 18, 'FO': 18, 'FR': 27, 'GB': 22, 'GE': 22, 'GI': 23, 'GL': 18, 'GR': 27,\n 'GT': 28, 'HR': 21, 'HU': 28, 'IE': 22, 'IL': 23, 'IS': 26, 'IT': 27, 'JO': 30, 'KW': 30,\n 'KZ': 20, 'LB': 28, 'LC': 32, 'LI': 21, 'LT': 20, 'LU': 20, 'LV': 21, 'MC': 27, 'MD': 24,\n 'ME': 22, 'MK': 19, 'MR': 27, 'MT': 31, 'MU': 30, 'NL': 18, 'NO': 15, 'PK': 24, 'PL': 28,\n 'PS': 29, 'PT': 25, 'QA': 29, 'RO': 24, 'RS': 22, 'SA': 24, 'SC': 31, 'SE': 24, 'SI': 19,\n 'SK': 24, 'SM': 27, 'ST': 25, 'SV': 28, 'TL': 23, 'TN': 24, 'TR': 26, 'UA': 29, 'VA': 22,\n 'VG': 24, 'XK': 20,\n};\n\nfunction _validateIBAN(value: string, options?: IsIBANOptions): boolean {\n let s = options?.allowSpaces ? value.replace(/\\s/g, '') : value;\n s = s.toUpperCase();\n if (!/^[A-Z]{2}\\d{2}[A-Z0-9]+$/.test(s)) return false;\n const country = s.slice(0, 2);\n const expectedLength = IBAN_COUNTRY_LENGTH[country];\n if (expectedLength !== undefined && s.length !== expectedLength) return false;\n // Rearrange: move first 4 chars to end\n const rearranged = s.slice(4) + s.slice(0, 4);\n // Convert letters to digits (A=10, B=11, ...)\n const numeric = rearranged.replace(/[A-Z]/g, (ch) => String(ch.charCodeAt(0) - 55));\n // Compute mod 97 on large number in chunks\n let remainder = 0;\n for (let i = 0; i < numeric.length; i += 7) {\n const chunk = String(remainder) + numeric.slice(i, i + 7);\n remainder = parseInt(chunk, 10) % 97;\n }\n return remainder === 1;\n}\n\nexport function isIBAN(options?: IsIBANOptions): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return _validateIBAN(value, options);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(fn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isIBAN')};`;\n };\n (fn as any).ruleName = 'isIBAN';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// ByteLength — counts UTF-8 bytes via Buffer.byteLength\nexport function isByteLength(min: number, max?: number): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n const byteLen = Buffer.byteLength(value, 'utf8');\n if (byteLen < min) return false;\n if (max !== undefined && byteLen > max) return false;\n return true;\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n // emit: ref-based (Buffer.byteLength is available in Bun and Node)\n const checkFn = (s: string): boolean => {\n const byteLen = Buffer.byteLength(s, 'utf8');\n if (byteLen < min) return false;\n if (max !== undefined && byteLen > max) return false;\n return true;\n };\n const i = ctx.addRef(checkFn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isByteLength')};`;\n };\n (fn as any).ruleName = 'isByteLength';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group E: New Validators\n// ─────────────────────────────────────────────────────────────────────────────\n\n// isHash — hash algorithm별 hex 정규식 (§4.8 B: 정규식 인라인)\n\nconst HASH_REGEXES: Record<string, RegExp> = {\n md5: /^[a-f0-9]{32}$/i,\n md4: /^[a-f0-9]{32}$/i,\n md2: /^[a-f0-9]{32}$/i,\n sha1: /^[a-f0-9]{40}$/i,\n sha256: /^[a-f0-9]{64}$/i,\n sha384: /^[a-f0-9]{96}$/i,\n sha512: /^[a-f0-9]{128}$/i,\n ripemd128: /^[a-f0-9]{32}$/i,\n ripemd160: /^[a-f0-9]{40}$/i,\n 'tiger128,3': /^[a-f0-9]{32}$/i,\n 'tiger128,4': /^[a-f0-9]{32}$/i,\n 'tiger160,3': /^[a-f0-9]{40}$/i,\n 'tiger160,4': /^[a-f0-9]{40}$/i,\n 'tiger192,3': /^[a-f0-9]{48}$/i,\n 'tiger192,4': /^[a-f0-9]{48}$/i,\n crc32: /^[a-f0-9]{8}$/i,\n crc32b: /^[a-f0-9]{8}$/i,\n};\n\nexport function isHash(algorithm: string): EmittableRule {\n const re = HASH_REGEXES[algorithm];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n // 알 수 없는 알고리즘 → 항상 실패\n return ctx.fail('isHash') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isHash')};`;\n };\n (fn as any).ruleName = 'isHash';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// isRFC3339 — RFC 3339 datetime (§4.8 B)\n\nconst RFC3339_RE = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/i;\n\nexport const isRFC3339 = makeStringRule(\n 'isRFC3339',\n (v) => RFC3339_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(RFC3339_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isRFC3339')};`;\n },\n);\n\n// isMilitaryTime — HH:MM 24시간 형식 (§4.8 B)\n\nconst MILITARY_TIME_RE = /^([01]\\d|2[0-3]):[0-5]\\d$/;\n\nexport const isMilitaryTime = makeStringRule(\n 'isMilitaryTime',\n (v) => MILITARY_TIME_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(MILITARY_TIME_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMilitaryTime')};`;\n },\n);\n\n// isLatitude — string 또는 number, -90 ~ 90 (requiresType none)\n\nfunction _checkLatitude(value: unknown): boolean {\n if (typeof value === 'number') {\n return value >= -90 && value <= 90;\n }\n if (typeof value === 'string') {\n const n = parseFloat(value);\n if (isNaN(n)) return false;\n if (String(n) !== value && value !== String(n)) {\n // extra chars check — parseFloat('90abc') = 90 but should fail\n if (!/^-?\\d+(\\.\\d+)?$/.test(value)) return false;\n }\n return n >= -90 && n <= 90;\n }\n return false;\n}\n\nconst _isLatitude = (value: unknown): boolean => _checkLatitude(value);\n\n(_isLatitude as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(_checkLatitude);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isLatitude')};`;\n};\n(_isLatitude as any).ruleName = 'isLatitude';\n// requiresType = undefined — string|number 모두 처리\n\nexport const isLatitude = _isLatitude as EmittableRule;\n\n// isLongitude — string 또는 number, -180 ~ 180 (requiresType none)\n\nfunction _checkLongitude(value: unknown): boolean {\n if (typeof value === 'number') {\n return value >= -180 && value <= 180;\n }\n if (typeof value === 'string') {\n const n = parseFloat(value);\n if (isNaN(n)) return false;\n if (!/^-?\\d+(\\.\\d+)?$/.test(value)) return false;\n return n >= -180 && n <= 180;\n }\n return false;\n}\n\nconst _isLongitude = (value: unknown): boolean => _checkLongitude(value);\n\n(_isLongitude as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(_checkLongitude);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isLongitude')};`;\n};\n(_isLongitude as any).ruleName = 'isLongitude';\n// requiresType = undefined — string|number 모두 처리\n\nexport const isLongitude = _isLongitude as EmittableRule;\n\n// isEthereumAddress — 0x + 40 hex chars (§4.8 B)\n\nconst ETH_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nexport const isEthereumAddress = makeStringRule(\n 'isEthereumAddress',\n (v) => ETH_ADDRESS_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(ETH_ADDRESS_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isEthereumAddress')};`;\n },\n);\n\n// isBtcAddress — P2PKH (1...), P2SH (3...), bech32 (bc1...) (§4.8 B)\n\nconst BTC_P2PKH_RE = /^1[a-km-zA-HJ-NP-Z1-9]{25,34}$/;\nconst BTC_P2SH_RE = /^3[a-km-zA-HJ-NP-Z1-9]{25,34}$/;\nconst BTC_BECH32_RE = /^(bc1)[a-z0-9]{6,87}$/;\n\nexport const isBtcAddress = makeStringRule(\n 'isBtcAddress',\n (v) => BTC_P2PKH_RE.test(v) || BTC_P2SH_RE.test(v) || BTC_BECH32_RE.test(v),\n (varName, ctx) => {\n const i1 = ctx.addRegex(BTC_P2PKH_RE);\n const i2 = ctx.addRegex(BTC_P2SH_RE);\n const i3 = ctx.addRegex(BTC_BECH32_RE);\n return `if (!_re[${i1}].test(${varName}) && !_re[${i2}].test(${varName}) && !_re[${i3}].test(${varName})) ${ctx.fail('isBtcAddress')};`;\n },\n);\n\n// isISO4217CurrencyCode — ISO 4217 통화 코드 집합 (§4.8 C: ref 기반)\n\nconst ISO4217_CODES = new Set([\n 'AED','AFN','ALL','AMD','ANG','AOA','ARS','AUD','AWG','AZN',\n 'BAM','BBD','BDT','BGN','BHD','BIF','BMD','BND','BOB','BOV',\n 'BRL','BSD','BTN','BWP','BYN','BZD','CAD','CDF','CHE','CHF',\n 'CHW','CLF','CLP','CNY','COP','COU','CRC','CUC','CUP','CVE',\n 'CZK','DJF','DKK','DOP','DZD','EGP','ERN','ETB','EUR','FJD',\n 'FKP','GBP','GEL','GHS','GIP','GMD','GNF','GTQ','GYD','HKD',\n 'HNL','HRK','HTG','HUF','IDR','ILS','INR','IQD','IRR','ISK',\n 'JMD','JOD','JPY','KES','KGS','KHR','KMF','KPW','KRW','KWD',\n 'KYD','KZT','LAK','LBP','LKR','LRD','LSL','LYD','MAD','MDL',\n 'MGA','MKD','MMK','MNT','MOP','MRU','MUR','MVR','MWK','MXN',\n 'MXV','MYR','MZN','NAD','NGN','NIO','NOK','NPR','NZD','OMR',\n 'PAB','PEN','PGK','PHP','PKR','PLN','PYG','QAR','RON','RSD',\n 'RUB','RWF','SAR','SBD','SCR','SDG','SEK','SGD','SHP','SLE',\n 'SLL','SOS','SRD','SSP','STN','SVC','SYP','SZL','THB','TJS',\n 'TMT','TND','TOP','TRY','TTD','TWD','TZS','UAH','UGX','USD',\n 'USN','UYI','UYU','UYW','UZS','VED','VES','VND','VUV','WST',\n 'XAF','XAG','XAU','XBA','XBB','XBC','XBD','XCD','XDR','XOF',\n 'XPD','XPF','XPT','XSU','XTS','XUA','YER','ZAR','ZMW','ZWL',\n]);\n\nexport const isISO4217CurrencyCode = makeStringRule(\n 'isISO4217CurrencyCode',\n (v) => ISO4217_CODES.has(v),\n (varName, ctx) => {\n const i = ctx.addRef(ISO4217_CODES);\n return `if (!_refs[${i}].has(${varName})) ${ctx.fail('isISO4217CurrencyCode')};`;\n },\n);\n\n// isPhoneNumber — E.164 국제 전화번호 (§4.8 B)\n\nconst PHONE_E164_RE = /^\\+[1-9]\\d{6,14}$/;\n\nexport const isPhoneNumber = makeStringRule(\n 'isPhoneNumber',\n (v) => PHONE_E164_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(PHONE_E164_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isPhoneNumber')};`;\n },\n);\n\n// isStrongPassword — 강력한 비밀번호 체크 (§4.8 C: factory)\n\nexport interface IsStrongPasswordOptions {\n minLength?: number;\n minLowercase?: number;\n minUppercase?: number;\n minNumbers?: number;\n minSymbols?: number;\n}\n\nexport function isStrongPassword(options?: IsStrongPasswordOptions): EmittableRule {\n const minLength = options?.minLength ?? 8;\n const minLower = options?.minLowercase ?? 1;\n const minUpper = options?.minUppercase ?? 1;\n const minNums = options?.minNumbers ?? 1;\n const minSymbols = options?.minSymbols ?? 1;\n\n const validate = (v: string): boolean => {\n if (v.length < minLength) return false;\n if (minLower > 0) {\n const cnt = (v.match(/[a-z]/g) || []).length;\n if (cnt < minLower) return false;\n }\n if (minUpper > 0) {\n const cnt = (v.match(/[A-Z]/g) || []).length;\n if (cnt < minUpper) return false;\n }\n if (minNums > 0) {\n const cnt = (v.match(/[0-9]/g) || []).length;\n if (cnt < minNums) return false;\n }\n if (minSymbols > 0) {\n const cnt = (v.match(/[^a-zA-Z0-9]/g) || []).length;\n if (cnt < minSymbols) return false;\n }\n return true;\n };\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return validate(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(validate);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isStrongPassword')};`;\n };\n (fn as any).ruleName = 'isStrongPassword';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// isTaxId — 로케일별 세금 식별자 (§4.8 C: factory)\n\nconst TAX_ID_REGEXES: Record<string, RegExp> = {\n US: /^\\d{2}-\\d{7}$/, // EIN format: XX-XXXXXXX\n KR: /^\\d{3}-\\d{2}-\\d{5}$/, // 사업자등록번호: XXX-XX-XXXXX\n DE: /^\\d{11}$/, // Steuernummer: 11자리\n FR: /^[0-9]{13}$/, // SIRET: 13자리\n GB: /^\\d{10}$/, // UTR: 10자리\n IT: /^[A-Z]{6}\\d{2}[A-Z]\\d{2}[A-Z]\\d{3}[A-Z]$/i, // Codice Fiscale\n ES: /^[0-9A-Z]\\d{7}[0-9A-Z]$/i, // NIF/NIE/CIF\n AU: /^\\d{11}$/, // ABN: 11자리\n CA: /^\\d{9}$/, // BN: 9자리\n IN: /^[A-Z]{5}\\d{4}[A-Z]$/i, // PAN: XXXXX9999X\n};\n\nexport function isTaxId(locale: string): EmittableRule {\n const re = TAX_ID_REGEXES[locale];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n return ctx.fail('isTaxId') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isTaxId')};`;\n };\n (fn as any).ruleName = 'isTaxId';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n",
|
|
10
|
+
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayContains(values) — 배열이 지정한 모든 값을 포함\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function arrayContains(values: unknown[]): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (!Array.isArray(value)) return false;\n return values.every((v) => value.includes(v));\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(values);\n return `if (!_refs[${i}].every(function(v){return ${varName}.indexOf(v)!==-1;})) ${ctx.fail('arrayContains')};`;\n };\n (fn as any).ruleName = 'arrayContains';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayNotContains(values) — 배열이 지정한 값을 포함하지 않음\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function arrayNotContains(values: unknown[]): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (!Array.isArray(value)) return false;\n return values.every((v) => !value.includes(v));\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(values);\n return `if (_refs[${i}].some(function(v){return ${varName}.indexOf(v)!==-1;})) ${ctx.fail('arrayNotContains')};`;\n };\n (fn as any).ruleName = 'arrayNotContains';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayMinSize(min) — 배열 최소 길이\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function arrayMinSize(min: number): EmittableRule {\n const fn = (value: unknown): boolean =>\n Array.isArray(value) && value.length >= min;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length < ${min}) ${ctx.fail('arrayMinSize')};`;\n (fn as any).ruleName = 'arrayMinSize';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayMaxSize(max) — 배열 최대 길이\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function arrayMaxSize(max: number): EmittableRule {\n const fn = (value: unknown): boolean =>\n Array.isArray(value) && value.length <= max;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length > ${max}) ${ctx.fail('arrayMaxSize')};`;\n (fn as any).ruleName = 'arrayMaxSize';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayUnique(identifier?) — 배열 내 중복 없음\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function arrayUnique(identifier?: (val: unknown) => unknown): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (!Array.isArray(value)) return false;\n if (identifier) {\n const keys = value.map(identifier);\n return new Set(keys).size === keys.length;\n }\n return new Set(value).size === value.length;\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (identifier) {\n const i = ctx.addRef(identifier);\n return `{var _keys=${varName}.map(_refs[${i}]);if(new Set(_keys).size!==_keys.length)${ctx.fail('arrayUnique')};}`;\n }\n return `if(new Set(${varName}).size!==${varName}.length)${ctx.fail('arrayUnique')};`;\n };\n (fn as any).ruleName = 'arrayUnique';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayNotEmpty — 배열이 비어있지 않음 (singleton)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _arrayNotEmpty = (value: unknown): boolean =>\n Array.isArray(value) && value.length > 0;\n\n(_arrayNotEmpty as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length === 0) ${ctx.fail('arrayNotEmpty')};`;\n(_arrayNotEmpty as any).ruleName = 'arrayNotEmpty';\nexport const arrayNotEmpty = _arrayNotEmpty as EmittableRule;\n",
|
|
11
|
+
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isNotEmptyObject(options?) — 빈 객체가 아님 (최소 1개의 key)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface IsNotEmptyObjectOptions {\n /** null/undefined 값을 가진 키를 무시할지 여부 (기본: false → 무시하지 않음) */\n nullable?: boolean;\n}\n\nexport function isNotEmptyObject(options?: IsNotEmptyObjectOptions): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n const keys = Object.keys(value as object);\n if (options?.nullable) {\n return keys.some((k) => (value as Record<string, unknown>)[k] != null);\n }\n return keys.length > 0;\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (options?.nullable) {\n const i = ctx.addRef(fn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isNotEmptyObject')};`;\n }\n return `if (Object.keys(${varName}).length === 0) ${ctx.fail('isNotEmptyObject')};`;\n };\n (fn as any).ruleName = 'isNotEmptyObject';\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isInstance(targetType) — 특정 클래스 인스턴스인지 확인\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function isInstance(targetType: new (...args: any[]) => any): EmittableRule {\n const fn = (value: unknown): boolean => value instanceof targetType;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(targetType);\n return `if (!(${varName} instanceof _refs[${i}])) ${ctx.fail('isInstance')};`;\n };\n (fn as any).ruleName = 'isInstance';\n\n return fn as EmittableRule;\n}\n",
|
|
12
|
+
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Locale-specific Validators\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── isMobilePhone ────────────────────────────────────────────────────────────\n\nconst MOBILE_PHONE_REGEXES: Record<string, RegExp> = {\n 'ko-KR': /^(\\+?82|0)1[016789]\\d{7,8}$/,\n 'en-US': /^\\+?1?[2-9]\\d{2}[2-9]\\d{6}$/,\n 'zh-CN': /^(\\+?86)?1[3-9]\\d{9}$/,\n 'zh-TW': /^(\\+?886)?9\\d{8}$/,\n 'ja-JP': /^(\\+?81)?0?[789]0[0-9]{8}$/,\n 'de-DE': /^(\\+?49)?1(5\\d|6[0-9]|7[0-9])\\d{8}$/,\n 'fr-FR': /^(\\+?33)?[67]\\d{8}$/,\n 'en-GB': /^(\\+?44)?7[1-9]\\d{8}$/,\n 'ru-RU': /^(\\+?7)?9\\d{9}$/,\n 'pt-BR': /^(\\+?55)?[1-9]{2}9?\\d{8}$/,\n 'in-IN': /^(\\+?91)?[6-9]\\d{9}$/,\n 'ar-SA': /^(\\+?966)?5\\d{8}$/,\n 'ar-EG': /^(\\+?20)?1[0125]\\d{8}$/,\n 'vi-VN': /^(\\+?84)?[35789]\\d{8}$/,\n 'th-TH': /^(\\+?66)?[689]\\d{8}$/,\n 'id-ID': /^(\\+?62)?8\\d{9,11}$/,\n 'ms-MY': /^(\\+?60)?1\\d{8,9}$/,\n 'nl-NL': /^(\\+?31)?6\\d{8}$/,\n 'it-IT': /^(\\+?39)?3\\d{9}$/,\n 'es-ES': /^(\\+?34)?[67]\\d{8}$/,\n 'pl-PL': /^(\\+?48)?[45789]\\d{8}$/,\n};\n\nexport function isMobilePhone(locale: string): EmittableRule {\n const re = MOBILE_PHONE_REGEXES[locale];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n return ctx.fail('isMobilePhone') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMobilePhone')};`;\n };\n (fn as any).ruleName = 'isMobilePhone';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// ─── isPostalCode ─────────────────────────────────────────────────────────────\n\nconst POSTAL_CODE_REGEXES: Record<string, RegExp> = {\n AD: /^AD\\d{3}$/,\n AT: /^\\d{4}$/,\n AU: /^\\d{4}$/,\n AZ: /^\\d{4}$/,\n BE: /^\\d{4}$/,\n BG: /^\\d{4}$/,\n BR: /^\\d{5}-?\\d{3}$/,\n BY: /^\\d{6}$/,\n CA: /^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z] ?\\d[ABCEGHJ-NPRSTV-Z]\\d$/i,\n CH: /^\\d{4}$/,\n CN: /^\\d{6}$/,\n CZ: /^\\d{3} ?\\d{2}$/,\n DE: /^\\d{5}$/,\n DK: /^\\d{4}$/,\n EE: /^\\d{5}$/,\n ES: /^\\d{5}$/,\n FI: /^\\d{5}$/,\n FR: /^\\d{2} ?\\d{3}$/,\n GB: /^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPSTUW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$/i,\n GR: /^\\d{3} ?\\d{2}$/,\n HR: /^\\d{5}$/,\n HU: /^\\d{4}$/,\n ID: /^\\d{5}$/,\n IL: /^\\d{5}(\\d{2})?$/,\n IN: /^\\d{6}$/,\n IS: /^\\d{3}$/,\n IT: /^\\d{5}$/,\n JP: /^\\d{3}-?\\d{4}$/,\n KR: /^\\d{5}$/,\n LI: /^(948[5-9]|949[0-7])$/,\n LT: /^LT-\\d{5}$/,\n LU: /^\\d{4}$/,\n LV: /^LV-\\d{4}$/,\n MX: /^\\d{5}$/,\n MT: /^[A-Z]{3} ?\\d{4}$/i,\n MZ: /^\\d{4}$/,\n NL: /^\\d{4} ?[A-Z]{2}$/i,\n NO: /^\\d{4}$/,\n NP: /^\\d{5}$/,\n NZ: /^\\d{4}$/,\n PH: /^\\d{4}$/,\n PK: /^\\d{5}$/,\n PL: /^\\d{2}-\\d{3}$/,\n PR: /^009\\d{2}([ -]\\d{4})?$/,\n PT: /^\\d{4}-\\d{3}$/,\n RO: /^\\d{6}$/,\n RU: /^\\d{6}$/,\n SE: /^\\d{3} ?\\d{2}$/,\n SG: /^\\d{6}$/,\n SI: /^\\d{4}$/,\n SK: /^\\d{3} ?\\d{2}$/,\n TH: /^\\d{5}$/,\n TN: /^\\d{4}$/,\n TW: /^\\d{3}(\\d{2})?$/,\n UA: /^\\d{5}$/,\n US: /^\\d{5}(-\\d{4})?$/,\n ZA: /^\\d{4}$/,\n ZM: /^\\d{5}$/,\n};\n\nexport function isPostalCode(locale: string): EmittableRule {\n const re = POSTAL_CODE_REGEXES[locale];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n return ctx.fail('isPostalCode') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isPostalCode')};`;\n };\n (fn as any).ruleName = 'isPostalCode';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// ─── isIdentityCard ───────────────────────────────────────────────────────────\n\nconst IDENTITY_CARD_REGEXES: Record<string, RegExp> = {\n AF: /^\\d{8}$/,\n AL: /^[A-Z]\\d{8}[A-Z]$/i,\n AR: /^\\d{7,8}$/,\n AZ: /^AZE\\d{8}$/,\n BE: /^\\d{11}$/,\n BG: /^\\d{10}$/,\n BR: /^\\d{9}$/,\n BY: /^[A-Z]{2}\\d{7}$/i,\n CA: /^\\d{9}$/,\n CH: /^756\\d{10}$/,\n CN: /^\\d{15}(\\d{2}[0-9xX])?$/,\n CY: /^\\d{7}[A-Z]$/i,\n CZ: /^\\d{9,10}$/,\n DE: /^[LI TOUAEVBMNPRSZDFGHCK]{9}$/i,\n DK: /^\\d{10}$/,\n EE: /^\\d{11}$/,\n ES: /^[0-9X-Z]\\d{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/i,\n FI: /^\\d{6}[+-A]\\d{3}[0-9A-FHJ-NPR-Y]$/,\n FR: /^\\d{8,9}[0-9Á-ÿ]{1}$/i,\n GB: /^[A-Z]{2}\\d{6}[A-Z]$/i,\n GR: /^[A-Z]{2}\\d{6}$/i,\n HR: /^\\d{11}$/,\n HU: /^\\d{8}[A-Z]{2}$/i,\n ID: /^\\d{16}$/,\n IE: /^\\d{7}[A-W][A-W]?$/, \n IL: /^\\d{9}$/,\n IN: /^\\d{12}$/,\n IR: /^\\d{10}$/,\n IS: /^\\d{10}$/,\n IT: /^[A-Z]{6}\\d{2}[A-Z]\\d{2}[A-Z]\\d{3}[A-Z]$/i,\n JP: /^\\d{12}$/,\n KR: /^\\d{6}-\\d{7}$/,\n LT: /^\\d{11}$/,\n LU: /^\\d{13}$/,\n LV: /^\\d{6}-\\d{5}$/,\n MK: /^\\d{13}$/,\n MX: /^[A-Z]{4}\\d{6}[HM][A-Z]{2}[B-DF-HJ-NP-TV-Z]{3}[A-Z0-9]\\d$/i,\n MT: /^\\d{7}[A-Z]$/i,\n NL: /^\\d{9}$/,\n NO: /^\\d{11}$/,\n PL: /^\\d{11}$/,\n PT: /^[1-9]\\d{7}[0-9TV]$/i,\n RO: /^\\d{13}$/,\n RS: /^\\d{13}$/,\n RU: /^\\d{10}$/,\n SE: /^\\d{10,12}$/,\n SI: /^\\d{13}$/,\n SK: /^\\d{9,10}$/,\n TH: /^\\d{13}$/,\n TR: /^\\d{11}$/,\n TW: /^[A-Z]\\d{9}$/i,\n UA: /^\\d{9}$/,\n US: /^\\d{3}-\\d{2}-\\d{4}$/,\n ZA: /^\\d{13}$/,\n};\n\nexport function isIdentityCard(locale: string): EmittableRule {\n const re = IDENTITY_CARD_REGEXES[locale];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n return ctx.fail('isIdentityCard') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isIdentityCard')};`;\n };\n (fn as any).ruleName = 'isIdentityCard';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n\n// ─── isPassportNumber ─────────────────────────────────────────────────────────\n\nconst PASSPORT_REGEXES: Record<string, RegExp> = {\n AM: /^[A-Z]{2}\\d{7}$/i,\n AR: /^[A-Z]{3}\\d{6}$/i,\n AT: /^[A-Z]\\d{7}$/i,\n AU: /^[A-Z]\\d{7}$/i,\n AZ: /^[Aa]\\d{8}$/,\n BE: /^[A-Z]{2}\\d{6}$/i,\n BG: /^\\d{9}$/,\n BH: /^[A-Z]{2}\\d{6}$/i,\n BR: /^[A-Z]{2}\\d{6}$/i,\n BY: /^[A-Z]{2}\\d{7}$/i,\n CA: /^[A-Z]{2}\\d{6}$/i,\n CH: /^[A-Z]\\d{7}$/i,\n CN: /^G\\d{8}$/,\n CY: /^[A-Z](\\d{6}|\\d{8})$/i,\n CZ: /^\\d{8}$/,\n DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/i,\n DK: /^\\d{9}$/,\n EE: /^([A-Z]\\d{7}|[A-Z]{2}\\d{7})$/i,\n ES: /^[A-Z0-9]{2}([A-Z0-9]?)\\d{6}$/i,\n FI: /^[A-Z]{2}\\d{7}$/i,\n FR: /[A-Z0-9]{9}/i,\n GB: /^\\d{9}$/,\n GR: /^[A-Z]{2}\\d{7}$/i,\n HR: /^\\d{9}$/,\n HU: /^[A-Z]{2}(\\d{6}|\\d{7})$/i,\n ID: /^[A-C]\\d{7}$/i,\n IE: /^[A-Z0-9]{2}\\d{7}$/i,\n IL: /^\\d{9}$/,\n IN: /^[A-Z]\\d{7}$/i,\n IR: /^[A-Z]\\d{8}$/i,\n IS: /^(A)\\d{7}$/i,\n IT: /^[A-Z0-9]{9}$/i,\n JO: /^[A-Z]{2}\\d{7}$/i,\n JP: /^[A-Z]{2}\\d{7}$/i,\n KR: /^[A-Z][A-Z0-9]\\d{7}$/i,\n KW: /^\\d{8}$/,\n KZ: /^[A-Z]\\d{8}$/i,\n LI: /^[A-Z]\\d{6}X$/i,\n LT: /^[A-Z0-9]{8}$/i,\n LU: /^[A-Z0-9]{8}$/i,\n LV: /^[A-Z0-9]{2}\\d{7}$/i,\n LY: /^[A-Z]{2}\\d{7}$/i,\n MA: /^[A-Z0-9]{2}\\d{7}$/i,\n MD: /^[A-Z]{2}\\d{7}$/i,\n ME: /^[A-Z]{2}\\d{7}$/i,\n MK: /^[A-Z]\\d{7}$/i,\n MT: /^\\d{7}$/,\n MX: /^[A-Z]\\d{8}$/i,\n MY: /^[AHK]\\d{8}[A-Z]$/i,\n NL: /^[A-NP-Z]{2}[A-NP-Z0-9]{6}\\d$/i,\n NO: /^\\d{9}$/,\n NZ: /^[A-Z]{2}\\d{6}$/i,\n PH: /^[A-Z]\\d{7}[A-Z]$/i,\n PK: /^[A-Z]{2}\\d{7}$/i,\n PL: /^[A-Z]{2}\\d{7}$/i,\n PT: /^[A-Z]\\d{6}$/i,\n RO: /^\\d{8}$/,\n RS: /^\\d{9}$/,\n RU: /^\\d{9}$/,\n SA: /^[A-Z]\\d{8}$/i,\n SE: /^\\d{8}$/,\n SL: /^(P)[A-Z]\\d{7}$/i,\n SK: /^[0-9A-Z]\\d{7}$/i,\n TH: /^[A-Z]{1,2}\\d{6,7}$/i,\n TN: /^\\d{8}$/,\n TR: /^[A-Z]\\d{8}$/i,\n TW: /^[A-Z]\\d{9}$/i,\n UA: /^[A-Z]{2}\\d{6}$/i,\n US: /^\\d{9}$/,\n ZA: /^[A-Z]\\d{8}$/i,\n};\n\nexport function isPassportNumber(locale: string): EmittableRule {\n const re = PASSPORT_REGEXES[locale];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n return ctx.fail('isPassportNumber') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isPassportNumber')};`;\n };\n (fn as any).ruleName = 'isPassportNumber';\n (fn as any).requiresType = 'string';\n\n return fn as EmittableRule;\n}\n"
|
|
13
|
+
],
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "4B47A8B54E42A7B464756E2164756E21",
|
|
16
|
+
"names": []
|
|
17
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{$b as LI,Ab as v,Ac as vI,Bb as m,Bc as mI,Cb as u,Cc as uI,Db as V,Dc as VI,Eb as d,Ec as dI,Fb as k,Fc as kI,Gb as g,Gc as gI,Hb as y,Hc as yI,Ib as c,Ic as cI,Jb as r,Jc as rI,Kb as l,Kc as lI,Lb as a,Lc as aI,Mb as e,Mc as eI,Nb as p,Nc as pI,Ob as s,Oc as sI,Pb as n,Pc as nI,Qb as i,Qc as iI,Rb as t,Rc as tI,Sb as o,Sc as oI,Tb as II,Tc as I6,Ub as SI,Uc as S6,Vb as NI,Vc as N6,Wb as AI,Wc as A6,Xb as EI,Xc as E6,Yb as BI,Yc as B6,Zb as CI,Zc as C6,_b as FI,ac as QI,bc as UI,cc as xI,dc as zI,eb as H,ec as HI,fb as J,fc as JI,gb as K,gc as KI,hb as X,hc as XI,ib as Y,ic as YI,jb as Z,jc as ZI,kb as $,kc as $I,lb as G,lc as GI,mb as M,mc as MI,nb as P,nc as PI,ob as _,oc as _I,pb as q,pc as qI,qb as w,qc as wI,rb as h,rc as hI,sb as W,sc as WI,tb as j,tc as jI,ub as R,uc as RI,vb as T,vc as TI,wb as D,wc as DI,xb as f,xc as fI,yb as O,yc as OI,zb as b,zc as bI}from"./index-6pbm9cq6.js";import{_c as F}from"./index-w36xamck.js";var L=new Set;function QN(I){return L.delete(I)}function B(I,S){if(L.add(I),!Object.prototype.hasOwnProperty.call(I,F))I[F]=Object.create(null);let N=I[F];return N[S]??={validation:[],transform:[],expose:[],exclude:null,type:null,flags:{}}}function E(I,S,N){B(I.constructor,S).validation.push(N)}function Q(I,S,N){B(I.constructor,S).transform.push(N)}function U(I,S,N){B(I.constructor,S).expose.push(N)}function x(I,S,N){let A=B(I.constructor,S);A.exclude=N}function z(I,S,N){let A=B(I.constructor,S);A.type=N}function F6(I){return(S,N)=>{let A=B(S.constructor,N);A.flags.isDefined=!0}}function L6(I){return(S,N)=>{let A=B(S.constructor,N);A.flags.isOptional=!0}}function Q6(I){return(S,N)=>{let A=B(S.constructor,N);A.flags.validateIf=I}}function U6(I){return(S,N)=>{let A=B(S.constructor,N);if(A.flags.validateNested=!0,I?.each)A.flags.validateNestedEach=!0}}function x6(I,S){return(N,A)=>{E(N,A,{rule:H(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function z6(I,S){return(N,A)=>{E(N,A,{rule:J(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function H6(I){return(S,N)=>{E(S,N,{rule:K,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function J6(I){return(S,N)=>{E(S,N,{rule:X,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function K6(I,S){return(N,A)=>{E(N,A,{rule:Y(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function X6(I,S){return(N,A)=>{E(N,A,{rule:Z(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function Y6(I){return(S,N)=>{E(S,N,{rule:$,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function Z6(I,S){return(N,A)=>{E(N,A,{rule:G(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function $6(I){return(S,N)=>{E(S,N,{rule:M,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function G6(I){return(S,N)=>{E(S,N,{rule:P,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function M6(I,S){return(N,A)=>{E(N,A,{rule:_(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function P6(I){return(S,N)=>{E(S,N,{rule:q,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function _6(I){return(S,N)=>{E(S,N,{rule:w,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function q6(I){return(S,N)=>{E(S,N,{rule:h,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function w6(I,S){return(N,A)=>{E(N,A,{rule:W(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function h6(I,S){return(N,A)=>{E(N,A,{rule:j(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function W6(I){return(S,N)=>{E(S,N,{rule:R,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function j6(I){return(S,N)=>{E(S,N,{rule:T,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function R6(I,S){return(N,A)=>{E(N,A,{rule:D(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function T6(I,S){return(N,A)=>{E(N,A,{rule:f(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function D6(I,S){return(N,A)=>{E(N,A,{rule:O(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function f6(I,S){return(N,A)=>{E(N,A,{rule:b(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function O6(I,S){return(N,A)=>{E(N,A,{rule:v(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function b6(I,S,N){return(A,C)=>{E(A,C,{rule:m(I,S),each:N?.each,groups:N?.groups,message:N?.message,context:N?.context})}}function v6(I,S){return(N,A)=>{E(N,A,{rule:u(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function m6(I,S){return(N,A)=>{E(N,A,{rule:V(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function u6(I,S,N){return(A,C)=>{E(A,C,{rule:d(I,S),each:N?.each,groups:N?.groups,message:N?.message,context:N?.context})}}function V6(I){return(S,N)=>{E(S,N,{rule:k,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function d6(I){return(S,N)=>{E(S,N,{rule:g,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function k6(I){return(S,N)=>{E(S,N,{rule:y,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function g6(I){return(S,N)=>{E(S,N,{rule:c,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function y6(I){return(S,N)=>{E(S,N,{rule:r,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function c6(I){return(S,N)=>{E(S,N,{rule:l,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function r6(I,S){return(N,A)=>{E(N,A,{rule:a(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function l6(I,S){return(N,A)=>{E(N,A,{rule:e(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function a6(I){return(S,N)=>{E(S,N,{rule:p,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function e6(I){return(S,N)=>{E(S,N,{rule:s,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function p6(I){return(S,N)=>{E(S,N,{rule:n,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function s6(I){return(S,N)=>{E(S,N,{rule:i,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function n6(I){return(S,N)=>{E(S,N,{rule:t,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function i6(I){return(S,N)=>{E(S,N,{rule:o,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function t6(I){return(S,N)=>{E(S,N,{rule:II,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function o6(I,S){return(N,A)=>{E(N,A,{rule:SI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function IS(I,S){return(N,A)=>{E(N,A,{rule:NI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function SS(I,S){return(N,A)=>{E(N,A,{rule:AI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function NS(I,S){return(N,A)=>{E(N,A,{rule:EI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function AS(I){return(S,N)=>{E(S,N,{rule:BI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function ES(I,S){return(N,A)=>{E(N,A,{rule:CI(I??!1),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function BS(I){return(S,N)=>{E(S,N,{rule:FI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function CS(I,S){return(N,A)=>{E(N,A,{rule:LI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function FS(I,S){return(N,A)=>{E(N,A,{rule:QI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function LS(I){return(S,N)=>{E(S,N,{rule:UI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function QS(I,S){return(N,A)=>{E(N,A,{rule:xI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function US(I){return(S,N)=>{E(S,N,{rule:zI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function xS(I,S){return(N,A)=>{E(N,A,{rule:HI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function zS(I){return(S,N)=>{E(S,N,{rule:JI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function HS(I,S){return(N,A)=>{E(N,A,{rule:KI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function JS(I){return(S,N)=>{E(S,N,{rule:XI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function KS(I){return(S,N)=>{E(S,N,{rule:YI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function XS(I,S){return(N,A)=>{E(N,A,{rule:ZI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function YS(I){return(S,N)=>{E(S,N,{rule:$I,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function ZS(I){return(S,N)=>{E(S,N,{rule:GI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function $S(I){return(S,N)=>{E(S,N,{rule:MI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function GS(I){return(S,N)=>{E(S,N,{rule:PI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function MS(I){return(S,N)=>{E(S,N,{rule:_I,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function PS(I){return(S,N)=>{E(S,N,{rule:qI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function _S(I){return(S,N)=>{E(S,N,{rule:wI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function qS(I){return(S,N)=>{E(S,N,{rule:hI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function wS(I){return(S,N)=>{E(S,N,{rule:WI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function hS(I,S){return(N,A)=>{E(N,A,{rule:jI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function WS(I){return(S,N)=>{E(S,N,{rule:RI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function jS(I,S){return(N,A)=>{E(N,A,{rule:TI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function RS(I,S){return(N,A)=>{E(N,A,{rule:DI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function TS(I){return(S,N)=>{E(S,N,{rule:fI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function DS(I,S){return(N,A)=>{E(N,A,{rule:OI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function fS(I){return(S,N)=>{E(S,N,{rule:bI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function OS(I){return(S,N)=>{E(S,N,{rule:vI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function bS(I,S){return(N,A)=>{E(N,A,{rule:mI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function vS(I,S,N){return(A,C)=>{E(A,C,{rule:uI(I,S),each:N?.each,groups:N?.groups,message:N?.message,context:N?.context})}}function mS(I,S){return(N,A)=>{E(N,A,{rule:VI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function uS(I){return(S,N)=>{E(S,N,{rule:dI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function VS(I){return(S,N)=>{E(S,N,{rule:kI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function dS(I){return(S,N)=>{E(S,N,{rule:gI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function kS(I){return(S,N)=>{E(S,N,{rule:yI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function gS(I){return(S,N)=>{E(S,N,{rule:cI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function yS(I){return(S,N)=>{E(S,N,{rule:rI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function cS(I){return(S,N)=>{E(S,N,{rule:lI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function rS(I){return(S,N)=>{E(S,N,{rule:aI,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function lS(I,S){return(N,A)=>{E(N,A,{rule:eI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function aS(I,S){return(N,A)=>{E(N,A,{rule:pI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function eS(I,S){return(N,A)=>{E(N,A,{rule:sI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function pS(I,S){return(N,A)=>{E(N,A,{rule:nI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function sS(I,S){return(N,A)=>{E(N,A,{rule:iI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function nS(I,S){return(N,A)=>{E(N,A,{rule:tI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function iS(I,S){return(N,A)=>{E(N,A,{rule:oI(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function tS(I){return(S,N)=>{E(S,N,{rule:I6,each:I?.each,groups:I?.groups,message:I?.message,context:I?.context})}}function oS(I,S){return(N,A)=>{E(N,A,{rule:S6(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function IN(I,S){return(N,A)=>{E(N,A,{rule:N6(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function SN(I){return(S,N)=>{U(S,N,I??{})}}function NN(I){return(S,N)=>{x(S,N,I??{})}}function AN(I,S){return(N,A)=>{Q(N,A,{fn:I,options:S?{groups:S.groups,deserializeOnly:S.deserializeOnly,serializeOnly:S.serializeOnly}:void 0})}}function EN(I,S){return(N,A)=>{z(N,A,{fn:I,discriminator:S?.discriminator,keepDiscriminatorProperty:S?.keepDiscriminatorProperty})}}function BN(I,S){return(N,A)=>{E(N,A,{rule:A6(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function CN(I,S){return(N,A)=>{E(N,A,{rule:E6(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function FN(I,S){return(N,A)=>{E(N,A,{rule:B6(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}function LN(I,S){return(N,A)=>{E(N,A,{rule:C6(I),each:S?.each,groups:S?.groups,message:S?.message,context:S?.context})}}export{L as a,QN as b,F6 as c,L6 as d,Q6 as e,U6 as f,x6 as g,z6 as h,H6 as i,J6 as j,K6 as k,X6 as l,Y6 as m,Z6 as n,$6 as o,G6 as p,M6 as q,P6 as r,_6 as s,q6 as t,w6 as u,h6 as v,W6 as w,j6 as x,R6 as y,T6 as z,D6 as A,f6 as B,O6 as C,b6 as D,v6 as E,m6 as F,u6 as G,V6 as H,d6 as I,k6 as J,g6 as K,y6 as L,c6 as M,r6 as N,l6 as O,a6 as P,e6 as Q,p6 as R,s6 as S,n6 as T,i6 as U,t6 as V,o6 as W,IS as X,SS as Y,NS as Z,AS as _,ES as $,BS as aa,CS as ba,FS as ca,LS as da,QS as ea,US as fa,xS as ga,zS as ha,HS as ia,JS as ja,KS as ka,XS as la,YS as ma,ZS as na,$S as oa,GS as pa,MS as qa,PS as ra,_S as sa,qS as ta,wS as ua,hS as va,WS as wa,jS as xa,RS as ya,TS as za,DS as Aa,fS as Ba,OS as Ca,bS as Da,vS as Ea,mS as Fa,uS as Ga,VS as Ha,dS as Ia,kS as Ja,gS as Ka,yS as La,cS as Ma,rS as Na,lS as Oa,aS as Pa,eS as Qa,pS as Ra,sS as Sa,nS as Ta,iS as Ua,tS as Va,oS as Wa,IN as Xa,SN as Ya,NN as Za,AN as _a,EN as $a,BN as ab,CN as bb,FN as cb,LN as db};
|
|
3
|
+
|
|
4
|
+
//# debugId=2E7EB1A1568D4A4264756E2164756E21
|
|
5
|
+
//# sourceMappingURL=index-fww37qs9.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/registry.ts", "../src/collect.ts", "../src/decorators/common.ts", "../src/decorators/typechecker.ts", "../src/decorators/number.ts", "../src/decorators/date.ts", "../src/decorators/string.ts", "../src/decorators/array.ts", "../src/decorators/object.ts", "../src/decorators/transform.ts", "../src/decorators/locales.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * 전역 레지스트리 — 데코레이터가 1개라도 부착된 클래스를 자동 등록\n *\n * - ensureMeta()에서 자동 호출\n * - seal()이 이 Set을 순회하여 모든 DTO를 봉인\n * - 메타데이터는 여기에 저장되지 않음 — 인덱스(어떤 클래스가 등록되었는지)로만 사용\n */\nexport const globalRegistry = new Set<Function>();\n\n/**\n * 클래스를 레지스트리에서 제거한다.\n * seal() 후 더 이상 필요 없는 DTO를 GC 대상으로 돌린다 (§L1).\n *\n * @param cls 제거할 클래스 생성자\n * @returns 세트에 존재했는지 여부\n */\nexport function unregister(cls: Function): boolean {\n return globalRegistry.delete(cls);\n}\n",
|
|
6
|
+
"import { RAW } from './symbols';\nimport { globalRegistry } from './registry';\nimport type { RawPropertyMeta, RuleDef, TransformDef, ExposeDef, ExcludeDef, TypeDef } from './types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ensureMeta — 내부 유틸 (§3.1)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * ctor에 대한 propertyKey의 RawPropertyMeta를 반환한다.\n * - 존재하지 않으면 기본값으로 생성한다.\n * - 전역 레지스트리에 ctor를 자동 등록한다 (데코레이터가 1개라도 있으면 등록).\n */\nexport function ensureMeta(ctor: Function, key: string): RawPropertyMeta {\n // 전역 레지스트리에 자동 등록\n globalRegistry.add(ctor);\n\n // Class[RAW] 없으면 생성 (null prototype 사용 — 프로토타입 체인 간섭 0)\n // 주의: hasOwnProperty 체크 필수 — 클래스 상속 시 ctor.__proto__ === ParentClass 이므로\n // ??= 연산자가 부모의 [RAW]를 찾아 자식의 필드를 부모 RAW에 저장하는 오염 발생 방지\n if (!Object.prototype.hasOwnProperty.call(ctor, RAW)) {\n (ctor as any)[RAW] = Object.create(null) as Record<string, RawPropertyMeta>;\n }\n const raw = (ctor as any)[RAW] as Record<string, RawPropertyMeta>;\n\n // key 없으면 기본 meta 생성\n return (raw[key] ??= {\n validation: [],\n transform: [],\n expose: [],\n exclude: null,\n type: null,\n flags: {},\n });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// collect* — 카테고리별 수집 함수 (§3.1)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function collectValidation(target: object, key: string, ruleDef: RuleDef): void {\n const meta = ensureMeta((target as any).constructor, key);\n meta.validation.push(ruleDef);\n}\n\nexport function collectTransform(target: object, key: string, transformDef: TransformDef): void {\n const meta = ensureMeta((target as any).constructor, key);\n meta.transform.push(transformDef);\n}\n\nexport function collectExpose(target: object, key: string, exposeDef: ExposeDef): void {\n const meta = ensureMeta((target as any).constructor, key);\n meta.expose.push(exposeDef);\n}\n\nexport function collectExclude(target: object, key: string, excludeDef: ExcludeDef): void {\n const meta = ensureMeta((target as any).constructor, key);\n meta.exclude = excludeDef;\n}\n\nexport function collectType(target: object, key: string, typeDef: TypeDef): void {\n const meta = ensureMeta((target as any).constructor, key);\n meta.type = typeDef;\n}\n",
|
|
7
|
+
"import { collectValidation, ensureMeta } from '../collect';\nimport { equals, notEquals, isEmpty, isNotEmpty, isIn, isNotIn } from '../rules/common';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Flag-based decorators — flags에 직접 저장 (§3.2, §2.1 PropertyFlags)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * undefined/null 불허. groups를 무시하고 항상 적용.\n * @IsDefined와 @IsOptional 동시 선언 시 @IsDefined 우선 (optional 가드 생략).\n */\nexport function IsDefined(_options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n const meta = ensureMeta((target as any).constructor, key as string);\n meta.flags.isDefined = true;\n };\n}\n\n/**\n * undefined/null 허용 — 해당 필드의 전체 validation을 skip.\n * @IsDefined와 동시 선언 시 @IsDefined 우선.\n */\nexport function IsOptional(_options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n const meta = ensureMeta((target as any).constructor, key as string);\n meta.flags.isOptional = true;\n };\n}\n\n/**\n * 조건이 false일 때 해당 필드의 전체 검증을 skip.\n * 조건 함수는 원본 input 객체를 인자로 받는다.\n */\nexport function ValidateIf(condition: (obj: any) => boolean): PropertyDecorator {\n return (target, key) => {\n const meta = ensureMeta((target as any).constructor, key as string);\n meta.flags.validateIf = condition;\n };\n}\n\n/**\n * 중첩 DTO 재귀 검증 트리거. @Type과 함께 사용해야 한다.\n * builder 트리거 조건: meta.type !== null && meta.flags.validateNested === true\n */\nexport function ValidateNested(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n const meta = ensureMeta((target as any).constructor, key as string);\n meta.flags.validateNested = true;\n if (options?.each) meta.flags.validateNestedEach = true;\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Rule-based decorators — collectValidation으로 등록 (§3.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** value === comparison (strict equality) */\nexport function Equals(comparison: unknown, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: equals(comparison),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value !== comparison (strict inequality) */\nexport function NotEquals(comparison: unknown, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: notEquals(comparison),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value === undefined | null | '' */\nexport function IsEmpty(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isEmpty,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value !== undefined && value !== null && value !== '' */\nexport function IsNotEmpty(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNotEmpty,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** array.indexOf(value) !== -1 */\nexport function IsIn(array: readonly unknown[], options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isIn(array as unknown[]),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** array.indexOf(value) === -1 */\nexport function IsNotIn(array: readonly unknown[], options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNotIn(array as unknown[]),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
8
|
+
"import { collectValidation } from '../collect';\nimport { isString, isNumber, isBoolean, isDate, isEnum, isInt, isArray, isObject } from '../rules/typechecker';\nimport type { IsNumberOptions } from '../rules/typechecker';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Type Checker Decorators (§1.1 Type Checkers)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** typeof value === 'string' */\nexport function IsString(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isString,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** typeof value === 'number' + NaN/Infinity/maxDecimalPlaces 옵션 */\nexport function IsNumber(numberOptions?: IsNumberOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNumber(numberOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** typeof value === 'boolean' */\nexport function IsBoolean(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isBoolean,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value instanceof Date && !isNaN(getTime()) */\nexport function IsDate(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isDate,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** Object.values(entity).indexOf(value) !== -1 */\nexport function IsEnum(entity: object, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isEnum(entity),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** typeof value === 'number' && Number.isInteger(value) */\nexport function IsInt(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isInt,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** Array.isArray(value) */\nexport function IsArray(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isArray,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** typeof value === 'object' && value !== null && !Array.isArray(value) */\nexport function IsObject(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isObject,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
9
|
+
"import { collectValidation } from '../collect';\nimport { min, max, isPositive, isNegative, isDivisibleBy } from '../rules/number';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Number Decorators (§1.1 Number)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** value >= n */\nexport function Min(n: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: min(n),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value <= n */\nexport function Max(n: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: max(n),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value > 0 */\nexport function IsPositive(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isPositive,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value < 0 */\nexport function IsNegative(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNegative,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value % n === 0 */\nexport function IsDivisibleBy(n: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isDivisibleBy(n),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
10
|
+
"import { collectValidation } from '../collect';\nimport { minDate, maxDate } from '../rules/date';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Date Decorators (§1.1 Date)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** value >= date (inclusive, getTime 비교) */\nexport function MinDate(date: Date, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: minDate(date),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value <= date (inclusive, getTime 비교) */\nexport function MaxDate(date: Date, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: maxDate(date),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
11
|
+
"import { collectValidation } from '../collect';\nimport {\n minLength, maxLength, length, contains, notContains, matches,\n isLowercase, isUppercase, isAscii, isAlpha, isAlphanumeric,\n isBooleanString, isNumberString, isDecimal, isFullWidth, isHalfWidth,\n isVariableWidth, isMultibyte, isSurrogatePair, isHexadecimal, isOctal,\n isEmail, isURL, isUUID, isIP, isHexColor, isRgbColor, isHSL, isMACAddress,\n isISBN, isISIN, isISO8601, isISRC, isISSN, isJWT, isLatLong, isLocale,\n isDataURI, isFQDN, isPort, isEAN, isISO31661Alpha2, isISO31661Alpha3,\n isBIC, isFirebasePushId, isSemVer, isMongoId, isJSON,\n isBase32, isBase58, isBase64, isDateString, isMimeType, isCurrency, isMagnetURI,\n isCreditCard, isIBAN, isByteLength,\n isHash, isRFC3339, isMilitaryTime, isLatitude, isLongitude,\n isEthereumAddress, isBtcAddress, isISO4217CurrencyCode, isPhoneNumber,\n isStrongPassword, isTaxId,\n} from '../rules/string';\nimport type {\n IsEmailOptions, IsURLOptions, IsBase32Options, IsBase64Options,\n IsDateStringOptions, IsCurrencyOptions, IsMACAddressOptions,\n IsIBANOptions, IsISSNOptions, IsFQDNOptions, IsLatLongOptions,\n IsISO8601Options, IsNumberStringOptions, IsDecimalOptions,\n IsStrongPasswordOptions,\n} from '../rules/string';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Re-export option types for decorator consumer convenience\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type {\n IsEmailOptions, IsURLOptions, IsBase32Options, IsBase64Options,\n IsDateStringOptions, IsCurrencyOptions, IsMACAddressOptions,\n IsIBANOptions, IsISSNOptions, IsFQDNOptions, IsLatLongOptions,\n IsISO8601Options, IsNumberStringOptions, IsDecimalOptions,\n IsStrongPasswordOptions,\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group A: Length / Range\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function MinLength(min: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: minLength(min),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function MaxLength(max: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: maxLength(max),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function Length(min: number, max: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: length(min, max),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function Contains(seed: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: contains(seed),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function NotContains(seed: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: notContains(seed),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function Matches(pattern: string | RegExp, modifiers?: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: matches(pattern, modifiers),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group B: Simple Boolean Checks\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function IsLowercase(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isLowercase, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsUppercase(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isUppercase, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsAscii(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isAscii, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsAlpha(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isAlpha, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsAlphanumeric(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isAlphanumeric, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsBooleanString(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isBooleanString, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsNumberString(numberOptions?: IsNumberStringOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNumberString(numberOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsDecimal(decimalOptions?: IsDecimalOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isDecimal(decimalOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsFullWidth(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isFullWidth, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsHalfWidth(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isHalfWidth, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsVariableWidth(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isVariableWidth, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsMultibyte(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isMultibyte, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsSurrogatePair(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isSurrogatePair, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsHexadecimal(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isHexadecimal, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsOctal(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isOctal, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group C: Internet / Format (options 있는 것들)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function IsEmail(emailOptions?: IsEmailOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isEmail(emailOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsURL(urlOptions?: IsURLOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isURL(urlOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsUUID(version?: 1 | 2 | 3 | 4 | 5 | 'all', options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isUUID(version),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsIP(version?: 4 | 6, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isIP(version),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsHexColor(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isHexColor, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsRgbColor(includePercentValues?: boolean, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isRgbColor(includePercentValues ?? false), each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsHSL(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isHSL, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsMACAddress(macOptions?: IsMACAddressOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isMACAddress(macOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsISBN(version?: 10 | 13, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isISBN(version),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsISIN(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isISIN, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsISO8601(isoOptions?: IsISO8601Options, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isISO8601(isoOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsISRC(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isISRC, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsISSN(issnOptions?: IsISSNOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isISSN(issnOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsJWT(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isJWT, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsLatLong(latLongOptions?: IsLatLongOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isLatLong(latLongOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsLocale(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isLocale, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsDataURI(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isDataURI, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsFQDN(fqdnOptions?: IsFQDNOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isFQDN(fqdnOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsPort(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isPort, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsEAN(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isEAN, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsISO31661Alpha2(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isISO31661Alpha2, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsISO31661Alpha3(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isISO31661Alpha3, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsBIC(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isBIC, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsFirebasePushId(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isFirebasePushId, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsSemVer(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isSemVer, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsMongoId(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isMongoId, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsJSON(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isJSON, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsBase32(base32Options?: IsBase32Options, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isBase32(base32Options),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsBase58(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isBase58, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsBase64(base64Options?: IsBase64Options, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isBase64(base64Options),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsDateString(dateOptions?: IsDateStringOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isDateString(dateOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsMimeType(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isMimeType, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsCurrency(currencyOptions?: IsCurrencyOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isCurrency(currencyOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsMagnetURI(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isMagnetURI, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsCreditCard(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isCreditCard, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsIBAN(ibanOptions?: IsIBANOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isIBAN(ibanOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsByteLength(min: number, max?: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isByteLength(min, max),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group E: New Validators\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function IsHash(algorithm: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isHash(algorithm),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsRFC3339(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isRFC3339, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsMilitaryTime(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isMilitaryTime, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsLatitude(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isLatitude, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsLongitude(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isLongitude, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsEthereumAddress(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isEthereumAddress, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsBtcAddress(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isBtcAddress, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsISO4217CurrencyCode(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isISO4217CurrencyCode, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsPhoneNumber(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isPhoneNumber, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsStrongPassword(pwOptions?: IsStrongPasswordOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isStrongPassword(pwOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsTaxId(locale: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isTaxId(locale),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
12
|
+
"import { collectValidation } from '../collect';\nimport {\n arrayContains, arrayNotContains, arrayMinSize, arrayMaxSize,\n arrayUnique, arrayNotEmpty,\n} from '../rules/array';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Array Decorators (§1.1 Array)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** 배열이 지정한 모든 값을 포함 */\nexport function ArrayContains(values: unknown[], options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayContains(values),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 배열이 지정한 값을 포함하지 않음 */\nexport function ArrayNotContains(values: unknown[], options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayNotContains(values),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 배열 최소 길이 */\nexport function ArrayMinSize(min: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayMinSize(min),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 배열 최대 길이 */\nexport function ArrayMaxSize(max: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayMaxSize(max),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 배열에 중복 값 없음 */\nexport function ArrayUnique(identifier?: (o: unknown) => unknown, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayUnique(identifier),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 배열이 비어있지 않음 */\nexport function ArrayNotEmpty(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayNotEmpty,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
13
|
+
"import { collectValidation } from '../collect';\nimport { isNotEmptyObject, isInstance } from '../rules/object';\nimport type { IsNotEmptyObjectOptions } from '../rules/object';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Object Decorators (§1.1 Object)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 빈 객체가 아님 (최소 1개의 key).\n * nullable: true이면 null/undefined 값을 가진 키를 무시.\n */\nexport function IsNotEmptyObject(objectOptions?: IsNotEmptyObjectOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNotEmptyObject(objectOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value instanceof targetType */\nexport function IsInstance(targetType: new (...args: any[]) => any, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isInstance(targetType),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
14
|
+
"import { collectExpose, collectExclude, collectTransform, collectType } from '../collect';\nimport type { ExcludeDef, ExposeDef, TransformFunction, TypeDef } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Option Types (§1.2, §1.5 방향 옵션)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ExposeOptions {\n /** 출력 측 키 매핑 이름. deserialize/serialize 방향에 따라 다르게 설정 가능. */\n name?: string;\n /** 이 @Expose가 적용되는 groups. */\n groups?: string[];\n /** true: deserialize 방향에만 적용 (class-transformer toClassOnly 대응) */\n deserializeOnly?: boolean;\n /** true: serialize 방향에만 적용 (class-transformer toPlainOnly 대응) */\n serializeOnly?: boolean;\n}\n\nexport interface ExcludeOptions {\n /** true: deserialize 방향에만 제외 */\n deserializeOnly?: boolean;\n /** true: serialize 방향에만 제외 */\n serializeOnly?: boolean;\n}\n\nexport interface TransformOptions {\n /** 이 @Transform이 적용되는 groups */\n groups?: string[];\n /** true: deserialize 방향에만 적용 */\n deserializeOnly?: boolean;\n /** true: serialize 방향에만 적용 */\n serializeOnly?: boolean;\n}\n\nexport interface TypeOptions {\n /** discriminator 설정 — 다형성 지원 (§8) */\n discriminator?: {\n property: string;\n subTypes: { value: Function; name: string }[];\n };\n /** discriminator 프로퍼티를 결과 객체에 유지할지 여부 */\n keepDiscriminatorProperty?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Transform Decorators (§1.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 필드를 baker에 등록하고 선택적으로 name 매핑/groups/방향 제어를 수행.\n *\n * 복수 @Expose 스택 지원 — 방향별 다른 name 매핑에 활용:\n * @Expose({ name: 'user_name', deserializeOnly: true })\n * @Expose({ name: 'userName', serializeOnly: true })\n *\n * @Expose와 @Exclude 동시 적용 시 @Exclude 우선 (§1.2).\n */\nexport function Expose(options?: ExposeOptions): PropertyDecorator {\n return (target, key) => {\n collectExpose(target as object, key as string, (options ?? {}) as ExposeDef);\n };\n}\n\n/**\n * 필드를 serialize/deserialize 결과에서 제외.\n * @Exclude({ deserializeOnly: true }) — deserialize 방향만 제외\n * @Exclude({ serializeOnly: true }) — serialize 방향만 제외\n * @Exclude() — 양방향 제외\n *\n * @Expose와 동시 적용 시 @Exclude 우선 (§1.2).\n */\nexport function Exclude(options?: ExcludeOptions): PropertyDecorator {\n return (target, key) => {\n collectExclude(target as object, key as string, (options ?? {}) as ExcludeDef);\n };\n}\n\n/**\n * 커스텀 변환 함수 적용.\n * - TransformParams.type === 'deserialize' | 'serialize'로 방향 구분 가능\n * - 명시적 @Transform이 있으면 enableImplicitConversion 건너뜀 (§4.3 ⑤)\n */\nexport function Transform(fn: TransformFunction, options?: TransformOptions): PropertyDecorator {\n return (target, key) => {\n collectTransform(target as object, key as string, {\n fn,\n options: options ? {\n groups: options.groups,\n deserializeOnly: options.deserializeOnly,\n serializeOnly: options.serializeOnly,\n } : undefined,\n });\n };\n}\n\n/**\n * 중첩 객체의 타입을 지정. discriminator 다형성 지원.\n * @ValidateNested와 함께 사용 시 중첩 DTO 재귀 검증 활성화.\n * builder 트리거 조건: meta.type !== null && meta.flags.validateNested === true\n */\nexport function Type(fn: () => Function, options?: TypeOptions): PropertyDecorator {\n return (target, key) => {\n collectType(target as object, key as string, {\n fn: fn as TypeDef['fn'],\n discriminator: options?.discriminator,\n keepDiscriminatorProperty: options?.keepDiscriminatorProperty,\n });\n };\n}\n",
|
|
15
|
+
"import { collectValidation } from '../collect';\nimport {\n isMobilePhone,\n isPostalCode,\n isIdentityCard,\n isPassportNumber,\n} from '../rules/locales';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Locale Decorators (§1.1 Phase 6)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** 로케일별 모바일 전화번호 */\nexport function IsMobilePhone(locale: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isMobilePhone(locale),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 로케일별 우편번호 */\nexport function IsPostalCode(locale: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isPostalCode(locale),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 로케일별 신분증 번호 */\nexport function IsIdentityCard(locale: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isIdentityCard(locale),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 로케일별 여권 번호 */\nexport function IsPassportNumber(locale: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isPassportNumber(locale),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n"
|
|
16
|
+
],
|
|
17
|
+
"mappings": "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",
|
|
18
|
+
"debugId": "2E7EB1A1568D4A4264756E2164756E21",
|
|
19
|
+
"names": []
|
|
20
|
+
}
|