@warlock.js/seal 5.37.0 → 5.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/cjs/index.cjs +36 -8
  3. package/cjs/index.cjs.map +1 -1
  4. package/cjs/{object-Um5Ds4ch.cjs → object-BK6x62QZ.cjs} +27 -4
  5. package/cjs/object-BK6x62QZ.cjs.map +1 -0
  6. package/cjs/object.cjs +2 -2
  7. package/cjs/{required-methods-Bh481cKm.cjs → required-methods-Bt9oNJ5V.cjs} +102 -17
  8. package/cjs/required-methods-Bt9oNJ5V.cjs.map +1 -0
  9. package/cjs/{string-BOKt6UtS.cjs → string-bc4YzeXc.cjs} +2 -2
  10. package/cjs/{string-BOKt6UtS.cjs.map → string-bc4YzeXc.cjs.map} +1 -1
  11. package/cjs/string.cjs +2 -2
  12. package/esm/helpers/humanize-attribute.d.mts +18 -0
  13. package/esm/helpers/humanize-attribute.d.mts.map +1 -0
  14. package/esm/helpers/humanize-attribute.mjs +24 -0
  15. package/esm/helpers/humanize-attribute.mjs.map +1 -0
  16. package/esm/helpers/index.d.mts +2 -1
  17. package/esm/helpers/index.mjs +2 -1
  18. package/esm/helpers/validation-helpers.d.mts.map +1 -1
  19. package/esm/helpers/validation-helpers.mjs +2 -1
  20. package/esm/helpers/validation-helpers.mjs.map +1 -1
  21. package/esm/index.d.mts +3 -2
  22. package/esm/index.mjs +2 -1
  23. package/esm/standard-schema/json-schema.d.mts +12 -3
  24. package/esm/standard-schema/json-schema.d.mts.map +1 -1
  25. package/esm/standard-schema/json-schema.mjs +65 -15
  26. package/esm/standard-schema/json-schema.mjs.map +1 -1
  27. package/esm/types/index.d.mts +2 -2
  28. package/esm/types/inference-types.d.mts +13 -0
  29. package/esm/types/inference-types.d.mts.map +1 -1
  30. package/esm/validators/base-validator.d.mts +30 -0
  31. package/esm/validators/base-validator.d.mts.map +1 -1
  32. package/esm/validators/base-validator.mjs +34 -0
  33. package/esm/validators/base-validator.mjs.map +1 -1
  34. package/esm/validators/object-validator.d.mts +23 -4
  35. package/esm/validators/object-validator.d.mts.map +1 -1
  36. package/esm/validators/object-validator.mjs +25 -2
  37. package/esm/validators/object-validator.mjs.map +1 -1
  38. package/esm/validators/scalar-validator.d.mts +1 -1
  39. package/esm/validators/scalar-validator.d.mts.map +1 -1
  40. package/esm/validators/scalar-validator.mjs +8 -5
  41. package/esm/validators/scalar-validator.mjs.map +1 -1
  42. package/esm/validators/union-validator.mjs +4 -2
  43. package/esm/validators/union-validator.mjs.map +1 -1
  44. package/llms-full.txt +2 -1
  45. package/package.json +1 -1
  46. package/skills/define-structural-shape/SKILL.md +1 -1
  47. package/skills/generate-json-schema/SKILL.md +1 -0
  48. package/cjs/object-Um5Ds4ch.cjs.map +0 -1
  49. package/cjs/required-methods-Bh481cKm.cjs.map +0 -1
@@ -1,4 +1,4 @@
1
- const require_required_methods = require("./required-methods-Bh481cKm.cjs");
1
+ const require_required_methods = require("./required-methods-Bt9oNJ5V.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-BOKt6UtS.cjs.map
945
+ //# sourceMappingURL=string-bc4YzeXc.cjs.map
@@ -1 +1 @@
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, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\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(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#039;/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-bc4YzeXc.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, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\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(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#039;/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-Bh481cKm.cjs");
3
- const require_string = require("./string-BOKt6UtS.cjs");
2
+ const require_required_methods = require("./required-methods-Bt9oNJ5V.cjs");
3
+ const require_string = require("./string-bc4YzeXc.cjs");
4
4
 
5
5
  exports.StringValidator = require_string.StringValidator;
6
6
  exports.equalityConditionalMethodsApplied = require_required_methods.equalityConditionalMethodsApplied;
@@ -0,0 +1,18 @@
1
+ //#region ../../packages/seal/src/helpers/humanize-attribute.d.ts
2
+ /**
3
+ * Turn a field key into readable words for a validation message.
4
+ *
5
+ * Splits on underscores, hyphens, dots and camel-case boundaries, lowercases
6
+ * the words and capitalises the first one. A key without letters (such as an
7
+ * array index) is returned unchanged.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * humanizeAttribute("max_dumbbell_kg"); // "Max dumbbell kg"
12
+ * humanizeAttribute("firstName"); // "First name"
13
+ * humanizeAttribute("userID"); // "User id"
14
+ * ```
15
+ */
16
+ export declare function humanizeAttribute(attribute: string): string;
17
+ //#endregion
18
+ //# sourceMappingURL=humanize-attribute.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanize-attribute.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/helpers/humanize-attribute.ts"],"mappings":";;;;;;;;;;;;;;;wBAcgB,kBAAkB"}
@@ -0,0 +1,24 @@
1
+ //#region ../../packages/seal/src/helpers/humanize-attribute.ts
2
+ /**
3
+ * Turn a field key into readable words for a validation message.
4
+ *
5
+ * Splits on underscores, hyphens, dots and camel-case boundaries, lowercases
6
+ * the words and capitalises the first one. A key without letters (such as an
7
+ * array index) is returned unchanged.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * humanizeAttribute("max_dumbbell_kg"); // "Max dumbbell kg"
12
+ * humanizeAttribute("firstName"); // "First name"
13
+ * humanizeAttribute("userID"); // "User id"
14
+ * ```
15
+ */
16
+ function humanizeAttribute(attribute) {
17
+ if (!/[A-Za-z]/.test(attribute)) return attribute;
18
+ const words = attribute.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2").replace(/[_\-.]+/g, " ").trim().replace(/\s+/g, " ").toLowerCase();
19
+ return words.charAt(0).toUpperCase() + words.slice(1);
20
+ }
21
+
22
+ //#endregion
23
+ export { humanizeAttribute };
24
+ //# sourceMappingURL=humanize-attribute.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanize-attribute.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/helpers/humanize-attribute.ts"],"sourcesContent":["/**\n * Turn a field key into readable words for a validation message.\n *\n * Splits on underscores, hyphens, dots and camel-case boundaries, lowercases\n * the words and capitalises the first one. A key without letters (such as an\n * array index) is returned unchanged.\n *\n * @example\n * ```ts\n * humanizeAttribute(\"max_dumbbell_kg\"); // \"Max dumbbell kg\"\n * humanizeAttribute(\"firstName\"); // \"First name\"\n * humanizeAttribute(\"userID\"); // \"User id\"\n * ```\n */\nexport function humanizeAttribute(attribute: string): string {\n if (!/[A-Za-z]/.test(attribute)) return attribute;\n\n const words = attribute\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n .replace(/[_\\-.]+/g, \" \")\n .trim()\n .replace(/\\s+/g, \" \")\n .toLowerCase();\n\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAcA,SAAgB,kBAAkB,WAA2B;CAC3D,IAAI,CAAC,WAAW,KAAK,SAAS,GAAG,OAAO;CAExC,MAAM,QAAQ,UACX,QAAQ,sBAAsB,OAAO,CAAC,CACtC,QAAQ,yBAAyB,OAAO,CAAC,CACzC,QAAQ,YAAY,GAAG,CAAC,CACxB,KAAK,CAAC,CACN,QAAQ,QAAQ,GAAG,CAAC,CACpB,YAAY;CAEf,OAAO,MAAM,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,MAAM,MAAM,CAAC;AACtD"}
@@ -1,6 +1,7 @@
1
1
  import { isDateValue } from "./date-helpers.mjs";
2
2
  import { humanizeSize, resolveFileSize } from "./file.utils.mjs";
3
3
  import { getFieldValue } from "./get-field-value.mjs";
4
+ import { humanizeAttribute } from "./humanize-attribute.mjs";
4
5
  import { setKeyPath } from "./path-helpers.mjs";
5
6
  import { VALID_RULE, invalidRule, resolveTranslation } from "./validation-helpers.mjs";
6
- export { VALID_RULE, getFieldValue, humanizeSize, invalidRule, isDateValue, resolveFileSize, resolveTranslation, setKeyPath };
7
+ export { VALID_RULE, getFieldValue, humanizeAttribute, humanizeSize, invalidRule, isDateValue, resolveFileSize, resolveTranslation, setKeyPath };
@@ -2,6 +2,7 @@ import { VALID_RULE, invalidRule, resolveTranslation } from "./validation-helper
2
2
  import { isDateValue } from "./date-helpers.mjs";
3
3
  import { humanizeSize, resolveFileSize } from "./file.utils.mjs";
4
4
  import { getFieldValue } from "./get-field-value.mjs";
5
+ import { humanizeAttribute } from "./humanize-attribute.mjs";
5
6
  import { setKeyPath } from "./path-helpers.mjs";
6
7
 
7
- export { VALID_RULE, getFieldValue, humanizeSize, invalidRule, isDateValue, resolveFileSize, resolveTranslation, setKeyPath };
8
+ export { VALID_RULE, getFieldValue, humanizeAttribute, humanizeSize, invalidRule, isDateValue, resolveFileSize, resolveTranslation, setKeyPath };
@@ -1 +1 @@
1
- {"version":3,"file":"validation-helpers.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/helpers/validation-helpers.ts"],"mappings":";;;;qBAGa,YAAY;;;;;;;;;;;;;;;;;qBAmBZ,uBAAkB,KAAA,UAAA,MAAA;EAM7B;EACA;EACA,MAAM;EACN,SAAS;;qBAqBE,cAAW,MAAU,sBAAoB,SAAW,kBAAgB"}
1
+ {"version":3,"file":"validation-helpers.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/helpers/validation-helpers.ts"],"mappings":";;;;qBAGa,YAAY;;;;;;;;;;;;;;;;;qBAmBZ,uBAAkB,KAAA,UAAA,MAAA;EAM7B;EACA;EACA,MAAM;EACN,SAAS;;qBA8BE,cAAW,MAAU,sBAAoB,SAAW,kBAAgB"}
@@ -19,7 +19,8 @@ const VALID_RULE = { isValid: true };
19
19
  * this.context.translationParams.enumList = enumList;
