@vielzeug/spell 26.10.0 → 26.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,7 +31,7 @@ if (result.success) {
31
31
  const user: User = result.data;
32
32
  console.log(user.id); // 42
33
33
 
34
- // Assertion form — narrows type, throws SpellValidationError on failure
34
+ // Assertion form: narrows type, throws SpellValidationError on failure
35
35
  UserSchema.assert(result.data, 'user');
36
36
  } else {
37
37
  const { fieldErrors, formErrors } = result.error.flattenFirst();
@@ -49,4 +49,4 @@ if (result.success) {
49
49
 
50
50
  ## License
51
51
 
52
- MIT © [Helmuth Saatkamp](https://github.com/helmuthdu) — part of the [Vielzeug](https://github.com/helmuthdu/vielzeug) monorepo.
52
+ MIT © [Helmuth Saatkamp](https://github.com/helmuthdu): part of the [Vielzeug](https://github.com/helmuthdu/vielzeug) monorepo.
package/dist/_dev.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal — Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
1
+ {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
package/dist/_dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal — Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
1
+ {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
@@ -1 +1 @@
1
- {"version":3,"file":"formats.cjs","names":[],"sources":["../src/formats.ts"],"sourcesContent":["/**\n * Pure string format validators.\n *\n * All functions take a `string` and return `boolean`. They are exported as part of the\n * public API so callers can use them independently of any Schema.\n *\n * ```ts\n * import { isEmail, isUuid } from '@vielzeug/spell/predicates';\n * isEmail('foo@bar.com'); // true\n * ```\n */\n\nexport function isEmail(v: string): boolean {\n return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(v);\n}\n\nconst _DEFAULT_URL_PROTOCOLS = new Set(['http', 'https']);\n\nexport function isUrl(v: string, protocols?: readonly string[]): boolean {\n try {\n const parsed = new URL(v);\n const allowed = protocols ? new Set(protocols.map((p) => p.toLowerCase())) : _DEFAULT_URL_PROTOCOLS;\n\n return allowed.has(parsed.protocol.replace(':', '').toLowerCase());\n } catch {\n return false;\n }\n}\n\nexport function isUuid(v: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v);\n}\n\nexport function isIsoDate(v: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false;\n\n const d = new Date(v);\n\n return !Number.isNaN(d.getTime()) && d.toISOString().startsWith(v);\n}\n\nexport function isIsoDateTime(v: string): boolean {\n return (\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:\\d{2})?$/.test(v) &&\n !Number.isNaN(new Date(v).getTime())\n );\n}\n\nexport function isIp(v: string): boolean {\n // IPv4\n if (/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(v)) {\n return v.split('.').every((o) => {\n const n = parseInt(o, 10);\n\n return n >= 0 && n <= 255;\n });\n }\n\n // IPv6 — rely on URL parser\n try {\n new URL(`http://[${v}]/`);\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isCuid(v: string): boolean {\n return /^c[a-z0-9]{8,}$/.test(v);\n}\n\nexport function isCuid2(v: string): boolean {\n return /^[a-z][a-z0-9]{23}$/.test(v);\n}\n\nexport function isUlid(v: string): boolean {\n return /^[0-7][0-9A-HJKMNP-TV-Z]{25}$/.test(v);\n}\n\n/**\n * Validates a NanoID string. The default NanoID length is 21 characters; pass a\n * custom length to validate IDs generated with non-default sizes.\n */\nexport function isNanoid(v: string, length = 21): boolean {\n return v.length === length && /^[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isBase64(v: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(v);\n}\n\n/**\n * Validates a base64url-encoded string (RFC 4648 §5). Accepts unpadded and padded forms.\n * A string whose length % 4 === 1 is never valid base64url.\n */\nexport function isBase64url(v: string): boolean {\n if (v.length === 0 || v.length % 4 === 1) return false;\n\n return /^[A-Za-z0-9_-]*={0,2}$/.test(v);\n}\n\nexport function isHex(v: string): boolean {\n return /^[A-Fa-f0-9]+$/.test(v);\n}\n\nexport function isHexColor(v: string): boolean {\n return /^#(?:[A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(v);\n}\n\nexport function isEmoji(v: string): boolean {\n return /^\\p{Extended_Pictographic}+$/u.test(v);\n}\n\nexport function isJwt(v: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isTime(v: string): boolean {\n return /^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$/.test(v);\n}\n\nexport function isDuration(v: string): boolean {\n return /^P(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+(?:\\.\\d+)?S)?)?$/.test(v);\n}\n\nexport function isSemver(v: string): boolean {\n return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/.test(\n v,\n );\n}\n\nexport function isSlug(v: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(v);\n}\n\nexport function isNumeric(v: string): boolean {\n return /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?$/i.test(v);\n}\n"],"mappings":"AAYA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,IAAM,EAAyB,IAAI,IAAI,CAAC,OAAQ,OAAO,CAAC,EAExD,SAAgB,EAAM,EAAW,EAAwC,CACvE,GAAI,CACF,IAAM,EAAS,IAAI,IAAI,CAAC,EAGxB,OAFgB,EAAY,IAAI,IAAI,EAAU,IAAK,GAAM,EAAE,YAAY,CAAC,CAAC,EAAI,EAAA,CAE9D,IAAI,EAAO,SAAS,QAAQ,IAAK,EAAE,CAAC,CAAC,YAAY,CAAC,CACnE,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kEAAkE,KAAK,CAAC,CACjF,CAEA,SAAgB,EAAU,EAAoB,CAC5C,GAAI,CAAC,sBAAsB,KAAK,CAAC,EAAG,MAAO,GAE3C,IAAM,EAAI,IAAI,KAAK,CAAC,EAEpB,MAAO,CAAC,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAK,EAAE,YAAY,CAAC,CAAC,WAAW,CAAC,CACnE,CAEA,SAAgB,EAAc,EAAoB,CAChD,MACE,6EAA6E,KAAK,CAAC,GACnF,CAAC,OAAO,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAEvC,CAEA,SAAgB,EAAK,EAAoB,CAEvC,GAAI,0BAA0B,KAAK,CAAC,EAClC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,MAAO,GAAM,CAC/B,IAAM,EAAI,SAAS,EAAG,EAAE,EAExB,OAAO,GAAK,GAAK,GAAK,GACxB,CAAC,EAIH,GAAI,CAGF,OAFA,IAAI,IAAI,WAAW,EAAE,GAAG,EAEjB,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kBAAkB,KAAK,CAAC,CACjC,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,sBAAsB,KAAK,CAAC,CACrC,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAMA,SAAgB,EAAS,EAAW,EAAS,GAAa,CACxD,OAAO,EAAE,SAAW,GAAU,mBAAmB,KAAK,CAAC,CACzD,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,mFAAmF,KAAK,CAAC,CAClG,CAMA,SAAgB,EAAY,EAAoB,CAG9C,OAFI,EAAE,SAAW,GAAK,EAAE,OAAS,GAAM,EAAU,GAE1C,yBAAyB,KAAK,CAAC,CACxC,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,iBAAiB,KAAK,CAAC,CAChC,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,sDAAsD,KAAK,CAAC,CACrE,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,2CAA2C,KAAK,CAAC,CAC1D,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,+EAA+E,KAAK,CAAC,CAC9F,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,sLAAsL,KAC3L,CACF,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,6BAA6B,KAAK,CAAC,CAC5C,CAEA,SAAgB,EAAU,EAAoB,CAC5C,MAAO,4CAA4C,KAAK,CAAC,CAC3D"}
1
+ {"version":3,"file":"formats.cjs","names":[],"sources":["../src/formats.ts"],"sourcesContent":["/**\n * Pure string format validators.\n *\n * All functions take a `string` and return `boolean`. They are exported as part of the\n * public API so callers can use them independently of any Schema.\n *\n * ```ts\n * import { isEmail, isUuid } from '@vielzeug/spell/predicates';\n * isEmail('foo@bar.com'); // true\n * ```\n */\n\nexport function isEmail(v: string): boolean {\n return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(v);\n}\n\nconst _DEFAULT_URL_PROTOCOLS = new Set(['http', 'https']);\n\nexport function isUrl(v: string, protocols?: readonly string[]): boolean {\n try {\n const parsed = new URL(v);\n const allowed = protocols ? new Set(protocols.map((p) => p.toLowerCase())) : _DEFAULT_URL_PROTOCOLS;\n\n return allowed.has(parsed.protocol.replace(':', '').toLowerCase());\n } catch {\n return false;\n }\n}\n\nexport function isUuid(v: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v);\n}\n\nexport function isIsoDate(v: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false;\n\n const d = new Date(v);\n\n return !Number.isNaN(d.getTime()) && d.toISOString().startsWith(v);\n}\n\nexport function isIsoDateTime(v: string): boolean {\n return (\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:\\d{2})?$/.test(v) &&\n !Number.isNaN(new Date(v).getTime())\n );\n}\n\nexport function isIp(v: string): boolean {\n // IPv4\n if (/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(v)) {\n return v.split('.').every((o) => {\n const n = parseInt(o, 10);\n\n return n >= 0 && n <= 255;\n });\n }\n\n // IPv6: rely on URL parser\n try {\n new URL(`http://[${v}]/`);\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isCuid(v: string): boolean {\n return /^c[a-z0-9]{8,}$/.test(v);\n}\n\nexport function isCuid2(v: string): boolean {\n return /^[a-z][a-z0-9]{23}$/.test(v);\n}\n\nexport function isUlid(v: string): boolean {\n return /^[0-7][0-9A-HJKMNP-TV-Z]{25}$/.test(v);\n}\n\n/**\n * Validates a NanoID string. The default NanoID length is 21 characters; pass a\n * custom length to validate IDs generated with non-default sizes.\n */\nexport function isNanoid(v: string, length = 21): boolean {\n return v.length === length && /^[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isBase64(v: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(v);\n}\n\n/**\n * Validates a base64url-encoded string (RFC 4648 §5). Accepts unpadded and padded forms.\n * A string whose length % 4 === 1 is never valid base64url.\n */\nexport function isBase64url(v: string): boolean {\n if (v.length === 0 || v.length % 4 === 1) return false;\n\n return /^[A-Za-z0-9_-]*={0,2}$/.test(v);\n}\n\nexport function isHex(v: string): boolean {\n return /^[A-Fa-f0-9]+$/.test(v);\n}\n\nexport function isHexColor(v: string): boolean {\n return /^#(?:[A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(v);\n}\n\nexport function isEmoji(v: string): boolean {\n return /^\\p{Extended_Pictographic}+$/u.test(v);\n}\n\nexport function isJwt(v: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isTime(v: string): boolean {\n return /^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$/.test(v);\n}\n\nexport function isDuration(v: string): boolean {\n return /^P(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+(?:\\.\\d+)?S)?)?$/.test(v);\n}\n\nexport function isSemver(v: string): boolean {\n return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/.test(\n v,\n );\n}\n\nexport function isSlug(v: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(v);\n}\n\nexport function isNumeric(v: string): boolean {\n return /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?$/i.test(v);\n}\n"],"mappings":"AAYA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,IAAM,EAAyB,IAAI,IAAI,CAAC,OAAQ,OAAO,CAAC,EAExD,SAAgB,EAAM,EAAW,EAAwC,CACvE,GAAI,CACF,IAAM,EAAS,IAAI,IAAI,CAAC,EAGxB,OAFgB,EAAY,IAAI,IAAI,EAAU,IAAK,GAAM,EAAE,YAAY,CAAC,CAAC,EAAI,EAAA,CAE9D,IAAI,EAAO,SAAS,QAAQ,IAAK,EAAE,CAAC,CAAC,YAAY,CAAC,CACnE,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kEAAkE,KAAK,CAAC,CACjF,CAEA,SAAgB,EAAU,EAAoB,CAC5C,GAAI,CAAC,sBAAsB,KAAK,CAAC,EAAG,MAAO,GAE3C,IAAM,EAAI,IAAI,KAAK,CAAC,EAEpB,MAAO,CAAC,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAK,EAAE,YAAY,CAAC,CAAC,WAAW,CAAC,CACnE,CAEA,SAAgB,EAAc,EAAoB,CAChD,MACE,6EAA6E,KAAK,CAAC,GACnF,CAAC,OAAO,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAEvC,CAEA,SAAgB,EAAK,EAAoB,CAEvC,GAAI,0BAA0B,KAAK,CAAC,EAClC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,MAAO,GAAM,CAC/B,IAAM,EAAI,SAAS,EAAG,EAAE,EAExB,OAAO,GAAK,GAAK,GAAK,GACxB,CAAC,EAIH,GAAI,CAGF,OAFA,IAAI,IAAI,WAAW,EAAE,GAAG,EAEjB,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kBAAkB,KAAK,CAAC,CACjC,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,sBAAsB,KAAK,CAAC,CACrC,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAMA,SAAgB,EAAS,EAAW,EAAS,GAAa,CACxD,OAAO,EAAE,SAAW,GAAU,mBAAmB,KAAK,CAAC,CACzD,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,mFAAmF,KAAK,CAAC,CAClG,CAMA,SAAgB,EAAY,EAAoB,CAG9C,OAFI,EAAE,SAAW,GAAK,EAAE,OAAS,GAAM,EAAU,GAE1C,yBAAyB,KAAK,CAAC,CACxC,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,iBAAiB,KAAK,CAAC,CAChC,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,sDAAsD,KAAK,CAAC,CACrE,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,2CAA2C,KAAK,CAAC,CAC1D,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,+EAA+E,KAAK,CAAC,CAC9F,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,sLAAsL,KAC3L,CACF,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,6BAA6B,KAAK,CAAC,CAC5C,CAEA,SAAgB,EAAU,EAAoB,CAC5C,MAAO,4CAA4C,KAAK,CAAC,CAC3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"formats.js","names":[],"sources":["../src/formats.ts"],"sourcesContent":["/**\n * Pure string format validators.\n *\n * All functions take a `string` and return `boolean`. They are exported as part of the\n * public API so callers can use them independently of any Schema.\n *\n * ```ts\n * import { isEmail, isUuid } from '@vielzeug/spell/predicates';\n * isEmail('foo@bar.com'); // true\n * ```\n */\n\nexport function isEmail(v: string): boolean {\n return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(v);\n}\n\nconst _DEFAULT_URL_PROTOCOLS = new Set(['http', 'https']);\n\nexport function isUrl(v: string, protocols?: readonly string[]): boolean {\n try {\n const parsed = new URL(v);\n const allowed = protocols ? new Set(protocols.map((p) => p.toLowerCase())) : _DEFAULT_URL_PROTOCOLS;\n\n return allowed.has(parsed.protocol.replace(':', '').toLowerCase());\n } catch {\n return false;\n }\n}\n\nexport function isUuid(v: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v);\n}\n\nexport function isIsoDate(v: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false;\n\n const d = new Date(v);\n\n return !Number.isNaN(d.getTime()) && d.toISOString().startsWith(v);\n}\n\nexport function isIsoDateTime(v: string): boolean {\n return (\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:\\d{2})?$/.test(v) &&\n !Number.isNaN(new Date(v).getTime())\n );\n}\n\nexport function isIp(v: string): boolean {\n // IPv4\n if (/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(v)) {\n return v.split('.').every((o) => {\n const n = parseInt(o, 10);\n\n return n >= 0 && n <= 255;\n });\n }\n\n // IPv6 — rely on URL parser\n try {\n new URL(`http://[${v}]/`);\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isCuid(v: string): boolean {\n return /^c[a-z0-9]{8,}$/.test(v);\n}\n\nexport function isCuid2(v: string): boolean {\n return /^[a-z][a-z0-9]{23}$/.test(v);\n}\n\nexport function isUlid(v: string): boolean {\n return /^[0-7][0-9A-HJKMNP-TV-Z]{25}$/.test(v);\n}\n\n/**\n * Validates a NanoID string. The default NanoID length is 21 characters; pass a\n * custom length to validate IDs generated with non-default sizes.\n */\nexport function isNanoid(v: string, length = 21): boolean {\n return v.length === length && /^[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isBase64(v: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(v);\n}\n\n/**\n * Validates a base64url-encoded string (RFC 4648 §5). Accepts unpadded and padded forms.\n * A string whose length % 4 === 1 is never valid base64url.\n */\nexport function isBase64url(v: string): boolean {\n if (v.length === 0 || v.length % 4 === 1) return false;\n\n return /^[A-Za-z0-9_-]*={0,2}$/.test(v);\n}\n\nexport function isHex(v: string): boolean {\n return /^[A-Fa-f0-9]+$/.test(v);\n}\n\nexport function isHexColor(v: string): boolean {\n return /^#(?:[A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(v);\n}\n\nexport function isEmoji(v: string): boolean {\n return /^\\p{Extended_Pictographic}+$/u.test(v);\n}\n\nexport function isJwt(v: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isTime(v: string): boolean {\n return /^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$/.test(v);\n}\n\nexport function isDuration(v: string): boolean {\n return /^P(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+(?:\\.\\d+)?S)?)?$/.test(v);\n}\n\nexport function isSemver(v: string): boolean {\n return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/.test(\n v,\n );\n}\n\nexport function isSlug(v: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(v);\n}\n\nexport function isNumeric(v: string): boolean {\n return /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?$/i.test(v);\n}\n"],"mappings":"AAYA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,IAAM,EAAyB,IAAI,IAAI,CAAC,OAAQ,OAAO,CAAC,EAExD,SAAgB,EAAM,EAAW,EAAwC,CACvE,GAAI,CACF,IAAM,EAAS,IAAI,IAAI,CAAC,EAGxB,OAFgB,EAAY,IAAI,IAAI,EAAU,IAAK,GAAM,EAAE,YAAY,CAAC,CAAC,EAAI,EAAA,CAE9D,IAAI,EAAO,SAAS,QAAQ,IAAK,EAAE,CAAC,CAAC,YAAY,CAAC,CACnE,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kEAAkE,KAAK,CAAC,CACjF,CAEA,SAAgB,EAAU,EAAoB,CAC5C,GAAI,CAAC,sBAAsB,KAAK,CAAC,EAAG,MAAO,GAE3C,IAAM,EAAI,IAAI,KAAK,CAAC,EAEpB,MAAO,CAAC,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAK,EAAE,YAAY,CAAC,CAAC,WAAW,CAAC,CACnE,CAEA,SAAgB,EAAc,EAAoB,CAChD,MACE,6EAA6E,KAAK,CAAC,GACnF,CAAC,OAAO,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAEvC,CAEA,SAAgB,EAAK,EAAoB,CAEvC,GAAI,0BAA0B,KAAK,CAAC,EAClC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,MAAO,GAAM,CAC/B,IAAM,EAAI,SAAS,EAAG,EAAE,EAExB,OAAO,GAAK,GAAK,GAAK,GACxB,CAAC,EAIH,GAAI,CAGF,OAFA,IAAI,IAAI,WAAW,EAAE,GAAG,EAEjB,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kBAAkB,KAAK,CAAC,CACjC,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,sBAAsB,KAAK,CAAC,CACrC,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAMA,SAAgB,EAAS,EAAW,EAAS,GAAa,CACxD,OAAO,EAAE,SAAW,GAAU,mBAAmB,KAAK,CAAC,CACzD,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,mFAAmF,KAAK,CAAC,CAClG,CAMA,SAAgB,EAAY,EAAoB,CAG9C,OAFI,EAAE,SAAW,GAAK,EAAE,OAAS,GAAM,EAAU,GAE1C,yBAAyB,KAAK,CAAC,CACxC,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,iBAAiB,KAAK,CAAC,CAChC,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,sDAAsD,KAAK,CAAC,CACrE,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,2CAA2C,KAAK,CAAC,CAC1D,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,+EAA+E,KAAK,CAAC,CAC9F,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,sLAAsL,KAC3L,CACF,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,6BAA6B,KAAK,CAAC,CAC5C,CAEA,SAAgB,EAAU,EAAoB,CAC5C,MAAO,4CAA4C,KAAK,CAAC,CAC3D"}
1
+ {"version":3,"file":"formats.js","names":[],"sources":["../src/formats.ts"],"sourcesContent":["/**\n * Pure string format validators.\n *\n * All functions take a `string` and return `boolean`. They are exported as part of the\n * public API so callers can use them independently of any Schema.\n *\n * ```ts\n * import { isEmail, isUuid } from '@vielzeug/spell/predicates';\n * isEmail('foo@bar.com'); // true\n * ```\n */\n\nexport function isEmail(v: string): boolean {\n return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(v);\n}\n\nconst _DEFAULT_URL_PROTOCOLS = new Set(['http', 'https']);\n\nexport function isUrl(v: string, protocols?: readonly string[]): boolean {\n try {\n const parsed = new URL(v);\n const allowed = protocols ? new Set(protocols.map((p) => p.toLowerCase())) : _DEFAULT_URL_PROTOCOLS;\n\n return allowed.has(parsed.protocol.replace(':', '').toLowerCase());\n } catch {\n return false;\n }\n}\n\nexport function isUuid(v: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v);\n}\n\nexport function isIsoDate(v: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false;\n\n const d = new Date(v);\n\n return !Number.isNaN(d.getTime()) && d.toISOString().startsWith(v);\n}\n\nexport function isIsoDateTime(v: string): boolean {\n return (\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:\\d{2})?$/.test(v) &&\n !Number.isNaN(new Date(v).getTime())\n );\n}\n\nexport function isIp(v: string): boolean {\n // IPv4\n if (/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(v)) {\n return v.split('.').every((o) => {\n const n = parseInt(o, 10);\n\n return n >= 0 && n <= 255;\n });\n }\n\n // IPv6: rely on URL parser\n try {\n new URL(`http://[${v}]/`);\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isCuid(v: string): boolean {\n return /^c[a-z0-9]{8,}$/.test(v);\n}\n\nexport function isCuid2(v: string): boolean {\n return /^[a-z][a-z0-9]{23}$/.test(v);\n}\n\nexport function isUlid(v: string): boolean {\n return /^[0-7][0-9A-HJKMNP-TV-Z]{25}$/.test(v);\n}\n\n/**\n * Validates a NanoID string. The default NanoID length is 21 characters; pass a\n * custom length to validate IDs generated with non-default sizes.\n */\nexport function isNanoid(v: string, length = 21): boolean {\n return v.length === length && /^[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isBase64(v: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(v);\n}\n\n/**\n * Validates a base64url-encoded string (RFC 4648 §5). Accepts unpadded and padded forms.\n * A string whose length % 4 === 1 is never valid base64url.\n */\nexport function isBase64url(v: string): boolean {\n if (v.length === 0 || v.length % 4 === 1) return false;\n\n return /^[A-Za-z0-9_-]*={0,2}$/.test(v);\n}\n\nexport function isHex(v: string): boolean {\n return /^[A-Fa-f0-9]+$/.test(v);\n}\n\nexport function isHexColor(v: string): boolean {\n return /^#(?:[A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(v);\n}\n\nexport function isEmoji(v: string): boolean {\n return /^\\p{Extended_Pictographic}+$/u.test(v);\n}\n\nexport function isJwt(v: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isTime(v: string): boolean {\n return /^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$/.test(v);\n}\n\nexport function isDuration(v: string): boolean {\n return /^P(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+(?:\\.\\d+)?S)?)?$/.test(v);\n}\n\nexport function isSemver(v: string): boolean {\n return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/.test(\n v,\n );\n}\n\nexport function isSlug(v: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(v);\n}\n\nexport function isNumeric(v: string): boolean {\n return /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?$/i.test(v);\n}\n"],"mappings":"AAYA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,IAAM,EAAyB,IAAI,IAAI,CAAC,OAAQ,OAAO,CAAC,EAExD,SAAgB,EAAM,EAAW,EAAwC,CACvE,GAAI,CACF,IAAM,EAAS,IAAI,IAAI,CAAC,EAGxB,OAFgB,EAAY,IAAI,IAAI,EAAU,IAAK,GAAM,EAAE,YAAY,CAAC,CAAC,EAAI,EAAA,CAE9D,IAAI,EAAO,SAAS,QAAQ,IAAK,EAAE,CAAC,CAAC,YAAY,CAAC,CACnE,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kEAAkE,KAAK,CAAC,CACjF,CAEA,SAAgB,EAAU,EAAoB,CAC5C,GAAI,CAAC,sBAAsB,KAAK,CAAC,EAAG,MAAO,GAE3C,IAAM,EAAI,IAAI,KAAK,CAAC,EAEpB,MAAO,CAAC,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAK,EAAE,YAAY,CAAC,CAAC,WAAW,CAAC,CACnE,CAEA,SAAgB,EAAc,EAAoB,CAChD,MACE,6EAA6E,KAAK,CAAC,GACnF,CAAC,OAAO,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAEvC,CAEA,SAAgB,EAAK,EAAoB,CAEvC,GAAI,0BAA0B,KAAK,CAAC,EAClC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,MAAO,GAAM,CAC/B,IAAM,EAAI,SAAS,EAAG,EAAE,EAExB,OAAO,GAAK,GAAK,GAAK,GACxB,CAAC,EAIH,GAAI,CAGF,OAFA,IAAI,IAAI,WAAW,EAAE,GAAG,EAEjB,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kBAAkB,KAAK,CAAC,CACjC,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,sBAAsB,KAAK,CAAC,CACrC,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAMA,SAAgB,EAAS,EAAW,EAAS,GAAa,CACxD,OAAO,EAAE,SAAW,GAAU,mBAAmB,KAAK,CAAC,CACzD,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,mFAAmF,KAAK,CAAC,CAClG,CAMA,SAAgB,EAAY,EAAoB,CAG9C,OAFI,EAAE,SAAW,GAAK,EAAE,OAAS,GAAM,EAAU,GAE1C,yBAAyB,KAAK,CAAC,CACxC,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,iBAAiB,KAAK,CAAC,CAChC,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,sDAAsD,KAAK,CAAC,CACrE,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,2CAA2C,KAAK,CAAC,CAC1D,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,+EAA+E,KAAK,CAAC,CAC9F,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,sLAAsL,KAC3L,CACF,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,6BAA6B,KAAK,CAAC,CAC5C,CAEA,SAAgB,EAAU,EAAoB,CAC5C,MAAO,4CAA4C,KAAK,CAAC,CAC3D"}
@@ -1,2 +1,2 @@
1
- const e=require("./safe-object.cjs");function t(e){return n(e)}function n(e){let t=r(e),n=t;return e.isNullable&&(n={anyOf:[t,{type:`null`}]}),e.description&&(n={...n,description:e.description}),n}function r(t){switch(t.kind){case`unknown`:return{};case`array`:{let e={items:n(t.items),type:`array`};return t.minItems!==void 0&&(e.minItems=t.minItems),t.maxItems!==void 0&&(e.maxItems=t.maxItems),e}case`bigint`:return{type:`integer`};case`boolean`:return{type:`boolean`};case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`enum`:return{enum:[...t.values]};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`intersect`:return{allOf:t.branches.map(n)};case`lazy`:return{};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`map`:return{$comment:`Map type — represented as an object with arbitrary string keys.`,additionalProperties:n(t.value),type:`object`};case`never`:return{not:{}};case`number`:{let e={type:t.typeHint===`integer`?`integer`:`number`};return t.minimum!==void 0&&(e.minimum=t.minimum),t.maximum!==void 0&&(e.maximum=t.maximum),t.exclusiveMinimum!==void 0&&(e.exclusiveMinimum=t.exclusiveMinimum),t.exclusiveMaximum!==void 0&&(e.exclusiveMaximum=t.exclusiveMaximum),t.multipleOf!==void 0&&(e.multipleOf=t.multipleOf),e}case`object`:{let r={},i=[];for(let[a,o]of Object.entries(t.fields))e.defineOwnProperty(r,a,n(o)),o.isOptional||i.push(a);let a={properties:r,type:`object`};return i.length>0&&(a.required=i),t.strict&&(a.additionalProperties=!1),a}case`pipe`:return n(t.to);case`record`:return{additionalProperties:n(t.value),type:`object`};case`set`:return{$comment:`Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:n(t.items),type:`array`,uniqueItems:!0};case`string`:{let e={type:`string`};return t.minLength!==void 0&&(e.minLength=t.minLength),t.maxLength!==void 0&&(e.maxLength=t.maxLength),t.pattern!=null&&(e.pattern=t.pattern),t.format!==void 0&&(e.format=t.format),t.contentEncoding!==void 0&&(e.contentEncoding=t.contentEncoding),e}case`tuple`:{let e={prefixItems:t.items.map(n),type:`array`};return e.items=t.rest!==null&&n(t.rest),e}case`union`:return{anyOf:t.branches.map(n)};case`variant`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(n)}}}exports.definitionToJsonSchema=t,exports.descriptorToJsonSchema=n;
1
+ const e=require("./safe-object.cjs");function t(e){return n(e)}function n(e){let t=r(e),n=t;return e.isNullable&&(n={anyOf:[t,{type:`null`}]}),e.description&&(n={...n,description:e.description}),n}function r(t){switch(t.kind){case`unknown`:return{};case`array`:{let e={items:n(t.items),type:`array`};return t.minItems!==void 0&&(e.minItems=t.minItems),t.maxItems!==void 0&&(e.maxItems=t.maxItems),e}case`bigint`:return{type:`integer`};case`boolean`:return{type:`boolean`};case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`enum`:return{enum:[...t.values]};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`intersect`:return{allOf:t.branches.map(n)};case`lazy`:return{};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`map`:return{$comment:`Map type: represented as an object with arbitrary string keys.`,additionalProperties:n(t.value),type:`object`};case`never`:return{not:{}};case`number`:{let e={type:t.typeHint===`integer`?`integer`:`number`};return t.minimum!==void 0&&(e.minimum=t.minimum),t.maximum!==void 0&&(e.maximum=t.maximum),t.exclusiveMinimum!==void 0&&(e.exclusiveMinimum=t.exclusiveMinimum),t.exclusiveMaximum!==void 0&&(e.exclusiveMaximum=t.exclusiveMaximum),t.multipleOf!==void 0&&(e.multipleOf=t.multipleOf),e}case`object`:{let r={},i=[];for(let[a,o]of Object.entries(t.fields))e.defineOwnProperty(r,a,n(o)),o.isOptional||i.push(a);let a={properties:r,type:`object`};return i.length>0&&(a.required=i),t.strict&&(a.additionalProperties=!1),a}case`pipe`:return n(t.to);case`record`:return{additionalProperties:n(t.value),type:`object`};case`set`:return{$comment:`Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:n(t.items),type:`array`,uniqueItems:!0};case`string`:{let e={type:`string`};return t.minLength!==void 0&&(e.minLength=t.minLength),t.maxLength!==void 0&&(e.maxLength=t.maxLength),t.pattern!=null&&(e.pattern=t.pattern),t.format!==void 0&&(e.format=t.format),t.contentEncoding!==void 0&&(e.contentEncoding=t.contentEncoding),e}case`tuple`:{let e={prefixItems:t.items.map(n),type:`array`};return e.items=t.rest!==null&&n(t.rest),e}case`union`:return{anyOf:t.branches.map(n)};case`variant`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(n)}}}exports.definitionToJsonSchema=t,exports.descriptorToJsonSchema=n;
2
2
  //# sourceMappingURL=json-schema.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.cjs","names":[],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type — represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"json-schema.cjs","names":[],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type: represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineOwnProperty as e}from"./safe-object.js";function t(e){return n(e)}function n(e){let t=r(e),n=t;return e.isNullable&&(n={anyOf:[t,{type:`null`}]}),e.description&&(n={...n,description:e.description}),n}function r(t){switch(t.kind){case`unknown`:return{};case`array`:{let e={items:n(t.items),type:`array`};return t.minItems!==void 0&&(e.minItems=t.minItems),t.maxItems!==void 0&&(e.maxItems=t.maxItems),e}case`bigint`:return{type:`integer`};case`boolean`:return{type:`boolean`};case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`enum`:return{enum:[...t.values]};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`intersect`:return{allOf:t.branches.map(n)};case`lazy`:return{};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`map`:return{$comment:`Map type — represented as an object with arbitrary string keys.`,additionalProperties:n(t.value),type:`object`};case`never`:return{not:{}};case`number`:{let e={type:t.typeHint===`integer`?`integer`:`number`};return t.minimum!==void 0&&(e.minimum=t.minimum),t.maximum!==void 0&&(e.maximum=t.maximum),t.exclusiveMinimum!==void 0&&(e.exclusiveMinimum=t.exclusiveMinimum),t.exclusiveMaximum!==void 0&&(e.exclusiveMaximum=t.exclusiveMaximum),t.multipleOf!==void 0&&(e.multipleOf=t.multipleOf),e}case`object`:{let r={},i=[];for(let[a,o]of Object.entries(t.fields))e(r,a,n(o)),o.isOptional||i.push(a);let a={properties:r,type:`object`};return i.length>0&&(a.required=i),t.strict&&(a.additionalProperties=!1),a}case`pipe`:return n(t.to);case`record`:return{additionalProperties:n(t.value),type:`object`};case`set`:return{$comment:`Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:n(t.items),type:`array`,uniqueItems:!0};case`string`:{let e={type:`string`};return t.minLength!==void 0&&(e.minLength=t.minLength),t.maxLength!==void 0&&(e.maxLength=t.maxLength),t.pattern!=null&&(e.pattern=t.pattern),t.format!==void 0&&(e.format=t.format),t.contentEncoding!==void 0&&(e.contentEncoding=t.contentEncoding),e}case`tuple`:{let e={prefixItems:t.items.map(n),type:`array`};return e.items=t.rest!==null&&n(t.rest),e}case`union`:return{anyOf:t.branches.map(n)};case`variant`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(n)}}}export{t as definitionToJsonSchema,n as descriptorToJsonSchema};
1
+ import{defineOwnProperty as e}from"./safe-object.js";function t(e){return n(e)}function n(e){let t=r(e),n=t;return e.isNullable&&(n={anyOf:[t,{type:`null`}]}),e.description&&(n={...n,description:e.description}),n}function r(t){switch(t.kind){case`unknown`:return{};case`array`:{let e={items:n(t.items),type:`array`};return t.minItems!==void 0&&(e.minItems=t.minItems),t.maxItems!==void 0&&(e.maxItems=t.maxItems),e}case`bigint`:return{type:`integer`};case`boolean`:return{type:`boolean`};case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`enum`:return{enum:[...t.values]};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`intersect`:return{allOf:t.branches.map(n)};case`lazy`:return{};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`map`:return{$comment:`Map type: represented as an object with arbitrary string keys.`,additionalProperties:n(t.value),type:`object`};case`never`:return{not:{}};case`number`:{let e={type:t.typeHint===`integer`?`integer`:`number`};return t.minimum!==void 0&&(e.minimum=t.minimum),t.maximum!==void 0&&(e.maximum=t.maximum),t.exclusiveMinimum!==void 0&&(e.exclusiveMinimum=t.exclusiveMinimum),t.exclusiveMaximum!==void 0&&(e.exclusiveMaximum=t.exclusiveMaximum),t.multipleOf!==void 0&&(e.multipleOf=t.multipleOf),e}case`object`:{let r={},i=[];for(let[a,o]of Object.entries(t.fields))e(r,a,n(o)),o.isOptional||i.push(a);let a={properties:r,type:`object`};return i.length>0&&(a.required=i),t.strict&&(a.additionalProperties=!1),a}case`pipe`:return n(t.to);case`record`:return{additionalProperties:n(t.value),type:`object`};case`set`:return{$comment:`Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:n(t.items),type:`array`,uniqueItems:!0};case`string`:{let e={type:`string`};return t.minLength!==void 0&&(e.minLength=t.minLength),t.maxLength!==void 0&&(e.maxLength=t.maxLength),t.pattern!=null&&(e.pattern=t.pattern),t.format!==void 0&&(e.format=t.format),t.contentEncoding!==void 0&&(e.contentEncoding=t.contentEncoding),e}case`tuple`:{let e={prefixItems:t.items.map(n),type:`array`};return e.items=t.rest!==null&&n(t.rest),e}case`union`:return{anyOf:t.branches.map(n)};case`variant`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(n)}}}export{t as definitionToJsonSchema,n as descriptorToJsonSchema};
2
2
  //# sourceMappingURL=json-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.js","names":[],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type — represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"json-schema.js","names":[],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type: represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"qDAGA,SAAgB,EAAuB,EAA0C,CAC/E,OAAO,EAAuB,CAAU,CAC1C,CAGA,SAAgB,EAAuB,EAAiC,CACtE,IAAM,EAAO,EAAkB,CAAC,EAC5B,EAAqB,EAMzB,OAJI,EAAE,aAAY,EAAS,CAAE,MAAO,CAAC,EAAM,CAAE,KAAM,MAAO,CAAC,CAAE,GAEzD,EAAE,cAAa,EAAS,CAAE,GAAG,EAAQ,YAAa,EAAE,WAAY,GAE7D,CACT,CAEA,SAAS,EAAkB,EAAiC,CAC1D,OAAQ,EAAE,KAAV,CACE,IAAK,UACH,MAAO,CAAC,EAEV,IAAK,QAAS,CACZ,IAAM,EAAkB,CAAE,MAAO,EAAuB,EAAE,KAAK,EAAG,KAAM,OAAQ,EAMhF,OAJI,EAAE,WAAa,IAAA,KAAW,EAAI,SAAW,EAAE,UAE3C,EAAE,WAAa,IAAA,KAAW,EAAI,SAAW,EAAE,UAExC,CACT,CAEA,IAAK,SACH,MAAO,CAAE,KAAM,SAAU,EAE3B,IAAK,UACH,MAAO,CAAE,KAAM,SAAU,EAE3B,IAAK,OACH,MAAO,CACL,SACE,8GACJ,EAEF,IAAK,OACH,MAAO,CAAE,KAAM,CAAC,GAAG,EAAE,MAAM,CAAE,EAE/B,IAAK,aACH,MAAO,CACL,SAAU,iBAAiB,EAAE,UAAU,wCACzC,EAEF,IAAK,YACH,MAAO,CAAE,MAAO,EAAE,SAAS,IAAI,CAAsB,CAAE,EAEzD,IAAK,OACH,MAAO,CAAC,EAEV,IAAK,UAKH,OAJI,EAAE,QAAU,KAAa,CAAE,KAAM,MAAO,EAExC,EAAE,QAAU,IAAA,GAAkB,CAAC,EAE5B,CAAE,MAAO,EAAE,KAAM,EAE1B,IAAK,MACH,MAAO,CACL,SAAU,iEACV,qBAAsB,EAAuB,EAAE,KAAK,EACpD,KAAM,QACR,EAEF,IAAK,QACH,MAAO,CAAE,IAAK,CAAC,CAAE,EAEnB,IAAK,SAAU,CACb,IAAM,EAAkB,CAAE,KAAM,EAAE,WAAa,UAAY,UAAY,QAAS,EAYhF,OAVI,EAAE,UAAY,IAAA,KAAW,EAAI,QAAU,EAAE,SAEzC,EAAE,UAAY,IAAA,KAAW,EAAI,QAAU,EAAE,SAEzC,EAAE,mBAAqB,IAAA,KAAW,EAAI,iBAAmB,EAAE,kBAE3D,EAAE,mBAAqB,IAAA,KAAW,EAAI,iBAAmB,EAAE,kBAE3D,EAAE,aAAe,IAAA,KAAW,EAAI,WAAa,EAAE,YAE5C,CACT,CAEA,IAAK,SAAU,CACb,IAAM,EAAyC,CAAC,EAC1C,EAAqB,CAAC,EAE5B,IAAK,GAAM,CAAC,EAAK,KAAoB,OAAO,QAAQ,EAAE,MAAM,EAC1D,EAAkB,EAAY,EAAK,EAAuB,CAAe,CAAC,EAErE,EAAgB,YAAY,EAAS,KAAK,CAAG,EAGpD,IAAM,EAAkB,CAAE,aAAY,KAAM,QAAS,EAMrD,OAJI,EAAS,OAAS,IAAG,EAAI,SAAW,GAEpC,EAAE,SAAQ,EAAI,qBAAuB,IAElC,CACT,CAEA,IAAK,OACH,OAAO,EAAuB,EAAE,EAAE,EAEpC,IAAK,SACH,MAAO,CACL,qBAAsB,EAAuB,EAAE,KAAK,EACpD,KAAM,QACR,EAEF,IAAK,MACH,MAAO,CACL,SAAU,uFACV,MAAO,EAAuB,EAAE,KAAK,EACrC,KAAM,QACN,YAAa,EACf,EAEF,IAAK,SAAU,CACb,IAAM,EAAkB,CAAE,KAAM,QAAS,EAYzC,OAVI,EAAE,YAAc,IAAA,KAAW,EAAI,UAAY,EAAE,WAE7C,EAAE,YAAc,IAAA,KAAW,EAAI,UAAY,EAAE,WAE7C,EAAE,SAAW,OAAM,EAAI,QAAU,EAAE,SAEnC,EAAE,SAAW,IAAA,KAAW,EAAI,OAAS,EAAE,QAEvC,EAAE,kBAAoB,IAAA,KAAW,EAAI,gBAAkB,EAAE,iBAEtD,CACT,CAEA,IAAK,QAAS,CACZ,IAAM,EAAkB,CACtB,YAAa,EAAE,MAAM,IAAI,CAAsB,EAC/C,KAAM,OACR,EAQA,MANA,CACE,EAAI,MADF,EAAE,OAAS,MACD,EAAuB,EAAE,IAAI,EAKpC,CACT,CAEA,IAAK,QACH,MAAO,CAAE,MAAO,EAAE,SAAS,IAAI,CAAsB,CAAE,EACzD,IAAK,UACH,MAAO,CACL,cAAe,CAAE,aAAc,EAAE,aAAc,EAC/C,MAAO,OAAO,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAsB,CAC7D,CACJ,CACF"}
package/dist/s.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.cjs","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferInput, type InferOutput, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, InferInput<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, InferInput<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\n// Schema-only tuples keep their concrete branch types; the second overload normalizes raw\n// literals, where intersecting with AnySchema[] costs nothing.\nfunction sUnion<T extends readonly [AnySchema, AnySchema, ...AnySchema[]]>(...items: T): UnionSchema<T>;\nfunction sUnion<T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]>;\nfunction sUnion(this: unknown, ...items: readonly RawOrSchema[]): UnionSchema<readonly AnySchema[]> {\n return new UnionSchema(normalizeToSchemas(items) as AnySchema[]);\n}\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"gsBAwBA,IAAM,EAA+B,GAA8B,IAAI,EAAA,YAAY,CAAM,EACnF,MAA8B,IAAI,EAAA,aAClC,MAAgC,IAAI,EAAA,cACpC,MAA0B,IAAI,EAAA,WAC9B,EAAqC,GAA6B,IAAI,EAAA,WAAW,CAAM,EACvF,EAAkB,GAA0D,IAAI,EAAA,iBAAiB,CAAG,EACpG,GACJ,GAAG,IAEH,IAAI,EAAA,gBAAgB,EAAA,mBAAmB,CAAK,CAA6C,EACrF,EAA8B,GAClC,IAAI,EAAA,WAAW,CAAgE,EAC3E,EAAoE,GACxE,IAAI,EAAA,cAAc,CAAK,EACnB,GAAkD,EAAc,IACpE,IAAI,EAAA,UAAU,EAAW,CAAW,EAChC,MAA4B,IAAI,EAAA,YAChC,MAAmC,IAAI,EAAA,cAAc,IAAI,EACzD,MAA8B,IAAI,EAAA,aAClC,EAAkC,GAA8B,IAAI,EAAA,aAAa,CAAK,EACtF,GAAqD,EAAc,IACvE,IAAI,EAAA,aAAa,EAAW,CAAW,EACnC,EAA6B,GAA4B,IAAI,EAAA,UAAU,CAAM,EAC7E,MAA8B,IAAI,EAAA,aAClC,EAAwC,GAA6B,IAAI,EAAA,YAAY,CAAK,EAC1F,MAA6C,IAAI,EAAA,cAAc,IAAA,EAAS,EAO9E,SAAS,EAAsB,GAAG,EAAkE,CAClG,OAAO,IAAI,EAAA,YAAY,EAAA,mBAAmB,CAAK,CAAgB,CACjE,CAyBA,IAAa,EAAI,CACf,MAAO,EACP,OAAQ,EACR,QAAS,EACT,OAAQ,CAtBR,WAAqC,EAAA,aAAa,OAAO,EACzD,YAAuC,EAAA,cAAc,OAAO,EAC5D,SAAiC,EAAA,WAAW,OAAO,EACnD,WAAqC,EAAA,aAAa,OAAO,EACzD,WAAqC,EAAA,aAAa,OAAO,CAkBjD,EACR,KAAM,EACN,oBA5BA,EACA,IACwB,IAAI,EAAA,cAAc,EAAe,CAAG,EA2B5D,KAAM,EACN,WAAY,EACZ,UAAW,EACX,KAAM,EACN,QAAS,EACT,IAAK,EACL,MAAO,EACP,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,IAAK,EACL,OAAQ,EACR,MAAO,EACP,UAAW,EACX,MAAO,EACP,YA/CsC,IAAI,EAAA,MAgD5C"}
1
+ {"version":3,"file":"s.cjs","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferInput, type InferOutput, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, InferInput<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, InferInput<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\n// Schema-only tuples keep their concrete branch types; the second overload normalizes raw\n// literals, where intersecting with AnySchema[] costs nothing.\nfunction sUnion<T extends readonly [AnySchema, AnySchema, ...AnySchema[]]>(...items: T): UnionSchema<T>;\nfunction sUnion<T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]>;\nfunction sUnion(this: unknown, ...items: readonly RawOrSchema[]): UnionSchema<readonly AnySchema[]> {\n return new UnionSchema(normalizeToSchemas(items) as AnySchema[]);\n}\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace: the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"gsBAwBA,IAAM,EAA+B,GAA8B,IAAI,EAAA,YAAY,CAAM,EACnF,MAA8B,IAAI,EAAA,aAClC,MAAgC,IAAI,EAAA,cACpC,MAA0B,IAAI,EAAA,WAC9B,EAAqC,GAA6B,IAAI,EAAA,WAAW,CAAM,EACvF,EAAkB,GAA0D,IAAI,EAAA,iBAAiB,CAAG,EACpG,GACJ,GAAG,IAEH,IAAI,EAAA,gBAAgB,EAAA,mBAAmB,CAAK,CAA6C,EACrF,EAA8B,GAClC,IAAI,EAAA,WAAW,CAAgE,EAC3E,EAAoE,GACxE,IAAI,EAAA,cAAc,CAAK,EACnB,GAAkD,EAAc,IACpE,IAAI,EAAA,UAAU,EAAW,CAAW,EAChC,MAA4B,IAAI,EAAA,YAChC,MAAmC,IAAI,EAAA,cAAc,IAAI,EACzD,MAA8B,IAAI,EAAA,aAClC,EAAkC,GAA8B,IAAI,EAAA,aAAa,CAAK,EACtF,GAAqD,EAAc,IACvE,IAAI,EAAA,aAAa,EAAW,CAAW,EACnC,EAA6B,GAA4B,IAAI,EAAA,UAAU,CAAM,EAC7E,MAA8B,IAAI,EAAA,aAClC,EAAwC,GAA6B,IAAI,EAAA,YAAY,CAAK,EAC1F,MAA6C,IAAI,EAAA,cAAc,IAAA,EAAS,EAO9E,SAAS,EAAsB,GAAG,EAAkE,CAClG,OAAO,IAAI,EAAA,YAAY,EAAA,mBAAmB,CAAK,CAAgB,CACjE,CAyBA,IAAa,EAAI,CACf,MAAO,EACP,OAAQ,EACR,QAAS,EACT,OAAQ,CAtBR,WAAqC,EAAA,aAAa,OAAO,EACzD,YAAuC,EAAA,cAAc,OAAO,EAC5D,SAAiC,EAAA,WAAW,OAAO,EACnD,WAAqC,EAAA,aAAa,OAAO,EACzD,WAAqC,EAAA,aAAa,OAAO,CAkBjD,EACR,KAAM,EACN,oBA5BA,EACA,IACwB,IAAI,EAAA,cAAc,EAAe,CAAG,EA2B5D,KAAM,EACN,WAAY,EACZ,UAAW,EACX,KAAM,EACN,QAAS,EACT,IAAK,EACL,MAAO,EACP,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,IAAK,EACL,OAAQ,EACR,MAAO,EACP,UAAW,EACX,MAAO,EACP,YA/CsC,IAAI,EAAA,MAgD5C"}
package/dist/s.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.js","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferInput, type InferOutput, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, InferInput<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, InferInput<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\n// Schema-only tuples keep their concrete branch types; the second overload normalizes raw\n// literals, where intersecting with AnySchema[] costs nothing.\nfunction sUnion<T extends readonly [AnySchema, AnySchema, ...AnySchema[]]>(...items: T): UnionSchema<T>;\nfunction sUnion<T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]>;\nfunction sUnion(this: unknown, ...items: readonly RawOrSchema[]): UnionSchema<readonly AnySchema[]> {\n return new UnionSchema(normalizeToSchemas(items) as AnySchema[]);\n}\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"yhCAwBA,IAAM,EAA+B,GAA8B,IAAI,EAAY,CAAM,EACnF,MAA8B,IAAI,EAClC,MAAgC,IAAI,EACpC,MAA0B,IAAI,EAC9B,EAAqC,GAA6B,IAAI,EAAW,CAAM,EACvF,EAAkB,GAA0D,IAAI,EAAiB,CAAG,EACpG,GACJ,GAAG,IAEH,IAAI,EAAgB,EAAmB,CAAK,CAA6C,EACrF,EAA8B,GAClC,IAAI,EAAW,CAAgE,EAC3E,EAAoE,GACxE,IAAI,EAAc,CAAK,EACnB,GAAkD,EAAc,IACpE,IAAI,EAAU,EAAW,CAAW,EAChC,MAA4B,IAAI,EAChC,MAAmC,IAAI,EAAc,IAAI,EACzD,MAA8B,IAAI,EAClC,EAAkC,GAA8B,IAAI,EAAa,CAAK,EACtF,GAAqD,EAAc,IACvE,IAAI,EAAa,EAAW,CAAW,EACnC,EAA6B,GAA4B,IAAI,EAAU,CAAM,EAC7E,MAA8B,IAAI,EAClC,EAAwC,GAA6B,IAAI,EAAY,CAAK,EAC1F,MAA6C,IAAI,EAAc,IAAA,EAAS,EAO9E,SAAS,EAAsB,GAAG,EAAkE,CAClG,OAAO,IAAI,EAAY,EAAmB,CAAK,CAAgB,CACjE,CAyBA,IAAa,EAAI,CACf,MAAO,EACP,OAAQ,EACR,QAAS,EACT,OAAQ,CAtBR,WAAqC,EAAa,OAAO,EACzD,YAAuC,EAAc,OAAO,EAC5D,SAAiC,EAAW,OAAO,EACnD,WAAqC,EAAa,OAAO,EACzD,WAAqC,EAAa,OAAO,CAkBjD,EACR,KAAM,EACN,oBA5BA,EACA,IACwB,IAAI,EAAc,EAAe,CAAG,EA2B5D,KAAM,EACN,WAAY,EACZ,UAAW,EACX,KAAM,EACN,QAAS,EACT,IAAK,EACL,MAAO,EACP,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,IAAK,EACL,OAAQ,EACR,MAAO,EACP,UAAW,EACX,MAAO,EACP,YA/CsC,IAAI,CAgD5C"}
1
+ {"version":3,"file":"s.js","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferInput, type InferOutput, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, InferInput<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, InferInput<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\n// Schema-only tuples keep their concrete branch types; the second overload normalizes raw\n// literals, where intersecting with AnySchema[] costs nothing.\nfunction sUnion<T extends readonly [AnySchema, AnySchema, ...AnySchema[]]>(...items: T): UnionSchema<T>;\nfunction sUnion<T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]>;\nfunction sUnion(this: unknown, ...items: readonly RawOrSchema[]): UnionSchema<readonly AnySchema[]> {\n return new UnionSchema(normalizeToSchemas(items) as AnySchema[]);\n}\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace: the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"yhCAwBA,IAAM,EAA+B,GAA8B,IAAI,EAAY,CAAM,EACnF,MAA8B,IAAI,EAClC,MAAgC,IAAI,EACpC,MAA0B,IAAI,EAC9B,EAAqC,GAA6B,IAAI,EAAW,CAAM,EACvF,EAAkB,GAA0D,IAAI,EAAiB,CAAG,EACpG,GACJ,GAAG,IAEH,IAAI,EAAgB,EAAmB,CAAK,CAA6C,EACrF,EAA8B,GAClC,IAAI,EAAW,CAAgE,EAC3E,EAAoE,GACxE,IAAI,EAAc,CAAK,EACnB,GAAkD,EAAc,IACpE,IAAI,EAAU,EAAW,CAAW,EAChC,MAA4B,IAAI,EAChC,MAAmC,IAAI,EAAc,IAAI,EACzD,MAA8B,IAAI,EAClC,EAAkC,GAA8B,IAAI,EAAa,CAAK,EACtF,GAAqD,EAAc,IACvE,IAAI,EAAa,EAAW,CAAW,EACnC,EAA6B,GAA4B,IAAI,EAAU,CAAM,EAC7E,MAA8B,IAAI,EAClC,EAAwC,GAA6B,IAAI,EAAY,CAAK,EAC1F,MAA6C,IAAI,EAAc,IAAA,EAAS,EAO9E,SAAS,EAAsB,GAAG,EAAkE,CAClG,OAAO,IAAI,EAAY,EAAmB,CAAK,CAAgB,CACjE,CAyBA,IAAa,EAAI,CACf,MAAO,EACP,OAAQ,EACR,QAAS,EACT,OAAQ,CAtBR,WAAqC,EAAa,OAAO,EACzD,YAAuC,EAAc,OAAO,EAC5D,SAAiC,EAAW,OAAO,EACnD,WAAqC,EAAa,OAAO,EACzD,WAAqC,EAAa,OAAO,CAkBjD,EACR,KAAM,EACN,oBA5BA,EACA,IACwB,IAAI,EAAc,EAAe,CAAG,EA2B5D,KAAM,EACN,WAAY,EACZ,UAAW,EACX,KAAM,EACN,QAAS,EACT,IAAK,EACL,MAAO,EACP,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,IAAK,EACL,OAAQ,EACR,MAAO,EACP,UAAW,EACX,MAAO,EACP,YA/CsC,IAAI,CAgD5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"intersect.cjs","names":[],"sources":["../../src/schemas/intersect.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport type { AnySchema, InferInput, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { Schema } from '../core';\nimport { cloneRecord, defineOwnProperty } from '../safe-object';\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;\n\n/**\n * Recursively merges `source` into `target`.\n * Plain objects are merged key-by-key; all other values take the `source` value.\n */\nfunction deepMerge(target: unknown, source: unknown): unknown {\n if (isPlainObject(target) && isPlainObject(source)) {\n const result = cloneRecord(target);\n\n for (const [key, val] of Object.entries(source)) {\n defineOwnProperty(result, key, deepMerge(target[key], val));\n }\n\n return result;\n }\n\n return source;\n}\n\n/** All schemas must pass — intersection semantics. */\nexport class IntersectSchema<T extends readonly AnySchema[]> extends Schema<\n UnionToIntersection<InferOutput<T[number]>>,\n UnionToIntersection<InferInput<T[number]>>\n> {\n readonly schemas: T;\n\n protected override get _kind(): string {\n return 'intersect';\n }\n\n constructor(schemas: T) {\n super();\n this.schemas = Object.freeze([...schemas]) as T;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = this.schemas[i]._parseFullSync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = await this.schemas[i]._parseFullAsync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), branches: this.schemas.map((s) => s.definition()), kind: 'intersect' };\n }\n}\n"],"mappings":"kGAaA,SAAS,EAAU,EAAiB,EAA0B,CAC5D,IAAA,EAAI,EAAA,cAAA,CAAc,CAAM,IAAA,EAAK,EAAA,cAAA,CAAc,CAAM,EAAG,CAClD,IAAM,EAAS,EAAA,YAAY,CAAM,EAEjC,IAAK,GAAM,CAAC,EAAK,KAAQ,OAAO,QAAQ,CAAM,EAC5C,EAAA,kBAAkB,EAAQ,EAAK,EAAU,EAAO,GAAM,CAAG,CAAC,EAG5D,OAAO,CACT,CAEA,OAAO,CACT,CAGA,IAAa,EAAb,cAAqE,EAAA,MAGnE,CACA,QAEA,IAAuB,OAAgB,CACrC,MAAO,WACT,CAEA,YAAY,EAAY,CACtB,MAAM,EACN,KAAK,QAAU,OAAO,OAAO,CAAC,GAAG,CAAO,CAAC,CAC3C,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,KAAK,QAAQ,EAAE,CAAC,eAAe,EAAO,CAAG,EAEpD,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAM,EAAM,OAAQ,OAAQ,EAAM,OAAQ,OAAQ,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,MAAM,KAAK,QAAQ,EAAE,CAAC,gBAAgB,EAAO,CAAG,EAE3D,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAM,EAAM,OAAQ,OAAQ,EAAM,OAAQ,OAAQ,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,SAAU,KAAK,QAAQ,IAAK,GAAM,EAAE,WAAW,CAAC,EAAG,KAAM,WAAY,CACzG,CACF"}
1
+ {"version":3,"file":"intersect.cjs","names":[],"sources":["../../src/schemas/intersect.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport type { AnySchema, InferInput, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { Schema } from '../core';\nimport { cloneRecord, defineOwnProperty } from '../safe-object';\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;\n\n/**\n * Recursively merges `source` into `target`.\n * Plain objects are merged key-by-key; all other values take the `source` value.\n */\nfunction deepMerge(target: unknown, source: unknown): unknown {\n if (isPlainObject(target) && isPlainObject(source)) {\n const result = cloneRecord(target);\n\n for (const [key, val] of Object.entries(source)) {\n defineOwnProperty(result, key, deepMerge(target[key], val));\n }\n\n return result;\n }\n\n return source;\n}\n\n/** All schemas must pass: intersection semantics. */\nexport class IntersectSchema<T extends readonly AnySchema[]> extends Schema<\n UnionToIntersection<InferOutput<T[number]>>,\n UnionToIntersection<InferInput<T[number]>>\n> {\n readonly schemas: T;\n\n protected override get _kind(): string {\n return 'intersect';\n }\n\n constructor(schemas: T) {\n super();\n this.schemas = Object.freeze([...schemas]) as T;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = this.schemas[i]._parseFullSync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = await this.schemas[i]._parseFullAsync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), branches: this.schemas.map((s) => s.definition()), kind: 'intersect' };\n }\n}\n"],"mappings":"kGAaA,SAAS,EAAU,EAAiB,EAA0B,CAC5D,IAAA,EAAI,EAAA,cAAA,CAAc,CAAM,IAAA,EAAK,EAAA,cAAA,CAAc,CAAM,EAAG,CAClD,IAAM,EAAS,EAAA,YAAY,CAAM,EAEjC,IAAK,GAAM,CAAC,EAAK,KAAQ,OAAO,QAAQ,CAAM,EAC5C,EAAA,kBAAkB,EAAQ,EAAK,EAAU,EAAO,GAAM,CAAG,CAAC,EAG5D,OAAO,CACT,CAEA,OAAO,CACT,CAGA,IAAa,EAAb,cAAqE,EAAA,MAGnE,CACA,QAEA,IAAuB,OAAgB,CACrC,MAAO,WACT,CAEA,YAAY,EAAY,CACtB,MAAM,EACN,KAAK,QAAU,OAAO,OAAO,CAAC,GAAG,CAAO,CAAC,CAC3C,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,KAAK,QAAQ,EAAE,CAAC,eAAe,EAAO,CAAG,EAEpD,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAM,EAAM,OAAQ,OAAQ,EAAM,OAAQ,OAAQ,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,MAAM,KAAK,QAAQ,EAAE,CAAC,gBAAgB,EAAO,CAAG,EAE3D,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAM,EAAM,OAAQ,OAAQ,EAAM,OAAQ,OAAQ,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,SAAU,KAAK,QAAQ,IAAK,GAAM,EAAE,WAAW,CAAC,EAAG,KAAM,WAAY,CACzG,CACF"}
@@ -1,7 +1,7 @@
1
1
  import type { AnySchema, InferInput, InferOutput, ParseContext, ParseValue, SchemaDescriptor } from '../core';
2
2
  import { Schema } from '../core';
3
3
  type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
4
- /** All schemas must pass — intersection semantics. */
4
+ /** All schemas must pass: intersection semantics. */
5
5
  export declare class IntersectSchema<T extends readonly AnySchema[]> extends Schema<UnionToIntersection<InferOutput<T[number]>>, UnionToIntersection<InferInput<T[number]>>> {
6
6
  readonly schemas: T;
7
7
  protected get _kind(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"intersect.d.ts","sourceRoot":"","sources":["../../src/schemas/intersect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAS,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAErH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;AAoBhH,sDAAsD;AACtD,qBAAa,eAAe,CAAC,CAAC,SAAS,SAAS,SAAS,EAAE,CAAE,SAAQ,MAAM,CACzE,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAC3C,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAC3C;IACC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAEpB,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,OAAO,EAAE,CAAC;cAKH,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;cAuB/C,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;cAuBzE,iBAAiB,IAAI,gBAAgB;CAGzD"}
1
+ {"version":3,"file":"intersect.d.ts","sourceRoot":"","sources":["../../src/schemas/intersect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAS,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAErH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;AAoBhH,qDAAqD;AACrD,qBAAa,eAAe,CAAC,CAAC,SAAS,SAAS,SAAS,EAAE,CAAE,SAAQ,MAAM,CACzE,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAC3C,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAC3C;IACC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAEpB,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,OAAO,EAAE,CAAC;cAKH,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;cAuB/C,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;cAuBzE,iBAAiB,IAAI,gBAAgB;CAGzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"intersect.js","names":[],"sources":["../../src/schemas/intersect.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport type { AnySchema, InferInput, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { Schema } from '../core';\nimport { cloneRecord, defineOwnProperty } from '../safe-object';\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;\n\n/**\n * Recursively merges `source` into `target`.\n * Plain objects are merged key-by-key; all other values take the `source` value.\n */\nfunction deepMerge(target: unknown, source: unknown): unknown {\n if (isPlainObject(target) && isPlainObject(source)) {\n const result = cloneRecord(target);\n\n for (const [key, val] of Object.entries(source)) {\n defineOwnProperty(result, key, deepMerge(target[key], val));\n }\n\n return result;\n }\n\n return source;\n}\n\n/** All schemas must pass — intersection semantics. */\nexport class IntersectSchema<T extends readonly AnySchema[]> extends Schema<\n UnionToIntersection<InferOutput<T[number]>>,\n UnionToIntersection<InferInput<T[number]>>\n> {\n readonly schemas: T;\n\n protected override get _kind(): string {\n return 'intersect';\n }\n\n constructor(schemas: T) {\n super();\n this.schemas = Object.freeze([...schemas]) as T;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = this.schemas[i]._parseFullSync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = await this.schemas[i]._parseFullAsync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), branches: this.schemas.map((s) => s.definition()), kind: 'intersect' };\n }\n}\n"],"mappings":"6JAaA,SAAS,EAAU,EAAiB,EAA0B,CAC5D,GAAI,EAAc,CAAM,GAAK,EAAc,CAAM,EAAG,CAClD,IAAM,EAAS,EAAY,CAAM,EAEjC,IAAK,GAAM,CAAC,EAAK,KAAQ,OAAO,QAAQ,CAAM,EAC5C,EAAkB,EAAQ,EAAK,EAAU,EAAO,GAAM,CAAG,CAAC,EAG5D,OAAO,CACT,CAEA,OAAO,CACT,CAGA,IAAa,EAAb,cAAqE,CAGnE,CACA,QAEA,IAAuB,OAAgB,CACrC,MAAO,WACT,CAEA,YAAY,EAAY,CACtB,MAAM,EACN,KAAK,QAAU,OAAO,OAAO,CAAC,GAAG,CAAO,CAAC,CAC3C,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,KAAK,QAAQ,EAAE,CAAC,eAAe,EAAO,CAAG,EAEpD,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAM,EAAM,OAAQ,OAAQ,EAAM,OAAQ,OAAQ,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,MAAM,KAAK,QAAQ,EAAE,CAAC,gBAAgB,EAAO,CAAG,EAE3D,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAM,EAAM,OAAQ,OAAQ,EAAM,OAAQ,OAAQ,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,SAAU,KAAK,QAAQ,IAAK,GAAM,EAAE,WAAW,CAAC,EAAG,KAAM,WAAY,CACzG,CACF"}
1
+ {"version":3,"file":"intersect.js","names":[],"sources":["../../src/schemas/intersect.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport type { AnySchema, InferInput, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { Schema } from '../core';\nimport { cloneRecord, defineOwnProperty } from '../safe-object';\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;\n\n/**\n * Recursively merges `source` into `target`.\n * Plain objects are merged key-by-key; all other values take the `source` value.\n */\nfunction deepMerge(target: unknown, source: unknown): unknown {\n if (isPlainObject(target) && isPlainObject(source)) {\n const result = cloneRecord(target);\n\n for (const [key, val] of Object.entries(source)) {\n defineOwnProperty(result, key, deepMerge(target[key], val));\n }\n\n return result;\n }\n\n return source;\n}\n\n/** All schemas must pass: intersection semantics. */\nexport class IntersectSchema<T extends readonly AnySchema[]> extends Schema<\n UnionToIntersection<InferOutput<T[number]>>,\n UnionToIntersection<InferInput<T[number]>>\n> {\n readonly schemas: T;\n\n protected override get _kind(): string {\n return 'intersect';\n }\n\n constructor(schemas: T) {\n super();\n this.schemas = Object.freeze([...schemas]) as T;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = this.schemas[i]._parseFullSync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = await this.schemas[i]._parseFullAsync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), branches: this.schemas.map((s) => s.definition()), kind: 'intersect' };\n }\n}\n"],"mappings":"6JAaA,SAAS,EAAU,EAAiB,EAA0B,CAC5D,GAAI,EAAc,CAAM,GAAK,EAAc,CAAM,EAAG,CAClD,IAAM,EAAS,EAAY,CAAM,EAEjC,IAAK,GAAM,CAAC,EAAK,KAAQ,OAAO,QAAQ,CAAM,EAC5C,EAAkB,EAAQ,EAAK,EAAU,EAAO,GAAM,CAAG,CAAC,EAG5D,OAAO,CACT,CAEA,OAAO,CACT,CAGA,IAAa,EAAb,cAAqE,CAGnE,CACA,QAEA,IAAuB,OAAgB,CACrC,MAAO,WACT,CAEA,YAAY,EAAY,CACtB,MAAM,EACN,KAAK,QAAU,OAAO,OAAO,CAAC,GAAG,CAAO,CAAC,CAC3C,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,KAAK,QAAQ,EAAE,CAAC,eAAe,EAAO,CAAG,EAEpD,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAM,EAAM,OAAQ,OAAQ,EAAM,OAAQ,OAAQ,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,MAAM,KAAK,QAAQ,EAAE,CAAC,gBAAgB,EAAO,CAAG,EAE3D,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAM,EAAM,OAAQ,OAAQ,EAAM,OAAQ,OAAQ,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,SAAU,KAAK,QAAQ,IAAK,GAAM,EAAE,WAAW,CAAC,EAAG,KAAM,WAAY,CACzG,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"lazy.cjs","names":[],"sources":["../../src/schemas/lazy.ts"],"sourcesContent":["import type { ParseContext, ParseValue, SchemaDescriptor, SchemaState } from '../core';\n\nimport { Schema } from '../core';\n\nexport class LazySchema<T, Input = T> extends Schema<T, Input> {\n private readonly _getter: () => Schema<T, Input>;\n private _resolved?: Schema<T, Input>;\n\n protected override get _kind(): string {\n return 'lazy';\n }\n\n constructor(getter: () => Schema<T, Input>) {\n super();\n this._getter = getter;\n }\n\n private _resolve(): Schema<T, Input> {\n const resolved = (this._resolved ??= this._getter());\n\n return resolved;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const result = this._resolve()._parseFullSync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n return { data: value, issues: result.issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const result = await this._resolve()._parseFullAsync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n return { data: value, issues: result.issues, typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'lazy' };\n }\n\n protected override _construct(state: SchemaState<any>): this {\n // Do not copy _resolved — each clone re-resolves from the getter on first use.\n const next = new LazySchema(this._getter) as this;\n\n next.state = state as any;\n\n return next;\n }\n}\n"],"mappings":"+BAIA,IAAa,EAAb,MAAa,UAAiC,EAAA,MAAiB,CAC7D,QACA,UAEA,IAAuB,OAAgB,CACrC,MAAO,MACT,CAEA,YAAY,EAAgC,CAC1C,MAAM,EACN,KAAK,QAAU,CACjB,CAEA,UAAqC,CAGnC,MAAO,MAFgB,YAAc,KAAK,QAAQ,CAGpD,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAS,KAAK,SAAS,CAAC,CAAC,eAAe,EAAO,CAAG,EAIxD,OAFI,EAAO,OAAO,SAAW,EAAU,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAE9E,CAAE,KAAM,EAAO,OAAQ,EAAO,OAAQ,OAAQ,EAAK,CAC5D,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,IAAM,EAAS,MAAM,KAAK,SAAS,CAAC,CAAC,gBAAgB,EAAO,CAAG,EAI/D,OAFI,EAAO,OAAO,SAAW,EAAU,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAE9E,CAAE,KAAM,EAAO,OAAQ,EAAO,OAAQ,OAAQ,EAAK,CAC5D,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,MAAO,CACjD,CAEA,WAA8B,EAA+B,CAE3D,IAAM,EAAO,IAAI,EAAW,KAAK,OAAO,EAIxC,MAFA,GAAK,MAAQ,EAEN,CACT,CACF"}
1
+ {"version":3,"file":"lazy.cjs","names":[],"sources":["../../src/schemas/lazy.ts"],"sourcesContent":["import type { ParseContext, ParseValue, SchemaDescriptor, SchemaState } from '../core';\n\nimport { Schema } from '../core';\n\nexport class LazySchema<T, Input = T> extends Schema<T, Input> {\n private readonly _getter: () => Schema<T, Input>;\n private _resolved?: Schema<T, Input>;\n\n protected override get _kind(): string {\n return 'lazy';\n }\n\n constructor(getter: () => Schema<T, Input>) {\n super();\n this._getter = getter;\n }\n\n private _resolve(): Schema<T, Input> {\n const resolved = (this._resolved ??= this._getter());\n\n return resolved;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const result = this._resolve()._parseFullSync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n return { data: value, issues: result.issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const result = await this._resolve()._parseFullAsync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n return { data: value, issues: result.issues, typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'lazy' };\n }\n\n protected override _construct(state: SchemaState<any>): this {\n // Do not copy _resolved: each clone re-resolves from the getter on first use.\n const next = new LazySchema(this._getter) as this;\n\n next.state = state as any;\n\n return next;\n }\n}\n"],"mappings":"+BAIA,IAAa,EAAb,MAAa,UAAiC,EAAA,MAAiB,CAC7D,QACA,UAEA,IAAuB,OAAgB,CACrC,MAAO,MACT,CAEA,YAAY,EAAgC,CAC1C,MAAM,EACN,KAAK,QAAU,CACjB,CAEA,UAAqC,CAGnC,MAAO,MAFgB,YAAc,KAAK,QAAQ,CAGpD,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAS,KAAK,SAAS,CAAC,CAAC,eAAe,EAAO,CAAG,EAIxD,OAFI,EAAO,OAAO,SAAW,EAAU,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAE9E,CAAE,KAAM,EAAO,OAAQ,EAAO,OAAQ,OAAQ,EAAK,CAC5D,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,IAAM,EAAS,MAAM,KAAK,SAAS,CAAC,CAAC,gBAAgB,EAAO,CAAG,EAI/D,OAFI,EAAO,OAAO,SAAW,EAAU,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAE9E,CAAE,KAAM,EAAO,OAAQ,EAAO,OAAQ,OAAQ,EAAK,CAC5D,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,MAAO,CACjD,CAEA,WAA8B,EAA+B,CAE3D,IAAM,EAAO,IAAI,EAAW,KAAK,OAAO,EAIxC,MAFA,GAAK,MAAQ,EAEN,CACT,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"lazy.js","names":[],"sources":["../../src/schemas/lazy.ts"],"sourcesContent":["import type { ParseContext, ParseValue, SchemaDescriptor, SchemaState } from '../core';\n\nimport { Schema } from '../core';\n\nexport class LazySchema<T, Input = T> extends Schema<T, Input> {\n private readonly _getter: () => Schema<T, Input>;\n private _resolved?: Schema<T, Input>;\n\n protected override get _kind(): string {\n return 'lazy';\n }\n\n constructor(getter: () => Schema<T, Input>) {\n super();\n this._getter = getter;\n }\n\n private _resolve(): Schema<T, Input> {\n const resolved = (this._resolved ??= this._getter());\n\n return resolved;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const result = this._resolve()._parseFullSync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n return { data: value, issues: result.issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const result = await this._resolve()._parseFullAsync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n return { data: value, issues: result.issues, typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'lazy' };\n }\n\n protected override _construct(state: SchemaState<any>): this {\n // Do not copy _resolved — each clone re-resolves from the getter on first use.\n const next = new LazySchema(this._getter) as this;\n\n next.state = state as any;\n\n return next;\n }\n}\n"],"mappings":"oCAIA,IAAa,EAAb,MAAa,UAAiC,CAAiB,CAC7D,QACA,UAEA,IAAuB,OAAgB,CACrC,MAAO,MACT,CAEA,YAAY,EAAgC,CAC1C,MAAM,EACN,KAAK,QAAU,CACjB,CAEA,UAAqC,CAGnC,MAAO,MAFgB,YAAc,KAAK,QAAQ,CAGpD,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAS,KAAK,SAAS,CAAC,CAAC,eAAe,EAAO,CAAG,EAIxD,OAFI,EAAO,OAAO,SAAW,EAAU,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAE9E,CAAE,KAAM,EAAO,OAAQ,EAAO,OAAQ,OAAQ,EAAK,CAC5D,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,IAAM,EAAS,MAAM,KAAK,SAAS,CAAC,CAAC,gBAAgB,EAAO,CAAG,EAI/D,OAFI,EAAO,OAAO,SAAW,EAAU,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAE9E,CAAE,KAAM,EAAO,OAAQ,EAAO,OAAQ,OAAQ,EAAK,CAC5D,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,MAAO,CACjD,CAEA,WAA8B,EAA+B,CAE3D,IAAM,EAAO,IAAI,EAAW,KAAK,OAAO,EAIxC,MAFA,GAAK,MAAQ,EAEN,CACT,CACF"}
1
+ {"version":3,"file":"lazy.js","names":[],"sources":["../../src/schemas/lazy.ts"],"sourcesContent":["import type { ParseContext, ParseValue, SchemaDescriptor, SchemaState } from '../core';\n\nimport { Schema } from '../core';\n\nexport class LazySchema<T, Input = T> extends Schema<T, Input> {\n private readonly _getter: () => Schema<T, Input>;\n private _resolved?: Schema<T, Input>;\n\n protected override get _kind(): string {\n return 'lazy';\n }\n\n constructor(getter: () => Schema<T, Input>) {\n super();\n this._getter = getter;\n }\n\n private _resolve(): Schema<T, Input> {\n const resolved = (this._resolved ??= this._getter());\n\n return resolved;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const result = this._resolve()._parseFullSync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n return { data: value, issues: result.issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const result = await this._resolve()._parseFullAsync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n return { data: value, issues: result.issues, typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'lazy' };\n }\n\n protected override _construct(state: SchemaState<any>): this {\n // Do not copy _resolved: each clone re-resolves from the getter on first use.\n const next = new LazySchema(this._getter) as this;\n\n next.state = state as any;\n\n return next;\n }\n}\n"],"mappings":"oCAIA,IAAa,EAAb,MAAa,UAAiC,CAAiB,CAC7D,QACA,UAEA,IAAuB,OAAgB,CACrC,MAAO,MACT,CAEA,YAAY,EAAgC,CAC1C,MAAM,EACN,KAAK,QAAU,CACjB,CAEA,UAAqC,CAGnC,MAAO,MAFgB,YAAc,KAAK,QAAQ,CAGpD,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAS,KAAK,SAAS,CAAC,CAAC,eAAe,EAAO,CAAG,EAIxD,OAFI,EAAO,OAAO,SAAW,EAAU,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAE9E,CAAE,KAAM,EAAO,OAAQ,EAAO,OAAQ,OAAQ,EAAK,CAC5D,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,IAAM,EAAS,MAAM,KAAK,SAAS,CAAC,CAAC,gBAAgB,EAAO,CAAG,EAI/D,OAFI,EAAO,OAAO,SAAW,EAAU,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAE9E,CAAE,KAAM,EAAO,OAAQ,EAAO,OAAQ,OAAQ,EAAK,CAC5D,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,MAAO,CACjD,CAEA,WAA8B,EAA+B,CAE3D,IAAM,EAAO,IAAI,EAAW,KAAK,OAAO,EAIxC,MAFA,GAAK,MAAQ,EAEN,CACT,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"object.cjs","names":[],"sources":["../../src/schemas/object.ts"],"sourcesContent":["import type {\n AcceptsMissing,\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema } from '../core';\nimport { defineOwnProperty, isUnsafeObjectKey, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { UnionSchema } from './union';\n\nexport type ObjectShape = Record<string, AnySchema>;\nexport type InferObject<T extends ObjectShape> = { [K in keyof T]: InferOutput<T[K]> };\ntype OptionalInputKeys<T extends ObjectShape> = {\n [K in keyof T]: T[K] extends AcceptsMissing ? K : never;\n}[keyof T];\ntype Simplify<T> = { [K in keyof T]: T[K] };\nexport type InferObjectInput<T extends ObjectShape> = Simplify<\n { [K in Exclude<keyof T, OptionalInputKeys<T>>]: InferInput<T[K]> } & {\n [K in OptionalInputKeys<T>]?: InferInput<T[K]>;\n }\n>;\n\nexport class ObjectSchema<T extends ObjectShape> extends Schema<InferObject<T>, InferObjectInput<T>> {\n readonly shape: T;\n private readonly _isRelaxed: boolean;\n\n protected override get _kind(): string {\n return 'object';\n }\n\n constructor(shape: T, isRelaxed = false) {\n super();\n this.shape = Object.freeze(objectFromEntries(Object.entries(shape))) as T;\n this._isRelaxed = isRelaxed;\n }\n\n private _unknownKeys(obj: Record<string, unknown>): string[] {\n return Object.keys(obj).filter((k) => !Object.hasOwn(this.shape, k));\n }\n\n private _strictUnknownKeyIssues(obj: Record<string, unknown>, ctx: ParseContext): Issue[] {\n if (this._isRelaxed) return [];\n\n const unknownKeys = this._unknownKeys(obj);\n\n if (unknownKeys.length === 0) return [];\n\n return [\n {\n code: ErrorCode.invalid_keys,\n message: ctx.messages.object.invalidKeys({ keys: unknownKeys }),\n params: { keys: unknownKeys },\n path: [],\n },\n ];\n }\n\n private _copyRelaxedUnknownKeys(obj: Record<string, unknown>, output: Record<string, unknown>): void {\n if (!this._isRelaxed) return;\n\n for (const key of this._unknownKeys(obj)) {\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(key)) continue;\n\n defineOwnProperty(output, key, obj[key]);\n }\n }\n\n private _guardObjectInput(\n value: unknown,\n ctx: ParseContext,\n ): { obj: Record<string, unknown>; ok: true } | { issues: Issue[]; ok: false } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.object.type(), path: [] }],\n ok: false,\n };\n }\n\n return { obj: value as Record<string, unknown>, ok: true };\n }\n\n private _createObjectParseContext(\n obj: Record<string, unknown>,\n ctx: ParseContext,\n ): {\n issues: Issue[];\n output: Record<string, unknown>;\n } {\n return {\n issues: [...this._strictUnknownKeyIssues(obj, ctx)],\n output: {},\n };\n }\n\n private _rebuildWith<U extends ObjectShape>(shape: U, isRelaxed = this._isRelaxed): ObjectSchema<U> {\n return this._copyStateTo(new ObjectSchema(shape, isRelaxed)) as unknown as ObjectSchema<U>;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n for (const key of Object.keys(this.shape)) {\n const fieldSchema = this.shape[key];\n const result = fieldSchema._parseFullSync(obj[key], ctx);\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n // Failed field keys are intentionally omitted from parsed output so\n // object-level checks can branch on key presence.\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n const keys = Object.keys(this.shape);\n const results = await Promise.all(keys.map((key) => this.shape[key]._parseFullAsync(obj[key], ctx)));\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const result = results[i];\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n partial(): ObjectSchema<{\n [K in keyof T]: Schema<InferOutput<T[K]> | undefined, InferInput<T[K]> | undefined> & AcceptsMissing;\n }>;\n partial<K extends keyof T>(\n ...keys: K[]\n ): ObjectSchema<\n Omit<T, K> & {\n [P in K]: Schema<InferOutput<T[P]> | undefined, InferInput<T[P]> | undefined> & AcceptsMissing;\n }\n >;\n partial<K extends keyof T>(...keys: K[]): ObjectSchema<any> {\n const targetKeys = keys.length > 0 ? new Set(keys as string[]) : null;\n\n return this._rebuildWith(\n objectFromEntries(\n Object.entries(this.shape).map(([k, s]) => [k, targetKeys === null || targetKeys.has(k) ? s.optional() : s]),\n ) as any,\n this._isRelaxed,\n );\n }\n\n override optional(): ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing {\n return super.optional() as ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing;\n }\n\n override nullable(): ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null> {\n return super.nullable() as ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null>;\n }\n\n override nullish(): ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing {\n return super.nullish() as ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing;\n }\n\n override required(): ObjectSchema<T> &\n Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>> {\n return this._rebuildWith(\n objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.required()])) as any,\n this._isRelaxed,\n ) as ObjectSchema<T> & Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>>;\n }\n\n extend<U extends ObjectShape>(extra: U): ObjectSchema<Omit<T, keyof U> & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(extra)]) as any,\n this._isRelaxed,\n );\n }\n\n pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => keySet.has(k))) as any);\n }\n\n omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => !keySet.has(k))) as any);\n }\n\n /**\n * Returns a fully default-filled object by parsing `{}` against this schema.\n * Every required field must have a `.default()` value set; if any required\n * field is missing a default, this method throws a `SpellValidationError`.\n *\n * @example\n * const Config = s.object({ host: s.string().default('localhost'), port: s.number().default(3000) });\n * Config.defaults(); // { host: 'localhost', port: 3000 }\n */\n defaults(): InferObject<T> {\n return this.parse({});\n }\n\n /**\n * Returns a partial object containing only the fields that have a default value set.\n * Fields without a `.default()` or `.catch()` are silently omitted rather than throwing.\n *\n * Useful for pre-filling forms where only some fields have defaults.\n *\n * @example\n * const Form = s.object({ name: s.string(), role: s.string().default('viewer') });\n * Form.partialDefaults(); // { role: 'viewer' } — name is omitted\n */\n partialDefaults(): Partial<InferObject<T>> {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(this.shape)) {\n const parsed = this.shape[key]._parseFullSync(undefined);\n\n if (parsed.issues.length === 0) {\n defineOwnProperty(result, key, parsed.data);\n }\n }\n\n return result as Partial<InferObject<T>>;\n }\n\n /**\n * Returns an array of field keys that are **required** (not optional and not nullish).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.requiredFields(); // ['id']\n */\n requiredFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => !this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Returns an array of field keys that are **optional** (accept `undefined`).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.optionalFields(); // ['name']\n */\n optionalFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Allow additional unknown properties (relaxed mode).\n * Default is strict mode (rejects unknown keys).\n *\n * Returns `ObjectSchema<T>` so fluent methods like `.pick()`, `.omit()`,\n * `.extend()`, and `.partial()` remain usable after calling `.relaxed()`.\n */\n relaxed(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, true);\n }\n\n /**\n * Alias for the default strict mode — rejects unknown keys.\n * Useful after calling `.relaxed()` to return a new strict schema.\n */\n strict(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, false);\n }\n\n /**\n * Returns a union schema of the object's key names as literal schemas.\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string() });\n * User.keyof(); // UnionSchema — validates 'id' | 'name'\n */\n keyof(): UnionSchema<readonly [LiteralSchema<keyof T & string>, ...LiteralSchema<keyof T & string>[]]> {\n const keys = Object.keys(this.shape) as (keyof T & string)[];\n const schemas = keys.map((k) => new LiteralSchema(k)) as unknown as readonly [\n LiteralSchema<keyof T & string>,\n ...LiteralSchema<keyof T & string>[],\n ];\n\n return new UnionSchema(schemas);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const fields: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of Object.entries(this.shape)) {\n defineOwnProperty(fields, key, schema.definition());\n }\n\n return { ...this._describeBase(), fields, kind: 'object', strict: !this._isRelaxed };\n }\n\n merge<U extends ObjectShape>(other: ObjectSchema<U>): ObjectSchema<T & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(other.shape)]) as any,\n other._isRelaxed,\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"object.cjs","names":[],"sources":["../../src/schemas/object.ts"],"sourcesContent":["import type {\n AcceptsMissing,\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema } from '../core';\nimport { defineOwnProperty, isUnsafeObjectKey, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { UnionSchema } from './union';\n\nexport type ObjectShape = Record<string, AnySchema>;\nexport type InferObject<T extends ObjectShape> = { [K in keyof T]: InferOutput<T[K]> };\ntype OptionalInputKeys<T extends ObjectShape> = {\n [K in keyof T]: T[K] extends AcceptsMissing ? K : never;\n}[keyof T];\ntype Simplify<T> = { [K in keyof T]: T[K] };\nexport type InferObjectInput<T extends ObjectShape> = Simplify<\n { [K in Exclude<keyof T, OptionalInputKeys<T>>]: InferInput<T[K]> } & {\n [K in OptionalInputKeys<T>]?: InferInput<T[K]>;\n }\n>;\n\nexport class ObjectSchema<T extends ObjectShape> extends Schema<InferObject<T>, InferObjectInput<T>> {\n readonly shape: T;\n private readonly _isRelaxed: boolean;\n\n protected override get _kind(): string {\n return 'object';\n }\n\n constructor(shape: T, isRelaxed = false) {\n super();\n this.shape = Object.freeze(objectFromEntries(Object.entries(shape))) as T;\n this._isRelaxed = isRelaxed;\n }\n\n private _unknownKeys(obj: Record<string, unknown>): string[] {\n return Object.keys(obj).filter((k) => !Object.hasOwn(this.shape, k));\n }\n\n private _strictUnknownKeyIssues(obj: Record<string, unknown>, ctx: ParseContext): Issue[] {\n if (this._isRelaxed) return [];\n\n const unknownKeys = this._unknownKeys(obj);\n\n if (unknownKeys.length === 0) return [];\n\n return [\n {\n code: ErrorCode.invalid_keys,\n message: ctx.messages.object.invalidKeys({ keys: unknownKeys }),\n params: { keys: unknownKeys },\n path: [],\n },\n ];\n }\n\n private _copyRelaxedUnknownKeys(obj: Record<string, unknown>, output: Record<string, unknown>): void {\n if (!this._isRelaxed) return;\n\n for (const key of this._unknownKeys(obj)) {\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(key)) continue;\n\n defineOwnProperty(output, key, obj[key]);\n }\n }\n\n private _guardObjectInput(\n value: unknown,\n ctx: ParseContext,\n ): { obj: Record<string, unknown>; ok: true } | { issues: Issue[]; ok: false } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.object.type(), path: [] }],\n ok: false,\n };\n }\n\n return { obj: value as Record<string, unknown>, ok: true };\n }\n\n private _createObjectParseContext(\n obj: Record<string, unknown>,\n ctx: ParseContext,\n ): {\n issues: Issue[];\n output: Record<string, unknown>;\n } {\n return {\n issues: [...this._strictUnknownKeyIssues(obj, ctx)],\n output: {},\n };\n }\n\n private _rebuildWith<U extends ObjectShape>(shape: U, isRelaxed = this._isRelaxed): ObjectSchema<U> {\n return this._copyStateTo(new ObjectSchema(shape, isRelaxed)) as unknown as ObjectSchema<U>;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n for (const key of Object.keys(this.shape)) {\n const fieldSchema = this.shape[key];\n const result = fieldSchema._parseFullSync(obj[key], ctx);\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n // Failed field keys are intentionally omitted from parsed output so\n // object-level checks can branch on key presence.\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n const keys = Object.keys(this.shape);\n const results = await Promise.all(keys.map((key) => this.shape[key]._parseFullAsync(obj[key], ctx)));\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const result = results[i];\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n partial(): ObjectSchema<{\n [K in keyof T]: Schema<InferOutput<T[K]> | undefined, InferInput<T[K]> | undefined> & AcceptsMissing;\n }>;\n partial<K extends keyof T>(\n ...keys: K[]\n ): ObjectSchema<\n Omit<T, K> & {\n [P in K]: Schema<InferOutput<T[P]> | undefined, InferInput<T[P]> | undefined> & AcceptsMissing;\n }\n >;\n partial<K extends keyof T>(...keys: K[]): ObjectSchema<any> {\n const targetKeys = keys.length > 0 ? new Set(keys as string[]) : null;\n\n return this._rebuildWith(\n objectFromEntries(\n Object.entries(this.shape).map(([k, s]) => [k, targetKeys === null || targetKeys.has(k) ? s.optional() : s]),\n ) as any,\n this._isRelaxed,\n );\n }\n\n override optional(): ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing {\n return super.optional() as ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing;\n }\n\n override nullable(): ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null> {\n return super.nullable() as ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null>;\n }\n\n override nullish(): ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing {\n return super.nullish() as ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing;\n }\n\n override required(): ObjectSchema<T> &\n Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>> {\n return this._rebuildWith(\n objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.required()])) as any,\n this._isRelaxed,\n ) as ObjectSchema<T> & Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>>;\n }\n\n extend<U extends ObjectShape>(extra: U): ObjectSchema<Omit<T, keyof U> & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(extra)]) as any,\n this._isRelaxed,\n );\n }\n\n pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => keySet.has(k))) as any);\n }\n\n omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => !keySet.has(k))) as any);\n }\n\n /**\n * Returns a fully default-filled object by parsing `{}` against this schema.\n * Every required field must have a `.default()` value set; if any required\n * field is missing a default, this method throws a `SpellValidationError`.\n *\n * @example\n * const Config = s.object({ host: s.string().default('localhost'), port: s.number().default(3000) });\n * Config.defaults(); // { host: 'localhost', port: 3000 }\n */\n defaults(): InferObject<T> {\n return this.parse({});\n }\n\n /**\n * Returns a partial object containing only the fields that have a default value set.\n * Fields without a `.default()` or `.catch()` are silently omitted rather than throwing.\n *\n * Useful for pre-filling forms where only some fields have defaults.\n *\n * @example\n * const Form = s.object({ name: s.string(), role: s.string().default('viewer') });\n * Form.partialDefaults(); // { role: 'viewer' }; name is omitted\n */\n partialDefaults(): Partial<InferObject<T>> {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(this.shape)) {\n const parsed = this.shape[key]._parseFullSync(undefined);\n\n if (parsed.issues.length === 0) {\n defineOwnProperty(result, key, parsed.data);\n }\n }\n\n return result as Partial<InferObject<T>>;\n }\n\n /**\n * Returns an array of field keys that are **required** (not optional and not nullish).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.requiredFields(); // ['id']\n */\n requiredFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => !this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Returns an array of field keys that are **optional** (accept `undefined`).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.optionalFields(); // ['name']\n */\n optionalFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Allow additional unknown properties (relaxed mode).\n * Default is strict mode (rejects unknown keys).\n *\n * Returns `ObjectSchema<T>` so fluent methods like `.pick()`, `.omit()`,\n * `.extend()`, and `.partial()` remain usable after calling `.relaxed()`.\n */\n relaxed(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, true);\n }\n\n /**\n * Alias for the default strict mode: rejects unknown keys.\n * Useful after calling `.relaxed()` to return a new strict schema.\n */\n strict(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, false);\n }\n\n /**\n * Returns a union schema of the object's key names as literal schemas.\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string() });\n * User.keyof(); // UnionSchema: validates 'id' | 'name'\n */\n keyof(): UnionSchema<readonly [LiteralSchema<keyof T & string>, ...LiteralSchema<keyof T & string>[]]> {\n const keys = Object.keys(this.shape) as (keyof T & string)[];\n const schemas = keys.map((k) => new LiteralSchema(k)) as unknown as readonly [\n LiteralSchema<keyof T & string>,\n ...LiteralSchema<keyof T & string>[],\n ];\n\n return new UnionSchema(schemas);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const fields: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of Object.entries(this.shape)) {\n defineOwnProperty(fields, key, schema.definition());\n }\n\n return { ...this._describeBase(), fields, kind: 'object', strict: !this._isRelaxed };\n }\n\n merge<U extends ObjectShape>(other: ObjectSchema<U>): ObjectSchema<T & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(other.shape)]) as any,\n other._isRelaxed,\n );\n }\n}\n"],"mappings":"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"}
@@ -61,7 +61,7 @@ export declare class ObjectSchema<T extends ObjectShape> extends Schema<InferObj
61
61
  *
62
62
  * @example
63
63
  * const Form = s.object({ name: s.string(), role: s.string().default('viewer') });
64
- * Form.partialDefaults(); // { role: 'viewer' } — name is omitted
64
+ * Form.partialDefaults(); // { role: 'viewer' }; name is omitted
65
65
  */
66
66
  partialDefaults(): Partial<InferObject<T>>;
67
67
  /**
@@ -89,7 +89,7 @@ export declare class ObjectSchema<T extends ObjectShape> extends Schema<InferObj
89
89
  */
90
90
  relaxed(): ObjectSchema<T>;
91
91
  /**
92
- * Alias for the default strict mode — rejects unknown keys.
92
+ * Alias for the default strict mode: rejects unknown keys.
93
93
  * Useful after calling `.relaxed()` to return a new strict schema.
94
94
  */
95
95
  strict(): ObjectSchema<T>;
@@ -98,7 +98,7 @@ export declare class ObjectSchema<T extends ObjectShape> extends Schema<InferObj
98
98
  *
99
99
  * @example
100
100
  * const User = s.object({ id: s.number(), name: s.string() });
101
- * User.keyof(); // UnionSchema — validates 'id' | 'name'
101
+ * User.keyof(); // UnionSchema: validates 'id' | 'name'
102
102
  */
103
103
  keyof(): UnionSchema<readonly [LiteralSchema<keyof T & string>, ...LiteralSchema<keyof T & string>[]]>;
104
104
  protected _toDescriptorImpl(): SchemaDescriptor;
@@ -1 +1 @@
1
- {"version":3,"file":"object.js","names":[],"sources":["../../src/schemas/object.ts"],"sourcesContent":["import type {\n AcceptsMissing,\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema } from '../core';\nimport { defineOwnProperty, isUnsafeObjectKey, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { UnionSchema } from './union';\n\nexport type ObjectShape = Record<string, AnySchema>;\nexport type InferObject<T extends ObjectShape> = { [K in keyof T]: InferOutput<T[K]> };\ntype OptionalInputKeys<T extends ObjectShape> = {\n [K in keyof T]: T[K] extends AcceptsMissing ? K : never;\n}[keyof T];\ntype Simplify<T> = { [K in keyof T]: T[K] };\nexport type InferObjectInput<T extends ObjectShape> = Simplify<\n { [K in Exclude<keyof T, OptionalInputKeys<T>>]: InferInput<T[K]> } & {\n [K in OptionalInputKeys<T>]?: InferInput<T[K]>;\n }\n>;\n\nexport class ObjectSchema<T extends ObjectShape> extends Schema<InferObject<T>, InferObjectInput<T>> {\n readonly shape: T;\n private readonly _isRelaxed: boolean;\n\n protected override get _kind(): string {\n return 'object';\n }\n\n constructor(shape: T, isRelaxed = false) {\n super();\n this.shape = Object.freeze(objectFromEntries(Object.entries(shape))) as T;\n this._isRelaxed = isRelaxed;\n }\n\n private _unknownKeys(obj: Record<string, unknown>): string[] {\n return Object.keys(obj).filter((k) => !Object.hasOwn(this.shape, k));\n }\n\n private _strictUnknownKeyIssues(obj: Record<string, unknown>, ctx: ParseContext): Issue[] {\n if (this._isRelaxed) return [];\n\n const unknownKeys = this._unknownKeys(obj);\n\n if (unknownKeys.length === 0) return [];\n\n return [\n {\n code: ErrorCode.invalid_keys,\n message: ctx.messages.object.invalidKeys({ keys: unknownKeys }),\n params: { keys: unknownKeys },\n path: [],\n },\n ];\n }\n\n private _copyRelaxedUnknownKeys(obj: Record<string, unknown>, output: Record<string, unknown>): void {\n if (!this._isRelaxed) return;\n\n for (const key of this._unknownKeys(obj)) {\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(key)) continue;\n\n defineOwnProperty(output, key, obj[key]);\n }\n }\n\n private _guardObjectInput(\n value: unknown,\n ctx: ParseContext,\n ): { obj: Record<string, unknown>; ok: true } | { issues: Issue[]; ok: false } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.object.type(), path: [] }],\n ok: false,\n };\n }\n\n return { obj: value as Record<string, unknown>, ok: true };\n }\n\n private _createObjectParseContext(\n obj: Record<string, unknown>,\n ctx: ParseContext,\n ): {\n issues: Issue[];\n output: Record<string, unknown>;\n } {\n return {\n issues: [...this._strictUnknownKeyIssues(obj, ctx)],\n output: {},\n };\n }\n\n private _rebuildWith<U extends ObjectShape>(shape: U, isRelaxed = this._isRelaxed): ObjectSchema<U> {\n return this._copyStateTo(new ObjectSchema(shape, isRelaxed)) as unknown as ObjectSchema<U>;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n for (const key of Object.keys(this.shape)) {\n const fieldSchema = this.shape[key];\n const result = fieldSchema._parseFullSync(obj[key], ctx);\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n // Failed field keys are intentionally omitted from parsed output so\n // object-level checks can branch on key presence.\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n const keys = Object.keys(this.shape);\n const results = await Promise.all(keys.map((key) => this.shape[key]._parseFullAsync(obj[key], ctx)));\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const result = results[i];\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n partial(): ObjectSchema<{\n [K in keyof T]: Schema<InferOutput<T[K]> | undefined, InferInput<T[K]> | undefined> & AcceptsMissing;\n }>;\n partial<K extends keyof T>(\n ...keys: K[]\n ): ObjectSchema<\n Omit<T, K> & {\n [P in K]: Schema<InferOutput<T[P]> | undefined, InferInput<T[P]> | undefined> & AcceptsMissing;\n }\n >;\n partial<K extends keyof T>(...keys: K[]): ObjectSchema<any> {\n const targetKeys = keys.length > 0 ? new Set(keys as string[]) : null;\n\n return this._rebuildWith(\n objectFromEntries(\n Object.entries(this.shape).map(([k, s]) => [k, targetKeys === null || targetKeys.has(k) ? s.optional() : s]),\n ) as any,\n this._isRelaxed,\n );\n }\n\n override optional(): ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing {\n return super.optional() as ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing;\n }\n\n override nullable(): ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null> {\n return super.nullable() as ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null>;\n }\n\n override nullish(): ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing {\n return super.nullish() as ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing;\n }\n\n override required(): ObjectSchema<T> &\n Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>> {\n return this._rebuildWith(\n objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.required()])) as any,\n this._isRelaxed,\n ) as ObjectSchema<T> & Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>>;\n }\n\n extend<U extends ObjectShape>(extra: U): ObjectSchema<Omit<T, keyof U> & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(extra)]) as any,\n this._isRelaxed,\n );\n }\n\n pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => keySet.has(k))) as any);\n }\n\n omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => !keySet.has(k))) as any);\n }\n\n /**\n * Returns a fully default-filled object by parsing `{}` against this schema.\n * Every required field must have a `.default()` value set; if any required\n * field is missing a default, this method throws a `SpellValidationError`.\n *\n * @example\n * const Config = s.object({ host: s.string().default('localhost'), port: s.number().default(3000) });\n * Config.defaults(); // { host: 'localhost', port: 3000 }\n */\n defaults(): InferObject<T> {\n return this.parse({});\n }\n\n /**\n * Returns a partial object containing only the fields that have a default value set.\n * Fields without a `.default()` or `.catch()` are silently omitted rather than throwing.\n *\n * Useful for pre-filling forms where only some fields have defaults.\n *\n * @example\n * const Form = s.object({ name: s.string(), role: s.string().default('viewer') });\n * Form.partialDefaults(); // { role: 'viewer' } — name is omitted\n */\n partialDefaults(): Partial<InferObject<T>> {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(this.shape)) {\n const parsed = this.shape[key]._parseFullSync(undefined);\n\n if (parsed.issues.length === 0) {\n defineOwnProperty(result, key, parsed.data);\n }\n }\n\n return result as Partial<InferObject<T>>;\n }\n\n /**\n * Returns an array of field keys that are **required** (not optional and not nullish).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.requiredFields(); // ['id']\n */\n requiredFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => !this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Returns an array of field keys that are **optional** (accept `undefined`).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.optionalFields(); // ['name']\n */\n optionalFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Allow additional unknown properties (relaxed mode).\n * Default is strict mode (rejects unknown keys).\n *\n * Returns `ObjectSchema<T>` so fluent methods like `.pick()`, `.omit()`,\n * `.extend()`, and `.partial()` remain usable after calling `.relaxed()`.\n */\n relaxed(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, true);\n }\n\n /**\n * Alias for the default strict mode — rejects unknown keys.\n * Useful after calling `.relaxed()` to return a new strict schema.\n */\n strict(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, false);\n }\n\n /**\n * Returns a union schema of the object's key names as literal schemas.\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string() });\n * User.keyof(); // UnionSchema — validates 'id' | 'name'\n */\n keyof(): UnionSchema<readonly [LiteralSchema<keyof T & string>, ...LiteralSchema<keyof T & string>[]]> {\n const keys = Object.keys(this.shape) as (keyof T & string)[];\n const schemas = keys.map((k) => new LiteralSchema(k)) as unknown as readonly [\n LiteralSchema<keyof T & string>,\n ...LiteralSchema<keyof T & string>[],\n ];\n\n return new UnionSchema(schemas);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const fields: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of Object.entries(this.shape)) {\n defineOwnProperty(fields, key, schema.definition());\n }\n\n return { ...this._describeBase(), fields, kind: 'object', strict: !this._isRelaxed };\n }\n\n merge<U extends ObjectShape>(other: ObjectSchema<U>): ObjectSchema<T & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(other.shape)]) as any,\n other._isRelaxed,\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"object.js","names":[],"sources":["../../src/schemas/object.ts"],"sourcesContent":["import type {\n AcceptsMissing,\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema } from '../core';\nimport { defineOwnProperty, isUnsafeObjectKey, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { UnionSchema } from './union';\n\nexport type ObjectShape = Record<string, AnySchema>;\nexport type InferObject<T extends ObjectShape> = { [K in keyof T]: InferOutput<T[K]> };\ntype OptionalInputKeys<T extends ObjectShape> = {\n [K in keyof T]: T[K] extends AcceptsMissing ? K : never;\n}[keyof T];\ntype Simplify<T> = { [K in keyof T]: T[K] };\nexport type InferObjectInput<T extends ObjectShape> = Simplify<\n { [K in Exclude<keyof T, OptionalInputKeys<T>>]: InferInput<T[K]> } & {\n [K in OptionalInputKeys<T>]?: InferInput<T[K]>;\n }\n>;\n\nexport class ObjectSchema<T extends ObjectShape> extends Schema<InferObject<T>, InferObjectInput<T>> {\n readonly shape: T;\n private readonly _isRelaxed: boolean;\n\n protected override get _kind(): string {\n return 'object';\n }\n\n constructor(shape: T, isRelaxed = false) {\n super();\n this.shape = Object.freeze(objectFromEntries(Object.entries(shape))) as T;\n this._isRelaxed = isRelaxed;\n }\n\n private _unknownKeys(obj: Record<string, unknown>): string[] {\n return Object.keys(obj).filter((k) => !Object.hasOwn(this.shape, k));\n }\n\n private _strictUnknownKeyIssues(obj: Record<string, unknown>, ctx: ParseContext): Issue[] {\n if (this._isRelaxed) return [];\n\n const unknownKeys = this._unknownKeys(obj);\n\n if (unknownKeys.length === 0) return [];\n\n return [\n {\n code: ErrorCode.invalid_keys,\n message: ctx.messages.object.invalidKeys({ keys: unknownKeys }),\n params: { keys: unknownKeys },\n path: [],\n },\n ];\n }\n\n private _copyRelaxedUnknownKeys(obj: Record<string, unknown>, output: Record<string, unknown>): void {\n if (!this._isRelaxed) return;\n\n for (const key of this._unknownKeys(obj)) {\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(key)) continue;\n\n defineOwnProperty(output, key, obj[key]);\n }\n }\n\n private _guardObjectInput(\n value: unknown,\n ctx: ParseContext,\n ): { obj: Record<string, unknown>; ok: true } | { issues: Issue[]; ok: false } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.object.type(), path: [] }],\n ok: false,\n };\n }\n\n return { obj: value as Record<string, unknown>, ok: true };\n }\n\n private _createObjectParseContext(\n obj: Record<string, unknown>,\n ctx: ParseContext,\n ): {\n issues: Issue[];\n output: Record<string, unknown>;\n } {\n return {\n issues: [...this._strictUnknownKeyIssues(obj, ctx)],\n output: {},\n };\n }\n\n private _rebuildWith<U extends ObjectShape>(shape: U, isRelaxed = this._isRelaxed): ObjectSchema<U> {\n return this._copyStateTo(new ObjectSchema(shape, isRelaxed)) as unknown as ObjectSchema<U>;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n for (const key of Object.keys(this.shape)) {\n const fieldSchema = this.shape[key];\n const result = fieldSchema._parseFullSync(obj[key], ctx);\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n // Failed field keys are intentionally omitted from parsed output so\n // object-level checks can branch on key presence.\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n const keys = Object.keys(this.shape);\n const results = await Promise.all(keys.map((key) => this.shape[key]._parseFullAsync(obj[key], ctx)));\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const result = results[i];\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n partial(): ObjectSchema<{\n [K in keyof T]: Schema<InferOutput<T[K]> | undefined, InferInput<T[K]> | undefined> & AcceptsMissing;\n }>;\n partial<K extends keyof T>(\n ...keys: K[]\n ): ObjectSchema<\n Omit<T, K> & {\n [P in K]: Schema<InferOutput<T[P]> | undefined, InferInput<T[P]> | undefined> & AcceptsMissing;\n }\n >;\n partial<K extends keyof T>(...keys: K[]): ObjectSchema<any> {\n const targetKeys = keys.length > 0 ? new Set(keys as string[]) : null;\n\n return this._rebuildWith(\n objectFromEntries(\n Object.entries(this.shape).map(([k, s]) => [k, targetKeys === null || targetKeys.has(k) ? s.optional() : s]),\n ) as any,\n this._isRelaxed,\n );\n }\n\n override optional(): ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing {\n return super.optional() as ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing;\n }\n\n override nullable(): ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null> {\n return super.nullable() as ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null>;\n }\n\n override nullish(): ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing {\n return super.nullish() as ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing;\n }\n\n override required(): ObjectSchema<T> &\n Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>> {\n return this._rebuildWith(\n objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.required()])) as any,\n this._isRelaxed,\n ) as ObjectSchema<T> & Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>>;\n }\n\n extend<U extends ObjectShape>(extra: U): ObjectSchema<Omit<T, keyof U> & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(extra)]) as any,\n this._isRelaxed,\n );\n }\n\n pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => keySet.has(k))) as any);\n }\n\n omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => !keySet.has(k))) as any);\n }\n\n /**\n * Returns a fully default-filled object by parsing `{}` against this schema.\n * Every required field must have a `.default()` value set; if any required\n * field is missing a default, this method throws a `SpellValidationError`.\n *\n * @example\n * const Config = s.object({ host: s.string().default('localhost'), port: s.number().default(3000) });\n * Config.defaults(); // { host: 'localhost', port: 3000 }\n */\n defaults(): InferObject<T> {\n return this.parse({});\n }\n\n /**\n * Returns a partial object containing only the fields that have a default value set.\n * Fields without a `.default()` or `.catch()` are silently omitted rather than throwing.\n *\n * Useful for pre-filling forms where only some fields have defaults.\n *\n * @example\n * const Form = s.object({ name: s.string(), role: s.string().default('viewer') });\n * Form.partialDefaults(); // { role: 'viewer' }; name is omitted\n */\n partialDefaults(): Partial<InferObject<T>> {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(this.shape)) {\n const parsed = this.shape[key]._parseFullSync(undefined);\n\n if (parsed.issues.length === 0) {\n defineOwnProperty(result, key, parsed.data);\n }\n }\n\n return result as Partial<InferObject<T>>;\n }\n\n /**\n * Returns an array of field keys that are **required** (not optional and not nullish).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.requiredFields(); // ['id']\n */\n requiredFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => !this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Returns an array of field keys that are **optional** (accept `undefined`).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.optionalFields(); // ['name']\n */\n optionalFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Allow additional unknown properties (relaxed mode).\n * Default is strict mode (rejects unknown keys).\n *\n * Returns `ObjectSchema<T>` so fluent methods like `.pick()`, `.omit()`,\n * `.extend()`, and `.partial()` remain usable after calling `.relaxed()`.\n */\n relaxed(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, true);\n }\n\n /**\n * Alias for the default strict mode: rejects unknown keys.\n * Useful after calling `.relaxed()` to return a new strict schema.\n */\n strict(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, false);\n }\n\n /**\n * Returns a union schema of the object's key names as literal schemas.\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string() });\n * User.keyof(); // UnionSchema: validates 'id' | 'name'\n */\n keyof(): UnionSchema<readonly [LiteralSchema<keyof T & string>, ...LiteralSchema<keyof T & string>[]]> {\n const keys = Object.keys(this.shape) as (keyof T & string)[];\n const schemas = keys.map((k) => new LiteralSchema(k)) as unknown as readonly [\n LiteralSchema<keyof T & string>,\n ...LiteralSchema<keyof T & string>[],\n ];\n\n return new UnionSchema(schemas);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const fields: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of Object.entries(this.shape)) {\n defineOwnProperty(fields, key, schema.definition());\n }\n\n return { ...this._describeBase(), fields, kind: 'object', strict: !this._isRelaxed };\n }\n\n merge<U extends ObjectShape>(other: ObjectSchema<U>): ObjectSchema<T & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(other.shape)]) as any,\n other._isRelaxed,\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"raw-or.cjs","names":[],"sources":["../../src/schemas/raw-or.ts"],"sourcesContent":["/**\n * Helpers for accepting raw literal values alongside schema instances in\n * sUnion() and sIntersect() arguments.\n *\n * Moved out of literal.ts — this infrastructure belongs to the combinator\n * entry points (s.ts), not to LiteralSchema.\n */\n\nimport type { AnySchema } from '../core';\n\nimport { Schema } from '../core';\nimport { LiteralSchema } from './literal';\n\nexport type LiteralValue = string | number | boolean | null | undefined;\nexport type RawOrSchema = AnySchema | LiteralValue;\nexport type NormalizeItem<T> = T extends AnySchema ? T : T extends LiteralValue ? LiteralSchema<T> : never;\nexport type NormalizeItems<T extends readonly RawOrSchema[]> = { readonly [K in keyof T]: NormalizeItem<T[K]> };\n\nexport function normalizeToSchemas<T extends readonly RawOrSchema[]>(items: T): NormalizeItems<T> {\n return items.map((item) =>\n item instanceof Schema ? item : new LiteralSchema(item as LiteralValue),\n ) as unknown as NormalizeItems<T>;\n}\n"],"mappings":"0DAkBA,SAAgB,EAAqD,EAA6B,CAChG,OAAO,EAAM,IAAK,GAChB,aAAgB,EAAA,OAAS,EAAO,IAAI,EAAA,cAAc,CAAoB,CACxE,CACF"}
1
+ {"version":3,"file":"raw-or.cjs","names":[],"sources":["../../src/schemas/raw-or.ts"],"sourcesContent":["/**\n * Helpers for accepting raw literal values alongside schema instances in\n * sUnion() and sIntersect() arguments.\n *\n * Moved out of literal.ts: this infrastructure belongs to the combinator\n * entry points (s.ts), not to LiteralSchema.\n */\n\nimport type { AnySchema } from '../core';\n\nimport { Schema } from '../core';\nimport { LiteralSchema } from './literal';\n\nexport type LiteralValue = string | number | boolean | null | undefined;\nexport type RawOrSchema = AnySchema | LiteralValue;\nexport type NormalizeItem<T> = T extends AnySchema ? T : T extends LiteralValue ? LiteralSchema<T> : never;\nexport type NormalizeItems<T extends readonly RawOrSchema[]> = { readonly [K in keyof T]: NormalizeItem<T[K]> };\n\nexport function normalizeToSchemas<T extends readonly RawOrSchema[]>(items: T): NormalizeItems<T> {\n return items.map((item) =>\n item instanceof Schema ? item : new LiteralSchema(item as LiteralValue),\n ) as unknown as NormalizeItems<T>;\n}\n"],"mappings":"0DAkBA,SAAgB,EAAqD,EAA6B,CAChG,OAAO,EAAM,IAAK,GAChB,aAAgB,EAAA,OAAS,EAAO,IAAI,EAAA,cAAc,CAAoB,CACxE,CACF"}