@warlock.js/seal 5.32.0 → 5.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -72
- package/cjs/index.cjs +39 -8
- package/cjs/index.cjs.map +1 -1
- package/cjs/{object-BoVGJ68E.cjs → object-Um5Ds4ch.cjs} +9 -6
- package/cjs/{object-BoVGJ68E.cjs.map → object-Um5Ds4ch.cjs.map} +1 -1
- package/cjs/object.cjs +2 -2
- package/cjs/{required-methods-BJlnLnwa.cjs → required-methods-Bh481cKm.cjs} +17 -2
- package/cjs/required-methods-Bh481cKm.cjs.map +1 -0
- package/cjs/{string-CM8x0u2w.cjs → string-BOKt6UtS.cjs} +2 -2
- package/cjs/{string-CM8x0u2w.cjs.map → string-BOKt6UtS.cjs.map} +1 -1
- package/cjs/string.cjs +2 -2
- package/esm/factory/validators.d.mts +10 -3
- package/esm/factory/validators.d.mts.map +1 -1
- package/esm/factory/validators.mjs +9 -1
- package/esm/factory/validators.mjs.map +1 -1
- package/esm/helpers/plain-object.mjs +11 -0
- package/esm/helpers/plain-object.mjs.map +1 -0
- package/esm/rules/common/type-rules.d.mts.map +1 -1
- package/esm/rules/common/type-rules.mjs +3 -2
- package/esm/rules/common/type-rules.mjs.map +1 -1
- package/esm/validators/object-validator.mjs +9 -6
- package/esm/validators/object-validator.mjs.map +1 -1
- package/esm/validators/record-validator.d.mts +3 -1
- package/esm/validators/record-validator.d.mts.map +1 -1
- package/esm/validators/record-validator.mjs +28 -4
- package/esm/validators/record-validator.mjs.map +1 -1
- package/llms-full.txt +21 -2
- package/package.json +1 -1
- package/skills/define-structural-shape/SKILL.md +21 -2
- package/cjs/required-methods-BJlnLnwa.cjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_required_methods = require("./required-methods-
|
|
1
|
+
const require_required_methods = require("./required-methods-Bh481cKm.cjs");
|
|
2
2
|
let _mongez_reinforcements = require("@mongez/reinforcements");
|
|
3
3
|
|
|
4
4
|
//#region ../../packages/seal/src/mutators/string-mutators.ts
|
|
@@ -942,4 +942,4 @@ Object.defineProperty(exports, "urlEncodeMutator", {
|
|
|
942
942
|
return urlEncodeMutator;
|
|
943
943
|
}
|
|
944
944
|
});
|
|
945
|
-
//# sourceMappingURL=string-
|
|
945
|
+
//# sourceMappingURL=string-BOKt6UtS.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string-CM8x0u2w.cjs","names":["capitalize","trim","toCamelCase","toStudlyCase","toSnakeCase","toKebabCase","ltrim","rtrim","readMoreChars","BaseValidator","enumRule","inRule","allowedValuesRule","notAllowedValuesRule","stringRule","emailRule","urlRule","withoutWhitespaceRule","patternRule","strongPasswordRule","wordsRule","minWordsRule","maxWordsRule","minLengthRule","maxLengthRule","lengthRule","betweenLengthRule","alphaRule","alphaNumericRule","isNumericRule","startsWithRule","endsWithRule","containsRule","notContainsRule","ipRule","ip4Rule","ip6Rule","isCreditCardRule","colorRule","hexColorRule","hslColorRule","rgbColorRule","rgbaColorRule","lightColorRule","darkColorRule","uuidRule","cuidRule","ulidRule","nanoidRule","getRuleOptions"],"sources":["../../../../../../../packages/seal/src/mutators/string-mutators.ts","../../../../../../../packages/seal/src/validators/primitive-validator.ts","../../../../../../../packages/seal/src/validators/string-validator.ts","../../../../../../../packages/seal/src/string.ts"],"sourcesContent":["import {\n capitalize,\n ltrim,\n readMoreChars,\n rtrim,\n toCamelCase,\n toKebabCase,\n toSnakeCase,\n toStudlyCase,\n trim,\n} from \"@mongez/reinforcements\";\nimport type { Mutator } from \"../types\";\n\n/** Convert string to lowercase */\nexport const lowercaseMutator: Mutator = async (value) => {\n return value?.toString().toLowerCase();\n};\n\n/** Convert string to uppercase */\nexport const uppercaseMutator: Mutator = async (value) => {\n return value?.toString().toUpperCase();\n};\n\n/** Capitalize only the first letter of the string */\nexport const capitalizeMutator: Mutator = async (value) => {\n const str = value?.toString();\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n};\n\n/** Capitalize the first letter of each word (Title Case) */\nexport const titleCaseMutator: Mutator = async (value) => {\n return capitalize(value?.toString());\n};\n\n/** Convert value to string */\nexport const stringifyMutator: Mutator = async (value) => {\n if (!value && value !== 0) return \"\";\n // only convert numbers, boolean and strings\n\n // Handle strings (pass through)\n if (typeof value === \"string\") return value;\n\n // Handle scalar types (number, boolean)\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n};\n\n/** Trim whitespace */\nexport const trimMutator: Mutator = async (value, context) => {\n return trim(value?.toString(), context?.options?.needle ?? \" \");\n};\n\n/**\n * Strip HTML tags with a naive `<...>` regex.\n *\n * This is a **tag stripper, not an XSS sanitizer**: it is not a parser, so\n * malformed/nested markup, attribute payloads, or content re-introduced\n * later in a pipeline can defeat it. Do not rely on this alone to make\n * untrusted rich text safe to render — use a real parser-based sanitizer\n * (e.g. DOMPurify / sanitize-html) for that.\n */\nexport const stripTagsMutator: Mutator = async (value) => {\n return value?.toString().replace(/<[^>]*>?/gm, \"\");\n};\n\n/**\n * @deprecated Renamed to {@link stripTagsMutator} — the old name implied\n * XSS safety this tag-stripping regex does not provide. Kept as an alias\n * for backward compatibility; switch to `stripTagsMutator`.\n */\nexport const safeHtmlMutator: Mutator = stripTagsMutator;\n\n/** HTML escape */\nexport const htmlEscapeMutator: Mutator = async (value) => {\n return value\n ?.toString()\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n};\n\n/** Remove special characters */\nexport const removeSpecialCharactersMutator: Mutator = async (value) => {\n return value?.toString().replace(/[^a-zA-Z0-9]/g, \"\");\n};\n\n/** URL decode */\nexport const urlDecodeMutator: Mutator = async (value) => {\n return decodeURIComponent(value);\n};\n\n/** URL encode */\nexport const urlEncodeMutator: Mutator = async (value) => {\n return encodeURIComponent(value);\n};\n\n/** Convert to camelCase */\nexport const camelCaseMutator: Mutator = async (value) => {\n return toCamelCase(value?.toString());\n};\n\n/** Convert to PascalCase */\nexport const pascalCaseMutator: Mutator = async (value) => {\n return toStudlyCase(value?.toString());\n};\n\n/** Convert to snake_case */\nexport const snakeCaseMutator: Mutator = async (value) => {\n return toSnakeCase(value?.toString());\n};\n\n/** Convert to kebab-case */\nexport const kebabCaseMutator: Mutator = async (value) => {\n return toKebabCase(value?.toString());\n};\n\n/** Convert to URL-friendly slug */\nexport const slugMutator: Mutator = async (value) => {\n return value\n ?.toString()\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_]+/g, \"-\")\n .replace(/--+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n};\n\n/** Trim from the left/start */\nexport const ltrimMutator: Mutator = async (value, context) => {\n return ltrim(value?.toString(), context?.options?.needle ?? \" \");\n};\n\n/** Trim from the right/end */\nexport const rtrimMutator: Mutator = async (value, context) => {\n return rtrim(value?.toString(), context?.options?.needle ?? \" \");\n};\n\n/** Base64 encode */\nexport const base64EncodeMutator: Mutator = async (value) => {\n return Buffer.from(value?.toString()).toString(\"base64\");\n};\n\n/** Base64 decode */\nexport const base64DecodeMutator: Mutator = async (value) => {\n return Buffer.from(value?.toString(), \"base64\").toString(\"utf-8\");\n};\n\n/** Replace substring or pattern */\nexport const replaceMutator: Mutator = async (value, context) => {\n const { search, replace } = context?.options ?? {};\n if (!search) return value?.toString();\n return value?.toString().replace(search, replace ?? \"\");\n};\n\n/** Replace all occurrences of substring or pattern */\nexport const replaceAllMutator: Mutator = async (value, context) => {\n const { search, replace } = context?.options ?? {};\n if (!search) return value?.toString();\n const searchValue = typeof search === \"string\" ? new RegExp(search, \"g\") : search;\n return value?.toString().replace(searchValue, replace ?? \"\");\n};\n\n/** Append/suffix text to the end */\nexport const appendMutator: Mutator = async (value, context) => {\n const suffix = context?.options?.suffix ?? \"\";\n return value?.toString() + suffix;\n};\n\n/** Prepend/prefix text to the beginning */\nexport const prependMutator: Mutator = async (value, context) => {\n const prefix = context?.options?.prefix ?? \"\";\n return prefix + value?.toString();\n};\n\n/** Reverse the string */\nexport const reverseMutator: Mutator = async (value) => {\n return value?.toString().split(\"\").reverse().join(\"\");\n};\n\n/** Truncate to a maximum length */\nexport const truncateMutator: Mutator = async (value, context) => {\n const str = value?.toString();\n const maxLength = context?.options?.maxLength ?? 100;\n const suffix = context?.options?.suffix ?? \"...\";\n return readMoreChars(str, maxLength, suffix);\n};\n\n/** Trim multiple whitespace into single space */\nexport const trimMultipleWhitespaceMutator: Mutator = async (value) => {\n return value?.toString().replace(/\\s+/g, \" \");\n};\n\n/** Pad string from the start to reach target length */\nexport const padStartMutator: Mutator = async (value, context) => {\n const length = context?.options?.length ?? 0;\n const char = context?.options?.char ?? \" \";\n return value?.toString().padStart(length, char);\n};\n\n/** Pad string from the end to reach target length */\nexport const padEndMutator: Mutator = async (value, context) => {\n const length = context?.options?.length ?? 0;\n const char = context?.options?.char ?? \" \";\n return value?.toString().padEnd(length, char);\n};\n\n/** Repeat string N times */\nexport const repeatMutator: Mutator = async (value, context) => {\n const count = context?.options?.count ?? 1;\n return value?.toString()?.repeat(count);\n};\n\n/** Mask part of string */\nexport const maskMutator: Mutator = async (value, context) => {\n const str = value?.toString();\n const maskChar = context?.options?.char ?? \"*\";\n const start = context?.options?.start ?? 0;\n const end = context?.options?.end ?? str?.length;\n const visibleStart = str?.substring(0, start);\n const visibleEnd = str?.substring(end);\n const maskedLength = end - start;\n return visibleStart + maskChar.repeat(maskedLength) + visibleEnd;\n};\n\n/** Unescape HTML entities */\nexport const unescapeHtmlMutator: Mutator = async (value) => {\n return value\n ?.toString()\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n};\n\n/** Keep only alphabetic characters */\nexport const alphaOnlyMutator: Mutator = async (value) => {\n return value.toString().replace(/[^a-zA-Z]/g, \"\");\n};\n\n/** Keep only alphanumeric characters */\nexport const alphanumericOnlyMutator: Mutator = async (value) => {\n return value.toString().replace(/[^a-zA-Z0-9]/g, \"\");\n};\n\n/** Remove all numeric characters */\nexport const removeNumbersMutator: Mutator = async (value) => {\n return value.toString().replace(/[0-9]/g, \"\");\n};\n","import { allowedValuesRule, enumRule, inRule, notAllowedValuesRule } from \"../rules/common/enum\";\nimport { BaseValidator } from \"./base-validator\";\n\n/**\n * Abstract base validator for primitive-typed fields (string, number, boolean).\n *\n * Provides value-membership rules that are meaningful for any single primitive value\n * but not for complex structures (object, array).\n *\n * Do NOT expose this on the `v` factory — it is an inheritance-only base class.\n *\n * Hierarchy:\n * BaseValidator\n * └── PrimitiveValidator ← enum, in, oneOf, allowsOnly, forbids, notIn\n * ├── StringValidator\n * ├── NumberValidator\n * │ └── FloatValidator\n * ├── BooleanValidator\n * └── ScalarValidator (extends PrimitiveValidator, adds asNumber/asString/accepted/declined)\n *\n * @example\n * class MyValidator extends PrimitiveValidator {\n * // inherits: in(), forbids(), enum(), oneOf(), allowsOnly(), notIn()\n * }\n */\nexport abstract class PrimitiveValidator extends BaseValidator {\n /**\n * Value must be one of the enum's values\n *\n * @example\n * v.string().enum(Direction) // Direction is a TS enum\n */\n public enum(values: any, errorMessage?: string) {\n return this.addRule(enumRule, errorMessage, { enum: Object.values(values) });\n }\n\n /**\n * Value must be one of the given values\n *\n * @example\n * v.string().in([\"admin\", \"user\", \"guest\"])\n * v.number().in([1, 2, 3])\n */\n public in(values: any[], errorMessage?: string) {\n return this.addRule(inRule, errorMessage, { values });\n }\n\n /**\n * Alias for `in()`\n *\n * @example\n * v.string().oneOf([\"active\", \"inactive\"])\n */\n public oneOf(values: any[], errorMessage?: string) {\n return this.in(values, errorMessage);\n }\n\n /**\n * Value must be one of the allowed values (stricter variant)\n *\n * @example\n * v.string().allowsOnly([\"yes\", \"no\"])\n */\n public allowsOnly(values: any[], errorMessage?: string) {\n return this.addRule(allowedValuesRule, errorMessage, { allowedValues: values });\n }\n\n /**\n * Value must NOT be one of the given values\n *\n * @example\n * v.string().forbids([\"banned\", \"blacklisted\"])\n * v.number().forbids([0, -1])\n */\n public forbids(values: any[], errorMessage?: string) {\n return this.addRule(notAllowedValuesRule, errorMessage, { notAllowedValues: values });\n }\n\n /**\n * Alias for `forbids()`\n *\n * @example\n * v.string().notIn([\"OK\", \"NOT OK\"])\n */\n public notIn(values: any[], errorMessage?: string) {\n return this.forbids(values, errorMessage);\n }\n}\n","import {\n alphaOnlyMutator,\n alphanumericOnlyMutator,\n appendMutator,\n base64DecodeMutator,\n base64EncodeMutator,\n camelCaseMutator,\n capitalizeMutator,\n htmlEscapeMutator,\n kebabCaseMutator,\n lowercaseMutator,\n ltrimMutator,\n maskMutator,\n padEndMutator,\n padStartMutator,\n pascalCaseMutator,\n prependMutator,\n removeNumbersMutator,\n removeSpecialCharactersMutator,\n repeatMutator,\n replaceAllMutator,\n replaceMutator,\n reverseMutator,\n rtrimMutator,\n slugMutator,\n snakeCaseMutator,\n stringifyMutator,\n stripTagsMutator,\n titleCaseMutator,\n trimMultipleWhitespaceMutator,\n trimMutator,\n truncateMutator,\n unescapeHtmlMutator,\n uppercaseMutator,\n urlDecodeMutator,\n urlEncodeMutator,\n} from \"../mutators/string-mutators\";\nimport { alphaNumericRule, alphaRule, isNumericRule } from \"../rules/string/alpha\";\nimport { isCreditCardRule } from \"../rules/string/credit-card\";\nimport { emailRule } from \"../rules/string/email\";\nimport { cuidRule, nanoidRule, ulidRule, uuidRule } from \"../rules/string/id-formats\";\nimport { ip4Rule, ip6Rule, ipRule } from \"../rules/string/ip\";\nimport {\n containsRule,\n endsWithRule,\n notContainsRule,\n startsWithRule,\n} from \"../rules/string/string-comparison\";\nimport { patternRule } from \"../rules/string/pattern\";\nimport { strongPasswordRule } from \"../rules/string/strong-password-rule\";\nimport { urlRule } from \"../rules/string/url\";\nimport { withoutWhitespaceRule } from \"../rules/string/without-whitespace\";\nimport type { UUIDVersion } from \"../rules/string/id-formats\";\nimport {\n betweenLengthRule,\n lengthRule,\n maxLengthRule,\n maxWordsRule,\n minLengthRule,\n minWordsRule,\n wordsRule,\n} from \"../rules/length\";\nimport {\n colorRule,\n darkColorRule,\n hexColorRule,\n hslColorRule,\n lightColorRule,\n rgbColorRule,\n rgbaColorRule,\n} from \"../rules/color\";\nimport { stringRule } from \"../rules/common/type-rules\";\nimport { PrimitiveValidator } from \"./primitive-validator\";\nimport { applyNullable, getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * String validator class\n */\nexport class StringValidator extends PrimitiveValidator {\n public constructor(errorMessage?: string) {\n super();\n this.addMutableRule(stringRule, errorMessage);\n }\n\n /**\n * Check if value is a string type\n */\n public matchesType(value: any): boolean {\n return typeof value === \"string\";\n }\n\n // ==================== Mutators ====================\n\n /**\n * Stringify the value if not a string\n */\n public toString() {\n return this.addMutator(stringifyMutator);\n }\n\n /** Convert string to uppercase */\n public uppercase() {\n return this.addMutator(uppercaseMutator);\n }\n\n /** Convert string to lowercase */\n public lowercase() {\n return this.addMutator(lowercaseMutator);\n }\n\n /** Capitalize only the first letter of the string */\n public capitalize() {\n return this.addMutator(capitalizeMutator);\n }\n\n /** Capitalize the first letter of each word (Title Case) */\n public titleCase() {\n return this.addMutator(titleCaseMutator);\n }\n\n /** Convert to camelCase */\n public camelCase() {\n return this.addMutator(camelCaseMutator);\n }\n\n /** Convert to PascalCase */\n public pascalCase() {\n return this.addMutator(pascalCaseMutator);\n }\n\n /** Convert to snake_case */\n public snakeCase() {\n return this.addMutator(snakeCaseMutator);\n }\n\n /** Convert to kebab-case */\n public kebabCase() {\n return this.addMutator(kebabCaseMutator);\n }\n\n /**\n * Trim the given needle from the string\n * If no needle is provided, the default is a single space\n */\n public trim(needle?: string) {\n return this.addMutator(trimMutator, { needle });\n }\n\n /** Trim from the left/start */\n public ltrim(needle?: string) {\n return this.addMutator(ltrimMutator, { needle });\n }\n\n /** Trim from the right/end */\n public rtrim(needle?: string) {\n return this.addMutator(rtrimMutator, { needle });\n }\n\n /** Trim multiple whitespace into single space */\n public trimMultipleWhitespace() {\n return this.addMutator(trimMultipleWhitespaceMutator);\n }\n\n /** Pad string from the start to reach target length */\n public padStart(length: number, char = \" \") {\n return this.addMutator(padStartMutator, { length, char });\n }\n\n /** Pad string from the end to reach target length */\n public padEnd(length: number, char = \" \") {\n return this.addMutator(padEndMutator, { length, char });\n }\n\n /**\n * Strip HTML tags with a naive `<...>` regex.\n *\n * This is a **tag stripper, not an XSS sanitizer**: it is not a parser,\n * so malformed/nested markup or content re-introduced later in a\n * pipeline can defeat it. Do not rely on this alone to make untrusted\n * rich text safe to render — use a real parser-based sanitizer (e.g.\n * DOMPurify / sanitize-html) for that.\n */\n public stripTags() {\n return this.addMutator(stripTagsMutator);\n }\n\n /**\n * @deprecated Renamed to {@link StringValidator.stripTags} — the old\n * name implied XSS safety this tag-stripping regex does not provide.\n * Kept as an alias for backward compatibility; switch to `.stripTags()`.\n */\n public safeHtml() {\n return this.stripTags();\n }\n\n /** HTML escape special characters */\n public htmlEscape() {\n return this.addMutator(htmlEscapeMutator);\n }\n\n /** Unescape HTML entities */\n public unescapeHtml() {\n return this.addMutator(unescapeHtmlMutator);\n }\n\n /**\n * Remove special characters\n * This will remove all characters that are not alphanumeric or whitespace\n */\n public removeSpecialCharacters() {\n return this.addMutator(removeSpecialCharactersMutator);\n }\n\n /** Convert to only alphabetic characters */\n public toAlpha() {\n return this.addMutator(alphaOnlyMutator);\n }\n\n /** Convert to only alphanumeric characters */\n public toAlphanumeric() {\n return this.addMutator(alphanumericOnlyMutator);\n }\n\n /** Remove all numeric characters */\n public removeNumbers() {\n return this.addMutator(removeNumbersMutator);\n }\n\n /** URL decode */\n public urlDecode() {\n return this.addMutator(urlDecodeMutator);\n }\n\n /** URL encode */\n public urlEncode() {\n return this.addMutator(urlEncodeMutator);\n }\n\n /** Convert to URL-friendly slug */\n public slug() {\n return this.addMutator(slugMutator);\n }\n\n /** Base64 encode */\n public base64Encode() {\n return this.addMutator(base64EncodeMutator);\n }\n\n /** Base64 decode */\n public base64Decode() {\n return this.addMutator(base64DecodeMutator);\n }\n\n /** Replace substring or pattern */\n public replace(search: string | RegExp, replace: string) {\n return this.addMutator(replaceMutator, { search, replace });\n }\n\n /** Replace all occurrences of substring or pattern */\n public replaceAll(search: string | RegExp, replace: string) {\n return this.addMutator(replaceAllMutator, { search, replace });\n }\n\n /** Append/suffix text to the end */\n public append(suffix: string) {\n return this.addMutator(appendMutator, { suffix });\n }\n\n /** Prepend/prefix text to the beginning */\n public prepend(prefix: string) {\n return this.addMutator(prependMutator, { prefix });\n }\n\n /** Reverse the string */\n public reverse() {\n return this.addMutator(reverseMutator);\n }\n\n /** Truncate to a maximum length */\n public truncate(maxLength: number, suffix = \"...\") {\n return this.addMutator(truncateMutator, { maxLength, suffix });\n }\n\n /** Repeat string N times */\n public repeat(count: number) {\n return this.addMutator(repeatMutator, { count });\n }\n\n /** Mask part of string */\n public mask(start: number, end?: number, char = \"*\") {\n return this.addMutator(maskMutator, { start, end, char });\n }\n\n // ==================== Validation Rules ====================\n\n /** Value must be a valid email */\n public email(errorMessage?: string) {\n return this.addRule(emailRule, errorMessage);\n }\n\n /** Value must be a valid URL */\n public url(errorMessage?: string) {\n return this.addRule(urlRule, errorMessage);\n }\n\n /** Value can not have whitespace */\n public withoutWhitespace(errorMessage?: string) {\n return this.addRule(withoutWhitespaceRule, errorMessage);\n }\n\n /** Value must match the given pattern */\n public pattern(pattern: RegExp, errorMessage?: string) {\n return this.addRule(patternRule, errorMessage, { pattern });\n }\n\n /**\n * Value must be a strong password\n * Requirements:\n * - At least 8 characters\n * - At least 1 uppercase letter\n * - At least 1 lowercase letter\n * - At least 1 number\n * - At least 1 special character\n */\n public strongPassword(minLength?: number, errorMessage?: string) {\n return this.addRule(strongPasswordRule, errorMessage, { minLength });\n }\n\n /** Value must be exactly the given number of words */\n public words(words: number, errorMessage?: string) {\n return this.addRule(wordsRule, errorMessage, { words });\n }\n\n /** Value must be at least the given number of words */\n public minWords(words: number, errorMessage?: string) {\n return this.addRule(minWordsRule, errorMessage, { minWords: words });\n }\n\n /** Value must be at most the given number of words */\n public maxWords(words: number, errorMessage?: string) {\n return this.addRule(maxWordsRule, errorMessage, { maxWords: words });\n }\n\n /** Value length must be greater than the given length */\n public minLength(length: number, errorMessage?: string) {\n return this.addRule(minLengthRule, errorMessage, { minLength: length });\n }\n\n /** @alias minLength */\n public min(min: number, errorMessage?: string) {\n return this.minLength(min, errorMessage);\n }\n\n /** Value length must be less than the given length */\n public maxLength(length: number, errorMessage?: string) {\n return this.addRule(maxLengthRule, errorMessage, { maxLength: length });\n }\n\n /** @alias maxLength */\n public max(max: number, errorMessage?: string) {\n return this.maxLength(max, errorMessage);\n }\n\n /** Value must be of the given length */\n public length(length: number, errorMessage?: string) {\n return this.addRule(lengthRule, errorMessage, { length });\n }\n\n /**\n * String length must be between min and max (inclusive)\n *\n * @param min - Minimum length (inclusive)\n * @param max - Maximum length (inclusive)\n *\n * @example\n * ```ts\n * v.string().between(5, 10) // Length: 5 to 10 characters\n * v.string().lengthBetween(8, 20) // Same using alias\n * ```\n *\n * @category Validation Rule\n */\n public lengthBetween(min: number, max: number, errorMessage?: string) {\n return this.addRule(betweenLengthRule, errorMessage, {\n minLength: min,\n maxLength: max,\n });\n }\n\n /** Allow only alphabetic characters */\n public alpha(errorMessage?: string) {\n return this.addRule(alphaRule, errorMessage);\n }\n\n /** Allow only alphanumeric characters */\n public alphanumeric(errorMessage?: string) {\n return this.addRule(alphaNumericRule, errorMessage);\n }\n\n /** Allow only numeric characters */\n public numeric(errorMessage?: string) {\n return this.addRule(isNumericRule, errorMessage);\n }\n\n /** Value must starts with the given string */\n public startsWith(value: string, errorMessage?: string) {\n return this.addRule(startsWithRule, errorMessage, { value });\n }\n\n /** Value must ends with the given string */\n public endsWith(value: string, errorMessage?: string) {\n return this.addRule(endsWithRule, errorMessage, { value });\n }\n\n /** Value must contain the given string */\n public contains(value: string, errorMessage?: string) {\n return this.addRule(containsRule, errorMessage, { value });\n }\n\n /** Value must not contain the given string */\n public notContains(value: string, errorMessage?: string) {\n return this.addRule(notContainsRule, errorMessage, { value });\n }\n\n /** Value must be a valid IP address */\n public ip(errorMessage?: string) {\n return this.addRule(ipRule, errorMessage);\n }\n\n /** Value must be a valid IPv4 address */\n public ip4(errorMessage?: string) {\n return this.addRule(ip4Rule, errorMessage);\n }\n\n /** Value must be a valid IPv6 address */\n public ip6(errorMessage?: string) {\n return this.addRule(ip6Rule, errorMessage);\n }\n\n /** Check if the string matches a credit card number */\n public creditCard(errorMessage?: string) {\n return this.addRule(isCreditCardRule, errorMessage);\n }\n\n /** Determine if the value is a valid color */\n public color(errorMessage?: string) {\n return this.addRule(colorRule, errorMessage);\n }\n\n /** Determine if the value is a valid hex color */\n public hexColor(errorMessage?: string) {\n return this.addRule(hexColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid HSL color */\n public hslColor(errorMessage?: string) {\n return this.addRule(hslColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid RGB color */\n public rgbColor(errorMessage?: string) {\n return this.addRule(rgbColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid RGBA color */\n public rgbaColor(errorMessage?: string) {\n return this.addRule(rgbaColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid light color */\n public lightColor(errorMessage?: string) {\n return this.addRule(lightColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid dark color */\n public darkColor(errorMessage?: string) {\n return this.addRule(darkColorRule, errorMessage);\n }\n\n // ==================== ID Format Rules ====================\n\n /**\n * Value must be a valid UUID. Optionally restrict to a specific version.\n *\n * @example\n * v.string().uuid() // any RFC 4122 UUID\n * v.string().uuid(4) // only v4 (random)\n * v.string().uuid(7) // only v7 (timestamp-ordered)\n */\n public uuid(version?: UUIDVersion, errorMessage?: string) {\n return this.addRule(uuidRule, errorMessage, { version });\n }\n\n /**\n * Value must be a valid CUID. Defaults to CUID2; pass `{ version: 1 }` for legacy.\n *\n * @example\n * v.string().cuid() // CUID2\n * v.string().cuid({ version: 1 }) // legacy CUID1\n */\n public cuid(options?: { version?: 1 | 2; errorMessage?: string }) {\n const { errorMessage, version } = options ?? {};\n return this.addRule(cuidRule, errorMessage, { version });\n }\n\n /** Value must be a valid ULID (26 chars, Crockford base32). */\n public ulid(errorMessage?: string) {\n return this.addRule(ulidRule, errorMessage);\n }\n\n /**\n * Value must be a valid nanoid string. Default length is 21.\n *\n * @example\n * v.string().nanoid() // 21 chars (default)\n * v.string().nanoid(10) // 10 chars\n */\n public nanoid(length?: number, errorMessage?: string) {\n return this.addRule(nanoidRule, errorMessage, { length });\n }\n\n /**\n * @inheritdoc\n *\n * Maps String-specific rule options to JSON Schema keywords.\n * Non-representable rules (cross-field, refine, color rules, etc.) are silently omitted.\n *\n * @example\n * ```ts\n * v.string().min(2).max(100).email().toJsonSchema(\"draft-2020-12\")\n * // → { type: \"string\", minLength: 2, maxLength: 100, format: \"email\" }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const schema: JsonSchemaResult = { type: \"string\" };\n\n // minLength / min\n const minOpts = getRuleOptions(this.rules, \"minLength\");\n if (minOpts?.minLength !== undefined) schema.minLength = minOpts.minLength;\n\n // maxLength / max\n const maxOpts = getRuleOptions(this.rules, \"maxLength\");\n if (maxOpts?.maxLength !== undefined) schema.maxLength = maxOpts.maxLength;\n\n // betweenLength covers both min and max in one rule\n const betweenOpts = getRuleOptions(this.rules, \"betweenLength\");\n if (betweenOpts) {\n if (betweenOpts.minLength !== undefined) schema.minLength = betweenOpts.minLength;\n if (betweenOpts.maxLength !== undefined) schema.maxLength = betweenOpts.maxLength;\n }\n\n // exact length\n const lengthOpts = getRuleOptions(this.rules, \"length\");\n if (lengthOpts?.length !== undefined) {\n schema.minLength = lengthOpts.length;\n schema.maxLength = lengthOpts.length;\n }\n\n // pattern (regex)\n const patternOpts = getRuleOptions(this.rules, \"pattern\");\n if (patternOpts?.pattern instanceof RegExp) {\n schema.pattern = patternOpts.pattern.source;\n }\n\n // format hints\n if (\n getRuleOptions(this.rules, \"email\") !== undefined ||\n this.rules.some((r) => r.name === \"email\")\n ) {\n schema.format = \"email\";\n } else if (this.rules.some((r) => r.name === \"url\")) {\n schema.format = \"uri\";\n } else if (this.rules.some((r) => r.name === \"ip\")) {\n schema.format = \"ipv4\";\n } else if (this.rules.some((r) => r.name === \"ip4\")) {\n schema.format = \"ipv4\";\n } else if (this.rules.some((r) => r.name === \"ip6\")) {\n schema.format = \"ipv6\";\n } else if (this.rules.some((r) => r.name === \"uuid\")) {\n schema.format = \"uuid\";\n } else if (this.rules.some((r) => r.name === \"hexColor\")) {\n schema.format = \"color\";\n }\n\n // CUID / ULID / nanoid don't have widely-supported format keywords —\n // fall back to pattern so JSON Schema validators still enforce shape.\n if (!schema.format) {\n const cuidOpts = getRuleOptions(this.rules, \"cuid\");\n if (cuidOpts) {\n schema.pattern = cuidOpts.version === 1 ? \"^c[a-z0-9]{24,}$\" : \"^[a-z][a-z0-9]{23}$\";\n }\n if (this.rules.some((r) => r.name === \"ulid\")) {\n schema.pattern = \"^[0-9A-HJKMNP-TV-Z]{26}$\";\n }\n const nanoidOpts = getRuleOptions(this.rules, \"nanoid\");\n if (nanoidOpts) {\n const len = (nanoidOpts.length as number | undefined) ?? 21;\n schema.pattern = `^[A-Za-z0-9_-]{${len}}$`;\n }\n }\n\n // enum (from PrimitiveValidator.in / .enum)\n const inOpts = getRuleOptions(this.rules, \"in\");\n if (inOpts?.values && Array.isArray(inOpts.values)) {\n schema.enum = inOpts.values;\n }\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n","import type { StandardSchemaV1 } from \"./standard-schema/types\";\nimport { StringValidator } from \"./validators/string-validator\";\n\nexport { equalityConditionalMethodsApplied } from \"./validators/methods/equality-conditional-methods\";\nexport { forbiddenMethodsApplied } from \"./validators/methods/forbidden-methods\";\nexport { presentMethodsApplied } from \"./validators/methods/present-methods\";\nexport { requiredMethodsApplied } from \"./validators/methods/required-methods\";\nexport { StringValidator };\n\n/** Create a string schema without importing the complete `v` factory. */\nexport const string = (errorMessage?: string) =>\n new StringValidator(errorMessage) as StringValidator & StandardSchemaV1<string>;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"string-BOKt6UtS.cjs","names":["capitalize","trim","toCamelCase","toStudlyCase","toSnakeCase","toKebabCase","ltrim","rtrim","readMoreChars","BaseValidator","enumRule","inRule","allowedValuesRule","notAllowedValuesRule","stringRule","emailRule","urlRule","withoutWhitespaceRule","patternRule","strongPasswordRule","wordsRule","minWordsRule","maxWordsRule","minLengthRule","maxLengthRule","lengthRule","betweenLengthRule","alphaRule","alphaNumericRule","isNumericRule","startsWithRule","endsWithRule","containsRule","notContainsRule","ipRule","ip4Rule","ip6Rule","isCreditCardRule","colorRule","hexColorRule","hslColorRule","rgbColorRule","rgbaColorRule","lightColorRule","darkColorRule","uuidRule","cuidRule","ulidRule","nanoidRule","getRuleOptions"],"sources":["../../../../../../../packages/seal/src/mutators/string-mutators.ts","../../../../../../../packages/seal/src/validators/primitive-validator.ts","../../../../../../../packages/seal/src/validators/string-validator.ts","../../../../../../../packages/seal/src/string.ts"],"sourcesContent":["import {\n capitalize,\n ltrim,\n readMoreChars,\n rtrim,\n toCamelCase,\n toKebabCase,\n toSnakeCase,\n toStudlyCase,\n trim,\n} from \"@mongez/reinforcements\";\nimport type { Mutator } from \"../types\";\n\n/** Convert string to lowercase */\nexport const lowercaseMutator: Mutator = async (value) => {\n return value?.toString().toLowerCase();\n};\n\n/** Convert string to uppercase */\nexport const uppercaseMutator: Mutator = async (value) => {\n return value?.toString().toUpperCase();\n};\n\n/** Capitalize only the first letter of the string */\nexport const capitalizeMutator: Mutator = async (value) => {\n const str = value?.toString();\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n};\n\n/** Capitalize the first letter of each word (Title Case) */\nexport const titleCaseMutator: Mutator = async (value) => {\n return capitalize(value?.toString());\n};\n\n/** Convert value to string */\nexport const stringifyMutator: Mutator = async (value) => {\n if (!value && value !== 0) return \"\";\n // only convert numbers, boolean and strings\n\n // Handle strings (pass through)\n if (typeof value === \"string\") return value;\n\n // Handle scalar types (number, boolean)\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n};\n\n/** Trim whitespace */\nexport const trimMutator: Mutator = async (value, context) => {\n return trim(value?.toString(), context?.options?.needle ?? \" \");\n};\n\n/**\n * Strip HTML tags with a naive `<...>` regex.\n *\n * This is a **tag stripper, not an XSS sanitizer**: it is not a parser, so\n * malformed/nested markup, attribute payloads, or content re-introduced\n * later in a pipeline can defeat it. Do not rely on this alone to make\n * untrusted rich text safe to render — use a real parser-based sanitizer\n * (e.g. DOMPurify / sanitize-html) for that.\n */\nexport const stripTagsMutator: Mutator = async (value) => {\n return value?.toString().replace(/<[^>]*>?/gm, \"\");\n};\n\n/**\n * @deprecated Renamed to {@link stripTagsMutator} — the old name implied\n * XSS safety this tag-stripping regex does not provide. Kept as an alias\n * for backward compatibility; switch to `stripTagsMutator`.\n */\nexport const safeHtmlMutator: Mutator = stripTagsMutator;\n\n/** HTML escape */\nexport const htmlEscapeMutator: Mutator = async (value) => {\n return value\n ?.toString()\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n};\n\n/** Remove special characters */\nexport const removeSpecialCharactersMutator: Mutator = async (value) => {\n return value?.toString().replace(/[^a-zA-Z0-9]/g, \"\");\n};\n\n/** URL decode */\nexport const urlDecodeMutator: Mutator = async (value) => {\n return decodeURIComponent(value);\n};\n\n/** URL encode */\nexport const urlEncodeMutator: Mutator = async (value) => {\n return encodeURIComponent(value);\n};\n\n/** Convert to camelCase */\nexport const camelCaseMutator: Mutator = async (value) => {\n return toCamelCase(value?.toString());\n};\n\n/** Convert to PascalCase */\nexport const pascalCaseMutator: Mutator = async (value) => {\n return toStudlyCase(value?.toString());\n};\n\n/** Convert to snake_case */\nexport const snakeCaseMutator: Mutator = async (value) => {\n return toSnakeCase(value?.toString());\n};\n\n/** Convert to kebab-case */\nexport const kebabCaseMutator: Mutator = async (value) => {\n return toKebabCase(value?.toString());\n};\n\n/** Convert to URL-friendly slug */\nexport const slugMutator: Mutator = async (value) => {\n return value\n ?.toString()\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_]+/g, \"-\")\n .replace(/--+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n};\n\n/** Trim from the left/start */\nexport const ltrimMutator: Mutator = async (value, context) => {\n return ltrim(value?.toString(), context?.options?.needle ?? \" \");\n};\n\n/** Trim from the right/end */\nexport const rtrimMutator: Mutator = async (value, context) => {\n return rtrim(value?.toString(), context?.options?.needle ?? \" \");\n};\n\n/** Base64 encode */\nexport const base64EncodeMutator: Mutator = async (value) => {\n return Buffer.from(value?.toString()).toString(\"base64\");\n};\n\n/** Base64 decode */\nexport const base64DecodeMutator: Mutator = async (value) => {\n return Buffer.from(value?.toString(), \"base64\").toString(\"utf-8\");\n};\n\n/** Replace substring or pattern */\nexport const replaceMutator: Mutator = async (value, context) => {\n const { search, replace } = context?.options ?? {};\n if (!search) return value?.toString();\n return value?.toString().replace(search, replace ?? \"\");\n};\n\n/** Replace all occurrences of substring or pattern */\nexport const replaceAllMutator: Mutator = async (value, context) => {\n const { search, replace } = context?.options ?? {};\n if (!search) return value?.toString();\n const searchValue = typeof search === \"string\" ? new RegExp(search, \"g\") : search;\n return value?.toString().replace(searchValue, replace ?? \"\");\n};\n\n/** Append/suffix text to the end */\nexport const appendMutator: Mutator = async (value, context) => {\n const suffix = context?.options?.suffix ?? \"\";\n return value?.toString() + suffix;\n};\n\n/** Prepend/prefix text to the beginning */\nexport const prependMutator: Mutator = async (value, context) => {\n const prefix = context?.options?.prefix ?? \"\";\n return prefix + value?.toString();\n};\n\n/** Reverse the string */\nexport const reverseMutator: Mutator = async (value) => {\n return value?.toString().split(\"\").reverse().join(\"\");\n};\n\n/** Truncate to a maximum length */\nexport const truncateMutator: Mutator = async (value, context) => {\n const str = value?.toString();\n const maxLength = context?.options?.maxLength ?? 100;\n const suffix = context?.options?.suffix ?? \"...\";\n return readMoreChars(str, maxLength, suffix);\n};\n\n/** Trim multiple whitespace into single space */\nexport const trimMultipleWhitespaceMutator: Mutator = async (value) => {\n return value?.toString().replace(/\\s+/g, \" \");\n};\n\n/** Pad string from the start to reach target length */\nexport const padStartMutator: Mutator = async (value, context) => {\n const length = context?.options?.length ?? 0;\n const char = context?.options?.char ?? \" \";\n return value?.toString().padStart(length, char);\n};\n\n/** Pad string from the end to reach target length */\nexport const padEndMutator: Mutator = async (value, context) => {\n const length = context?.options?.length ?? 0;\n const char = context?.options?.char ?? \" \";\n return value?.toString().padEnd(length, char);\n};\n\n/** Repeat string N times */\nexport const repeatMutator: Mutator = async (value, context) => {\n const count = context?.options?.count ?? 1;\n return value?.toString()?.repeat(count);\n};\n\n/** Mask part of string */\nexport const maskMutator: Mutator = async (value, context) => {\n const str = value?.toString();\n const maskChar = context?.options?.char ?? \"*\";\n const start = context?.options?.start ?? 0;\n const end = context?.options?.end ?? str?.length;\n const visibleStart = str?.substring(0, start);\n const visibleEnd = str?.substring(end);\n const maskedLength = end - start;\n return visibleStart + maskChar.repeat(maskedLength) + visibleEnd;\n};\n\n/** Unescape HTML entities */\nexport const unescapeHtmlMutator: Mutator = async (value) => {\n return value\n ?.toString()\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n};\n\n/** Keep only alphabetic characters */\nexport const alphaOnlyMutator: Mutator = async (value) => {\n return value.toString().replace(/[^a-zA-Z]/g, \"\");\n};\n\n/** Keep only alphanumeric characters */\nexport const alphanumericOnlyMutator: Mutator = async (value) => {\n return value.toString().replace(/[^a-zA-Z0-9]/g, \"\");\n};\n\n/** Remove all numeric characters */\nexport const removeNumbersMutator: Mutator = async (value) => {\n return value.toString().replace(/[0-9]/g, \"\");\n};\n","import { allowedValuesRule, enumRule, inRule, notAllowedValuesRule } from \"../rules/common/enum\";\nimport { BaseValidator } from \"./base-validator\";\n\n/**\n * Abstract base validator for primitive-typed fields (string, number, boolean).\n *\n * Provides value-membership rules that are meaningful for any single primitive value\n * but not for complex structures (object, array).\n *\n * Do NOT expose this on the `v` factory — it is an inheritance-only base class.\n *\n * Hierarchy:\n * BaseValidator\n * └── PrimitiveValidator ← enum, in, oneOf, allowsOnly, forbids, notIn\n * ├── StringValidator\n * ├── NumberValidator\n * │ └── FloatValidator\n * ├── BooleanValidator\n * └── ScalarValidator (extends PrimitiveValidator, adds asNumber/asString/accepted/declined)\n *\n * @example\n * class MyValidator extends PrimitiveValidator {\n * // inherits: in(), forbids(), enum(), oneOf(), allowsOnly(), notIn()\n * }\n */\nexport abstract class PrimitiveValidator extends BaseValidator {\n /**\n * Value must be one of the enum's values\n *\n * @example\n * v.string().enum(Direction) // Direction is a TS enum\n */\n public enum(values: any, errorMessage?: string) {\n return this.addRule(enumRule, errorMessage, { enum: Object.values(values) });\n }\n\n /**\n * Value must be one of the given values\n *\n * @example\n * v.string().in([\"admin\", \"user\", \"guest\"])\n * v.number().in([1, 2, 3])\n */\n public in(values: any[], errorMessage?: string) {\n return this.addRule(inRule, errorMessage, { values });\n }\n\n /**\n * Alias for `in()`\n *\n * @example\n * v.string().oneOf([\"active\", \"inactive\"])\n */\n public oneOf(values: any[], errorMessage?: string) {\n return this.in(values, errorMessage);\n }\n\n /**\n * Value must be one of the allowed values (stricter variant)\n *\n * @example\n * v.string().allowsOnly([\"yes\", \"no\"])\n */\n public allowsOnly(values: any[], errorMessage?: string) {\n return this.addRule(allowedValuesRule, errorMessage, { allowedValues: values });\n }\n\n /**\n * Value must NOT be one of the given values\n *\n * @example\n * v.string().forbids([\"banned\", \"blacklisted\"])\n * v.number().forbids([0, -1])\n */\n public forbids(values: any[], errorMessage?: string) {\n return this.addRule(notAllowedValuesRule, errorMessage, { notAllowedValues: values });\n }\n\n /**\n * Alias for `forbids()`\n *\n * @example\n * v.string().notIn([\"OK\", \"NOT OK\"])\n */\n public notIn(values: any[], errorMessage?: string) {\n return this.forbids(values, errorMessage);\n }\n}\n","import {\n alphaOnlyMutator,\n alphanumericOnlyMutator,\n appendMutator,\n base64DecodeMutator,\n base64EncodeMutator,\n camelCaseMutator,\n capitalizeMutator,\n htmlEscapeMutator,\n kebabCaseMutator,\n lowercaseMutator,\n ltrimMutator,\n maskMutator,\n padEndMutator,\n padStartMutator,\n pascalCaseMutator,\n prependMutator,\n removeNumbersMutator,\n removeSpecialCharactersMutator,\n repeatMutator,\n replaceAllMutator,\n replaceMutator,\n reverseMutator,\n rtrimMutator,\n slugMutator,\n snakeCaseMutator,\n stringifyMutator,\n stripTagsMutator,\n titleCaseMutator,\n trimMultipleWhitespaceMutator,\n trimMutator,\n truncateMutator,\n unescapeHtmlMutator,\n uppercaseMutator,\n urlDecodeMutator,\n urlEncodeMutator,\n} from \"../mutators/string-mutators\";\nimport { alphaNumericRule, alphaRule, isNumericRule } from \"../rules/string/alpha\";\nimport { isCreditCardRule } from \"../rules/string/credit-card\";\nimport { emailRule } from \"../rules/string/email\";\nimport { cuidRule, nanoidRule, ulidRule, uuidRule } from \"../rules/string/id-formats\";\nimport { ip4Rule, ip6Rule, ipRule } from \"../rules/string/ip\";\nimport {\n containsRule,\n endsWithRule,\n notContainsRule,\n startsWithRule,\n} from \"../rules/string/string-comparison\";\nimport { patternRule } from \"../rules/string/pattern\";\nimport { strongPasswordRule } from \"../rules/string/strong-password-rule\";\nimport { urlRule } from \"../rules/string/url\";\nimport { withoutWhitespaceRule } from \"../rules/string/without-whitespace\";\nimport type { UUIDVersion } from \"../rules/string/id-formats\";\nimport {\n betweenLengthRule,\n lengthRule,\n maxLengthRule,\n maxWordsRule,\n minLengthRule,\n minWordsRule,\n wordsRule,\n} from \"../rules/length\";\nimport {\n colorRule,\n darkColorRule,\n hexColorRule,\n hslColorRule,\n lightColorRule,\n rgbColorRule,\n rgbaColorRule,\n} from \"../rules/color\";\nimport { stringRule } from \"../rules/common/type-rules\";\nimport { PrimitiveValidator } from \"./primitive-validator\";\nimport { applyNullable, getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * String validator class\n */\nexport class StringValidator extends PrimitiveValidator {\n public constructor(errorMessage?: string) {\n super();\n this.addMutableRule(stringRule, errorMessage);\n }\n\n /**\n * Check if value is a string type\n */\n public matchesType(value: any): boolean {\n return typeof value === \"string\";\n }\n\n // ==================== Mutators ====================\n\n /**\n * Stringify the value if not a string\n */\n public toString() {\n return this.addMutator(stringifyMutator);\n }\n\n /** Convert string to uppercase */\n public uppercase() {\n return this.addMutator(uppercaseMutator);\n }\n\n /** Convert string to lowercase */\n public lowercase() {\n return this.addMutator(lowercaseMutator);\n }\n\n /** Capitalize only the first letter of the string */\n public capitalize() {\n return this.addMutator(capitalizeMutator);\n }\n\n /** Capitalize the first letter of each word (Title Case) */\n public titleCase() {\n return this.addMutator(titleCaseMutator);\n }\n\n /** Convert to camelCase */\n public camelCase() {\n return this.addMutator(camelCaseMutator);\n }\n\n /** Convert to PascalCase */\n public pascalCase() {\n return this.addMutator(pascalCaseMutator);\n }\n\n /** Convert to snake_case */\n public snakeCase() {\n return this.addMutator(snakeCaseMutator);\n }\n\n /** Convert to kebab-case */\n public kebabCase() {\n return this.addMutator(kebabCaseMutator);\n }\n\n /**\n * Trim the given needle from the string\n * If no needle is provided, the default is a single space\n */\n public trim(needle?: string) {\n return this.addMutator(trimMutator, { needle });\n }\n\n /** Trim from the left/start */\n public ltrim(needle?: string) {\n return this.addMutator(ltrimMutator, { needle });\n }\n\n /** Trim from the right/end */\n public rtrim(needle?: string) {\n return this.addMutator(rtrimMutator, { needle });\n }\n\n /** Trim multiple whitespace into single space */\n public trimMultipleWhitespace() {\n return this.addMutator(trimMultipleWhitespaceMutator);\n }\n\n /** Pad string from the start to reach target length */\n public padStart(length: number, char = \" \") {\n return this.addMutator(padStartMutator, { length, char });\n }\n\n /** Pad string from the end to reach target length */\n public padEnd(length: number, char = \" \") {\n return this.addMutator(padEndMutator, { length, char });\n }\n\n /**\n * Strip HTML tags with a naive `<...>` regex.\n *\n * This is a **tag stripper, not an XSS sanitizer**: it is not a parser,\n * so malformed/nested markup or content re-introduced later in a\n * pipeline can defeat it. Do not rely on this alone to make untrusted\n * rich text safe to render — use a real parser-based sanitizer (e.g.\n * DOMPurify / sanitize-html) for that.\n */\n public stripTags() {\n return this.addMutator(stripTagsMutator);\n }\n\n /**\n * @deprecated Renamed to {@link StringValidator.stripTags} — the old\n * name implied XSS safety this tag-stripping regex does not provide.\n * Kept as an alias for backward compatibility; switch to `.stripTags()`.\n */\n public safeHtml() {\n return this.stripTags();\n }\n\n /** HTML escape special characters */\n public htmlEscape() {\n return this.addMutator(htmlEscapeMutator);\n }\n\n /** Unescape HTML entities */\n public unescapeHtml() {\n return this.addMutator(unescapeHtmlMutator);\n }\n\n /**\n * Remove special characters\n * This will remove all characters that are not alphanumeric or whitespace\n */\n public removeSpecialCharacters() {\n return this.addMutator(removeSpecialCharactersMutator);\n }\n\n /** Convert to only alphabetic characters */\n public toAlpha() {\n return this.addMutator(alphaOnlyMutator);\n }\n\n /** Convert to only alphanumeric characters */\n public toAlphanumeric() {\n return this.addMutator(alphanumericOnlyMutator);\n }\n\n /** Remove all numeric characters */\n public removeNumbers() {\n return this.addMutator(removeNumbersMutator);\n }\n\n /** URL decode */\n public urlDecode() {\n return this.addMutator(urlDecodeMutator);\n }\n\n /** URL encode */\n public urlEncode() {\n return this.addMutator(urlEncodeMutator);\n }\n\n /** Convert to URL-friendly slug */\n public slug() {\n return this.addMutator(slugMutator);\n }\n\n /** Base64 encode */\n public base64Encode() {\n return this.addMutator(base64EncodeMutator);\n }\n\n /** Base64 decode */\n public base64Decode() {\n return this.addMutator(base64DecodeMutator);\n }\n\n /** Replace substring or pattern */\n public replace(search: string | RegExp, replace: string) {\n return this.addMutator(replaceMutator, { search, replace });\n }\n\n /** Replace all occurrences of substring or pattern */\n public replaceAll(search: string | RegExp, replace: string) {\n return this.addMutator(replaceAllMutator, { search, replace });\n }\n\n /** Append/suffix text to the end */\n public append(suffix: string) {\n return this.addMutator(appendMutator, { suffix });\n }\n\n /** Prepend/prefix text to the beginning */\n public prepend(prefix: string) {\n return this.addMutator(prependMutator, { prefix });\n }\n\n /** Reverse the string */\n public reverse() {\n return this.addMutator(reverseMutator);\n }\n\n /** Truncate to a maximum length */\n public truncate(maxLength: number, suffix = \"...\") {\n return this.addMutator(truncateMutator, { maxLength, suffix });\n }\n\n /** Repeat string N times */\n public repeat(count: number) {\n return this.addMutator(repeatMutator, { count });\n }\n\n /** Mask part of string */\n public mask(start: number, end?: number, char = \"*\") {\n return this.addMutator(maskMutator, { start, end, char });\n }\n\n // ==================== Validation Rules ====================\n\n /** Value must be a valid email */\n public email(errorMessage?: string) {\n return this.addRule(emailRule, errorMessage);\n }\n\n /** Value must be a valid URL */\n public url(errorMessage?: string) {\n return this.addRule(urlRule, errorMessage);\n }\n\n /** Value can not have whitespace */\n public withoutWhitespace(errorMessage?: string) {\n return this.addRule(withoutWhitespaceRule, errorMessage);\n }\n\n /** Value must match the given pattern */\n public pattern(pattern: RegExp, errorMessage?: string) {\n return this.addRule(patternRule, errorMessage, { pattern });\n }\n\n /**\n * Value must be a strong password\n * Requirements:\n * - At least 8 characters\n * - At least 1 uppercase letter\n * - At least 1 lowercase letter\n * - At least 1 number\n * - At least 1 special character\n */\n public strongPassword(minLength?: number, errorMessage?: string) {\n return this.addRule(strongPasswordRule, errorMessage, { minLength });\n }\n\n /** Value must be exactly the given number of words */\n public words(words: number, errorMessage?: string) {\n return this.addRule(wordsRule, errorMessage, { words });\n }\n\n /** Value must be at least the given number of words */\n public minWords(words: number, errorMessage?: string) {\n return this.addRule(minWordsRule, errorMessage, { minWords: words });\n }\n\n /** Value must be at most the given number of words */\n public maxWords(words: number, errorMessage?: string) {\n return this.addRule(maxWordsRule, errorMessage, { maxWords: words });\n }\n\n /** Value length must be greater than the given length */\n public minLength(length: number, errorMessage?: string) {\n return this.addRule(minLengthRule, errorMessage, { minLength: length });\n }\n\n /** @alias minLength */\n public min(min: number, errorMessage?: string) {\n return this.minLength(min, errorMessage);\n }\n\n /** Value length must be less than the given length */\n public maxLength(length: number, errorMessage?: string) {\n return this.addRule(maxLengthRule, errorMessage, { maxLength: length });\n }\n\n /** @alias maxLength */\n public max(max: number, errorMessage?: string) {\n return this.maxLength(max, errorMessage);\n }\n\n /** Value must be of the given length */\n public length(length: number, errorMessage?: string) {\n return this.addRule(lengthRule, errorMessage, { length });\n }\n\n /**\n * String length must be between min and max (inclusive)\n *\n * @param min - Minimum length (inclusive)\n * @param max - Maximum length (inclusive)\n *\n * @example\n * ```ts\n * v.string().between(5, 10) // Length: 5 to 10 characters\n * v.string().lengthBetween(8, 20) // Same using alias\n * ```\n *\n * @category Validation Rule\n */\n public lengthBetween(min: number, max: number, errorMessage?: string) {\n return this.addRule(betweenLengthRule, errorMessage, {\n minLength: min,\n maxLength: max,\n });\n }\n\n /** Allow only alphabetic characters */\n public alpha(errorMessage?: string) {\n return this.addRule(alphaRule, errorMessage);\n }\n\n /** Allow only alphanumeric characters */\n public alphanumeric(errorMessage?: string) {\n return this.addRule(alphaNumericRule, errorMessage);\n }\n\n /** Allow only numeric characters */\n public numeric(errorMessage?: string) {\n return this.addRule(isNumericRule, errorMessage);\n }\n\n /** Value must starts with the given string */\n public startsWith(value: string, errorMessage?: string) {\n return this.addRule(startsWithRule, errorMessage, { value });\n }\n\n /** Value must ends with the given string */\n public endsWith(value: string, errorMessage?: string) {\n return this.addRule(endsWithRule, errorMessage, { value });\n }\n\n /** Value must contain the given string */\n public contains(value: string, errorMessage?: string) {\n return this.addRule(containsRule, errorMessage, { value });\n }\n\n /** Value must not contain the given string */\n public notContains(value: string, errorMessage?: string) {\n return this.addRule(notContainsRule, errorMessage, { value });\n }\n\n /** Value must be a valid IP address */\n public ip(errorMessage?: string) {\n return this.addRule(ipRule, errorMessage);\n }\n\n /** Value must be a valid IPv4 address */\n public ip4(errorMessage?: string) {\n return this.addRule(ip4Rule, errorMessage);\n }\n\n /** Value must be a valid IPv6 address */\n public ip6(errorMessage?: string) {\n return this.addRule(ip6Rule, errorMessage);\n }\n\n /** Check if the string matches a credit card number */\n public creditCard(errorMessage?: string) {\n return this.addRule(isCreditCardRule, errorMessage);\n }\n\n /** Determine if the value is a valid color */\n public color(errorMessage?: string) {\n return this.addRule(colorRule, errorMessage);\n }\n\n /** Determine if the value is a valid hex color */\n public hexColor(errorMessage?: string) {\n return this.addRule(hexColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid HSL color */\n public hslColor(errorMessage?: string) {\n return this.addRule(hslColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid RGB color */\n public rgbColor(errorMessage?: string) {\n return this.addRule(rgbColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid RGBA color */\n public rgbaColor(errorMessage?: string) {\n return this.addRule(rgbaColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid light color */\n public lightColor(errorMessage?: string) {\n return this.addRule(lightColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid dark color */\n public darkColor(errorMessage?: string) {\n return this.addRule(darkColorRule, errorMessage);\n }\n\n // ==================== ID Format Rules ====================\n\n /**\n * Value must be a valid UUID. Optionally restrict to a specific version.\n *\n * @example\n * v.string().uuid() // any RFC 4122 UUID\n * v.string().uuid(4) // only v4 (random)\n * v.string().uuid(7) // only v7 (timestamp-ordered)\n */\n public uuid(version?: UUIDVersion, errorMessage?: string) {\n return this.addRule(uuidRule, errorMessage, { version });\n }\n\n /**\n * Value must be a valid CUID. Defaults to CUID2; pass `{ version: 1 }` for legacy.\n *\n * @example\n * v.string().cuid() // CUID2\n * v.string().cuid({ version: 1 }) // legacy CUID1\n */\n public cuid(options?: { version?: 1 | 2; errorMessage?: string }) {\n const { errorMessage, version } = options ?? {};\n return this.addRule(cuidRule, errorMessage, { version });\n }\n\n /** Value must be a valid ULID (26 chars, Crockford base32). */\n public ulid(errorMessage?: string) {\n return this.addRule(ulidRule, errorMessage);\n }\n\n /**\n * Value must be a valid nanoid string. Default length is 21.\n *\n * @example\n * v.string().nanoid() // 21 chars (default)\n * v.string().nanoid(10) // 10 chars\n */\n public nanoid(length?: number, errorMessage?: string) {\n return this.addRule(nanoidRule, errorMessage, { length });\n }\n\n /**\n * @inheritdoc\n *\n * Maps String-specific rule options to JSON Schema keywords.\n * Non-representable rules (cross-field, refine, color rules, etc.) are silently omitted.\n *\n * @example\n * ```ts\n * v.string().min(2).max(100).email().toJsonSchema(\"draft-2020-12\")\n * // → { type: \"string\", minLength: 2, maxLength: 100, format: \"email\" }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const schema: JsonSchemaResult = { type: \"string\" };\n\n // minLength / min\n const minOpts = getRuleOptions(this.rules, \"minLength\");\n if (minOpts?.minLength !== undefined) schema.minLength = minOpts.minLength;\n\n // maxLength / max\n const maxOpts = getRuleOptions(this.rules, \"maxLength\");\n if (maxOpts?.maxLength !== undefined) schema.maxLength = maxOpts.maxLength;\n\n // betweenLength covers both min and max in one rule\n const betweenOpts = getRuleOptions(this.rules, \"betweenLength\");\n if (betweenOpts) {\n if (betweenOpts.minLength !== undefined) schema.minLength = betweenOpts.minLength;\n if (betweenOpts.maxLength !== undefined) schema.maxLength = betweenOpts.maxLength;\n }\n\n // exact length\n const lengthOpts = getRuleOptions(this.rules, \"length\");\n if (lengthOpts?.length !== undefined) {\n schema.minLength = lengthOpts.length;\n schema.maxLength = lengthOpts.length;\n }\n\n // pattern (regex)\n const patternOpts = getRuleOptions(this.rules, \"pattern\");\n if (patternOpts?.pattern instanceof RegExp) {\n schema.pattern = patternOpts.pattern.source;\n }\n\n // format hints\n if (\n getRuleOptions(this.rules, \"email\") !== undefined ||\n this.rules.some((r) => r.name === \"email\")\n ) {\n schema.format = \"email\";\n } else if (this.rules.some((r) => r.name === \"url\")) {\n schema.format = \"uri\";\n } else if (this.rules.some((r) => r.name === \"ip\")) {\n schema.format = \"ipv4\";\n } else if (this.rules.some((r) => r.name === \"ip4\")) {\n schema.format = \"ipv4\";\n } else if (this.rules.some((r) => r.name === \"ip6\")) {\n schema.format = \"ipv6\";\n } else if (this.rules.some((r) => r.name === \"uuid\")) {\n schema.format = \"uuid\";\n } else if (this.rules.some((r) => r.name === \"hexColor\")) {\n schema.format = \"color\";\n }\n\n // CUID / ULID / nanoid don't have widely-supported format keywords —\n // fall back to pattern so JSON Schema validators still enforce shape.\n if (!schema.format) {\n const cuidOpts = getRuleOptions(this.rules, \"cuid\");\n if (cuidOpts) {\n schema.pattern = cuidOpts.version === 1 ? \"^c[a-z0-9]{24,}$\" : \"^[a-z][a-z0-9]{23}$\";\n }\n if (this.rules.some((r) => r.name === \"ulid\")) {\n schema.pattern = \"^[0-9A-HJKMNP-TV-Z]{26}$\";\n }\n const nanoidOpts = getRuleOptions(this.rules, \"nanoid\");\n if (nanoidOpts) {\n const len = (nanoidOpts.length as number | undefined) ?? 21;\n schema.pattern = `^[A-Za-z0-9_-]{${len}}$`;\n }\n }\n\n // enum (from PrimitiveValidator.in / .enum)\n const inOpts = getRuleOptions(this.rules, \"in\");\n if (inOpts?.values && Array.isArray(inOpts.values)) {\n schema.enum = inOpts.values;\n }\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n","import type { StandardSchemaV1 } from \"./standard-schema/types\";\nimport { StringValidator } from \"./validators/string-validator\";\n\nexport { equalityConditionalMethodsApplied } from \"./validators/methods/equality-conditional-methods\";\nexport { forbiddenMethodsApplied } from \"./validators/methods/forbidden-methods\";\nexport { presentMethodsApplied } from \"./validators/methods/present-methods\";\nexport { requiredMethodsApplied } from \"./validators/methods/required-methods\";\nexport { StringValidator };\n\n/** Create a string schema without importing the complete `v` factory. */\nexport const string = (errorMessage?: string) =>\n new StringValidator(errorMessage) as StringValidator & StandardSchemaV1<string>;\n"],"mappings":"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"}
|
package/cjs/string.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_required_methods = require("./required-methods-
|
|
3
|
-
const require_string = require("./string-
|
|
2
|
+
const require_required_methods = require("./required-methods-Bh481cKm.cjs");
|
|
3
|
+
const require_string = require("./string-BOKt6UtS.cjs");
|
|
4
4
|
|
|
5
5
|
exports.StringValidator = require_string.StringValidator;
|
|
6
6
|
exports.equalityConditionalMethodsApplied = require_required_methods.equalityConditionalMethodsApplied;
|
|
@@ -31,6 +31,14 @@ import { TupleValidator } from "../validators/tuple-validator.mjs";
|
|
|
31
31
|
import { UnionValidator } from "../validators/union-validator.mjs";
|
|
32
32
|
import { SealConfig } from "../config.mjs";
|
|
33
33
|
//#region ../../packages/seal/src/factory/validators.d.ts
|
|
34
|
+
type RecordShape<K extends string, V> = string extends K ? Record<string, V> : Partial<Record<K, V>>;
|
|
35
|
+
type TypedRecord<T extends BaseValidator, K extends string = string> = StandardSchemaV1<RecordShape<K, Infer.Input<T>>, RecordShape<K, Infer.Output<T>>> & RecordValidator & {
|
|
36
|
+
valueValidator: T;
|
|
37
|
+
};
|
|
38
|
+
declare function record<T extends BaseValidator = AnyValidator>(validator?: T, errorMessage?: string): TypedRecord<T>;
|
|
39
|
+
declare function record<K extends BaseValidator, T extends BaseValidator>(keyValidator: K, valueValidator: T, errorMessage?: string): TypedRecord<T, Extract<Infer.Input<K>, string>> & {
|
|
40
|
+
keyValidator: K;
|
|
41
|
+
};
|
|
34
42
|
/**
|
|
35
43
|
* Seal factory object - creates instances of validators
|
|
36
44
|
*
|
|
@@ -51,9 +59,7 @@ export interface ValidatorV {
|
|
|
51
59
|
array: <T extends BaseValidator>(validator: T, errorMessage?: string) => ArrayValidator & {
|
|
52
60
|
validator: T;
|
|
53
61
|
} & StandardSchemaV1<Array<Infer.Input<T>>, Array<Infer.Output<T>>>;
|
|
54
|
-
record:
|
|
55
|
-
valueValidator: T;
|
|
56
|
-
};
|
|
62
|
+
record: typeof record;
|
|
57
63
|
tuple: <T extends BaseValidator[] | []>(validators: T, errorMessage?: string) => TupleValidator & {
|
|
58
64
|
validators: T;
|
|
59
65
|
} & StandardSchemaV1<{ [K in keyof T]: Infer.Input<T[K]>; }, { [K in keyof T]: Infer.Output<T[K]>; }>;
|
|
@@ -80,4 +86,5 @@ export interface ValidatorV {
|
|
|
80
86
|
validate: <T extends BaseValidator>(schema: T, data: unknown, options?: ValidateOptions) => Promise<TypedValidationResult<ValidatedOutput<T>>>;
|
|
81
87
|
}
|
|
82
88
|
//#endregion
|
|
89
|
+
export {};
|
|
83
90
|
//# sourceMappingURL=validators.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/factory/validators.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"validators.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/factory/validators.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsCK,YAAY,kBAAkB,oBAAoB,IACnD,eAAe,KACf,QAAQ,OAAO,GAAG;KACjB,YAAY,UAAU,eAAe,6BAA6B,iBACrE,YAAY,GAAG,MAAM,MAAM,KAC3B,YAAY,GAAG,MAAM,OAAO,OAE5B;EAAoB,gBAAgB;;iBAE7B,OAAO,UAAU,gBAAgB,cACxC,YAAY,GACZ,wBACC,YAAY;iBACN,OAAO,UAAU,eAAe,UAAU,eACjD,cAAc,GACd,gBAAgB,GAChB,wBACC,YAAY,GAAG,QAAQ,MAAM,MAAM;EAAiB,cAAc;;;;;;;qBAmBxD,GAAG;YA+KJ;EACV,UAAU;;;;;EAKV;IACE;iBAIa;EACf,SAAS,UAAU,QAAQ,QAAQ,GAAG,0BAA0B,gBAAgB;EAChF,WAAW,eAAe;EAC1B,QAAQ,UAAU,eAChB,WAAW,GACX,0BACG;IACH,WAAW;MACT,iBAAiB,MAAM,MAAM,MAAM,KAAK,MAAM,MAAM,OAAO;EAC/D,eAAe;EACf,QAAQ,UAAU,sBAChB,YAAY,GACZ,0BACG;IACH,YAAY;MACV,oBACG,WAAW,IAAI,MAAM,MAAM,EAAE,WAC7B,WAAW,IAAI,MAAM,OAAO,EAAE;EAErC,OAAO,0BAA0B,gBAAgB,iBAAiB;EAClE,UAAU,qFACL,QAAQ,MACR,iBAAiB,KAAK,iBAAiB;EAC5C,aAAa,GACX,cAAc,gBAAgB,GAC9B,0BACG,oBAAoB,KAAK,iBAAiB;EAC/C,OAAO,UAAU,eACf,aAAa,MACV,cAAc,KAAK,iBAAiB,MAAM,MAAM,IAAI,MAAM,OAAO;EACtE,SAAS,0BAA0B,kBAAkB;EACrD,QAAQ,0BAA0B,kBAAkB;EACpD;WACS,kDACL,QAAQ,GACR,wBACC,kBAAkB,iBAAiB;WAC/B,UAAU,iCACf,QAAQ,GACR,wBACC,kBAAkB,iBAAiB,QAAQ;;EAEhD,SAAS,0BAA0B,kBAAkB;EACrD,UAAU,0BAA0B,mBAAmB;EACvD,MAAM,0BAA0B,eAAe;EAC/C,QAAQ,0BAA0B,iBAAiB;EACnD,UAAU,0BAA0B,mBAAmB;EACvD,SAAS,0BAA0B,kBAAkB;EACrD,QAAQ,UAAU,iBAChB,YAAY,GACZ,0BACG,iBAAiB,MAAM,MAAM,YAAY,MAAM,OAAO,cAAc;EACzE,qBAAqB,kBAAkB,iBAAiB,cAAc,uBACpE,eAAe,GACf,YAAY,aACT,4BAA4B,GAAG,YAClC,iBAAiB,MAAM,MAAM,mBAAmB,MAAM,OAAO;EAC/D,WAAW,eACT,WAAW,WAAW,SAAS,kBAAkB,UAAU,QAAQ,UACnE,kBAAkB,kBACf,kBAAkB,WAAW,iBAAiB;EACnD,UAAU,eACR,YAAY,SAAS,kBAAkB,UAAU,QAAQ,UACzD,kBAAkB,kBACf,iBAAiB,WAAW,iBAAiB;EAClD,WAAW,UAAU,eACnB,QAAQ,GACR,eACA,UAAU,oBACP,QAAQ,sBAAsB,gBAAgB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { validate } from "./validate.mjs";
|
|
2
|
+
import { BaseValidator } from "../validators/base-validator.mjs";
|
|
2
3
|
import { AnyValidator } from "../validators/any-validator.mjs";
|
|
3
4
|
import { ArrayValidator } from "../validators/array-validator.mjs";
|
|
4
5
|
import "../validators/methods/equality-conditional-methods.mjs";
|
|
@@ -26,6 +27,13 @@ import { object } from "../object.mjs";
|
|
|
26
27
|
import { string } from "../string.mjs";
|
|
27
28
|
|
|
28
29
|
//#region ../../packages/seal/src/factory/validators.ts
|
|
30
|
+
function record(first, second, errorMessage) {
|
|
31
|
+
if (second instanceof BaseValidator) {
|
|
32
|
+
if (first === void 0) throw new TypeError("v.record(): a key validator is required before the value validator");
|
|
33
|
+
return new RecordValidator(first, second, errorMessage);
|
|
34
|
+
}
|
|
35
|
+
return new RecordValidator(first === void 0 ? new AnyValidator() : first, second);
|
|
36
|
+
}
|
|
29
37
|
/**
|
|
30
38
|
* Seal factory object - creates instances of validators
|
|
31
39
|
*
|
|
@@ -39,7 +47,7 @@ const v = {
|
|
|
39
47
|
/** Create an array validator */
|
|
40
48
|
array: (validator, errorMessage) => new ArrayValidator(validator, errorMessage),
|
|
41
49
|
/** Create a record validator - object with dynamic keys and consistent value types */
|
|
42
|
-
record
|
|
50
|
+
record,
|
|
43
51
|
/**
|
|
44
52
|
* Create a tuple validator - fixed-length array with position-specific types.
|
|
45
53
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.mjs","names":["validateFunction"],"sources":["../../../../../../../../packages/seal/src/factory/validators.ts"],"sourcesContent":["import type { SealConfig } from \"../config\";\nimport { object } from \"../object\";\nimport { string } from \"../string\";\nimport type { StandardSchemaV1 } from \"../standard-schema/types\";\nimport type { Schema, SchemaContext, TypedValidationResult, ValidatedOutput } from \"../types\";\nimport type { Infer } from \"../types/inference-types\";\nimport { AnyValidator } from \"../validators/any-validator\";\nimport { ArrayValidator } from \"../validators/array-validator\";\nimport type { BaseValidator } from \"../validators/base-validator\";\nimport { BooleanValidator } from \"../validators/boolean-validator\";\nimport { ComputedValidator } from \"../validators/computed-validator\";\nimport { DateValidator } from \"../validators/date-validator\";\nimport { DiscriminatedUnionValidator } from \"../validators/discriminated-union-validator\";\nimport { FloatValidator } from \"../validators/float-validator\";\nimport { InstanceOfValidator } from \"../validators/instanceof-validator\";\nimport { IntValidator } from \"../validators/int-validator\";\nimport { LazyValidator } from \"../validators/lazy-validator\";\nimport { LiteralValidator } from \"../validators/literal-validator\";\nimport { ManagedValidator } from \"../validators/managed-validator\";\nimport { NumberValidator } from \"../validators/number-validator\";\nimport { NumericValidator } from \"../validators/numeric-validator\";\nimport { ObjectValidator } from \"../validators/object-validator\";\nimport { RecordValidator } from \"../validators/record-validator\";\nimport { ScalarValidator } from \"../validators/scalar-validator\";\nimport { StringValidator } from \"../validators/string-validator\";\nimport { TupleValidator } from \"../validators/tuple-validator\";\nimport { UnionValidator } from \"../validators/union-validator\";\n// BaseValidator prototype augmentations — side-effect imports so the `v`\n// factory always exposes the chain methods (.required, .requiredIf, .sameAs,\n// .present, .forbidden, .when, …) regardless of which entry path loaded it.\n// The package barrel (src/index.ts) loads these via the validators barrel, but\n// importing the factory leaf directly would otherwise yield a half-built `v`.\nimport \"../validators/methods/equality-conditional-methods\";\nimport \"../validators/methods/forbidden-methods\";\nimport \"../validators/methods/present-methods\";\nimport \"../validators/methods/required-methods\";\nimport { validate as validateFunction } from \"./validate\";\n\n/**\n * Seal factory object - creates instances of validators\n *\n * Use 'v' to create validation schemas (seals) for your data\n */\nexport const v: ValidatorV = {\n /** Create an object validator */\n object,\n\n /** Create an any validator */\n any: () => new AnyValidator() as AnyValidator & StandardSchemaV1<any>,\n\n /** Create an array validator */\n array: <T extends BaseValidator>(validator: T, errorMessage?: string) =>\n new ArrayValidator(validator, errorMessage) as ArrayValidator & {\n validator: T;\n } & StandardSchemaV1<Array<Infer.Input<T>>, Array<Infer.Output<T>>>,\n\n /** Create a record validator - object with dynamic keys and consistent value types */\n record: <T extends BaseValidator>(validator?: T, errorMessage?: string) =>\n new RecordValidator(validator || v.any(), errorMessage) as StandardSchemaV1<\n Record<string, Infer.Input<T>>,\n Record<string, Infer.Output<T>>\n > &\n RecordValidator & { valueValidator: T },\n\n /**\n * Create a tuple validator - fixed-length array with position-specific types.\n *\n * The `| []` in the constraint makes TypeScript infer a literal list as a tuple, so\n * `v.tuple([v.string(), v.int()])` is typed `[string, number]` rather than\n * `(string | number)[]`; a `BaseValidator[]` variable is still accepted.\n */\n tuple: <T extends BaseValidator[] | []>(validators: T, errorMessage?: string) =>\n new TupleValidator(validators, errorMessage) as TupleValidator & {\n validators: T;\n } & StandardSchemaV1<\n { [K in keyof T]: Infer.Input<T[K]> },\n { [K in keyof T]: Infer.Output<T[K]> }\n >,\n\n /** Create a date validator */\n date: (errorMessage?: string) =>\n new DateValidator(errorMessage) as DateValidator & StandardSchemaV1<Date>,\n\n /**\n * Create a literal validator — narrows to the union of given literal values\n *\n * @example\n * v.literal(\"items\") // type: \"items\"\n * v.literal(\"draft\", \"published\") // type: \"draft\" | \"published\"\n * v.literal(1, 2, 3) // type: 1 | 2 | 3\n */\n literal: <T extends readonly [string | number | boolean, ...(string | number | boolean)[]]>(\n ...values: T\n ) => new LiteralValidator<T>(values) as LiteralValidator<T> & StandardSchemaV1<T[number]>,\n\n /**\n * Create an instanceof validator — value must be `instanceof` the constructor\n *\n * @example\n * v.instanceof(File) // type: File\n * v.instanceof(Buffer) // type: Buffer\n * v.instanceof(MyClass) // type: MyClass\n */\n instanceof: <T>(ctor: new (...args: any[]) => T, errorMessage?: string) =>\n new InstanceOfValidator<T>(ctor, errorMessage) as InstanceOfValidator<T> & StandardSchemaV1<T>,\n\n /**\n * Create a lazy validator — defers resolution of the inner validator until\n * validate-time. Use for recursive or forward-referenced schemas.\n *\n * @example\n * type Category = { name: string; children: Category[] };\n *\n * const category: ObjectValidator<...> = v.object({\n * name: v.string(),\n * children: v.array(v.lazy(() => category)),\n * });\n */\n lazy: <T extends BaseValidator>(thunk: () => T) =>\n new LazyValidator(thunk) as LazyValidator<T> &\n StandardSchemaV1<Infer.Input<T>, Infer.Output<T>>,\n\n /** Create a string validator */\n string,\n\n /** Create an email validator */\n email: (emailErrorMessage?: string, errorMessage?: string) =>\n new StringValidator(errorMessage).email(emailErrorMessage) as StringValidator &\n StandardSchemaV1<string>,\n\n /**\n * Create an enum validator — preserves the literal union of accepted\n * values in the inferred Standard Schema output.\n *\n * Two input shapes:\n * - Tuple of literals: `v.enum([\"draft\", \"published\"])` →\n * `StandardSchemaV1<\"draft\" | \"published\">`\n * - TypeScript enum object: `v.enum(Status)` →\n * `StandardSchemaV1<Status[keyof Status]>`\n *\n * Implementation is loosely typed; the public `ValidatorV.enum`\n * surface declares the precise overloads.\n */\n enum: ((values: any, errorMessage?: string) =>\n Array.isArray(values)\n ? new ScalarValidator().oneOf(values, errorMessage)\n : new ScalarValidator().enum(values, errorMessage)) as ValidatorV[\"enum\"],\n\n /** Create a number validator */\n number: (errorMessage?: string) =>\n new NumberValidator(errorMessage) as NumberValidator & StandardSchemaV1<number>,\n\n /** Create a numeric validator */\n numeric: (errorMessage?: string) =>\n new NumericValidator(errorMessage) as NumericValidator & StandardSchemaV1<number>,\n\n /** Create an integer validator */\n int: (errorMessage?: string) =>\n new IntValidator(errorMessage) as IntValidator & StandardSchemaV1<number>,\n\n /** Create a float validator */\n float: (errorMessage?: string) =>\n new FloatValidator(errorMessage) as FloatValidator & StandardSchemaV1<number>,\n\n /** Create a boolean validator */\n boolean: (errorMessage?: string) =>\n new BooleanValidator(errorMessage) as BooleanValidator & StandardSchemaV1<boolean>,\n\n /** Create a scalar validator */\n scalar: (errorMessage?: string) =>\n new ScalarValidator(errorMessage) as ScalarValidator &\n StandardSchemaV1<string | number | boolean>,\n\n /** Create a union validator - validates against multiple types */\n union: <T extends BaseValidator[]>(validators: T, errorMessage?: string) =>\n new UnionValidator().union(validators, errorMessage) as StandardSchemaV1<\n Infer.Input<T[number]>,\n Infer.Output<T[number]>\n > &\n UnionValidator,\n\n /**\n * Create a discriminated union — routes payloads by a shared literal\n * discriminator field. Each branch must be a `v.object(...)` with the\n * discriminator typed as `v.literal(...)`.\n *\n * @example\n * const email = v.object({ type: v.literal(\"email\"), email: v.string().email() });\n * const sms = v.object({ type: v.literal(\"sms\"), phone: v.string() });\n * const notif = v.discriminatedUnion(\"type\", [email, sms]);\n * // type T = Infer<typeof notif>;\n * // → { type: \"email\", email: string } | { type: \"sms\", phone: string }\n */\n discriminatedUnion: <K extends string, Branches extends ReadonlyArray<ObjectValidator<any>>>(\n discriminator: K,\n validators: Branches,\n ) =>\n new DiscriminatedUnionValidator(discriminator, validators) as DiscriminatedUnionValidator<\n K,\n Branches\n > &\n StandardSchemaV1<Infer.Input<Branches[number]>, Infer.Output<Branches[number]>>,\n\n /** Create a computed field validator - derives value from other validated fields */\n computed: <TResult = any>(\n callback: (data: any, context: SchemaContext) => TResult | Promise<TResult>,\n resultValidator?: BaseValidator,\n ) =>\n new ComputedValidator<TResult>(callback, resultValidator) as ComputedValidator<TResult> &\n StandardSchemaV1<TResult>,\n\n /** Create a managed field validator - framework-injected value */\n managed: <TResult = any>(\n callback: (context: SchemaContext) => TResult | Promise<TResult>,\n resultValidator?: BaseValidator,\n ) =>\n new ManagedValidator<TResult>(callback, resultValidator) as ManagedValidator<TResult> &\n StandardSchemaV1<TResult>,\n\n /** Validate data against a schema */\n validate: validateFunction,\n} as unknown as ValidatorV;\n\nexport type ValidateOptions = {\n context?: Record<string, any>;\n /**\n * Rendered as `:value` in every error message — translated or custom —\n * instead of the submitted input. Unset keeps the raw value.\n */\n redactValue?: string;\n} & SealConfig;\n\n// Standard Schema comes first on record/union intersections so direct calls\n// select the precise validate() output overload rather than BaseValidator's.\nexport interface ValidatorV {\n object: <T extends Schema>(schema: T, errorMessage?: string) => ObjectValidator<T>;\n any: () => AnyValidator & StandardSchemaV1<any>;\n array: <T extends BaseValidator>(\n validator: T,\n errorMessage?: string,\n ) => ArrayValidator & {\n validator: T;\n } & StandardSchemaV1<Array<Infer.Input<T>>, Array<Infer.Output<T>>>;\n record: <T extends BaseValidator>(\n validator?: T,\n errorMessage?: string,\n ) => StandardSchemaV1<Record<string, Infer.Input<T>>, Record<string, Infer.Output<T>>> &\n RecordValidator & { valueValidator: T };\n tuple: <T extends BaseValidator[] | []>(\n validators: T,\n errorMessage?: string,\n ) => TupleValidator & {\n validators: T;\n } & StandardSchemaV1<\n { [K in keyof T]: Infer.Input<T[K]> },\n { [K in keyof T]: Infer.Output<T[K]> }\n >;\n date: (errorMessage?: string) => DateValidator & StandardSchemaV1<Date>;\n literal: <T extends readonly [string | number | boolean, ...(string | number | boolean)[]]>(\n ...values: T\n ) => LiteralValidator<T> & StandardSchemaV1<T[number]>;\n instanceof: <T>(\n ctor: new (...args: any[]) => T,\n errorMessage?: string,\n ) => InstanceOfValidator<T> & StandardSchemaV1<T>;\n lazy: <T extends BaseValidator>(\n thunk: () => T,\n ) => LazyValidator<T> & StandardSchemaV1<Infer.Input<T>, Infer.Output<T>>;\n string: (errorMessage?: string) => StringValidator & StandardSchemaV1<string>;\n email: (errorMessage?: string) => StringValidator & StandardSchemaV1<string>;\n enum: {\n <const T extends readonly (string | number | boolean)[]>(\n values: T,\n errorMessage?: string,\n ): ScalarValidator & StandardSchemaV1<T[number]>;\n <const T extends Record<string, string | number>>(\n values: T,\n errorMessage?: string,\n ): ScalarValidator & StandardSchemaV1<T[keyof T]>;\n };\n number: (errorMessage?: string) => NumberValidator & StandardSchemaV1<number>;\n numeric: (errorMessage?: string) => NumericValidator & StandardSchemaV1<number>;\n int: (errorMessage?: string) => IntValidator & StandardSchemaV1<number>;\n float: (errorMessage?: string) => FloatValidator & StandardSchemaV1<number>;\n boolean: (errorMessage?: string) => BooleanValidator & StandardSchemaV1<boolean>;\n scalar: (errorMessage?: string) => ScalarValidator & StandardSchemaV1<string | number | boolean>;\n union: <T extends BaseValidator[]>(\n validators: T,\n errorMessage?: string,\n ) => StandardSchemaV1<Infer.Input<T[number]>, Infer.Output<T[number]>> & UnionValidator;\n discriminatedUnion: <K extends string, Branches extends ReadonlyArray<ObjectValidator<any>>>(\n discriminator: K,\n validators: Branches,\n ) => DiscriminatedUnionValidator<K, Branches> &\n StandardSchemaV1<Infer.Input<Branches[number]>, Infer.Output<Branches[number]>>;\n computed: <TResult = any>(\n callback: (data: any, context: SchemaContext) => TResult | Promise<TResult>,\n resultValidator?: BaseValidator,\n ) => ComputedValidator<TResult> & StandardSchemaV1<TResult>;\n managed: <TResult = any>(\n callback?: (context: SchemaContext) => TResult | Promise<TResult>,\n resultValidator?: BaseValidator,\n ) => ManagedValidator<TResult> & StandardSchemaV1<TResult>;\n validate: <T extends BaseValidator>(\n schema: T,\n data: unknown,\n options?: ValidateOptions,\n ) => Promise<TypedValidationResult<ValidatedOutput<T>>>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAa,IAAgB;;CAE3B;;CAGA,WAAW,IAAI,aAAa;;CAG5B,QAAiC,WAAc,iBAC7C,IAAI,eAAe,WAAW,YAAY;;CAK5C,SAAkC,WAAe,iBAC/C,IAAI,gBAAgB,aAAa,EAAE,IAAI,GAAG,YAAY;;;;;;;;CAaxD,QAAwC,YAAe,iBACrD,IAAI,eAAe,YAAY,YAAY;;CAQ7C,OAAO,iBACL,IAAI,cAAc,YAAY;;;;;;;;;CAUhC,UACE,GAAG,WACA,IAAI,iBAAoB,MAAM;;;;;;;;;CAUnC,aAAgB,MAAiC,iBAC/C,IAAI,oBAAuB,MAAM,YAAY;;;;;;;;;;;;;CAc/C,OAAgC,UAC9B,IAAI,cAAc,KAAK;;CAIzB;;CAGA,QAAQ,mBAA4B,iBAClC,IAAI,gBAAgB,YAAY,CAAC,CAAC,MAAM,iBAAiB;;;;;;;;;;;;;;CAgB3D,QAAQ,QAAa,iBACnB,MAAM,QAAQ,MAAM,IAChB,IAAI,gBAAgB,CAAC,CAAC,MAAM,QAAQ,YAAY,IAChD,IAAI,gBAAgB,CAAC,CAAC,KAAK,QAAQ,YAAY;;CAGrD,SAAS,iBACP,IAAI,gBAAgB,YAAY;;CAGlC,UAAU,iBACR,IAAI,iBAAiB,YAAY;;CAGnC,MAAM,iBACJ,IAAI,aAAa,YAAY;;CAG/B,QAAQ,iBACN,IAAI,eAAe,YAAY;;CAGjC,UAAU,iBACR,IAAI,iBAAiB,YAAY;;CAGnC,SAAS,iBACP,IAAI,gBAAgB,YAAY;;CAIlC,QAAmC,YAAe,iBAChD,IAAI,eAAe,CAAC,CAAC,MAAM,YAAY,YAAY;;;;;;;;;;;;;CAkBrD,qBACE,eACA,eAEA,IAAI,4BAA4B,eAAe,UAAU;;CAO3D,WACE,UACA,oBAEA,IAAI,kBAA2B,UAAU,eAAe;;CAI1D,UACE,UACA,oBAEA,IAAI,iBAA0B,UAAU,eAAe;;CAI/CA;AACZ"}
|
|
1
|
+
{"version":3,"file":"validators.mjs","names":["validateFunction"],"sources":["../../../../../../../../packages/seal/src/factory/validators.ts"],"sourcesContent":["import type { SealConfig } from \"../config\";\nimport { object } from \"../object\";\nimport { string } from \"../string\";\nimport type { StandardSchemaV1 } from \"../standard-schema/types\";\nimport type { Schema, SchemaContext, TypedValidationResult, ValidatedOutput } from \"../types\";\nimport type { Infer } from \"../types/inference-types\";\nimport { AnyValidator } from \"../validators/any-validator\";\nimport { ArrayValidator } from \"../validators/array-validator\";\nimport { BaseValidator } from \"../validators/base-validator\";\nimport { BooleanValidator } from \"../validators/boolean-validator\";\nimport { ComputedValidator } from \"../validators/computed-validator\";\nimport { DateValidator } from \"../validators/date-validator\";\nimport { DiscriminatedUnionValidator } from \"../validators/discriminated-union-validator\";\nimport { FloatValidator } from \"../validators/float-validator\";\nimport { InstanceOfValidator } from \"../validators/instanceof-validator\";\nimport { IntValidator } from \"../validators/int-validator\";\nimport { LazyValidator } from \"../validators/lazy-validator\";\nimport { LiteralValidator } from \"../validators/literal-validator\";\nimport { ManagedValidator } from \"../validators/managed-validator\";\nimport { NumberValidator } from \"../validators/number-validator\";\nimport { NumericValidator } from \"../validators/numeric-validator\";\nimport { ObjectValidator } from \"../validators/object-validator\";\nimport { RecordValidator } from \"../validators/record-validator\";\nimport { ScalarValidator } from \"../validators/scalar-validator\";\nimport { StringValidator } from \"../validators/string-validator\";\nimport { TupleValidator } from \"../validators/tuple-validator\";\nimport { UnionValidator } from \"../validators/union-validator\";\n// BaseValidator prototype augmentations — side-effect imports so the `v`\n// factory always exposes the chain methods (.required, .requiredIf, .sameAs,\n// .present, .forbidden, .when, …) regardless of which entry path loaded it.\n// The package barrel (src/index.ts) loads these via the validators barrel, but\n// importing the factory leaf directly would otherwise yield a half-built `v`.\nimport \"../validators/methods/equality-conditional-methods\";\nimport \"../validators/methods/forbidden-methods\";\nimport \"../validators/methods/present-methods\";\nimport \"../validators/methods/required-methods\";\nimport { validate as validateFunction } from \"./validate\";\n\ntype RecordShape<K extends string, V> = string extends K\n ? Record<string, V>\n : Partial<Record<K, V>>;\ntype TypedRecord<T extends BaseValidator, K extends string = string> = StandardSchemaV1<\n RecordShape<K, Infer.Input<T>>,\n RecordShape<K, Infer.Output<T>>\n> &\n RecordValidator & { valueValidator: T };\n\nfunction record<T extends BaseValidator = AnyValidator>(\n validator?: T,\n errorMessage?: string,\n): TypedRecord<T>;\nfunction record<K extends BaseValidator, T extends BaseValidator>(\n keyValidator: K,\n valueValidator: T,\n errorMessage?: string,\n): TypedRecord<T, Extract<Infer.Input<K>, string>> & { keyValidator: K };\nfunction record(\n first?: BaseValidator,\n second?: BaseValidator | string,\n errorMessage?: string,\n): RecordValidator {\n if (second instanceof BaseValidator) {\n if (first === undefined)\n throw new TypeError(\"v.record(): a key validator is required before the value validator\");\n return new RecordValidator(first, second, errorMessage);\n }\n return new RecordValidator(first === undefined ? new AnyValidator() : first, second);\n}\n\n/**\n * Seal factory object - creates instances of validators\n *\n * Use 'v' to create validation schemas (seals) for your data\n */\nexport const v: ValidatorV = {\n /** Create an object validator */\n object,\n\n /** Create an any validator */\n any: () => new AnyValidator() as AnyValidator & StandardSchemaV1<any>,\n\n /** Create an array validator */\n array: <T extends BaseValidator>(validator: T, errorMessage?: string) =>\n new ArrayValidator(validator, errorMessage) as ArrayValidator & {\n validator: T;\n } & StandardSchemaV1<Array<Infer.Input<T>>, Array<Infer.Output<T>>>,\n\n /** Create a record validator - object with dynamic keys and consistent value types */\n record,\n\n /**\n * Create a tuple validator - fixed-length array with position-specific types.\n *\n * The `| []` in the constraint makes TypeScript infer a literal list as a tuple, so\n * `v.tuple([v.string(), v.int()])` is typed `[string, number]` rather than\n * `(string | number)[]`; a `BaseValidator[]` variable is still accepted.\n */\n tuple: <T extends BaseValidator[] | []>(validators: T, errorMessage?: string) =>\n new TupleValidator(validators, errorMessage) as TupleValidator & {\n validators: T;\n } & StandardSchemaV1<\n { [K in keyof T]: Infer.Input<T[K]> },\n { [K in keyof T]: Infer.Output<T[K]> }\n >,\n\n /** Create a date validator */\n date: (errorMessage?: string) =>\n new DateValidator(errorMessage) as DateValidator & StandardSchemaV1<Date>,\n\n /**\n * Create a literal validator — narrows to the union of given literal values\n *\n * @example\n * v.literal(\"items\") // type: \"items\"\n * v.literal(\"draft\", \"published\") // type: \"draft\" | \"published\"\n * v.literal(1, 2, 3) // type: 1 | 2 | 3\n */\n literal: <T extends readonly [string | number | boolean, ...(string | number | boolean)[]]>(\n ...values: T\n ) => new LiteralValidator<T>(values) as LiteralValidator<T> & StandardSchemaV1<T[number]>,\n\n /**\n * Create an instanceof validator — value must be `instanceof` the constructor\n *\n * @example\n * v.instanceof(File) // type: File\n * v.instanceof(Buffer) // type: Buffer\n * v.instanceof(MyClass) // type: MyClass\n */\n instanceof: <T>(ctor: new (...args: any[]) => T, errorMessage?: string) =>\n new InstanceOfValidator<T>(ctor, errorMessage) as InstanceOfValidator<T> & StandardSchemaV1<T>,\n\n /**\n * Create a lazy validator — defers resolution of the inner validator until\n * validate-time. Use for recursive or forward-referenced schemas.\n *\n * @example\n * type Category = { name: string; children: Category[] };\n *\n * const category: ObjectValidator<...> = v.object({\n * name: v.string(),\n * children: v.array(v.lazy(() => category)),\n * });\n */\n lazy: <T extends BaseValidator>(thunk: () => T) =>\n new LazyValidator(thunk) as LazyValidator<T> &\n StandardSchemaV1<Infer.Input<T>, Infer.Output<T>>,\n\n /** Create a string validator */\n string,\n\n /** Create an email validator */\n email: (emailErrorMessage?: string, errorMessage?: string) =>\n new StringValidator(errorMessage).email(emailErrorMessage) as StringValidator &\n StandardSchemaV1<string>,\n\n /**\n * Create an enum validator — preserves the literal union of accepted\n * values in the inferred Standard Schema output.\n *\n * Two input shapes:\n * - Tuple of literals: `v.enum([\"draft\", \"published\"])` →\n * `StandardSchemaV1<\"draft\" | \"published\">`\n * - TypeScript enum object: `v.enum(Status)` →\n * `StandardSchemaV1<Status[keyof Status]>`\n *\n * Implementation is loosely typed; the public `ValidatorV.enum`\n * surface declares the precise overloads.\n */\n enum: ((values: any, errorMessage?: string) =>\n Array.isArray(values)\n ? new ScalarValidator().oneOf(values, errorMessage)\n : new ScalarValidator().enum(values, errorMessage)) as ValidatorV[\"enum\"],\n\n /** Create a number validator */\n number: (errorMessage?: string) =>\n new NumberValidator(errorMessage) as NumberValidator & StandardSchemaV1<number>,\n\n /** Create a numeric validator */\n numeric: (errorMessage?: string) =>\n new NumericValidator(errorMessage) as NumericValidator & StandardSchemaV1<number>,\n\n /** Create an integer validator */\n int: (errorMessage?: string) =>\n new IntValidator(errorMessage) as IntValidator & StandardSchemaV1<number>,\n\n /** Create a float validator */\n float: (errorMessage?: string) =>\n new FloatValidator(errorMessage) as FloatValidator & StandardSchemaV1<number>,\n\n /** Create a boolean validator */\n boolean: (errorMessage?: string) =>\n new BooleanValidator(errorMessage) as BooleanValidator & StandardSchemaV1<boolean>,\n\n /** Create a scalar validator */\n scalar: (errorMessage?: string) =>\n new ScalarValidator(errorMessage) as ScalarValidator &\n StandardSchemaV1<string | number | boolean>,\n\n /** Create a union validator - validates against multiple types */\n union: <T extends BaseValidator[]>(validators: T, errorMessage?: string) =>\n new UnionValidator().union(validators, errorMessage) as StandardSchemaV1<\n Infer.Input<T[number]>,\n Infer.Output<T[number]>\n > &\n UnionValidator,\n\n /**\n * Create a discriminated union — routes payloads by a shared literal\n * discriminator field. Each branch must be a `v.object(...)` with the\n * discriminator typed as `v.literal(...)`.\n *\n * @example\n * const email = v.object({ type: v.literal(\"email\"), email: v.string().email() });\n * const sms = v.object({ type: v.literal(\"sms\"), phone: v.string() });\n * const notif = v.discriminatedUnion(\"type\", [email, sms]);\n * // type T = Infer<typeof notif>;\n * // → { type: \"email\", email: string } | { type: \"sms\", phone: string }\n */\n discriminatedUnion: <K extends string, Branches extends ReadonlyArray<ObjectValidator<any>>>(\n discriminator: K,\n validators: Branches,\n ) =>\n new DiscriminatedUnionValidator(discriminator, validators) as DiscriminatedUnionValidator<\n K,\n Branches\n > &\n StandardSchemaV1<Infer.Input<Branches[number]>, Infer.Output<Branches[number]>>,\n\n /** Create a computed field validator - derives value from other validated fields */\n computed: <TResult = any>(\n callback: (data: any, context: SchemaContext) => TResult | Promise<TResult>,\n resultValidator?: BaseValidator,\n ) =>\n new ComputedValidator<TResult>(callback, resultValidator) as ComputedValidator<TResult> &\n StandardSchemaV1<TResult>,\n\n /** Create a managed field validator - framework-injected value */\n managed: <TResult = any>(\n callback: (context: SchemaContext) => TResult | Promise<TResult>,\n resultValidator?: BaseValidator,\n ) =>\n new ManagedValidator<TResult>(callback, resultValidator) as ManagedValidator<TResult> &\n StandardSchemaV1<TResult>,\n\n /** Validate data against a schema */\n validate: validateFunction,\n} as unknown as ValidatorV;\n\nexport type ValidateOptions = {\n context?: Record<string, any>;\n /**\n * Rendered as `:value` in every error message — translated or custom —\n * instead of the submitted input. Unset keeps the raw value.\n */\n redactValue?: string;\n} & SealConfig;\n\n// Standard Schema comes first on record/union intersections so direct calls\n// select the precise validate() output overload rather than BaseValidator's.\nexport interface ValidatorV {\n object: <T extends Schema>(schema: T, errorMessage?: string) => ObjectValidator<T>;\n any: () => AnyValidator & StandardSchemaV1<any>;\n array: <T extends BaseValidator>(\n validator: T,\n errorMessage?: string,\n ) => ArrayValidator & {\n validator: T;\n } & StandardSchemaV1<Array<Infer.Input<T>>, Array<Infer.Output<T>>>;\n record: typeof record;\n tuple: <T extends BaseValidator[] | []>(\n validators: T,\n errorMessage?: string,\n ) => TupleValidator & {\n validators: T;\n } & StandardSchemaV1<\n { [K in keyof T]: Infer.Input<T[K]> },\n { [K in keyof T]: Infer.Output<T[K]> }\n >;\n date: (errorMessage?: string) => DateValidator & StandardSchemaV1<Date>;\n literal: <T extends readonly [string | number | boolean, ...(string | number | boolean)[]]>(\n ...values: T\n ) => LiteralValidator<T> & StandardSchemaV1<T[number]>;\n instanceof: <T>(\n ctor: new (...args: any[]) => T,\n errorMessage?: string,\n ) => InstanceOfValidator<T> & StandardSchemaV1<T>;\n lazy: <T extends BaseValidator>(\n thunk: () => T,\n ) => LazyValidator<T> & StandardSchemaV1<Infer.Input<T>, Infer.Output<T>>;\n string: (errorMessage?: string) => StringValidator & StandardSchemaV1<string>;\n email: (errorMessage?: string) => StringValidator & StandardSchemaV1<string>;\n enum: {\n <const T extends readonly (string | number | boolean)[]>(\n values: T,\n errorMessage?: string,\n ): ScalarValidator & StandardSchemaV1<T[number]>;\n <const T extends Record<string, string | number>>(\n values: T,\n errorMessage?: string,\n ): ScalarValidator & StandardSchemaV1<T[keyof T]>;\n };\n number: (errorMessage?: string) => NumberValidator & StandardSchemaV1<number>;\n numeric: (errorMessage?: string) => NumericValidator & StandardSchemaV1<number>;\n int: (errorMessage?: string) => IntValidator & StandardSchemaV1<number>;\n float: (errorMessage?: string) => FloatValidator & StandardSchemaV1<number>;\n boolean: (errorMessage?: string) => BooleanValidator & StandardSchemaV1<boolean>;\n scalar: (errorMessage?: string) => ScalarValidator & StandardSchemaV1<string | number | boolean>;\n union: <T extends BaseValidator[]>(\n validators: T,\n errorMessage?: string,\n ) => StandardSchemaV1<Infer.Input<T[number]>, Infer.Output<T[number]>> & UnionValidator;\n discriminatedUnion: <K extends string, Branches extends ReadonlyArray<ObjectValidator<any>>>(\n discriminator: K,\n validators: Branches,\n ) => DiscriminatedUnionValidator<K, Branches> &\n StandardSchemaV1<Infer.Input<Branches[number]>, Infer.Output<Branches[number]>>;\n computed: <TResult = any>(\n callback: (data: any, context: SchemaContext) => TResult | Promise<TResult>,\n resultValidator?: BaseValidator,\n ) => ComputedValidator<TResult> & StandardSchemaV1<TResult>;\n managed: <TResult = any>(\n callback?: (context: SchemaContext) => TResult | Promise<TResult>,\n resultValidator?: BaseValidator,\n ) => ManagedValidator<TResult> & StandardSchemaV1<TResult>;\n validate: <T extends BaseValidator>(\n schema: T,\n data: unknown,\n options?: ValidateOptions,\n ) => Promise<TypedValidationResult<ValidatedOutput<T>>>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA,SAAS,OACP,OACA,QACA,cACiB;CACjB,IAAI,kBAAkB,eAAe;EACnC,IAAI,UAAU,QACZ,MAAM,IAAI,UAAU,oEAAoE;EAC1F,OAAO,IAAI,gBAAgB,OAAO,QAAQ,YAAY;CACxD;CACA,OAAO,IAAI,gBAAgB,UAAU,SAAY,IAAI,aAAa,IAAI,OAAO,MAAM;AACrF;;;;;;AAOA,MAAa,IAAgB;;CAE3B;;CAGA,WAAW,IAAI,aAAa;;CAG5B,QAAiC,WAAc,iBAC7C,IAAI,eAAe,WAAW,YAAY;;CAK5C;;;;;;;;CASA,QAAwC,YAAe,iBACrD,IAAI,eAAe,YAAY,YAAY;;CAQ7C,OAAO,iBACL,IAAI,cAAc,YAAY;;;;;;;;;CAUhC,UACE,GAAG,WACA,IAAI,iBAAoB,MAAM;;;;;;;;;CAUnC,aAAgB,MAAiC,iBAC/C,IAAI,oBAAuB,MAAM,YAAY;;;;;;;;;;;;;CAc/C,OAAgC,UAC9B,IAAI,cAAc,KAAK;;CAIzB;;CAGA,QAAQ,mBAA4B,iBAClC,IAAI,gBAAgB,YAAY,CAAC,CAAC,MAAM,iBAAiB;;;;;;;;;;;;;;CAgB3D,QAAQ,QAAa,iBACnB,MAAM,QAAQ,MAAM,IAChB,IAAI,gBAAgB,CAAC,CAAC,MAAM,QAAQ,YAAY,IAChD,IAAI,gBAAgB,CAAC,CAAC,KAAK,QAAQ,YAAY;;CAGrD,SAAS,iBACP,IAAI,gBAAgB,YAAY;;CAGlC,UAAU,iBACR,IAAI,iBAAiB,YAAY;;CAGnC,MAAM,iBACJ,IAAI,aAAa,YAAY;;CAG/B,QAAQ,iBACN,IAAI,eAAe,YAAY;;CAGjC,UAAU,iBACR,IAAI,iBAAiB,YAAY;;CAGnC,SAAS,iBACP,IAAI,gBAAgB,YAAY;;CAIlC,QAAmC,YAAe,iBAChD,IAAI,eAAe,CAAC,CAAC,MAAM,YAAY,YAAY;;;;;;;;;;;;;CAkBrD,qBACE,eACA,eAEA,IAAI,4BAA4B,eAAe,UAAU;;CAO3D,WACE,UACA,oBAEA,IAAI,kBAA2B,UAAU,eAAe;;CAI1D,UACE,UACA,oBAEA,IAAI,iBAA0B,UAAU,eAAe;;CAI/CA;AACZ"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region ../../packages/seal/src/helpers/plain-object.ts
|
|
2
|
+
/** Plain dictionaries include null-prototype objects, never arrays or class instances. */
|
|
3
|
+
function isPlainObjectValue(value) {
|
|
4
|
+
if (value === null || typeof value !== "object") return false;
|
|
5
|
+
const prototype = Object.getPrototypeOf(value);
|
|
6
|
+
return prototype === Object.prototype || prototype === null;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
export { isPlainObjectValue };
|
|
11
|
+
//# sourceMappingURL=plain-object.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plain-object.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/helpers/plain-object.ts"],"sourcesContent":["/** Plain dictionaries include null-prototype objects, never arrays or class instances. */\nexport function isPlainObjectValue(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n"],"mappings":";;AACA,SAAgB,mBAAmB,OAAkD;CACnF,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO;CACxD,MAAM,YAAY,OAAO,eAAe,KAAK;CAC7C,OAAO,cAAc,OAAO,aAAa,cAAc;AACzD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-rules.d.mts","names":[],"sources":["../../../../../../../../../packages/seal/src/rules/common/type-rules.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"type-rules.d.mts","names":[],"sources":["../../../../../../../../../packages/seal/src/rules/common/type-rules.ts"],"mappings":";;;;;;qBAQa,YAAY;;;;qBAcZ,YAAY;;;;qBAcZ,aAAa;;;;qBAcb,SAAS;;;;qBAcT,WAAW;;;;qBAcX,YAAY;;;;qBAcZ,YAAY;;;;qBAeZ,iBAAiB;;;;qBAejB,WAAW"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { VALID_RULE, invalidRule } from "../../helpers/validation-helpers.mjs";
|
|
2
2
|
import "../../helpers/index.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { isPlainObjectValue } from "../../helpers/plain-object.mjs";
|
|
4
|
+
import { isObject } from "@mongez/supportive-is";
|
|
4
5
|
|
|
5
6
|
//#region ../../packages/seal/src/rules/common/type-rules.ts
|
|
6
7
|
/**
|
|
@@ -91,7 +92,7 @@ const plainObjectRule = {
|
|
|
91
92
|
name: "plainObject",
|
|
92
93
|
defaultErrorMessage: "The :input must be an object",
|
|
93
94
|
async validate(value, context) {
|
|
94
|
-
if (!!
|
|
95
|
+
if (!!isPlainObjectValue(value) && value !== null) return VALID_RULE;
|
|
95
96
|
return invalidRule(this, context);
|
|
96
97
|
}
|
|
97
98
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-rules.mjs","names":[],"sources":["../../../../../../../../../packages/seal/src/rules/common/type-rules.ts"],"sourcesContent":["import { isObject
|
|
1
|
+
{"version":3,"file":"type-rules.mjs","names":["isPlainObject"],"sources":["../../../../../../../../../packages/seal/src/rules/common/type-rules.ts"],"sourcesContent":["import { isObject } from \"@mongez/supportive-is\";\nimport { isPlainObjectValue as isPlainObject } from \"../../helpers/plain-object\";\nimport { invalidRule, VALID_RULE } from \"../../helpers\";\nimport type { SchemaRule } from \"../../types\";\n\n/**\n * String rule - validates string type\n */\nexport const stringRule: SchemaRule = {\n name: \"string\",\n defaultErrorMessage: \"The :input must be a string\",\n async validate(value: any, context) {\n if (typeof value === \"string\") {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * Number rule - validates number type\n */\nexport const numberRule: SchemaRule = {\n name: \"number\",\n defaultErrorMessage: \"The :input must be a number\",\n async validate(value: any, context) {\n if (typeof value === \"number\") {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * Boolean rule - validates boolean type\n */\nexport const booleanRule: SchemaRule = {\n name: \"boolean\",\n defaultErrorMessage: \"The :input must be a boolean\",\n async validate(value: any, context) {\n if (typeof value === \"boolean\") {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * Int rule - validates integer type\n */\nexport const intRule: SchemaRule = {\n name: \"int\",\n defaultErrorMessage: \"The :input must be an integer\",\n async validate(value: any, context) {\n if (Number.isInteger(value)) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * Float rule - validates float type\n */\nexport const floatRule: SchemaRule = {\n name: \"float\",\n defaultErrorMessage: \"The :input must be a float\",\n async validate(value: any, context) {\n if (Number.isFinite(value) && !Number.isInteger(value)) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * Scalar rule - validates scalar value (string, number, or boolean)\n */\nexport const scalarRule: SchemaRule = {\n name: \"scalar\",\n defaultErrorMessage: \"The :input must be a scalar value\",\n async validate(value: any, context) {\n if ([\"string\", \"number\", \"boolean\"].includes(typeof value)) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * Object rule - validates object type\n */\nexport const objectRule: SchemaRule = {\n name: \"object\",\n defaultErrorMessage: \"The :input must be an object\",\n async validate(value: any, context) {\n if (!!isObject(value) && value !== null) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Object rule - validates object type\n */\nexport const plainObjectRule: SchemaRule = {\n name: \"plainObject\",\n defaultErrorMessage: \"The :input must be an object\",\n async validate(value: any, context) {\n if (!!isPlainObject(value) && value !== null) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Array rule - validates array type\n */\nexport const arrayRule: SchemaRule = {\n name: \"array\",\n defaultErrorMessage: \"The :input must be an array\",\n async validate(value: any, context) {\n if (Array.isArray(value)) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n"],"mappings":";;;;;;;;;AAQA,MAAa,aAAyB;CACpC,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI,OAAO,UAAU,UACnB,OAAO;EAET,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,aAAyB;CACpC,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI,OAAO,UAAU,UACnB,OAAO;EAET,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,cAA0B;CACrC,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI,OAAO,UAAU,WACnB,OAAO;EAET,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,UAAsB;CACjC,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI,OAAO,UAAU,KAAK,GACxB,OAAO;EAET,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,YAAwB;CACnC,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,UAAU,KAAK,GACnD,OAAO;EAET,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,aAAyB;CACpC,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI;GAAC;GAAU;GAAU;EAAS,CAAC,CAAC,SAAS,OAAO,KAAK,GACvD,OAAO;EAET,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,aAAyB;CACpC,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK,UAAU,MACjC,OAAO;EAGT,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,kBAA8B;CACzC,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI,CAAC,CAACA,mBAAc,KAAK,KAAK,UAAU,MACtC,OAAO;EAGT,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,YAAwB;CACnC,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO;EAGT,OAAO,YAAY,MAAM,OAAO;CAClC;AACF"}
|
|
@@ -2,11 +2,11 @@ import { applyNullable, wrapNullableStrict } from "../standard-schema/json-schem
|
|
|
2
2
|
import { setKeyPath } from "../helpers/path-helpers.mjs";
|
|
3
3
|
import { BaseValidator } from "./base-validator.mjs";
|
|
4
4
|
import { objectTrimMutator, stripUnknownMutator } from "../mutators/object-mutators.mjs";
|
|
5
|
-
import {
|
|
5
|
+
import { isPlainObjectValue } from "../helpers/plain-object.mjs";
|
|
6
|
+
import { plainObjectRule } from "../rules/common/type-rules.mjs";
|
|
6
7
|
import { unknownKeyRule } from "../rules/common/unknown-key.mjs";
|
|
7
8
|
import { ComputedValidator } from "./computed-validator.mjs";
|
|
8
9
|
import { except } from "@mongez/reinforcements";
|
|
9
|
-
import { isPlainObject } from "@mongez/supportive-is";
|
|
10
10
|
|
|
11
11
|
//#region ../../packages/seal/src/validators/object-validator.ts
|
|
12
12
|
/**
|
|
@@ -32,13 +32,16 @@ var ObjectValidator = class ObjectValidator extends BaseValidator {
|
|
|
32
32
|
this.shouldAllowUnknown = false;
|
|
33
33
|
this.allowedKeys = [];
|
|
34
34
|
this.hasUnknownKeyRule = false;
|
|
35
|
-
this.addMutableRule(
|
|
35
|
+
this.addMutableRule({
|
|
36
|
+
...plainObjectRule,
|
|
37
|
+
name: "object"
|
|
38
|
+
}, errorMessage);
|
|
36
39
|
}
|
|
37
40
|
/**
|
|
38
41
|
* Check if value is an object type (plain object, not array or date)
|
|
39
42
|
*/
|
|
40
43
|
matchesType(value) {
|
|
41
|
-
return
|
|
44
|
+
return isPlainObjectValue(value);
|
|
42
45
|
}
|
|
43
46
|
/** Strip unknown keys from the data */
|
|
44
47
|
stripUnknown() {
|
|
@@ -279,7 +282,7 @@ var ObjectValidator = class ObjectValidator extends BaseValidator {
|
|
|
279
282
|
}
|
|
280
283
|
/** Mutate the data */
|
|
281
284
|
mutate(data, context) {
|
|
282
|
-
if (!
|
|
285
|
+
if (!isPlainObjectValue(data)) return data;
|
|
283
286
|
return super.mutate({ ...data }, context);
|
|
284
287
|
}
|
|
285
288
|
/** Validate the data */
|
|
@@ -432,7 +435,7 @@ var ObjectValidator = class ObjectValidator extends BaseValidator {
|
|
|
432
435
|
function removeUndefinedValues(obj, visited = /* @__PURE__ */ new WeakMap()) {
|
|
433
436
|
if (obj === null) return obj;
|
|
434
437
|
if (Array.isArray(obj)) return obj.map((item) => removeUndefinedValues(item, visited));
|
|
435
|
-
if (!
|
|
438
|
+
if (!isPlainObjectValue(obj)) return obj;
|
|
436
439
|
if (visited.has(obj)) return visited.get(obj);
|
|
437
440
|
const result = {};
|
|
438
441
|
visited.set(obj, result);
|