20
20
  */
21
21
  const resolveTranslation = ({ key, rawValue, rule, context }) => {
22
- const translator = getSealConfig().translateAttribute;
22
+ const globalTranslator = getSealConfig().translateAttribute;
23
+ const translator = globalTranslator || context.translateAttribute ? (translation) => context.translateAttribute?.(translation) || globalTranslator?.(translation) || translation.attribute : void 0;
23
24
  const direct = rule.context.attributesList?.[key];
24
25
  if (direct && typeof direct === "string") return direct;
25
26
  if (!translator) return String(rawValue ?? key);
@@ -1 +1 @@
1
- {"version":3,"file":"validation-helpers.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/helpers/validation-helpers.ts"],"sourcesContent":["import { getSealConfig } from \"../config\";\nimport type { ContextualSchemaRule, RuleResult, RuleTranslation, SchemaContext } from \"../types\";\n\nexport const VALID_RULE: RuleResult = {\n isValid: true,\n};\n/**\n * Resolve a single attribute value through the full translation priority chain:\n * 1. attributesList[key] — developer direct text override (highest priority)\n * 2. translatedAttributes[key] — developer explicit translation key\n * 3. translator(rawValue) — auto-translate the raw value (fallback)\n *\n * Use this in rule bodies when you need per-item translation\n * (e.g. translating each enum value before joining them).\n *\n * @example\n * // Translate each enum value individually then join\n * const enumList = enumValues\n * .map(v => resolveTranslation(String(v), String(v), this, context))\n * .join(\", \");\n * this.context.translationParams.enumList = enumList;\n */\nexport const resolveTranslation = ({\n key,\n rawValue,\n rule,\n context,\n}: {\n key: string;\n rawValue: any;\n rule: ContextualSchemaRule;\n context: SchemaContext;\n}): string => {\n const translator = getSealConfig().translateAttribute;\n\n // 1. Direct text override wins\n const direct = rule.context.attributesList?.[key];\n if (direct && typeof direct === \"string\") return direct;\n\n if (!translator) return String(rawValue ?? key);\n\n // 2. Explicit translation key\n const transKey = rule.context.translatedAttributes?.[key];\n if (transKey) return translator({ attribute: transKey, context, rule });\n\n // 3. Auto-translate the raw value (fallback)\n return translator({ attribute: String(rawValue ?? key), context, rule });\n};\n\n// Internal alias — invalidRule uses the same function without re-importing config\nconst resolveAttribute = resolveTranslation;\n\nexport const invalidRule = (rule: ContextualSchemaRule, context: SchemaContext): RuleResult => {\n // `input` is always translatable — rules may add more (e.g., field references in sameAs)\n // Rule-defined translatableParams override the default input if the key matches\n const translatableWithInput: Record<string, string> = {\n // Fall back to \"schema\" when validating at the root level (no key)\n input: context.key || \"schema\",\n ...rule.context.translatableParams,\n };\n\n // Resolve all translatable params through the full priority chain\n const resolvedParams = Object.fromEntries(\n Object.entries(translatableWithInput).map(([key, rawValue]) => [\n key,\n resolveAttribute({ key, rawValue, rule, context }),\n ]),\n );\n const input = resolveAttribute({\n key: \"input\",\n rawValue: translatableWithInput.input ?? \"schema\",\n rule,\n context,\n });\n\n const attributes: RuleTranslation[\"attributes\"] = {\n path: context.path,\n key: context.key,\n // A per-call `redactValue` stands in for the submitted input, so neither a\n // translation nor a custom message can echo it through `:value`\n value: context.configurations?.redactValue ?? context.value,\n // Raw placeholders (:enumList, :min, :max, etc.) — no translation\n ...rule.context.translationParams,\n // Translated placeholders (:input, :field, etc.) — override raws if key collides\n ...resolvedParams,\n // Satisfy TypeScript's required field (always present via resolvedParams)\n input,\n };\n\n const rawError =\n rule.context.errorMessage ||\n rule.errorMessage ||\n context.translateRule?.({ rule, context, attributes }) ||\n rule.defaultErrorMessage!;\n\n // Fallback interpolation: replace :placeholder patterns from attributes\n // This kicks in when translateRule is absent or returns \"\" (not configured)\n const error = rawError.replace(/:([a-zA-Z_]+)/g, (match, key) =>\n key in attributes ? String(attributes[key as keyof typeof attributes]) : match,\n );\n\n return {\n isValid: false,\n error,\n input: attributes.input, // use resolved input, not raw context.key (may be \"\")\n path: context.path,\n };\n};\n"],"mappings":";;;AAGA,MAAa,aAAyB,EACpC,SAAS,KACX;;;;;;;;;;;;;;;;;AAiBA,MAAa,sBAAsB,EACjC,KACA,UACA,MACA,cAMY;CACZ,MAAM,aAAa,cAAc,CAAC,CAAC;CAGnC,MAAM,SAAS,KAAK,QAAQ,iBAAiB;CAC7C,IAAI,UAAU,OAAO,WAAW,UAAU,OAAO;CAEjD,IAAI,CAAC,YAAY,OAAO,OAAO,YAAY,GAAG;CAG9C,MAAM,WAAW,KAAK,QAAQ,uBAAuB;CACrD,IAAI,UAAU,OAAO,WAAW;EAAE,WAAW;EAAU;EAAS;CAAK,CAAC;CAGtE,OAAO,WAAW;EAAE,WAAW,OAAO,YAAY,GAAG;EAAG;EAAS;CAAK,CAAC;AACzE;AAGA,MAAM,mBAAmB;AAEzB,MAAa,eAAe,MAA4B,YAAuC;CAG7F,MAAM,wBAAgD;EAEpD,OAAO,QAAQ,OAAO;EACtB,GAAG,KAAK,QAAQ;CAClB;CAGA,MAAM,iBAAiB,OAAO,YAC5B,OAAO,QAAQ,qBAAqB,CAAC,CAAC,KAAK,CAAC,KAAK,cAAc,CAC7D,KACA,iBAAiB;EAAE;EAAK;EAAU;EAAM;CAAQ,CAAC,CACnD,CAAC,CACH;CACA,MAAM,QAAQ,iBAAiB;EAC7B,KAAK;EACL,UAAU,sBAAsB,SAAS;EACzC;EACA;CACF,CAAC;CAED,MAAM,aAA4C;EAChD,MAAM,QAAQ;EACd,KAAK,QAAQ;EAGb,OAAO,QAAQ,gBAAgB,eAAe,QAAQ;EAEtD,GAAG,KAAK,QAAQ;EAEhB,GAAG;EAEH;CACF;CAcA,OAAO;EACL,SAAS;EACT,QAbA,KAAK,QAAQ,gBACb,KAAK,gBACL,QAAQ,gBAAgB;GAAE;GAAM;GAAS;EAAW,CAAC,KACrD,KAAK,oBAIe,CAAC,QAAQ,mBAAmB,OAAO,QACvD,OAAO,aAAa,OAAO,WAAW,IAA+B,IAAI,KAKrE;EACJ,OAAO,WAAW;EAClB,MAAM,QAAQ;CAChB;AACF"}
1
+ {"version":3,"file":"validation-helpers.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/helpers/validation-helpers.ts"],"sourcesContent":["import { getSealConfig } from \"../config\";\nimport type { ContextualSchemaRule, RuleResult, RuleTranslation, SchemaContext } from \"../types\";\n\nexport const VALID_RULE: RuleResult = {\n isValid: true,\n};\n/**\n * Resolve a single attribute value through the full translation priority chain:\n * 1. attributesList[key] — developer direct text override (highest priority)\n * 2. translatedAttributes[key] — developer explicit translation key\n * 3. translator(rawValue) — auto-translate the raw value (fallback)\n *\n * Use this in rule bodies when you need per-item translation\n * (e.g. translating each enum value before joining them).\n *\n * @example\n * // Translate each enum value individually then join\n * const enumList = enumValues\n * .map(v => resolveTranslation(String(v), String(v), this, context))\n * .join(\", \");\n * this.context.translationParams.enumList = enumList;\n */\nexport const resolveTranslation = ({\n key,\n rawValue,\n rule,\n context,\n}: {\n key: string;\n rawValue: any;\n rule: ContextualSchemaRule;\n context: SchemaContext;\n}): string => {\n const globalTranslator = getSealConfig().translateAttribute;\n // The translator handed to this validation call wins over the global one, the\n // same way `translateRule` resolves. A call without one returns \"\".\n const translator: typeof globalTranslator =\n globalTranslator || context.translateAttribute\n ? (translation) =>\n context.translateAttribute?.(translation) ||\n globalTranslator?.(translation) ||\n translation.attribute\n : undefined;\n\n // 1. Direct text override wins\n const direct = rule.context.attributesList?.[key];\n if (direct && typeof direct === \"string\") return direct;\n\n if (!translator) return String(rawValue ?? key);\n\n // 2. Explicit translation key\n const transKey = rule.context.translatedAttributes?.[key];\n if (transKey) return translator({ attribute: transKey, context, rule });\n\n // 3. Auto-translate the raw value (fallback)\n return translator({ attribute: String(rawValue ?? key), context, rule });\n};\n\n// Internal alias — invalidRule uses the same function without re-importing config\nconst resolveAttribute = resolveTranslation;\n\nexport const invalidRule = (rule: ContextualSchemaRule, context: SchemaContext): RuleResult => {\n // `input` is always translatable — rules may add more (e.g., field references in sameAs)\n // Rule-defined translatableParams override the default input if the key matches\n const translatableWithInput: Record<string, string> = {\n // Fall back to \"schema\" when validating at the root level (no key)\n input: context.key || \"schema\",\n ...rule.context.translatableParams,\n };\n\n // Resolve all translatable params through the full priority chain\n const resolvedParams = Object.fromEntries(\n Object.entries(translatableWithInput).map(([key, rawValue]) => [\n key,\n resolveAttribute({ key, rawValue, rule, context }),\n ]),\n );\n const input = resolveAttribute({\n key: \"input\",\n rawValue: translatableWithInput.input ?? \"schema\",\n rule,\n context,\n });\n\n const attributes: RuleTranslation[\"attributes\"] = {\n path: context.path,\n key: context.key,\n // A per-call `redactValue` stands in for the submitted input, so neither a\n // translation nor a custom message can echo it through `:value`\n value: context.configurations?.redactValue ?? context.value,\n // Raw placeholders (:enumList, :min, :max, etc.) — no translation\n ...rule.context.translationParams,\n // Translated placeholders (:input, :field, etc.) — override raws if key collides\n ...resolvedParams,\n // Satisfy TypeScript's required field (always present via resolvedParams)\n input,\n };\n\n const rawError =\n rule.context.errorMessage ||\n rule.errorMessage ||\n context.translateRule?.({ rule, context, attributes }) ||\n rule.defaultErrorMessage!;\n\n // Fallback interpolation: replace :placeholder patterns from attributes\n // This kicks in when translateRule is absent or returns \"\" (not configured)\n const error = rawError.replace(/:([a-zA-Z_]+)/g, (match, key) =>\n key in attributes ? String(attributes[key as keyof typeof attributes]) : match,\n );\n\n return {\n isValid: false,\n error,\n input: attributes.input, // use resolved input, not raw context.key (may be \"\")\n path: context.path,\n };\n};\n"],"mappings":";;;AAGA,MAAa,aAAyB,EACpC,SAAS,KACX;;;;;;;;;;;;;;;;;AAiBA,MAAa,sBAAsB,EACjC,KACA,UACA,MACA,cAMY;CACZ,MAAM,mBAAmB,cAAc,CAAC,CAAC;CAGzC,MAAM,aACJ,oBAAoB,QAAQ,sBACvB,gBACC,QAAQ,qBAAqB,WAAW,KACxC,mBAAmB,WAAW,KAC9B,YAAY,YACd;CAGN,MAAM,SAAS,KAAK,QAAQ,iBAAiB;CAC7C,IAAI,UAAU,OAAO,WAAW,UAAU,OAAO;CAEjD,IAAI,CAAC,YAAY,OAAO,OAAO,YAAY,GAAG;CAG9C,MAAM,WAAW,KAAK,QAAQ,uBAAuB;CACrD,IAAI,UAAU,OAAO,WAAW;EAAE,WAAW;EAAU;EAAS;CAAK,CAAC;CAGtE,OAAO,WAAW;EAAE,WAAW,OAAO,YAAY,GAAG;EAAG;EAAS;CAAK,CAAC;AACzE;AAGA,MAAM,mBAAmB;AAEzB,MAAa,eAAe,MAA4B,YAAuC;CAG7F,MAAM,wBAAgD;EAEpD,OAAO,QAAQ,OAAO;EACtB,GAAG,KAAK,QAAQ;CAClB;CAGA,MAAM,iBAAiB,OAAO,YAC5B,OAAO,QAAQ,qBAAqB,CAAC,CAAC,KAAK,CAAC,KAAK,cAAc,CAC7D,KACA,iBAAiB;EAAE;EAAK;EAAU;EAAM;CAAQ,CAAC,CACnD,CAAC,CACH;CACA,MAAM,QAAQ,iBAAiB;EAC7B,KAAK;EACL,UAAU,sBAAsB,SAAS;EACzC;EACA;CACF,CAAC;CAED,MAAM,aAA4C;EAChD,MAAM,QAAQ;EACd,KAAK,QAAQ;EAGb,OAAO,QAAQ,gBAAgB,eAAe,QAAQ;EAEtD,GAAG,KAAK,QAAQ;EAEhB,GAAG;EAEH;CACF;CAcA,OAAO;EACL,SAAS;EACT,QAbA,KAAK,QAAQ,gBACb,KAAK,gBACL,QAAQ,gBAAgB;GAAE;GAAM;GAAS;EAAW,CAAC,KACrD,KAAK,oBAIe,CAAC,QAAQ,mBAAmB,OAAO,QACvD,OAAO,aAAa,OAAO,WAAW,IAA+B,IAAI,KAKrE;EACJ,OAAO,WAAW;EAClB,MAAM,QAAQ;CAChB;AACF"}
package/esm/index.d.mts CHANGED
@@ -7,7 +7,7 @@ import { TypedValidationResult, ValidationResult } from "./types/result-types.mj
7
7
  import { ContextualizedMutator, Mutator, MutatorContext } from "./types/mutator-types.mjs";
8
8
  import { WhenRuleOptions } from "./types/conditional-types.mjs";
9
9
  import { ContextualizedTransformer, SimpleTransformerCallback, TransformerCallback } from "./types/data-transformer-types.mjs";
10
- import { Infer, InferInput, InferInputObjectShape, InferObjectShape, InferOutput, InferOutputObjectShape, IsInputOptionalKey, IsOptionalKey, IsOutputOptionalKey, ValidatedOutput } from "./types/inference-types.mjs";
10
+ import { Infer, InferInput, InferInputObjectShape, InferObjectShape, InferOutput, InferOutputObjectShape, InternalKeys, IsInputOptionalKey, IsOptionalKey, IsOutputOptionalKey, PartialSchema, ValidatedOutput } from "./types/inference-types.mjs";
11
11
  import { WEEK_DAYS, WeekDay } from "./types/date-types.mjs";
12
12
  import { FileSizeOption } from "./types/file.types.mjs";
13
13
  import "./types/index.mjs";
@@ -87,6 +87,7 @@ import "./validators/index.mjs";
87
87
  import { isDateValue } from "./helpers/date-helpers.mjs";
88
88
  import { humanizeSize, resolveFileSize } from "./helpers/file.utils.mjs";
89
89
  import { getFieldValue } from "./helpers/get-field-value.mjs";
90
+ import { humanizeAttribute } from "./helpers/humanize-attribute.mjs";
90
91
  import { setKeyPath } from "./helpers/path-helpers.mjs";
91
92
  import { VALID_RULE, invalidRule, resolveTranslation } from "./helpers/validation-helpers.mjs";
92
93
  import "./helpers/index.mjs";
@@ -105,7 +106,7 @@ import "./factory/index.mjs";
105
106
  import { PluginContext, SealPlugin, getInstalledPlugins, hasPlugin, registerPlugin, unregisterPlugin } from "./plugins/plugin-system.mjs";
106
107
  import { mapToStandardResult } from "./standard-schema/map-result.mjs";
107
108
  import "./standard-schema/index.mjs";
108
- export { AnyValidator, ArrayValidator, AttributeTranslation, BaseValidator, BooleanValidator, ComputedCallback, ComputedValidator, ContextualSchemaRule, ContextualizedMutator, ContextualizedTransformer, DateValidator, DiscriminatedUnionValidator, FileSizeOption, FloatValidator, Infer, InferInput, InferInputObjectShape, InferObjectShape, InferOutput, InferOutputObjectShape, InstanceOfValidator, IntValidator, IsInputOptionalKey, IsOptionalKey, IsOutputOptionalKey, JsonSchemaResult, JsonSchemaTarget, LazyValidator, LiteralValidator, ManagedCallback, ManagedValidator, Month, Mutator, MutatorContext, NumberValidator, NumericValidator, ObjectValidator, PluginContext, PrimitiveValidator, RecordValidator, RuleResult, RuleTranslation, ScalarValidator, Schema, SchemaContext, SchemaRule, SchemaRuleOptions, SealConfig, SealPlugin, SimpleTransformerCallback, StandardJSONSchemaV1, StandardSchemaV1, StringValidator, TransformerCallback, TranslateAttributeCallback, TranslateRuleCallback, TupleValidator, TypedValidationResult, UUIDVersion, UnionValidator, VALID_RULE, ValidateOptions, ValidatedOutput, ValidationAttributesList, ValidationResult, ValidatorV, WEEK_DAYS, WeekDay, WhenRuleOptions, absMutator, addDaysMutator, addHoursMutator, addMonthsMutator, addYearsMutator, afterFieldRule, afterTodayRule, ageRule, allowedValuesRule, alphaNumericRule, alphaOnlyMutator, alphaRule, alphanumericOnlyMutator, appendMutator, applyNullable, arrayRule, base64DecodeMutator, base64EncodeMutator, beforeFieldRule, beforeHourRule, beforeMinuteRule, beforeTodayRule, betweenAgeRule, betweenDatesRule, betweenDaysRule, betweenHoursRule, betweenLengthRule, betweenMinutesRule, betweenMonthsRule, betweenNumbersRule, betweenTimesRule, betweenYearsRule, birthdayRule, booleanCoerceMutator, booleanMutator, booleanRule, businessDayRule, camelCaseMutator, capitalizeMutator, ceilMutator, colorRule, configureSeal, containsRule, cuidRule, darkColorRule, dateMutator, dateRule, emailRule, endsWithRule, enumRule, equalRule, equalityConditionalMethodsApplied, equalsFieldRule, evenRule, flipArrayMutator, floatRule, floorMutator, forbiddenIfEmptyRule, forbiddenIfInRule, forbiddenIfNotEmptyRule, forbiddenIfNotInRule, forbiddenIfNotRule, forbiddenIfRule, forbiddenMethodsApplied, forbiddenRule, formBooleanMutator, fromHourRule, fromMinuteRule, fromTodayRule, futureRule, getFieldValue, getInstalledPlugins, getRuleOptions, getSealConfig, greaterThanRule, hasPlugin, hexColorRule, hslColorRule, htmlEscapeMutator, humanizeSize, inRule, instanceofRule, intRule, invalidRule, ip4Rule, ip6Rule, ipRule, isCreditCardRule, isDateValue, isIP, isIPv4, isIPv6, isNumericRule, jsonMutator, kebabCaseMutator, leapYearRule, lengthRule, lessThanRule, lightColorRule, literalRule, lowercaseMutator, ltrimMutator, mapToStandardResult, maskMutator, matchesRule, maxAgeRule, maxDateRule, maxDayRule, maxFileSizeRule, maxHeightRule, maxLengthRule, maxMonthRule, maxRule, maxWidthRule, maxWordsRule, maxYearRule, minAgeRule, minDateRule, minDayRule, minFileSizeRule, minHeightRule, minLengthRule, minMonthRule, minRule, minWidthRule, minWordsRule, minYearRule, moduloRule, monthRule, nanoidRule, negativeRule, notAllowedValuesRule, notContainsRule, notEqualsFieldRule, numberMutator, numberRule, numericMutator, objectRule, objectTrimMutator, oddRule, padEndMutator, padStartMutator, pascalCaseMutator, pastRule, patternRule, plainObjectRule, positiveRule, prependMutator, presentIfEmptyRule, presentIfInRule, presentIfNotEmptyRule, presentIfNotInRule, presentIfRule, presentMethodsApplied, presentRule, presentUnlessRule, presentWithAllRule, presentWithAnyRule, presentWithRule, presentWithoutAllRule, presentWithoutAnyRule, presentWithoutRule, quarterRule, registerPlugin, removeEmptyArrayElementsMutator, removeNumbersMutator, removeSpecialCharactersMutator, repeatMutator, replaceAllMutator, replaceMutator, requiredIfAllEmptyRule, requiredIfAllNotEmptyRule, requiredIfAnyEmptyRule, requiredIfAnyNotEmptyRule, requiredIfEmptyRule, requiredIfInRule, requiredIfNotEmptyRule, requiredIfNotInRule, requiredIfRule, requiredMethodsApplied, requiredRule, requiredUnlessRule, requiredWhenRule, requiredWithAllRule, requiredWithAnyRule, requiredWithRule, requiredWithoutAllRule, requiredWithoutAnyRule, requiredWithoutRule, resetSealConfig, resolveFileSize, resolveTranslation, reverseArrayMutator, reverseMutator, rgbColorRule, rgbaColorRule, roundMutator, roundNumberMutator, rtrimMutator, safeHtmlMutator, sameAsFieldDateRule, scalarRule, setKeyPath, slugMutator, snakeCaseMutator, sortArrayMutator, sortedArrayRule, startsWithRule, stringMutator, stringRule, stringifyMutator, stripTagsMutator, stripUnknownMutator, strongPasswordRule, titleCaseMutator, toDateOnlyMutator, toEndOfDayMutator, toEndOfMonthMutator, toEndOfYearMutator, toFixedMutator, toFormatMutator, toISOStringMutator, toStartOfDayMutator, toStartOfMonthMutator, toStartOfYearMutator, toTimeOnlyMutator, toTimestampMutator, toUTCMutator, todayRule, trimMultipleWhitespaceMutator, trimMutator, truncateMutator, ulidRule, unescapeHtmlMutator, unionRule, uniqueArrayMutator, uniqueArrayRule, unknownKeyRule, unregisterPlugin, uppercaseMutator, urlDecodeMutator, urlEncodeMutator, urlRule, uuidRule, v, validate, weekDayRule, weekdayRule, weekdaysRule, weekendRule, whenRule, withinDaysRule, withinFutureDaysRule, withinPastDaysRule, withoutWhitespaceRule, wordsRule, wrapNullableStrict, yearRule };
109
+ export { AnyValidator, ArrayValidator, AttributeTranslation, BaseValidator, BooleanValidator, ComputedCallback, ComputedValidator, ContextualSchemaRule, ContextualizedMutator, ContextualizedTransformer, DateValidator, DiscriminatedUnionValidator, FileSizeOption, FloatValidator, Infer, InferInput, InferInputObjectShape, InferObjectShape, InferOutput, InferOutputObjectShape, InstanceOfValidator, IntValidator, InternalKeys, IsInputOptionalKey, IsOptionalKey, IsOutputOptionalKey, JsonSchemaResult, JsonSchemaTarget, LazyValidator, LiteralValidator, ManagedCallback, ManagedValidator, Month, Mutator, MutatorContext, NumberValidator, NumericValidator, ObjectValidator, PartialSchema, PluginContext, PrimitiveValidator, RecordValidator, RuleResult, RuleTranslation, ScalarValidator, Schema, SchemaContext, SchemaRule, SchemaRuleOptions, SealConfig, SealPlugin, SimpleTransformerCallback, StandardJSONSchemaV1, StandardSchemaV1, StringValidator, TransformerCallback, TranslateAttributeCallback, TranslateRuleCallback, TupleValidator, TypedValidationResult, UUIDVersion, UnionValidator, VALID_RULE, ValidateOptions, ValidatedOutput, ValidationAttributesList, ValidationResult, ValidatorV, WEEK_DAYS, WeekDay, WhenRuleOptions, absMutator, addDaysMutator, addHoursMutator, addMonthsMutator, addYearsMutator, afterFieldRule, afterTodayRule, ageRule, allowedValuesRule, alphaNumericRule, alphaOnlyMutator, alphaRule, alphanumericOnlyMutator, appendMutator, applyNullable, arrayRule, base64DecodeMutator, base64EncodeMutator, beforeFieldRule, beforeHourRule, beforeMinuteRule, beforeTodayRule, betweenAgeRule, betweenDatesRule, betweenDaysRule, betweenHoursRule, betweenLengthRule, betweenMinutesRule, betweenMonthsRule, betweenNumbersRule, betweenTimesRule, betweenYearsRule, birthdayRule, booleanCoerceMutator, booleanMutator, booleanRule, businessDayRule, camelCaseMutator, capitalizeMutator, ceilMutator, colorRule, configureSeal, containsRule, cuidRule, darkColorRule, dateMutator, dateRule, emailRule, endsWithRule, enumRule, equalRule, equalityConditionalMethodsApplied, equalsFieldRule, evenRule, flipArrayMutator, floatRule, floorMutator, forbiddenIfEmptyRule, forbiddenIfInRule, forbiddenIfNotEmptyRule, forbiddenIfNotInRule, forbiddenIfNotRule, forbiddenIfRule, forbiddenMethodsApplied, forbiddenRule, formBooleanMutator, fromHourRule, fromMinuteRule, fromTodayRule, futureRule, getFieldValue, getInstalledPlugins, getRuleOptions, getSealConfig, greaterThanRule, hasPlugin, hexColorRule, hslColorRule, htmlEscapeMutator, humanizeAttribute, humanizeSize, inRule, instanceofRule, intRule, invalidRule, ip4Rule, ip6Rule, ipRule, isCreditCardRule, isDateValue, isIP, isIPv4, isIPv6, isNumericRule, jsonMutator, kebabCaseMutator, leapYearRule, lengthRule, lessThanRule, lightColorRule, literalRule, lowercaseMutator, ltrimMutator, mapToStandardResult, maskMutator, matchesRule, maxAgeRule, maxDateRule, maxDayRule, maxFileSizeRule, maxHeightRule, maxLengthRule, maxMonthRule, maxRule, maxWidthRule, maxWordsRule, maxYearRule, minAgeRule, minDateRule, minDayRule, minFileSizeRule, minHeightRule, minLengthRule, minMonthRule, minRule, minWidthRule, minWordsRule, minYearRule, moduloRule, monthRule, nanoidRule, negativeRule, notAllowedValuesRule, notContainsRule, notEqualsFieldRule, numberMutator, numberRule, numericMutator, objectRule, objectTrimMutator, oddRule, padEndMutator, padStartMutator, pascalCaseMutator, pastRule, patternRule, plainObjectRule, positiveRule, prependMutator, presentIfEmptyRule, presentIfInRule, presentIfNotEmptyRule, presentIfNotInRule, presentIfRule, presentMethodsApplied, presentRule, presentUnlessRule, presentWithAllRule, presentWithAnyRule, presentWithRule, presentWithoutAllRule, presentWithoutAnyRule, presentWithoutRule, quarterRule, registerPlugin, removeEmptyArrayElementsMutator, removeNumbersMutator, removeSpecialCharactersMutator, repeatMutator, replaceAllMutator, replaceMutator, requiredIfAllEmptyRule, requiredIfAllNotEmptyRule, requiredIfAnyEmptyRule, requiredIfAnyNotEmptyRule, requiredIfEmptyRule, requiredIfInRule, requiredIfNotEmptyRule, requiredIfNotInRule, requiredIfRule, requiredMethodsApplied, requiredRule, requiredUnlessRule, requiredWhenRule, requiredWithAllRule, requiredWithAnyRule, requiredWithRule, requiredWithoutAllRule, requiredWithoutAnyRule, requiredWithoutRule, resetSealConfig, resolveFileSize, resolveTranslation, reverseArrayMutator, reverseMutator, rgbColorRule, rgbaColorRule, roundMutator, roundNumberMutator, rtrimMutator, safeHtmlMutator, sameAsFieldDateRule, scalarRule, setKeyPath, slugMutator, snakeCaseMutator, sortArrayMutator, sortedArrayRule, startsWithRule, stringMutator, stringRule, stringifyMutator, stripTagsMutator, stripUnknownMutator, strongPasswordRule, titleCaseMutator, toDateOnlyMutator, toEndOfDayMutator, toEndOfMonthMutator, toEndOfYearMutator, toFixedMutator, toFormatMutator, toISOStringMutator, toStartOfDayMutator, toStartOfMonthMutator, toStartOfYearMutator, toTimeOnlyMutator, toTimestampMutator, toUTCMutator, todayRule, trimMultipleWhitespaceMutator, trimMutator, truncateMutator, ulidRule, unescapeHtmlMutator, unionRule, uniqueArrayMutator, uniqueArrayRule, unknownKeyRule, unregisterPlugin, uppercaseMutator, urlDecodeMutator, urlEncodeMutator, urlRule, uuidRule, v, validate, weekDayRule, weekdayRule, weekdaysRule, weekendRule, whenRule, withinDaysRule, withinFutureDaysRule, withinPastDaysRule, withoutWhitespaceRule, wordsRule, wrapNullableStrict, yearRule };
109
110
  import "./validators/methods/equality-conditional-methods.mjs";
110
111
  import "./validators/methods/forbidden-methods.mjs";
111
112
  import "./validators/methods/present-methods.mjs";
package/esm/index.mjs CHANGED
@@ -5,6 +5,7 @@ import { VALID_RULE, invalidRule, resolveTranslation } from "./helpers/validatio
5
5
  import { isDateValue } from "./helpers/date-helpers.mjs";
6
6
  import { humanizeSize, resolveFileSize } from "./helpers/file.utils.mjs";
7
7
  import { getFieldValue } from "./helpers/get-field-value.mjs";
8
+ import { humanizeAttribute } from "./helpers/humanize-attribute.mjs";
8
9
  import { setKeyPath } from "./helpers/path-helpers.mjs";
9
10
  import "./helpers/index.mjs";
10
11
  import { presentRule, requiredRule } from "./rules/core/required.mjs";
@@ -94,4 +95,4 @@ import { v } from "./factory/validators.mjs";
94
95
  import "./factory/index.mjs";
95
96
  import { getInstalledPlugins, hasPlugin, registerPlugin, unregisterPlugin } from "./plugins/plugin-system.mjs";
96
97
 
97
- export { AnyValidator, ArrayValidator, BaseValidator, BooleanValidator, ComputedValidator, DateValidator, DiscriminatedUnionValidator, FloatValidator, InstanceOfValidator, IntValidator, LazyValidator, LiteralValidator, ManagedValidator, NumberValidator, NumericValidator, ObjectValidator, PrimitiveValidator, RecordValidator, ScalarValidator, StringValidator, TupleValidator, UnionValidator, VALID_RULE, WEEK_DAYS, absMutator, addDaysMutator, addHoursMutator, addMonthsMutator, addYearsMutator, afterFieldRule, afterTodayRule, ageRule, allowedValuesRule, alphaNumericRule, alphaOnlyMutator, alphaRule, alphanumericOnlyMutator, appendMutator, applyNullable, arrayRule, base64DecodeMutator, base64EncodeMutator, beforeFieldRule, beforeHourRule, beforeMinuteRule, beforeTodayRule, betweenAgeRule, betweenDatesRule, betweenDaysRule, betweenHoursRule, betweenLengthRule, betweenMinutesRule, betweenMonthsRule, betweenNumbersRule, betweenTimesRule, betweenYearsRule, birthdayRule, booleanCoerceMutator, booleanMutator, booleanRule, businessDayRule, camelCaseMutator, capitalizeMutator, ceilMutator, colorRule, configureSeal, containsRule, cuidRule, darkColorRule, dateMutator, dateRule, emailRule, endsWithRule, enumRule, equalRule, equalityConditionalMethodsApplied, equalsFieldRule, evenRule, flipArrayMutator, floatRule, floorMutator, forbiddenIfEmptyRule, forbiddenIfInRule, forbiddenIfNotEmptyRule, forbiddenIfNotInRule, forbiddenIfNotRule, forbiddenIfRule, forbiddenMethodsApplied, forbiddenRule, formBooleanMutator, fromHourRule, fromMinuteRule, fromTodayRule, futureRule, getFieldValue, getInstalledPlugins, getRuleOptions, getSealConfig, greaterThanRule, hasPlugin, hexColorRule, hslColorRule, htmlEscapeMutator, humanizeSize, inRule, instanceofRule, intRule, invalidRule, ip4Rule, ip6Rule, ipRule, isCreditCardRule, isDateValue, isIP, isIPv4, isIPv6, isNumericRule, jsonMutator, kebabCaseMutator, leapYearRule, lengthRule, lessThanRule, lightColorRule, literalRule, lowercaseMutator, ltrimMutator, mapToStandardResult, maskMutator, matchesRule, maxAgeRule, maxDateRule, maxDayRule, maxFileSizeRule, maxHeightRule, maxLengthRule, maxMonthRule, maxRule, maxWidthRule, maxWordsRule, maxYearRule, minAgeRule, minDateRule, minDayRule, minFileSizeRule, minHeightRule, minLengthRule, minMonthRule, minRule, minWidthRule, minWordsRule, minYearRule, moduloRule, monthRule, nanoidRule, negativeRule, notAllowedValuesRule, notContainsRule, notEqualsFieldRule, numberMutator, numberRule, numericMutator, objectRule, objectTrimMutator, oddRule, padEndMutator, padStartMutator, pascalCaseMutator, pastRule, patternRule, plainObjectRule, positiveRule, prependMutator, presentIfEmptyRule, presentIfInRule, presentIfNotEmptyRule, presentIfNotInRule, presentIfRule, presentMethodsApplied, presentRule, presentUnlessRule, presentWithAllRule, presentWithAnyRule, presentWithRule, presentWithoutAllRule, presentWithoutAnyRule, presentWithoutRule, quarterRule, registerPlugin, removeEmptyArrayElementsMutator, removeNumbersMutator, removeSpecialCharactersMutator, repeatMutator, replaceAllMutator, replaceMutator, requiredIfAllEmptyRule, requiredIfAllNotEmptyRule, requiredIfAnyEmptyRule, requiredIfAnyNotEmptyRule, requiredIfEmptyRule, requiredIfInRule, requiredIfNotEmptyRule, requiredIfNotInRule, requiredIfRule, requiredMethodsApplied, requiredRule, requiredUnlessRule, requiredWhenRule, requiredWithAllRule, requiredWithAnyRule, requiredWithRule, requiredWithoutAllRule, requiredWithoutAnyRule, requiredWithoutRule, resetSealConfig, resolveFileSize, resolveTranslation, reverseArrayMutator, reverseMutator, rgbColorRule, rgbaColorRule, roundMutator, roundNumberMutator, rtrimMutator, safeHtmlMutator, sameAsFieldDateRule, scalarRule, setKeyPath, slugMutator, snakeCaseMutator, sortArrayMutator, sortedArrayRule, startsWithRule, stringMutator, stringRule, stringifyMutator, stripTagsMutator, stripUnknownMutator, strongPasswordRule, titleCaseMutator, toDateOnlyMutator, toEndOfDayMutator, toEndOfMonthMutator, toEndOfYearMutator, toFixedMutator, toFormatMutator, toISOStringMutator, toStartOfDayMutator, toStartOfMonthMutator, toStartOfYearMutator, toTimeOnlyMutator, toTimestampMutator, toUTCMutator, todayRule, trimMultipleWhitespaceMutator, trimMutator, truncateMutator, ulidRule, unescapeHtmlMutator, unionRule, uniqueArrayMutator, uniqueArrayRule, unknownKeyRule, unregisterPlugin, uppercaseMutator, urlDecodeMutator, urlEncodeMutator, urlRule, uuidRule, v, validate, weekDayRule, weekdayRule, weekdaysRule, weekendRule, whenRule, withinDaysRule, withinFutureDaysRule, withinPastDaysRule, withoutWhitespaceRule, wordsRule, wrapNullableStrict, yearRule };
98
+ export { AnyValidator, ArrayValidator, BaseValidator, BooleanValidator, ComputedValidator, DateValidator, DiscriminatedUnionValidator, FloatValidator, InstanceOfValidator, IntValidator, LazyValidator, LiteralValidator, ManagedValidator, NumberValidator, NumericValidator, ObjectValidator, PrimitiveValidator, RecordValidator, ScalarValidator, StringValidator, TupleValidator, UnionValidator, VALID_RULE, WEEK_DAYS, absMutator, addDaysMutator, addHoursMutator, addMonthsMutator, addYearsMutator, afterFieldRule, afterTodayRule, ageRule, allowedValuesRule, alphaNumericRule, alphaOnlyMutator, alphaRule, alphanumericOnlyMutator, appendMutator, applyNullable, arrayRule, base64DecodeMutator, base64EncodeMutator, beforeFieldRule, beforeHourRule, beforeMinuteRule, beforeTodayRule, betweenAgeRule, betweenDatesRule, betweenDaysRule, betweenHoursRule, betweenLengthRule, betweenMinutesRule, betweenMonthsRule, betweenNumbersRule, betweenTimesRule, betweenYearsRule, birthdayRule, booleanCoerceMutator, booleanMutator, booleanRule, businessDayRule, camelCaseMutator, capitalizeMutator, ceilMutator, colorRule, configureSeal, containsRule, cuidRule, darkColorRule, dateMutator, dateRule, emailRule, endsWithRule, enumRule, equalRule, equalityConditionalMethodsApplied, equalsFieldRule, evenRule, flipArrayMutator, floatRule, floorMutator, forbiddenIfEmptyRule, forbiddenIfInRule, forbiddenIfNotEmptyRule, forbiddenIfNotInRule, forbiddenIfNotRule, forbiddenIfRule, forbiddenMethodsApplied, forbiddenRule, formBooleanMutator, fromHourRule, fromMinuteRule, fromTodayRule, futureRule, getFieldValue, getInstalledPlugins, getRuleOptions, getSealConfig, greaterThanRule, hasPlugin, hexColorRule, hslColorRule, htmlEscapeMutator, humanizeAttribute, humanizeSize, inRule, instanceofRule, intRule, invalidRule, ip4Rule, ip6Rule, ipRule, isCreditCardRule, isDateValue, isIP, isIPv4, isIPv6, isNumericRule, jsonMutator, kebabCaseMutator, leapYearRule, lengthRule, lessThanRule, lightColorRule, literalRule, lowercaseMutator, ltrimMutator, mapToStandardResult, maskMutator, matchesRule, maxAgeRule, maxDateRule, maxDayRule, maxFileSizeRule, maxHeightRule, maxLengthRule, maxMonthRule, maxRule, maxWidthRule, maxWordsRule, maxYearRule, minAgeRule, minDateRule, minDayRule, minFileSizeRule, minHeightRule, minLengthRule, minMonthRule, minRule, minWidthRule, minWordsRule, minYearRule, moduloRule, monthRule, nanoidRule, negativeRule, notAllowedValuesRule, notContainsRule, notEqualsFieldRule, numberMutator, numberRule, numericMutator, objectRule, objectTrimMutator, oddRule, padEndMutator, padStartMutator, pascalCaseMutator, pastRule, patternRule, plainObjectRule, positiveRule, prependMutator, presentIfEmptyRule, presentIfInRule, presentIfNotEmptyRule, presentIfNotInRule, presentIfRule, presentMethodsApplied, presentRule, presentUnlessRule, presentWithAllRule, presentWithAnyRule, presentWithRule, presentWithoutAllRule, presentWithoutAnyRule, presentWithoutRule, quarterRule, registerPlugin, removeEmptyArrayElementsMutator, removeNumbersMutator, removeSpecialCharactersMutator, repeatMutator, replaceAllMutator, replaceMutator, requiredIfAllEmptyRule, requiredIfAllNotEmptyRule, requiredIfAnyEmptyRule, requiredIfAnyNotEmptyRule, requiredIfEmptyRule, requiredIfInRule, requiredIfNotEmptyRule, requiredIfNotInRule, requiredIfRule, requiredMethodsApplied, requiredRule, requiredUnlessRule, requiredWhenRule, requiredWithAllRule, requiredWithAnyRule, requiredWithRule, requiredWithoutAllRule, requiredWithoutAnyRule, requiredWithoutRule, resetSealConfig, resolveFileSize, resolveTranslation, reverseArrayMutator, reverseMutator, rgbColorRule, rgbaColorRule, roundMutator, roundNumberMutator, rtrimMutator, safeHtmlMutator, sameAsFieldDateRule, scalarRule, setKeyPath, slugMutator, snakeCaseMutator, sortArrayMutator, sortedArrayRule, startsWithRule, stringMutator, stringRule, stringifyMutator, stripTagsMutator, stripUnknownMutator, strongPasswordRule, titleCaseMutator, toDateOnlyMutator, toEndOfDayMutator, toEndOfMonthMutator, toEndOfYearMutator, toFixedMutator, toFormatMutator, toISOStringMutator, toStartOfDayMutator, toStartOfMonthMutator, toStartOfYearMutator, toTimeOnlyMutator, toTimestampMutator, toUTCMutator, todayRule, trimMultipleWhitespaceMutator, trimMutator, truncateMutator, ulidRule, unescapeHtmlMutator, unionRule, uniqueArrayMutator, uniqueArrayRule, unknownKeyRule, unregisterPlugin, uppercaseMutator, urlDecodeMutator, urlEncodeMutator, urlRule, uuidRule, v, validate, weekDayRule, weekdayRule, weekdaysRule, weekendRule, whenRule, withinDaysRule, withinFutureDaysRule, withinPastDaysRule, withoutWhitespaceRule, wordsRule, wrapNullableStrict, yearRule };
@@ -31,7 +31,13 @@ export declare function applyNullable(schema: JsonSchemaResult, target: JsonSche
31
31
  *
32
32
  * OpenAI strict requires optional fields to be expressed as a nullable type
33
33
  * rather than being omitted from the `required` array. This helper wraps a
34
- * given schema into its nullable equivalent using the type-array form.
34
+ * given schema into its nullable equivalent, whatever its shape:
35
+ *
36
+ * - `type` : the type becomes an array with `"null"`
37
+ * - `enum` : `null` is added to the enum (and to `type` when present)
38
+ * - `const` : becomes `anyOf: [{ const }, { type: "null" }]`
39
+ * - `anyOf` / `oneOf` : a `{ type: "null" }` branch is appended once
40
+ * - `allOf` / `$ref` : wrapped in `anyOf` with a null branch
35
41
  *
36
42
  * Unlike `applyNullable()` (which mutates in-place), this returns a new
37
43
  * schema object to avoid side effects when wrapping child schemas.
@@ -41,8 +47,11 @@ export declare function applyNullable(schema: JsonSchemaResult, target: JsonSche
41
47
  * wrapNullableStrict({ type: "string", minLength: 3 })
42
48
  * // → { type: ["string", "null"], minLength: 3 }
43
49
  *
44
- * wrapNullableStrict({ type: "object", properties: {...} })
45
- * // → { type: ["object", "null"], properties: {...} }
50
+ * wrapNullableStrict({ enum: ["left", "right"] })
51
+ * // → { enum: ["left", "right", null] }
52
+ *
53
+ * wrapNullableStrict({ const: "items" })
54
+ * // → { anyOf: [{ const: "items" }, { type: "null" }] }
46
55
  *
47
56
  * wrapNullableStrict({ oneOf: [...] })
48
57
  * // → { oneOf: [..., { type: "null" }] }
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/standard-schema/json-schema.ts"],"mappings":";;;;;YAKY,mBAAmB,qBAAqB;;;;YAKxC,mBAAmB;;;;;;;;;;;;;;;;;;wBAmBf,cAAc,QAAQ,kBAAkB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;wBA0ChD,mBAAmB,QAAQ,mBAAmB;;;;;wBA2B9C,eACd,OAAO;EAAQ;EAAc;IAAW,SAAS;;IACjD,mBACC"}
1
+ {"version":3,"file":"json-schema.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/standard-schema/json-schema.ts"],"mappings":";;;;;YAKY,mBAAmB,qBAAqB;;;;YAKxC,mBAAmB;;;;;;;;;;;;;;;;;;wBAmBf,cAAc,QAAQ,kBAAkB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAsEhD,mBAAmB,QAAQ,mBAAmB;;;;;wBAoE9C,eACd,OAAO;EAAQ;EAAc;IAAW,SAAS;;IACjD,mBACC"}
@@ -19,23 +19,35 @@
19
19
  function applyNullable(schema, target) {
20
20
  if (target === "openapi-3.0") {
21
21
  schema.nullable = true;
22
+ if (Array.isArray(schema.enum) && !schema.enum.includes(null)) schema.enum = [...schema.enum, null];
22
23
  return;
23
24
  }
24
25
  if (target === "draft-2020-12" || target === "openai-strict") {
25
- const baseType = schema.type;
26
- schema.type = Array.isArray(baseType) ? [...baseType, "null"] : [baseType, "null"];
26
+ const wrapped = wrapNullableStrict(schema);
27
+ for (const key of Object.keys(schema)) delete schema[key];
28
+ Object.assign(schema, wrapped);
27
29
  return;
28
30
  }
29
31
  const copy = { ...schema };
30
32
  for (const key of Object.keys(schema)) delete schema[key];
31
33
  schema.oneOf = [copy, { type: "null" }];
32
34
  }
35
+ const NULL_BRANCH = { type: "null" };
36
+ function hasNullBranch(branches) {
37
+ return branches.some((branch) => typeof branch === "object" && branch !== null && branch.type === "null");
38
+ }
33
39
  /**
34
40
  * Wrap a field schema as nullable for OpenAI strict mode.
35
41
  *
36
42
  * OpenAI strict requires optional fields to be expressed as a nullable type
37
43
  * rather than being omitted from the `required` array. This helper wraps a
38
- * given schema into its nullable equivalent using the type-array form.
44
+ * given schema into its nullable equivalent, whatever its shape:
45
+ *
46
+ * - `type` : the type becomes an array with `"null"`
47
+ * - `enum` : `null` is added to the enum (and to `type` when present)
48
+ * - `const` : becomes `anyOf: [{ const }, { type: "null" }]`
49
+ * - `anyOf` / `oneOf` : a `{ type: "null" }` branch is appended once
50
+ * - `allOf` / `$ref` : wrapped in `anyOf` with a null branch
39
51
  *
40
52
  * Unlike `applyNullable()` (which mutates in-place), this returns a new
41
53
  * schema object to avoid side effects when wrapping child schemas.
@@ -45,27 +57,65 @@ function applyNullable(schema, target) {
45
57
  * wrapNullableStrict({ type: "string", minLength: 3 })
46
58
  * // → { type: ["string", "null"], minLength: 3 }
47
59
  *
48
- * wrapNullableStrict({ type: "object", properties: {...} })
49
- * // → { type: ["object", "null"], properties: {...} }
60
+ * wrapNullableStrict({ enum: ["left", "right"] })
61
+ * // → { enum: ["left", "right", null] }
62
+ *
63
+ * wrapNullableStrict({ const: "items" })
64
+ * // → { anyOf: [{ const: "items" }, { type: "null" }] }
50
65
  *
51
66
  * wrapNullableStrict({ oneOf: [...] })
52
67
  * // → { oneOf: [..., { type: "null" }] }
53
68
  * ```
54
69
  */
55
70
  function wrapNullableStrict(schema) {
56
- if (schema.oneOf) return {
57
- ...schema,
58
- oneOf: [...schema.oneOf, { type: "null" }]
59
- };
60
- if (schema.anyOf) return {
61
- ...schema,
62
- anyOf: [...schema.anyOf, { type: "null" }]
63
- };
64
- if (schema.type === void 0) return schema;
71
+ for (const key of ["oneOf", "anyOf"]) {
72
+ const branches = schema[key];
73
+ if (Array.isArray(branches)) {
74
+ if (hasNullBranch(branches)) return schema;
75
+ return {
76
+ ...schema,
77
+ [key]: [...branches, { ...NULL_BRANCH }]
78
+ };
79
+ }
80
+ }
81
+ if (Object.keys(schema).length === 0) return schema;
82
+ if (Array.isArray(schema.enum)) {
83
+ const output = {
84
+ ...schema,
85
+ enum: schema.enum.includes(null) ? schema.enum : [...schema.enum, null]
86
+ };
87
+ if (schema.type !== void 0) {
88
+ const baseType = schema.type;
89
+ const types = Array.isArray(baseType) ? baseType : [baseType];
90
+ output.type = types.includes("null") ? types : [...types, "null"];
91
+ }
92
+ return output;
93
+ }
94
+ if (schema.const !== void 0) {
95
+ if (schema.const === null) return schema;
96
+ const { const: constant, type, ...rest } = schema;
97
+ const branch = type === void 0 ? { const: constant } : {
98
+ const: constant,
99
+ type
100
+ };
101
+ return {
102
+ ...rest,
103
+ anyOf: [branch, { ...NULL_BRANCH }]
104
+ };
105
+ }
106
+ if (schema.type === void 0) {
107
+ const { description, title, default: defaultValue, ...inner } = schema;
108
+ const output = { anyOf: [inner, { ...NULL_BRANCH }] };
109
+ if (description !== void 0) output.description = description;
110
+ if (title !== void 0) output.title = title;
111
+ if (defaultValue !== void 0) output.default = defaultValue;
112
+ return output;
113
+ }
65
114
  const baseType = schema.type;
115
+ const types = Array.isArray(baseType) ? baseType : [baseType];
66
116
  return {
67
117
  ...schema,
68
- type: Array.isArray(baseType) ? [...baseType, "null"] : [baseType, "null"]
118
+ type: types.includes("null") ? types : [...types, "null"]
69
119
  };
70
120
  }
71
121
  /**