@vielzeug/spell 1.2.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/README.md +4 -4
  2. package/dist/_dev.cjs +1 -1
  3. package/dist/_dev.cjs.map +1 -1
  4. package/dist/_dev.js +1 -1
  5. package/dist/_dev.js.map +1 -1
  6. package/dist/core.cjs +1 -1
  7. package/dist/core.cjs.map +1 -1
  8. package/dist/core.d.ts +29 -43
  9. package/dist/core.d.ts.map +1 -1
  10. package/dist/core.js +1 -1
  11. package/dist/core.js.map +1 -1
  12. package/dist/errors.cjs +2 -2
  13. package/dist/errors.cjs.map +1 -1
  14. package/dist/errors.d.ts +9 -11
  15. package/dist/errors.d.ts.map +1 -1
  16. package/dist/errors.js +2 -2
  17. package/dist/errors.js.map +1 -1
  18. package/dist/index.cjs +2 -1
  19. package/dist/index.cjs.map +1 -0
  20. package/dist/index.d.ts +11 -5
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -1
  23. package/dist/index.js.map +1 -0
  24. package/dist/json-schema.cjs +1 -1
  25. package/dist/json-schema.cjs.map +1 -1
  26. package/dist/json-schema.d.ts +3 -13
  27. package/dist/json-schema.d.ts.map +1 -1
  28. package/dist/json-schema.js +1 -1
  29. package/dist/json-schema.js.map +1 -1
  30. package/dist/json.cjs +1 -0
  31. package/dist/json.d.ts +2 -0
  32. package/dist/json.d.ts.map +1 -0
  33. package/dist/json.js +1 -0
  34. package/dist/messages.cjs +1 -1
  35. package/dist/messages.cjs.map +1 -1
  36. package/dist/messages.d.ts +3 -35
  37. package/dist/messages.d.ts.map +1 -1
  38. package/dist/messages.js +1 -1
  39. package/dist/messages.js.map +1 -1
  40. package/dist/predicates.cjs +1 -0
  41. package/dist/predicates.d.ts +3 -0
  42. package/dist/predicates.d.ts.map +1 -0
  43. package/dist/predicates.js +1 -0
  44. package/dist/s.cjs +1 -1
  45. package/dist/s.cjs.map +1 -1
  46. package/dist/s.d.ts +12 -14
  47. package/dist/s.d.ts.map +1 -1
  48. package/dist/s.js +1 -1
  49. package/dist/s.js.map +1 -1
  50. package/dist/schemas/array.cjs +1 -1
  51. package/dist/schemas/array.cjs.map +1 -1
  52. package/dist/schemas/array.d.ts +7 -7
  53. package/dist/schemas/array.d.ts.map +1 -1
  54. package/dist/schemas/array.js +1 -1
  55. package/dist/schemas/array.js.map +1 -1
  56. package/dist/schemas/bigint.cjs +1 -1
  57. package/dist/schemas/bigint.cjs.map +1 -1
  58. package/dist/schemas/bigint.d.ts +2 -2
  59. package/dist/schemas/bigint.d.ts.map +1 -1
  60. package/dist/schemas/bigint.js +1 -1
  61. package/dist/schemas/bigint.js.map +1 -1
  62. package/dist/schemas/boolean.cjs +1 -1
  63. package/dist/schemas/boolean.cjs.map +1 -1
  64. package/dist/schemas/boolean.d.ts +2 -2
  65. package/dist/schemas/boolean.d.ts.map +1 -1
  66. package/dist/schemas/boolean.js +1 -1
  67. package/dist/schemas/boolean.js.map +1 -1
  68. package/dist/schemas/date.cjs +1 -1
  69. package/dist/schemas/date.cjs.map +1 -1
  70. package/dist/schemas/date.d.ts +2 -2
  71. package/dist/schemas/date.d.ts.map +1 -1
  72. package/dist/schemas/date.js +1 -1
  73. package/dist/schemas/date.js.map +1 -1
  74. package/dist/schemas/enum.cjs +1 -1
  75. package/dist/schemas/enum.cjs.map +1 -1
  76. package/dist/schemas/enum.d.ts +2 -2
  77. package/dist/schemas/enum.d.ts.map +1 -1
  78. package/dist/schemas/enum.js +1 -1
  79. package/dist/schemas/enum.js.map +1 -1
  80. package/dist/schemas/instanceof.cjs +1 -1
  81. package/dist/schemas/instanceof.cjs.map +1 -1
  82. package/dist/schemas/instanceof.d.ts +2 -2
  83. package/dist/schemas/instanceof.d.ts.map +1 -1
  84. package/dist/schemas/instanceof.js +1 -1
  85. package/dist/schemas/instanceof.js.map +1 -1
  86. package/dist/schemas/intersect.cjs +1 -1
  87. package/dist/schemas/intersect.cjs.map +1 -1
  88. package/dist/schemas/intersect.d.ts +2 -2
  89. package/dist/schemas/intersect.d.ts.map +1 -1
  90. package/dist/schemas/intersect.js +1 -1
  91. package/dist/schemas/intersect.js.map +1 -1
  92. package/dist/schemas/lazy.cjs +1 -1
  93. package/dist/schemas/lazy.cjs.map +1 -1
  94. package/dist/schemas/lazy.d.ts +3 -3
  95. package/dist/schemas/lazy.d.ts.map +1 -1
  96. package/dist/schemas/lazy.js +1 -1
  97. package/dist/schemas/lazy.js.map +1 -1
  98. package/dist/schemas/literal.cjs +1 -1
  99. package/dist/schemas/literal.cjs.map +1 -1
  100. package/dist/schemas/literal.d.ts +2 -2
  101. package/dist/schemas/literal.d.ts.map +1 -1
  102. package/dist/schemas/literal.js +1 -1
  103. package/dist/schemas/literal.js.map +1 -1
  104. package/dist/schemas/map.cjs +1 -1
  105. package/dist/schemas/map.cjs.map +1 -1
  106. package/dist/schemas/map.d.ts +7 -7
  107. package/dist/schemas/map.d.ts.map +1 -1
  108. package/dist/schemas/map.js +1 -1
  109. package/dist/schemas/map.js.map +1 -1
  110. package/dist/schemas/never.cjs +1 -1
  111. package/dist/schemas/never.cjs.map +1 -1
  112. package/dist/schemas/never.d.ts +2 -2
  113. package/dist/schemas/never.d.ts.map +1 -1
  114. package/dist/schemas/never.js +1 -1
  115. package/dist/schemas/never.js.map +1 -1
  116. package/dist/schemas/number.cjs +1 -1
  117. package/dist/schemas/number.cjs.map +1 -1
  118. package/dist/schemas/number.d.ts +3 -3
  119. package/dist/schemas/number.d.ts.map +1 -1
  120. package/dist/schemas/number.js +1 -1
  121. package/dist/schemas/number.js.map +1 -1
  122. package/dist/schemas/object.cjs +1 -1
  123. package/dist/schemas/object.cjs.map +1 -1
  124. package/dist/schemas/object.d.ts +21 -15
  125. package/dist/schemas/object.d.ts.map +1 -1
  126. package/dist/schemas/object.js +1 -1
  127. package/dist/schemas/object.js.map +1 -1
  128. package/dist/schemas/record.cjs +1 -1
  129. package/dist/schemas/record.cjs.map +1 -1
  130. package/dist/schemas/record.d.ts +7 -7
  131. package/dist/schemas/record.d.ts.map +1 -1
  132. package/dist/schemas/record.js +1 -1
  133. package/dist/schemas/record.js.map +1 -1
  134. package/dist/schemas/set.cjs +1 -1
  135. package/dist/schemas/set.cjs.map +1 -1
  136. package/dist/schemas/set.d.ts +6 -6
  137. package/dist/schemas/set.d.ts.map +1 -1
  138. package/dist/schemas/set.js +1 -1
  139. package/dist/schemas/set.js.map +1 -1
  140. package/dist/schemas/string.cjs +1 -1
  141. package/dist/schemas/string.cjs.map +1 -1
  142. package/dist/schemas/string.d.ts +6 -12
  143. package/dist/schemas/string.d.ts.map +1 -1
  144. package/dist/schemas/string.js +1 -1
  145. package/dist/schemas/string.js.map +1 -1
  146. package/dist/schemas/tuple.cjs +1 -1
  147. package/dist/schemas/tuple.cjs.map +1 -1
  148. package/dist/schemas/tuple.d.ts +3 -3
  149. package/dist/schemas/tuple.d.ts.map +1 -1
  150. package/dist/schemas/tuple.js +1 -1
  151. package/dist/schemas/tuple.js.map +1 -1
  152. package/dist/schemas/union.cjs +1 -1
  153. package/dist/schemas/union.cjs.map +1 -1
  154. package/dist/schemas/union.d.ts +2 -2
  155. package/dist/schemas/union.d.ts.map +1 -1
  156. package/dist/schemas/union.js +1 -1
  157. package/dist/schemas/union.js.map +1 -1
  158. package/dist/schemas/variant.cjs +1 -1
  159. package/dist/schemas/variant.cjs.map +1 -1
  160. package/dist/schemas/variant.d.ts +7 -5
  161. package/dist/schemas/variant.d.ts.map +1 -1
  162. package/dist/schemas/variant.js +1 -1
  163. package/dist/schemas/variant.js.map +1 -1
  164. package/dist/spell.cjs +2 -2
  165. package/dist/spell.cjs.map +1 -1
  166. package/dist/spell.iife.js +2 -2
  167. package/dist/spell.iife.js.map +1 -1
  168. package/dist/spell.js +2 -2
  169. package/dist/spell.js.map +1 -1
  170. package/dist/types.cjs +1 -1
  171. package/dist/types.cjs.map +1 -1
  172. package/dist/types.d.ts +61 -26
  173. package/dist/types.d.ts.map +1 -1
  174. package/dist/types.js +1 -1
  175. package/dist/types.js.map +1 -1
  176. package/package.json +18 -5
@@ -1 +1 @@
1
- {"version":3,"file":"string.js","names":[],"sources":["../../src/schemas/string.ts"],"sourcesContent":["import type { AnySchema, MessageFn, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\nimport {\n isBase64,\n isBase64url,\n isCuid,\n isCuid2,\n isDuration,\n isEmail,\n isEmoji,\n isHex,\n isHexColor,\n isIp,\n isIsoDate,\n isIsoDateTime,\n isJwt,\n isNanoid,\n isNumeric,\n isSemver,\n isSlug,\n isTime,\n isUlid,\n isUrl,\n isUuid,\n} from '../formats';\nimport { _messages, _dev } from '../messages';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface StringAnnotations extends Record<string, unknown> {\n contentEncoding?: string;\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string | null;\n}\n\ntype UrlOptions = {\n message?: MessageFn<{ value: string }>;\n protocols?: readonly string[];\n};\n\nexport class StringSchema<Input = string> extends Schema<string, Input> {\n protected override get _kind(): string {\n return 'string';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'string' ? null : fail(ErrorCode.invalid_type, (ctx?.messages ?? _messages()).string.type()),\n );\n }\n\n min(length: number, message: MessageFn<{ min: number; value: string }> = (ctx) => _messages().string.min(ctx)): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length >= length) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: length, value: value as string }), {\n min: length,\n });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n minLength: ann.minLength === undefined ? length : Math.max(ann.minLength, length),\n };\n },\n );\n }\n\n max(length: number, message: MessageFn<{ max: number; value: string }> = (ctx) => _messages().string.max(ctx)): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length <= length) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { max: length, value: value as string }), {\n max: length,\n });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n maxLength: ann.maxLength === undefined ? length : Math.min(ann.maxLength, length),\n };\n },\n );\n }\n\n length(\n exact: number,\n message: MessageFn<{ exact: number; value: string }> = (ctx) => _messages().string.length(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length === exact) return null;\n\n return fail(ErrorCode.invalid_length, resolveMessage(message, { exact, value: value as string }), { exact });\n },\n (ann) => ({ ...ann, maxLength: exact, minLength: exact }),\n );\n }\n\n /**\n * Alias for `.nonEmpty()` — validates that the string is not empty.\n * Provided for discoverability alongside `ArraySchema.nonEmpty()`.\n */\n nonempty(message: MessageFn<{ min: number; value: string }> = () => _messages().string.nonEmpty()): this {\n return this.nonEmpty(message);\n }\n\n nonEmpty(message: MessageFn<{ min: number; value: string }> = () => _messages().string.nonEmpty()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length > 0) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: 1, value: value as string }), { min: 1 });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return { ...ann, minLength: Math.max(ann.minLength ?? 0, 1) };\n },\n );\n }\n\n startsWith(\n prefix: string,\n message: MessageFn<{ prefix: string; value: string }> = (ctx) => _messages().string.startsWith(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n if ((value as string).startsWith(prefix)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { prefix, value: value as string }), { prefix });\n });\n }\n\n endsWith(\n suffix: string,\n message: MessageFn<{ suffix: string; value: string }> = (ctx) => _messages().string.endsWith(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n if ((value as string).endsWith(suffix)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { suffix, value: value as string }), { suffix });\n });\n }\n\n includes(\n substr: string,\n message: MessageFn<{ substr: string; value: string }> = (ctx) => _messages().string.includes(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n if ((value as string).includes(substr)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { substr, value: value as string }), {\n includes: substr,\n });\n });\n }\n\n /**\n * Validates that the string matches the given regular expression.\n *\n * **Security note:** Stateful `/g` and `/y` flags are stripped automatically to prevent\n * `lastIndex`-based bugs. However, caller-supplied patterns with catastrophic backtracking\n * (e.g. `/(a+)+$/`) are a ReDoS risk when validating untrusted input in server-side contexts.\n * Prefer well-tested, bounded patterns for user-facing validation.\n *\n * **`.equals()` note:** `.equals()` only compares descriptor-level annotations, never runtime\n * validator behavior. Chaining more than one `.regex()` collapses the descriptor `pattern` to\n * `null` (ambiguous), so two schemas with *different* pairs of regexes can compare equal even\n * though they accept different strings. This mirrors `.equals()`'s general limitation of\n * ignoring custom `.validate()`/`.refine()` logic — avoid relying on `.equals()` for schemas\n * with more than one `.regex()` constraint.\n */\n regex(pattern: RegExp, message: MessageFn<{ value: string }> = (ctx) => _messages().string.regex(ctx)): this {\n const safePattern = new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, ''));\n\n return this._addConstraint(\n (value, _ctx) => {\n // Caller-supplied regexes still run against untrusted strings; spell can\n // neutralize stateful /g and /y flags but cannot make arbitrary patterns\n // immune to catastrophic backtracking without breaking the API.\n if (safePattern.test(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n pattern: safePattern.source,\n });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n if (ann.pattern === null) return ann; // already ambiguous\n\n if (ann.pattern === undefined) return { ...ann, pattern: safePattern.source };\n\n if (ann.pattern !== safePattern.source) {\n _dev(\n '[spell] Multiple .regex() constraints detected on a single string schema. ' +\n 'JSON Schema `pattern` cannot represent multiple patterns and will be omitted from toJsonSchema() output.',\n );\n\n return { ...ann, pattern: null };\n }\n\n return ann;\n },\n );\n }\n\n email(message: MessageFn<{ value: string }> = () => _messages().string.email()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isEmail(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'email' });\n },\n (ann) => ({ ...ann, format: 'email' }),\n );\n }\n\n url(options: UrlOptions = {}): this {\n const { message = () => _messages().string.url(), protocols = ['http', 'https'] } = options;\n\n return this._addConstraint(\n (value, _ctx) => {\n if (isUrl(value as string, protocols)) return null;\n\n return fail(ErrorCode.invalid_url, resolveMessage(message, { value: value as string }), { format: 'url' });\n },\n (ann) => ({ ...ann, format: 'uri' }),\n );\n }\n\n uuid(message: MessageFn<{ value: string }> = () => _messages().string.uuid()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isUuid(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'uuid' });\n },\n (ann) => ({ ...ann, format: 'uuid' }),\n );\n }\n\n isoDate(message: MessageFn<{ value: string }> = () => _messages().string.date()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isIsoDate(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n format: 'iso-date',\n });\n },\n (ann) => ({ ...ann, format: 'date' }),\n );\n }\n\n isoDateTime(message: MessageFn<{ value: string }> = () => _messages().string.dateTime()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isIsoDateTime(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n format: 'iso-datetime',\n });\n },\n (ann) => ({ ...ann, format: 'date-time' }),\n );\n }\n\n ip(message: MessageFn<{ value: string }> = () => _messages().string.ip()): this {\n return this._addConstraint((value, _ctx) => {\n if (isIp(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'ip' });\n });\n }\n\n cuid(message: MessageFn<{ value: string }> = () => _messages().string.cuid()): this {\n return this._addConstraint((value, _ctx) => {\n if (isCuid(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'cuid' });\n });\n }\n\n cuid2(message: MessageFn<{ value: string }> = () => _messages().string.cuid2()): this {\n return this._addConstraint((value, _ctx) => {\n if (isCuid2(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'cuid2' });\n });\n }\n\n ulid(message: MessageFn<{ value: string }> = () => _messages().string.ulid()): this {\n return this._addConstraint((value, _ctx) => {\n if (isUlid(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'ulid' });\n });\n }\n\n nanoid(length?: number, message: MessageFn<{ value: string }> = () => _messages().string.nanoid()): this {\n return this._addConstraint((value, _ctx) => {\n if (isNanoid(value as string, length)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'nanoid' });\n });\n }\n\n base64(message: MessageFn<{ value: string }> = () => _messages().string.base64()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isBase64(value as string)) return null;\n\n return fail(ErrorCode.invalid_base64, resolveMessage(message, { value: value as string }), {\n format: 'base64',\n });\n },\n (ann) => ({ ...ann, contentEncoding: 'base64' }),\n );\n }\n\n base64url(message: MessageFn<{ value: string }> = () => _messages().string.base64url()): this {\n return this._addConstraint((value, _ctx) => {\n if (isBase64url(value as string)) return null;\n\n return fail(ErrorCode.invalid_base64, resolveMessage(message, { value: value as string }), {\n format: 'base64url',\n });\n });\n }\n\n hex(message: MessageFn<{ value: string }> = () => _messages().string.hex()): this {\n return this._addConstraint((value, _ctx) => {\n if (isHex(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'hex' });\n });\n }\n\n hexColor(message: MessageFn<{ value: string }> = () => _messages().string.hexColor()): this {\n return this._addConstraint((value, _ctx) => {\n if (isHexColor(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n format: 'hex-color',\n });\n });\n }\n\n emoji(message: MessageFn<{ value: string }> = () => _messages().string.emoji()): this {\n return this._addConstraint((value, _ctx) => {\n if (isEmoji(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'emoji' });\n });\n }\n\n jwt(message: MessageFn<{ value: string }> = () => _messages().string.jwt()): this {\n return this._addConstraint((value, _ctx) => {\n if (isJwt(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'jwt' });\n });\n }\n\n time(message: MessageFn<{ value: string }> = () => _messages().string.time()): this {\n return this._addConstraint((value, _ctx) => {\n if (isTime(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'time' });\n });\n }\n\n duration(message: MessageFn<{ value: string }> = () => _messages().string.duration()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isDuration(value as string)) return null;\n\n return fail(ErrorCode.invalid_duration, resolveMessage(message, { value: value as string }), {\n format: 'duration',\n });\n },\n (ann) => ({ ...ann, format: 'duration' }),\n );\n }\n\n semver(message: MessageFn<{ value: string }> = () => _messages().string.semver()): this {\n return this._addConstraint((value, _ctx) => {\n if (isSemver(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'semver' });\n });\n }\n\n slug(message: MessageFn<{ value: string }> = () => _messages().string.slug()): this {\n return this._addConstraint((value, _ctx) => {\n if (isSlug(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'slug' });\n });\n }\n\n numeric(message: MessageFn<{ value: string }> = () => _messages().string.numeric()): this {\n return this._addConstraint((value, _ctx) => {\n if (isNumeric(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'numeric' });\n });\n }\n\n /**\n * Returns a new schema that coerces the input to a string via `String(value)` before validation.\n * `null` and `undefined` are passed through unchanged.\n *\n * Equivalent to `s.coerce.string()`.\n */\n coerce(): StringSchema<unknown> {\n return StringSchema.coerce();\n }\n\n /**\n * **Note:** `trim()` adds a preprocessor. Preprocessors are not serializable —\n * `toDescriptor()` will warn if preprocessors are present.\n */\n trim(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.trim() : v));\n }\n\n /**\n * **Note:** `lowercase()` adds a preprocessor. Preprocessors are not serializable —\n * `toDescriptor()` will warn if preprocessors are present.\n */\n lowercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toLowerCase() : v));\n }\n\n /**\n * **Note:** `uppercase()` adds a preprocessor. Preprocessors are not serializable —\n * `toDescriptor()` will warn if preprocessors are present.\n */\n uppercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toUpperCase() : v));\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n if (visitor.string) return visitor.string(this);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as StringAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.contentEncoding !== undefined ? { contentEncoding: ann.contentEncoding } : {}),\n ...(ann.format !== undefined ? { format: ann.format } : {}),\n ...(ann.maxLength !== undefined ? { maxLength: ann.maxLength } : {}),\n ...(ann.minLength !== undefined ? { minLength: ann.minLength } : {}),\n ...(ann.pattern !== undefined ? { pattern: ann.pattern } : {}),\n kind: 'string',\n };\n }\n\n protected override _equalsImpl(other: AnySchema): boolean {\n if (!(other instanceof StringSchema)) return false;\n\n return this._annotationsEqual(other);\n }\n\n static coerce(): StringSchema<unknown> {\n return new StringSchema().preprocess((v: unknown) => (v == null ? v : String(v)));\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"string.js","names":[],"sources":["../../src/schemas/string.ts"],"sourcesContent":["import type { MessageFn, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\nimport {\n isBase64,\n isBase64url,\n isCuid,\n isCuid2,\n isDuration,\n isEmail,\n isEmoji,\n isHex,\n isHexColor,\n isIp,\n isIsoDate,\n isIsoDateTime,\n isJwt,\n isNanoid,\n isNumeric,\n isSemver,\n isSlug,\n isTime,\n isUlid,\n isUrl,\n isUuid,\n} from '../formats';\nimport { _dev } from '../messages';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface StringAnnotations extends Record<string, unknown> {\n contentEncoding?: string;\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string | null;\n}\n\ntype UrlOptions = {\n message?: MessageFn<{ value: string }>;\n protocols?: readonly string[];\n};\n\nexport class StringSchema<Input = string, Mode extends import('../core').SchemaMode = 'sync'> extends Schema<\n string,\n Input,\n Mode\n> {\n protected override get _kind(): string {\n return 'string';\n }\n\n override checkAsync(\n this: StringSchema<Input, 'sync'>,\n fn: (value: string, ctx: import('../core').CheckContext) => Promise<import('../core').ValidateResult>,\n ): StringSchema<Input, 'async'> {\n return this._addCheck(fn, true) as unknown as StringSchema<Input, 'async'>;\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'string' ? null : fail(ErrorCode.invalid_type, ctx!.messages.string.type()),\n );\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.string.min, { min: length, value: value as string }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n minLength: ann.minLength === undefined ? length : Math.max(ann.minLength, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.string.max, { max: length, value: value as string }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n maxLength: ann.maxLength === undefined ? length : Math.min(ann.maxLength, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.string.length, { exact, value: value as string }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxLength: exact, minLength: exact }),\n );\n }\n\n /**\n * Alias for `.nonEmpty()` — validates that the string is not empty.\n * Provided for discoverability alongside `ArraySchema.nonEmpty()`.\n */\n nonempty(message?: MessageFn<{ min: number; value: string }>): this {\n return this.nonEmpty(message);\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length > 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.string.nonEmpty, { min: 1, value: value as string }),\n { min: 1 },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return { ...ann, minLength: Math.max(ann.minLength ?? 0, 1) };\n },\n );\n }\n\n startsWith(prefix: string, message?: MessageFn<{ prefix: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).startsWith(prefix)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.startsWith, { prefix, value: value as string }),\n { prefix },\n );\n });\n }\n\n endsWith(suffix: string, message?: MessageFn<{ suffix: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).endsWith(suffix)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.endsWith, { suffix, value: value as string }),\n { suffix },\n );\n });\n }\n\n includes(substr: string, message?: MessageFn<{ substr: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).includes(substr)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.includes, { substr, value: value as string }),\n {\n includes: substr,\n },\n );\n });\n }\n\n /**\n * Validates that the string matches the given regular expression.\n *\n * **Security note:** Stateful `/g` and `/y` flags are stripped automatically to prevent\n * `lastIndex`-based bugs. However, caller-supplied patterns with catastrophic backtracking\n * (e.g. `/(a+)+$/`) are a ReDoS risk when validating untrusted input in server-side contexts.\n * Prefer well-tested, bounded patterns for user-facing validation.\n *\n */\n regex(pattern: RegExp, message?: MessageFn<{ value: string }>): this {\n const safePattern = new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, ''));\n\n return this._addConstraint(\n (value, ctx) => {\n // Caller-supplied regexes still run against untrusted strings; spell can\n // neutralize stateful /g and /y flags but cannot make arbitrary patterns\n // immune to catastrophic backtracking without breaking the API.\n if (safePattern.test(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.regex, { value: value as string }),\n {\n pattern: safePattern.source,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n if (ann.pattern === null) return ann; // already ambiguous\n\n if (ann.pattern === undefined) return { ...ann, pattern: safePattern.source };\n\n if (ann.pattern !== safePattern.source) {\n _dev(\n '[spell] Multiple .regex() constraints detected on a single string schema. ' +\n 'JSON Schema `pattern` cannot represent multiple patterns and will be omitted from definition output.',\n );\n\n return { ...ann, pattern: null };\n }\n\n return ann;\n },\n );\n }\n\n email(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isEmail(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.email, { value: value as string }),\n { format: 'email' },\n );\n },\n (ann) => ({ ...ann, format: 'email' }),\n );\n }\n\n url(options: UrlOptions = {}): this {\n const { message, protocols = ['http', 'https'] } = options;\n\n return this._addConstraint(\n (value, ctx) => {\n if (isUrl(value as string, protocols)) return null;\n\n return fail(\n ErrorCode.invalid_url,\n resolveMessage(message ?? ctx!.messages.string.url, { value: value as string }),\n { format: 'url' },\n );\n },\n (ann) => ({ ...ann, format: 'uri' }),\n );\n }\n\n uuid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isUuid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.uuid, { value: value as string }),\n { format: 'uuid' },\n );\n },\n (ann) => ({ ...ann, format: 'uuid' }),\n );\n }\n\n isoDate(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isIsoDate(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.date, { value: value as string }),\n {\n format: 'iso-date',\n },\n );\n },\n (ann) => ({ ...ann, format: 'date' }),\n );\n }\n\n isoDateTime(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isIsoDateTime(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.dateTime, { value: value as string }),\n {\n format: 'iso-datetime',\n },\n );\n },\n (ann) => ({ ...ann, format: 'date-time' }),\n );\n }\n\n ip(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isIp(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.ip, { value: value as string }),\n { format: 'ip' },\n );\n });\n }\n\n cuid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isCuid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.cuid, { value: value as string }),\n { format: 'cuid' },\n );\n });\n }\n\n cuid2(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isCuid2(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.cuid2, { value: value as string }),\n { format: 'cuid2' },\n );\n });\n }\n\n ulid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isUlid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.ulid, { value: value as string }),\n { format: 'ulid' },\n );\n });\n }\n\n nanoid(length?: number, message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isNanoid(value as string, length)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.nanoid, { value: value as string }),\n { format: 'nanoid' },\n );\n });\n }\n\n base64(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isBase64(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_base64,\n resolveMessage(message ?? ctx!.messages.string.base64, { value: value as string }),\n {\n format: 'base64',\n },\n );\n },\n (ann) => ({ ...ann, contentEncoding: 'base64' }),\n );\n }\n\n base64url(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isBase64url(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_base64,\n resolveMessage(message ?? ctx!.messages.string.base64url, { value: value as string }),\n {\n format: 'base64url',\n },\n );\n });\n }\n\n hex(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isHex(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.hex, { value: value as string }),\n { format: 'hex' },\n );\n });\n }\n\n hexColor(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isHexColor(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.hexColor, { value: value as string }),\n {\n format: 'hex-color',\n },\n );\n });\n }\n\n emoji(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isEmoji(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.emoji, { value: value as string }),\n { format: 'emoji' },\n );\n });\n }\n\n jwt(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isJwt(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.jwt, { value: value as string }),\n { format: 'jwt' },\n );\n });\n }\n\n time(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isTime(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.time, { value: value as string }),\n { format: 'time' },\n );\n });\n }\n\n duration(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isDuration(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_duration,\n resolveMessage(message ?? ctx!.messages.string.duration, { value: value as string }),\n {\n format: 'duration',\n },\n );\n },\n (ann) => ({ ...ann, format: 'duration' }),\n );\n }\n\n semver(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isSemver(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.semver, { value: value as string }),\n { format: 'semver' },\n );\n });\n }\n\n slug(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isSlug(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.slug, { value: value as string }),\n { format: 'slug' },\n );\n });\n }\n\n numeric(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isNumeric(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.numeric, { value: value as string }),\n { format: 'numeric' },\n );\n });\n }\n\n /**\n * Returns a new schema that coerces the input to a string via `String(value)` before validation.\n * `null` and `undefined` are passed through unchanged.\n *\n * Equivalent to `s.coerce.string()`.\n */\n coerce(): StringSchema<unknown> {\n return StringSchema.coerce();\n }\n\n /**\n * **Note:** `trim()` adds a preprocessor. Preprocessors are not serializable —\n * `definition()` throws because preprocessors are not serializable.\n */\n trim(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.trim() : v));\n }\n\n /**\n * **Note:** `lowercase()` adds a preprocessor. Preprocessors are not serializable —\n * `definition()` throws because preprocessors are not serializable.\n */\n lowercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toLowerCase() : v));\n }\n\n /**\n * **Note:** `uppercase()` adds a preprocessor. Preprocessors are not serializable —\n * `definition()` throws because preprocessors are not serializable.\n */\n uppercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toUpperCase() : v));\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n if (visitor.string) return visitor.string(this);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as StringAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.contentEncoding !== undefined ? { contentEncoding: ann.contentEncoding } : {}),\n ...(ann.format !== undefined ? { format: ann.format } : {}),\n ...(ann.maxLength !== undefined ? { maxLength: ann.maxLength } : {}),\n ...(ann.minLength !== undefined ? { minLength: ann.minLength } : {}),\n ...(ann.pattern !== undefined ? { pattern: ann.pattern } : {}),\n kind: 'string',\n };\n }\n\n static coerce(): StringSchema<unknown> {\n return new StringSchema().preprocess((v: unknown) => (v == null ? v : String(v)));\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("../types.cjs"),t=require("../errors.cjs");require("../messages.cjs");const n=require("../core.cjs");var r=class r extends n.Schema{items;restSchema;get _kind(){return`tuple`}constructor(e,t=null){super(),this.items=e,this.restSchema=t}rest(e){return this._copyStateTo(new r(this.items,e))}_guardTupleInput(t,n){return this.restSchema===null&&t.length!==this.items.length?{issues:[{code:e.ErrorCode.invalid_length,message:n.messages.tuple.length({exact:this.items.length}),params:{exact:this.items.length},path:[]}],ok:!1}:this.restSchema!==null&&t.length<this.items.length?{issues:[{code:e.ErrorCode.too_small,message:n.messages.tuple.min({min:this.items.length}),params:{min:this.items.length},path:[]}],ok:!1}:{ok:!0,value:t}}_parse(n,r){if(!Array.isArray(n))return{data:n,issues:[{code:e.ErrorCode.invalid_type,message:r.messages.tuple.type(),path:[]}],typeOk:!1};let i=this._guardTupleInput(n,r);if(!i.ok)return{data:n,issues:i.issues,typeOk:!1};let a=[],o=[],s=i.value;for(let e=0;e<this.items.length;e++){let n=this.items[e]._parseFullSync(s[e],r);n.issues.length===0?o.push(n.data):(a.push(...t.prependIssuePath(n.issues,e)),o.push(s[e]))}if(this.restSchema!==null)for(let e=this.items.length;e<s.length;e++){let n=this.restSchema._parseFullSync(s[e],r);n.issues.length===0?o.push(n.data):(a.push(...t.prependIssuePath(n.issues,e)),o.push(s[e]))}return{data:o,issues:a,typeOk:!0}}async parseAsync(r,i){let a=i??n._makeCtx();return this._withCatchAsync(async()=>{let n=this._prepareInput(r);if(n.skip)return n.value;let i=n.value;if(!Array.isArray(i))throw new t.SpellValidationError([{code:e.ErrorCode.invalid_type,message:a.messages.tuple.type(),path:[]}]);let o=this._guardTupleInput(i,a);if(!o.ok)throw new t.SpellValidationError(o.issues);let s=o.value,c=[],l=[],u=await Promise.all(this.items.map((e,t)=>e._parseFullAsync(s[t],a)));for(let e=0;e<u.length;e++){let n=u[e];n.issues.length===0?l.push(n.data):(c.push(...t.prependIssuePath(n.issues,e)),l.push(s[e]))}let d=this.restSchema;if(d!==null){let e=s.slice(this.items.length),n=await Promise.all(e.map(e=>d._parseFullAsync(e,a)));for(let e=0;e<n.length;e++){let r=n[e],i=this.items.length+e;r.issues.length===0?l.push(r.data):(c.push(...t.prependIssuePath(r.issues,i)),l.push(s[i]))}}let f=await this._runValidatorsAsync(l,a),p=[...c,...f];if(p.length>0)throw new t.SpellValidationError(p);return this._runPostprocessors(l)})}_toDescriptorImpl(){return{...this._describeBase(),items:this.items.map(e=>e.toDescriptor()),kind:`tuple`,rest:this.restSchema===null?null:this.restSchema.toDescriptor()}}_walk(e){let t=this.items.map(t=>t.walk(e)),n=this.restSchema===null?null:this.restSchema.walk(e);return e.tuple?e.tuple(this,t,n):super._walk(e)}_equalsImpl(e){if(!(e instanceof r)||this.items.length!==e.items.length)return!1;for(let t=0;t<this.items.length;t++)if(!this.items[t].equals(e.items[t]))return!1;let t=this.restSchema,n=e.restSchema;return!(t===null!=(n===null)||t!==null&&n!==null&&!t.equals(n))}};exports.TupleSchema=r;
1
+ const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../core.cjs");var r=class r extends n.Schema{items;restSchema;get _kind(){return`tuple`}checkAsync(e){return this._addCheck(e,!0)}constructor(e,t=null){super(),this.items=e,this.restSchema=t}rest(e){return this._copyStateTo(new r(this.items,e))}_guardTupleInput(t,n){return this.restSchema===null&&t.length!==this.items.length?{issues:[{code:e.ErrorCode.invalid_length,message:n.messages.tuple.length({exact:this.items.length}),params:{exact:this.items.length},path:[]}],ok:!1}:this.restSchema!==null&&t.length<this.items.length?{issues:[{code:e.ErrorCode.too_small,message:n.messages.tuple.min({min:this.items.length}),params:{min:this.items.length},path:[]}],ok:!1}:{ok:!0,value:t}}_parse(n,r){if(!Array.isArray(n))return{data:n,issues:[{code:e.ErrorCode.invalid_type,message:r.messages.tuple.type(),path:[]}],typeOk:!1};let i=this._guardTupleInput(n,r);if(!i.ok)return{data:n,issues:i.issues,typeOk:!1};let a=[],o=[],s=i.value;for(let e=0;e<this.items.length;e++){let n=this.items[e]._parseFullSync(s[e],r);n.issues.length===0?o.push(n.data):(a.push(...t.prependIssuePath(n.issues,e)),o.push(s[e]))}if(this.restSchema!==null)for(let e=this.items.length;e<s.length;e++){let n=this.restSchema._parseFullSync(s[e],r);n.issues.length===0?o.push(n.data):(a.push(...t.prependIssuePath(n.issues,e)),o.push(s[e]))}return{data:o,issues:a,typeOk:!0}}async parseAsync(r,i){let a=i??n._makeCtx();return this._withCatchAsync(async()=>{let n=this._prepareInput(r);if(n.skip)return n.value;let i=n.value;if(!Array.isArray(i))throw new t.SpellValidationError([{code:e.ErrorCode.invalid_type,message:a.messages.tuple.type(),path:[]}]);let o=this._guardTupleInput(i,a);if(!o.ok)throw new t.SpellValidationError(o.issues);let s=o.value,c=[],l=[],u=await Promise.all(this.items.map((e,t)=>e._parseFullAsync(s[t],a)));for(let e=0;e<u.length;e++){let n=u[e];n.issues.length===0?l.push(n.data):(c.push(...t.prependIssuePath(n.issues,e)),l.push(s[e]))}let d=this.restSchema;if(d!==null){let e=s.slice(this.items.length),n=await Promise.all(e.map(e=>d._parseFullAsync(e,a)));for(let e=0;e<n.length;e++){let r=n[e],i=this.items.length+e;r.issues.length===0?l.push(r.data):(c.push(...t.prependIssuePath(r.issues,i)),l.push(s[i]))}}let f=await this._runValidatorsAsync(l,a),p=[...c,...f];if(p.length>0)throw new t.SpellValidationError(p);return this._runPostprocessors(l)})}_toDescriptorImpl(){return{...this._describeBase(),items:this.items.map(e=>e.definition()),kind:`tuple`,rest:this.restSchema===null?null:this.restSchema.definition()}}_walk(e){let t=this.items.map(t=>t.walk(e)),n=this.restSchema===null?null:this.restSchema.walk(e);return e.tuple?e.tuple(this,t,n):super._walk(e)}};exports.TupleSchema=r;
2
2
  //# sourceMappingURL=tuple.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tuple.cjs","names":[],"sources":["../../src/schemas/tuple.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { _messages } from '../messages';\n\nexport type TupleSchemas = readonly [AnySchema, ...AnySchema[]];\nexport type InferTuple<T extends TupleSchemas, R extends AnySchema | null = null> =\n R extends Schema<infer O>\n ? readonly [...{ [K in keyof T]: T[K] extends Schema<infer V> ? V : never }, ...O[]]\n : { readonly [K in keyof T]: T[K] extends Schema<infer V> ? V : never };\n\nexport class TupleSchema<T extends TupleSchemas, R extends AnySchema | null = null> extends Schema<InferTuple<T, R>> {\n readonly items: T;\n readonly restSchema: R;\n\n protected override get _kind(): string {\n return 'tuple';\n }\n\n constructor(items: T, restSchema: R = null as R) {\n super();\n this.items = items;\n this.restSchema = restSchema;\n }\n\n rest<U>(schema: Schema<U>): TupleSchema<T, Schema<U>> {\n return this._copyStateTo(new TupleSchema(this.items, schema));\n }\n\n private _guardTupleInput(\n value: unknown[],\n ctx: ParseContext,\n ): { ok: true; value: unknown[] } | { issues: Issue[]; ok: false } {\n if (this.restSchema === null && value.length !== this.items.length) {\n return {\n issues: [\n {\n code: ErrorCode.invalid_length,\n message: ctx.messages.tuple.length({ exact: this.items.length }),\n params: { exact: this.items.length },\n path: [],\n },\n ],\n ok: false,\n };\n }\n\n if (this.restSchema !== null && value.length < this.items.length) {\n return {\n issues: [\n {\n code: ErrorCode.too_small,\n message: ctx.messages.tuple.min({ min: this.items.length }),\n params: { min: this.items.length },\n path: [],\n },\n ],\n ok: false,\n };\n }\n\n return { ok: true, value };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return {\n data: value,\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.tuple.type(), path: [] }],\n typeOk: false,\n };\n }\n\n const guarded = this._guardTupleInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const issues: Issue[] = [];\n const output: unknown[] = [];\n const tupleValue = guarded.value;\n\n for (let i = 0; i < this.items.length; i++) {\n const result = this.items[i]._parseFullSync(tupleValue[i], ctx);\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n\n if (this.restSchema !== null) {\n for (let i = this.items.length; i < tupleValue.length; i++) {\n const result = this.restSchema._parseFullSync(tupleValue[i], ctx);\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n }\n\n return { data: output, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferTuple<T, R>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferTuple<T, R>;\n\n const raw = prepared.value;\n\n if (!Array.isArray(raw)) {\n throw new SpellValidationError([{ code: ErrorCode.invalid_type, message: c.messages.tuple.type(), path: [] }]);\n }\n\n const guarded = this._guardTupleInput(raw, c);\n\n if (!guarded.ok) throw new SpellValidationError(guarded.issues);\n\n const tupleValue = guarded.value;\n const issues: Issue[] = [];\n const output: unknown[] = [];\n\n const fixedResults = await Promise.all(this.items.map((schema, i) => schema._parseFullAsync(tupleValue[i], c)));\n\n for (let i = 0; i < fixedResults.length; i++) {\n const result = fixedResults[i];\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n\n const rest = this.restSchema;\n\n if (rest !== null) {\n const restItems = tupleValue.slice(this.items.length);\n const restResults = await Promise.all(restItems.map((item) => rest._parseFullAsync(item, c)));\n\n for (let i = 0; i < restResults.length; i++) {\n const result = restResults[i];\n const idx = this.items.length + i;\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, idx));\n output.push(tupleValue[idx]);\n }\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(output, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(output) as InferTuple<T, R>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n items: this.items.map((s) => s.toDescriptor()),\n kind: 'tuple',\n rest: this.restSchema !== null ? this.restSchema.toDescriptor() : null,\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const items = this.items.map((s) => s.walk(visitor));\n const rest = this.restSchema !== null ? this.restSchema.walk(visitor) : null;\n\n if (visitor.tuple) return visitor.tuple(this, items, rest);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof TupleSchema)) return false;\n\n if (this.items.length !== other.items.length) return false;\n\n for (let i = 0; i < this.items.length; i++) {\n if (!this.items[i].equals(other.items[i])) return false;\n }\n\n const rs = this.restSchema;\n const ors = other.restSchema;\n\n if ((rs === null) !== (ors === null)) return false;\n\n if (rs !== null && ors !== null && !rs.equals(ors)) return false;\n\n return true;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tuple.cjs","names":[],"sources":["../../src/schemas/tuple.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema, SpellValidationError, _makeCtx } from '../core';\n\nexport type TupleSchemas = readonly [AnySchema, ...AnySchema[]];\nexport type InferTuple<T extends TupleSchemas, R extends AnySchema | null = null> =\n R extends Schema<infer O>\n ? readonly [...{ [K in keyof T]: T[K] extends Schema<infer V> ? V : never }, ...O[]]\n : { readonly [K in keyof T]: T[K] extends Schema<infer V> ? V : never };\n\nexport class TupleSchema<\n T extends TupleSchemas,\n R extends AnySchema | null = null,\n Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<\n import('../core').InferSchemaMode<T[number] | Exclude<R, null>>\n >,\n> extends Schema<InferTuple<T, R>, unknown, Mode> {\n readonly items: T;\n readonly restSchema: R;\n\n protected override get _kind(): string {\n return 'tuple';\n }\n\n override checkAsync(\n this: TupleSchema<T, R, 'sync'>,\n fn: (value: InferTuple<T, R>, ctx: import('../core').CheckContext) => Promise<import('../core').ValidateResult>,\n ): TupleSchema<T, R, 'async'> {\n return this._addCheck(fn, true) as unknown as TupleSchema<T, R, 'async'>;\n }\n\n constructor(items: T, restSchema: R = null as R) {\n super();\n this.items = items;\n this.restSchema = restSchema;\n }\n\n rest<U extends AnySchema>(\n schema: U,\n ): TupleSchema<T, U, import('../core').MergeSchemaModes<Mode | import('../core').InferSchemaMode<U>>> {\n return this._copyStateTo(new TupleSchema(this.items, schema)) as unknown as TupleSchema<\n T,\n U,\n import('../core').MergeSchemaModes<Mode | import('../core').InferSchemaMode<U>>\n >;\n }\n\n private _guardTupleInput(\n value: unknown[],\n ctx: ParseContext,\n ): { ok: true; value: unknown[] } | { issues: Issue[]; ok: false } {\n if (this.restSchema === null && value.length !== this.items.length) {\n return {\n issues: [\n {\n code: ErrorCode.invalid_length,\n message: ctx.messages.tuple.length({ exact: this.items.length }),\n params: { exact: this.items.length },\n path: [],\n },\n ],\n ok: false,\n };\n }\n\n if (this.restSchema !== null && value.length < this.items.length) {\n return {\n issues: [\n {\n code: ErrorCode.too_small,\n message: ctx.messages.tuple.min({ min: this.items.length }),\n params: { min: this.items.length },\n path: [],\n },\n ],\n ok: false,\n };\n }\n\n return { ok: true, value };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return {\n data: value,\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.tuple.type(), path: [] }],\n typeOk: false,\n };\n }\n\n const guarded = this._guardTupleInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const issues: Issue[] = [];\n const output: unknown[] = [];\n const tupleValue = guarded.value;\n\n for (let i = 0; i < this.items.length; i++) {\n const result = this.items[i]._parseFullSync(tupleValue[i], ctx);\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n\n if (this.restSchema !== null) {\n for (let i = this.items.length; i < tupleValue.length; i++) {\n const result = this.restSchema._parseFullSync(tupleValue[i], ctx);\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n }\n\n return { data: output, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferTuple<T, R>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferTuple<T, R>;\n\n const raw = prepared.value;\n\n if (!Array.isArray(raw)) {\n throw new SpellValidationError([{ code: ErrorCode.invalid_type, message: c.messages.tuple.type(), path: [] }]);\n }\n\n const guarded = this._guardTupleInput(raw, c);\n\n if (!guarded.ok) throw new SpellValidationError(guarded.issues);\n\n const tupleValue = guarded.value;\n const issues: Issue[] = [];\n const output: unknown[] = [];\n\n const fixedResults = await Promise.all(this.items.map((schema, i) => schema._parseFullAsync(tupleValue[i], c)));\n\n for (let i = 0; i < fixedResults.length; i++) {\n const result = fixedResults[i];\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n\n const rest = this.restSchema;\n\n if (rest !== null) {\n const restItems = tupleValue.slice(this.items.length);\n const restResults = await Promise.all(restItems.map((item) => rest._parseFullAsync(item, c)));\n\n for (let i = 0; i < restResults.length; i++) {\n const result = restResults[i];\n const idx = this.items.length + i;\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, idx));\n output.push(tupleValue[idx]);\n }\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(output, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(output) as InferTuple<T, R>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n items: this.items.map((s) => s.definition()),\n kind: 'tuple',\n rest: this.restSchema !== null ? this.restSchema.definition() : null,\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const items = this.items.map((s) => s.walk(visitor));\n const rest = this.restSchema !== null ? this.restSchema.walk(visitor) : null;\n\n if (visitor.tuple) return visitor.tuple(this, items, rest);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"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"}
@@ -6,17 +6,17 @@ export type InferTuple<T extends TupleSchemas, R extends AnySchema | null = null
6
6
  }, ...O[]] : {
7
7
  readonly [K in keyof T]: T[K] extends Schema<infer V> ? V : never;
8
8
  };
9
- export declare class TupleSchema<T extends TupleSchemas, R extends AnySchema | null = null> extends Schema<InferTuple<T, R>> {
9
+ export declare class TupleSchema<T extends TupleSchemas, R extends AnySchema | null = null, Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<import('../core').InferSchemaMode<T[number] | Exclude<R, null>>>> extends Schema<InferTuple<T, R>, unknown, Mode> {
10
10
  readonly items: T;
11
11
  readonly restSchema: R;
12
12
  protected get _kind(): string;
13
+ checkAsync(this: TupleSchema<T, R, 'sync'>, fn: (value: InferTuple<T, R>, ctx: import('../core').CheckContext) => Promise<import('../core').ValidateResult>): TupleSchema<T, R, 'async'>;
13
14
  constructor(items: T, restSchema?: R);
14
- rest<U>(schema: Schema<U>): TupleSchema<T, Schema<U>>;
15
+ rest<U extends AnySchema>(schema: U): TupleSchema<T, U, import('../core').MergeSchemaModes<Mode | import('../core').InferSchemaMode<U>>>;
15
16
  private _guardTupleInput;
16
17
  protected _parse(value: unknown, ctx: ParseContext): ParseValue;
17
18
  parseAsync(value: unknown, ctx?: ParseContext): Promise<InferTuple<T, R>>;
18
19
  protected _toDescriptorImpl(): SchemaDescriptor;
19
20
  protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
20
- protected _equalsImpl(other: import('../core').AnySchema): boolean;
21
21
  }
22
22
  //# sourceMappingURL=tuple.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tuple.d.ts","sourceRoot":"","sources":["../../src/schemas/tuple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAS,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAA+B,MAAM,EAAkC,MAAM,SAAS,CAAC;AAG9F,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;AAChE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,SAAS,GAAG,IAAI,GAAG,IAAI,IAC9E,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GACrB,SAAS,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAAE,EAAE,GAAG,CAAC,EAAE,CAAC,GAClF;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAAE,CAAC;AAE5E,qBAAa,WAAW,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,SAAS,GAAG,IAAI,GAAG,IAAI,CAAE,SAAQ,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClH,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAEvB,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,KAAK,EAAE,CAAC,EAAE,UAAU,GAAE,CAAa;IAM/C,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAIrD,OAAO,CAAC,gBAAgB;cAmCL,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IA4CzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;cA+DrE,iBAAiB,IAAI,gBAAgB;cASrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAS9D,WAAW,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,SAAS,GAAG,OAAO;CAkB5E"}
1
+ {"version":3,"file":"tuple.d.ts","sourceRoot":"","sources":["../../src/schemas/tuple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAS,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAA+B,MAAM,EAAkC,MAAM,SAAS,CAAC;AAE9F,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;AAChE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,SAAS,GAAG,IAAI,GAAG,IAAI,IAC9E,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GACrB,SAAS,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAAE,EAAE,GAAG,CAAC,EAAE,CAAC,GAClF;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAAE,CAAC;AAE5E,qBAAa,WAAW,CACtB,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,SAAS,GAAG,IAAI,GAAG,IAAI,EACjC,IAAI,SAAS,OAAO,SAAS,EAAE,UAAU,GAAG,OAAO,SAAS,EAAE,gBAAgB,CAC5E,OAAO,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAChE,CACD,SAAQ,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAEvB,cAAuB,KAAK,IAAI,MAAM,CAErC;IAEQ,UAAU,CACjB,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAC/B,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,SAAS,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,SAAS,EAAE,cAAc,CAAC,GAC9G,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;gBAIjB,KAAK,EAAE,CAAC,EAAE,UAAU,GAAE,CAAa;IAM/C,IAAI,CAAC,CAAC,SAAS,SAAS,EACtB,MAAM,EAAE,CAAC,GACR,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,SAAS,EAAE,gBAAgB,CAAC,IAAI,GAAG,OAAO,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAQrG,OAAO,CAAC,gBAAgB;cAmCL,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IA4CzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;cA+DrE,iBAAiB,IAAI,gBAAgB;cASrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;CAQlF"}
@@ -1,2 +1,2 @@
1
- import{ErrorCode as e}from"../types.js";import{SpellValidationError as t,prependIssuePath as n}from"../errors.js";import"../messages.js";import{Schema as r,_makeCtx as i}from"../core.js";var a=class a extends r{items;restSchema;get _kind(){return`tuple`}constructor(e,t=null){super(),this.items=e,this.restSchema=t}rest(e){return this._copyStateTo(new a(this.items,e))}_guardTupleInput(t,n){return this.restSchema===null&&t.length!==this.items.length?{issues:[{code:e.invalid_length,message:n.messages.tuple.length({exact:this.items.length}),params:{exact:this.items.length},path:[]}],ok:!1}:this.restSchema!==null&&t.length<this.items.length?{issues:[{code:e.too_small,message:n.messages.tuple.min({min:this.items.length}),params:{min:this.items.length},path:[]}],ok:!1}:{ok:!0,value:t}}_parse(t,r){if(!Array.isArray(t))return{data:t,issues:[{code:e.invalid_type,message:r.messages.tuple.type(),path:[]}],typeOk:!1};let i=this._guardTupleInput(t,r);if(!i.ok)return{data:t,issues:i.issues,typeOk:!1};let a=[],o=[],s=i.value;for(let e=0;e<this.items.length;e++){let t=this.items[e]._parseFullSync(s[e],r);t.issues.length===0?o.push(t.data):(a.push(...n(t.issues,e)),o.push(s[e]))}if(this.restSchema!==null)for(let e=this.items.length;e<s.length;e++){let t=this.restSchema._parseFullSync(s[e],r);t.issues.length===0?o.push(t.data):(a.push(...n(t.issues,e)),o.push(s[e]))}return{data:o,issues:a,typeOk:!0}}async parseAsync(r,a){let o=a??i();return this._withCatchAsync(async()=>{let i=this._prepareInput(r);if(i.skip)return i.value;let a=i.value;if(!Array.isArray(a))throw new t([{code:e.invalid_type,message:o.messages.tuple.type(),path:[]}]);let s=this._guardTupleInput(a,o);if(!s.ok)throw new t(s.issues);let c=s.value,l=[],u=[],d=await Promise.all(this.items.map((e,t)=>e._parseFullAsync(c[t],o)));for(let e=0;e<d.length;e++){let t=d[e];t.issues.length===0?u.push(t.data):(l.push(...n(t.issues,e)),u.push(c[e]))}let f=this.restSchema;if(f!==null){let e=c.slice(this.items.length),t=await Promise.all(e.map(e=>f._parseFullAsync(e,o)));for(let e=0;e<t.length;e++){let r=t[e],i=this.items.length+e;r.issues.length===0?u.push(r.data):(l.push(...n(r.issues,i)),u.push(c[i]))}}let p=await this._runValidatorsAsync(u,o),m=[...l,...p];if(m.length>0)throw new t(m);return this._runPostprocessors(u)})}_toDescriptorImpl(){return{...this._describeBase(),items:this.items.map(e=>e.toDescriptor()),kind:`tuple`,rest:this.restSchema===null?null:this.restSchema.toDescriptor()}}_walk(e){let t=this.items.map(t=>t.walk(e)),n=this.restSchema===null?null:this.restSchema.walk(e);return e.tuple?e.tuple(this,t,n):super._walk(e)}_equalsImpl(e){if(!(e instanceof a)||this.items.length!==e.items.length)return!1;for(let t=0;t<this.items.length;t++)if(!this.items[t].equals(e.items[t]))return!1;let t=this.restSchema,n=e.restSchema;return!(t===null!=(n===null)||t!==null&&n!==null&&!t.equals(n))}};export{a as TupleSchema};
1
+ import{ErrorCode as e}from"../types.js";import{SpellValidationError as t,prependIssuePath as n}from"../errors.js";import{Schema as r,_makeCtx as i}from"../core.js";var a=class a extends r{items;restSchema;get _kind(){return`tuple`}checkAsync(e){return this._addCheck(e,!0)}constructor(e,t=null){super(),this.items=e,this.restSchema=t}rest(e){return this._copyStateTo(new a(this.items,e))}_guardTupleInput(t,n){return this.restSchema===null&&t.length!==this.items.length?{issues:[{code:e.invalid_length,message:n.messages.tuple.length({exact:this.items.length}),params:{exact:this.items.length},path:[]}],ok:!1}:this.restSchema!==null&&t.length<this.items.length?{issues:[{code:e.too_small,message:n.messages.tuple.min({min:this.items.length}),params:{min:this.items.length},path:[]}],ok:!1}:{ok:!0,value:t}}_parse(t,r){if(!Array.isArray(t))return{data:t,issues:[{code:e.invalid_type,message:r.messages.tuple.type(),path:[]}],typeOk:!1};let i=this._guardTupleInput(t,r);if(!i.ok)return{data:t,issues:i.issues,typeOk:!1};let a=[],o=[],s=i.value;for(let e=0;e<this.items.length;e++){let t=this.items[e]._parseFullSync(s[e],r);t.issues.length===0?o.push(t.data):(a.push(...n(t.issues,e)),o.push(s[e]))}if(this.restSchema!==null)for(let e=this.items.length;e<s.length;e++){let t=this.restSchema._parseFullSync(s[e],r);t.issues.length===0?o.push(t.data):(a.push(...n(t.issues,e)),o.push(s[e]))}return{data:o,issues:a,typeOk:!0}}async parseAsync(r,a){let o=a??i();return this._withCatchAsync(async()=>{let i=this._prepareInput(r);if(i.skip)return i.value;let a=i.value;if(!Array.isArray(a))throw new t([{code:e.invalid_type,message:o.messages.tuple.type(),path:[]}]);let s=this._guardTupleInput(a,o);if(!s.ok)throw new t(s.issues);let c=s.value,l=[],u=[],d=await Promise.all(this.items.map((e,t)=>e._parseFullAsync(c[t],o)));for(let e=0;e<d.length;e++){let t=d[e];t.issues.length===0?u.push(t.data):(l.push(...n(t.issues,e)),u.push(c[e]))}let f=this.restSchema;if(f!==null){let e=c.slice(this.items.length),t=await Promise.all(e.map(e=>f._parseFullAsync(e,o)));for(let e=0;e<t.length;e++){let r=t[e],i=this.items.length+e;r.issues.length===0?u.push(r.data):(l.push(...n(r.issues,i)),u.push(c[i]))}}let p=await this._runValidatorsAsync(u,o),m=[...l,...p];if(m.length>0)throw new t(m);return this._runPostprocessors(u)})}_toDescriptorImpl(){return{...this._describeBase(),items:this.items.map(e=>e.definition()),kind:`tuple`,rest:this.restSchema===null?null:this.restSchema.definition()}}_walk(e){let t=this.items.map(t=>t.walk(e)),n=this.restSchema===null?null:this.restSchema.walk(e);return e.tuple?e.tuple(this,t,n):super._walk(e)}};export{a as TupleSchema};
2
2
  //# sourceMappingURL=tuple.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tuple.js","names":[],"sources":["../../src/schemas/tuple.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { _messages } from '../messages';\n\nexport type TupleSchemas = readonly [AnySchema, ...AnySchema[]];\nexport type InferTuple<T extends TupleSchemas, R extends AnySchema | null = null> =\n R extends Schema<infer O>\n ? readonly [...{ [K in keyof T]: T[K] extends Schema<infer V> ? V : never }, ...O[]]\n : { readonly [K in keyof T]: T[K] extends Schema<infer V> ? V : never };\n\nexport class TupleSchema<T extends TupleSchemas, R extends AnySchema | null = null> extends Schema<InferTuple<T, R>> {\n readonly items: T;\n readonly restSchema: R;\n\n protected override get _kind(): string {\n return 'tuple';\n }\n\n constructor(items: T, restSchema: R = null as R) {\n super();\n this.items = items;\n this.restSchema = restSchema;\n }\n\n rest<U>(schema: Schema<U>): TupleSchema<T, Schema<U>> {\n return this._copyStateTo(new TupleSchema(this.items, schema));\n }\n\n private _guardTupleInput(\n value: unknown[],\n ctx: ParseContext,\n ): { ok: true; value: unknown[] } | { issues: Issue[]; ok: false } {\n if (this.restSchema === null && value.length !== this.items.length) {\n return {\n issues: [\n {\n code: ErrorCode.invalid_length,\n message: ctx.messages.tuple.length({ exact: this.items.length }),\n params: { exact: this.items.length },\n path: [],\n },\n ],\n ok: false,\n };\n }\n\n if (this.restSchema !== null && value.length < this.items.length) {\n return {\n issues: [\n {\n code: ErrorCode.too_small,\n message: ctx.messages.tuple.min({ min: this.items.length }),\n params: { min: this.items.length },\n path: [],\n },\n ],\n ok: false,\n };\n }\n\n return { ok: true, value };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return {\n data: value,\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.tuple.type(), path: [] }],\n typeOk: false,\n };\n }\n\n const guarded = this._guardTupleInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const issues: Issue[] = [];\n const output: unknown[] = [];\n const tupleValue = guarded.value;\n\n for (let i = 0; i < this.items.length; i++) {\n const result = this.items[i]._parseFullSync(tupleValue[i], ctx);\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n\n if (this.restSchema !== null) {\n for (let i = this.items.length; i < tupleValue.length; i++) {\n const result = this.restSchema._parseFullSync(tupleValue[i], ctx);\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n }\n\n return { data: output, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferTuple<T, R>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferTuple<T, R>;\n\n const raw = prepared.value;\n\n if (!Array.isArray(raw)) {\n throw new SpellValidationError([{ code: ErrorCode.invalid_type, message: c.messages.tuple.type(), path: [] }]);\n }\n\n const guarded = this._guardTupleInput(raw, c);\n\n if (!guarded.ok) throw new SpellValidationError(guarded.issues);\n\n const tupleValue = guarded.value;\n const issues: Issue[] = [];\n const output: unknown[] = [];\n\n const fixedResults = await Promise.all(this.items.map((schema, i) => schema._parseFullAsync(tupleValue[i], c)));\n\n for (let i = 0; i < fixedResults.length; i++) {\n const result = fixedResults[i];\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n\n const rest = this.restSchema;\n\n if (rest !== null) {\n const restItems = tupleValue.slice(this.items.length);\n const restResults = await Promise.all(restItems.map((item) => rest._parseFullAsync(item, c)));\n\n for (let i = 0; i < restResults.length; i++) {\n const result = restResults[i];\n const idx = this.items.length + i;\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, idx));\n output.push(tupleValue[idx]);\n }\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(output, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(output) as InferTuple<T, R>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n items: this.items.map((s) => s.toDescriptor()),\n kind: 'tuple',\n rest: this.restSchema !== null ? this.restSchema.toDescriptor() : null,\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const items = this.items.map((s) => s.walk(visitor));\n const rest = this.restSchema !== null ? this.restSchema.walk(visitor) : null;\n\n if (visitor.tuple) return visitor.tuple(this, items, rest);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof TupleSchema)) return false;\n\n if (this.items.length !== other.items.length) return false;\n\n for (let i = 0; i < this.items.length; i++) {\n if (!this.items[i].equals(other.items[i])) return false;\n }\n\n const rs = this.restSchema;\n const ors = other.restSchema;\n\n if ((rs === null) !== (ors === null)) return false;\n\n if (rs !== null && ors !== null && !rs.equals(ors)) return false;\n\n return true;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tuple.js","names":[],"sources":["../../src/schemas/tuple.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema, SpellValidationError, _makeCtx } from '../core';\n\nexport type TupleSchemas = readonly [AnySchema, ...AnySchema[]];\nexport type InferTuple<T extends TupleSchemas, R extends AnySchema | null = null> =\n R extends Schema<infer O>\n ? readonly [...{ [K in keyof T]: T[K] extends Schema<infer V> ? V : never }, ...O[]]\n : { readonly [K in keyof T]: T[K] extends Schema<infer V> ? V : never };\n\nexport class TupleSchema<\n T extends TupleSchemas,\n R extends AnySchema | null = null,\n Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<\n import('../core').InferSchemaMode<T[number] | Exclude<R, null>>\n >,\n> extends Schema<InferTuple<T, R>, unknown, Mode> {\n readonly items: T;\n readonly restSchema: R;\n\n protected override get _kind(): string {\n return 'tuple';\n }\n\n override checkAsync(\n this: TupleSchema<T, R, 'sync'>,\n fn: (value: InferTuple<T, R>, ctx: import('../core').CheckContext) => Promise<import('../core').ValidateResult>,\n ): TupleSchema<T, R, 'async'> {\n return this._addCheck(fn, true) as unknown as TupleSchema<T, R, 'async'>;\n }\n\n constructor(items: T, restSchema: R = null as R) {\n super();\n this.items = items;\n this.restSchema = restSchema;\n }\n\n rest<U extends AnySchema>(\n schema: U,\n ): TupleSchema<T, U, import('../core').MergeSchemaModes<Mode | import('../core').InferSchemaMode<U>>> {\n return this._copyStateTo(new TupleSchema(this.items, schema)) as unknown as TupleSchema<\n T,\n U,\n import('../core').MergeSchemaModes<Mode | import('../core').InferSchemaMode<U>>\n >;\n }\n\n private _guardTupleInput(\n value: unknown[],\n ctx: ParseContext,\n ): { ok: true; value: unknown[] } | { issues: Issue[]; ok: false } {\n if (this.restSchema === null && value.length !== this.items.length) {\n return {\n issues: [\n {\n code: ErrorCode.invalid_length,\n message: ctx.messages.tuple.length({ exact: this.items.length }),\n params: { exact: this.items.length },\n path: [],\n },\n ],\n ok: false,\n };\n }\n\n if (this.restSchema !== null && value.length < this.items.length) {\n return {\n issues: [\n {\n code: ErrorCode.too_small,\n message: ctx.messages.tuple.min({ min: this.items.length }),\n params: { min: this.items.length },\n path: [],\n },\n ],\n ok: false,\n };\n }\n\n return { ok: true, value };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return {\n data: value,\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.tuple.type(), path: [] }],\n typeOk: false,\n };\n }\n\n const guarded = this._guardTupleInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const issues: Issue[] = [];\n const output: unknown[] = [];\n const tupleValue = guarded.value;\n\n for (let i = 0; i < this.items.length; i++) {\n const result = this.items[i]._parseFullSync(tupleValue[i], ctx);\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n\n if (this.restSchema !== null) {\n for (let i = this.items.length; i < tupleValue.length; i++) {\n const result = this.restSchema._parseFullSync(tupleValue[i], ctx);\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n }\n\n return { data: output, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferTuple<T, R>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferTuple<T, R>;\n\n const raw = prepared.value;\n\n if (!Array.isArray(raw)) {\n throw new SpellValidationError([{ code: ErrorCode.invalid_type, message: c.messages.tuple.type(), path: [] }]);\n }\n\n const guarded = this._guardTupleInput(raw, c);\n\n if (!guarded.ok) throw new SpellValidationError(guarded.issues);\n\n const tupleValue = guarded.value;\n const issues: Issue[] = [];\n const output: unknown[] = [];\n\n const fixedResults = await Promise.all(this.items.map((schema, i) => schema._parseFullAsync(tupleValue[i], c)));\n\n for (let i = 0; i < fixedResults.length; i++) {\n const result = fixedResults[i];\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n\n const rest = this.restSchema;\n\n if (rest !== null) {\n const restItems = tupleValue.slice(this.items.length);\n const restResults = await Promise.all(restItems.map((item) => rest._parseFullAsync(item, c)));\n\n for (let i = 0; i < restResults.length; i++) {\n const result = restResults[i];\n const idx = this.items.length + i;\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, idx));\n output.push(tupleValue[idx]);\n }\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(output, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(output) as InferTuple<T, R>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n items: this.items.map((s) => s.definition()),\n kind: 'tuple',\n rest: this.restSchema !== null ? this.restSchema.definition() : null,\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const items = this.items.map((s) => s.walk(visitor));\n const rest = this.restSchema !== null ? this.restSchema.walk(visitor) : null;\n\n if (visitor.tuple) return visitor.tuple(this, items, rest);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../core.cjs");var r=class r extends n.Schema{schemas;get _kind(){return`union`}constructor(e){super(),this.schemas=e}_parse(t,n){let r=[];for(let e of this.schemas){let i=e._parseFullSync(t,n);if(i.issues.length===0)return{data:i.data,issues:[],typeOk:!0};r.push(i.issues)}return{data:t,issues:[{code:e.ErrorCode.invalid_union,message:n.messages.union.invalid(),params:{errors:r},path:[]}],typeOk:!1}}async parseAsync(r,i){let a=i??n._makeCtx();return this._withCatchAsync(async()=>{let n=this._prepareInput(r);if(n.skip)return n.value;let i=n.value;try{let e=await Promise.any(this.schemas.map(e=>e.safeParseAsync(i,a).then(e=>{if(e.success)return e.data;throw e.error}))),n=await this._runValidatorsAsync(e,a);if(n.length)throw new t.SpellValidationError(n);return this._runPostprocessors(e)}catch(n){if(n instanceof AggregateError){let r=n.errors,i=r.find(e=>!t.SpellValidationError.is(e));if(i!==void 0)throw i;let o=r.map(e=>e.issues);throw new t.SpellValidationError([{code:e.ErrorCode.invalid_union,message:a.messages.union.invalid(),params:{errors:o},path:[]}])}throw n}})}_toDescriptorImpl(){return{...this._describeBase(),branches:this.schemas.map(e=>e.toDescriptor()),kind:`union`}}_walk(e){let t=this.schemas.map(t=>t.walk(e));return e.union?e.union(this,t):super._walk(e)}_equalsImpl(e){return!(e instanceof r)||this.schemas.length!==e.schemas.length?!1:this.schemas.every((t,n)=>t.equals(e.schemas[n]))}};exports.UnionSchema=r;
1
+ const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../core.cjs");var r=class extends n.Schema{schemas;get _kind(){return`union`}checkAsync(e){return this._addCheck(e,!0)}constructor(e){super(),this.schemas=Object.freeze([...e])}_parse(t,n){let r=[];for(let e of this.schemas){let i=e._parseFullSync(t,n);if(i.issues.length===0)return{data:i.data,issues:[],typeOk:!0};r.push(i.issues)}return{data:t,issues:[{code:e.ErrorCode.invalid_union,message:n.messages.union.invalid(),params:{errors:r},path:[]}],typeOk:!1}}async parseAsync(r,i){let a=i??n._makeCtx();return this._withCatchAsync(async()=>{let n=this._prepareInput(r);if(n.skip)return n.value;let i=n.value,o=[];for(let e of this.schemas){let n=await e._parseFullAsync(i,a);if(n.issues.length>0){o.push(n.issues);continue}let r=await this._runValidatorsAsync(n.data,a);if(r.length>0)throw new t.SpellValidationError(r);return this._runPostprocessors(n.data)}throw new t.SpellValidationError([{code:e.ErrorCode.invalid_union,message:a.messages.union.invalid(),params:{errors:o},path:[]}])})}_toDescriptorImpl(){return{...this._describeBase(),branches:this.schemas.map(e=>e.definition()),kind:`union`}}_walk(e){let t=this.schemas.map(t=>t.walk(e));return e.union?e.union(this,t):super._walk(e)}};exports.UnionSchema=r;
2
2
  //# sourceMappingURL=union.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"union.cjs","names":[],"sources":["../../src/schemas/union.ts"],"sourcesContent":["import type { AnySchema, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx } from '../core';\n\nexport class UnionSchema<T extends readonly AnySchema[]> extends Schema<InferOutput<T[number]>> {\n readonly schemas: T;\n\n protected override get _kind(): string {\n return 'union';\n }\n\n constructor(schemas: T) {\n super();\n this.schemas = schemas;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue | Promise<ParseValue> {\n const branchErrors: Issue[][] = [];\n\n for (const schema of this.schemas) {\n const result = schema._parseFullSync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n branchErrors.push(result.issues);\n }\n\n return {\n data: value,\n issues: [\n {\n code: ErrorCode.invalid_union,\n message: ctx.messages.union.invalid(),\n params: { errors: branchErrors },\n path: [],\n },\n ],\n typeOk: false,\n };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<T[number]>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as InferOutput<T[number]>;\n\n const v = prepared.value;\n\n try {\n const data = await Promise.any(\n this.schemas.map((schema) =>\n schema.safeParseAsync(v, c).then((result) => {\n if (result.success) return result.data;\n\n throw result.error;\n }),\n ),\n );\n\n const validationIssues = await this._runValidatorsAsync(data, c);\n\n if (validationIssues.length) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(data) as InferOutput<T[number]>;\n } catch (err) {\n if (err instanceof AggregateError) {\n const errors = err.errors as unknown[];\n const nonValidation = errors.find((e) => !SpellValidationError.is(e));\n\n if (nonValidation !== undefined) throw nonValidation;\n\n const branchErrors = (errors as SpellValidationError[]).map((e) => e.issues);\n\n throw new SpellValidationError([\n {\n code: ErrorCode.invalid_union,\n message: c.messages.union.invalid(),\n params: { errors: branchErrors },\n path: [],\n },\n ]);\n }\n\n throw err;\n }\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), branches: this.schemas.map((s) => s.toDescriptor()), kind: 'union' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = this.schemas.map((s) => s.walk(visitor));\n\n if (visitor.union) return visitor.union(this, branches);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof UnionSchema)) return false;\n\n if (this.schemas.length !== other.schemas.length) return false;\n\n return this.schemas.every((s, i) => s.equals(other.schemas[i]));\n }\n}\n"],"mappings":"oFAIA,IAAa,EAAb,MAAa,UAAoD,EAAA,MAA+B,CAC9F,QAEA,IAAuB,OAAgB,CACrC,MAAO,OACT,CAEA,YAAY,EAAY,CACtB,MAAM,EACN,KAAK,QAAU,CACjB,CAEA,OAA0B,EAAgB,EAAqD,CAC7F,IAAM,EAA0B,CAAC,EAEjC,IAAK,IAAM,KAAU,KAAK,QAAS,CACjC,IAAM,EAAS,EAAO,eAAe,EAAO,CAAG,EAE/C,GAAI,EAAO,OAAO,SAAW,EAAG,MAAO,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAErF,EAAa,KAAK,EAAO,MAAM,CACjC,CAEA,MAAO,CACL,KAAM,EACN,OAAQ,CACN,CACE,KAAM,EAAA,UAAU,cAChB,QAAS,EAAI,SAAS,MAAM,QAAQ,EACpC,OAAQ,CAAE,OAAQ,CAAa,EAC/B,KAAM,CAAC,CACT,CACF,EACA,OAAQ,EACV,CACF,CAEA,MAAe,WAAW,EAAgB,EAAqD,CAC7F,IAAM,EAAI,GAAO,EAAA,SAAS,EAE1B,OAAO,KAAK,gBAAgB,SAAY,CACtC,IAAM,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,OAAO,EAAS,MAEnC,IAAM,EAAI,EAAS,MAEnB,GAAI,CACF,IAAM,EAAO,MAAM,QAAQ,IACzB,KAAK,QAAQ,IAAK,GAChB,EAAO,eAAe,EAAG,CAAC,CAAC,CAAC,KAAM,GAAW,CAC3C,GAAI,EAAO,QAAS,OAAO,EAAO,KAElC,MAAM,EAAO,KACf,CAAC,CACH,CACF,EAEM,EAAmB,MAAM,KAAK,oBAAoB,EAAM,CAAC,EAE/D,GAAI,EAAiB,OAAQ,MAAM,IAAI,EAAA,qBAAqB,CAAgB,EAE5E,OAAO,KAAK,mBAAmB,CAAI,CACrC,OAAS,EAAK,CACZ,GAAI,aAAe,eAAgB,CACjC,IAAM,EAAS,EAAI,OACb,EAAgB,EAAO,KAAM,GAAM,CAAC,EAAA,qBAAqB,GAAG,CAAC,CAAC,EAEpE,GAAI,IAAkB,IAAA,GAAW,MAAM,EAEvC,IAAM,EAAgB,EAAkC,IAAK,GAAM,EAAE,MAAM,EAE3E,MAAM,IAAI,EAAA,qBAAqB,CAC7B,CACE,KAAM,EAAA,UAAU,cAChB,QAAS,EAAE,SAAS,MAAM,QAAQ,EAClC,OAAQ,CAAE,OAAQ,CAAa,EAC/B,KAAM,CAAC,CACT,CACF,CAAC,CACH,CAEA,MAAM,CACR,CACF,CAAC,CACH,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,SAAU,KAAK,QAAQ,IAAK,GAAM,EAAE,aAAa,CAAC,EAAG,KAAM,OAAQ,CACvG,CAEA,MAA4B,EAAsD,CAChF,IAAM,EAAW,KAAK,QAAQ,IAAK,GAAM,EAAE,KAAK,CAAO,CAAC,EAIxD,OAFI,EAAQ,MAAc,EAAQ,MAAM,KAAM,CAAQ,EAE/C,MAAM,MAAM,CAAO,CAC5B,CAEA,YAA+B,EAA6C,CAK1E,MAJI,EAAE,aAAiB,IAEnB,KAAK,QAAQ,SAAW,EAAM,QAAQ,OAAe,GAElD,KAAK,QAAQ,OAAO,EAAG,IAAM,EAAE,OAAO,EAAM,QAAQ,EAAE,CAAC,CAChE,CACF"}
1
+ {"version":3,"file":"union.cjs","names":[],"sources":["../../src/schemas/union.ts"],"sourcesContent":["import type { AnySchema, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx } from '../core';\n\nexport class UnionSchema<\n T extends readonly AnySchema[],\n Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<\n import('../core').InferSchemaMode<T[number]>\n >,\n> extends Schema<InferOutput<T[number]>, unknown, Mode> {\n readonly schemas: T;\n\n protected override get _kind(): string {\n return 'union';\n }\n\n override checkAsync(\n this: UnionSchema<T, 'sync'>,\n fn: (\n value: InferOutput<T[number]>,\n ctx: import('../core').CheckContext,\n ) => Promise<import('../core').ValidateResult>,\n ): UnionSchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as UnionSchema<T, 'async'>;\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 | Promise<ParseValue> {\n const branchErrors: Issue[][] = [];\n\n for (const schema of this.schemas) {\n const result = schema._parseFullSync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n branchErrors.push(result.issues);\n }\n\n return {\n data: value,\n issues: [\n {\n code: ErrorCode.invalid_union,\n message: ctx.messages.union.invalid(),\n params: { errors: branchErrors },\n path: [],\n },\n ],\n typeOk: false,\n };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<T[number]>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as InferOutput<T[number]>;\n\n const v = prepared.value;\n\n const branchErrors: Issue[][] = [];\n\n for (const schema of this.schemas) {\n const result = await schema._parseFullAsync(v, c);\n\n if (result.issues.length > 0) {\n branchErrors.push(result.issues);\n continue;\n }\n\n const validationIssues = await this._runValidatorsAsync(result.data, c);\n\n if (validationIssues.length > 0) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(result.data) as InferOutput<T[number]>;\n }\n\n throw new SpellValidationError([\n {\n code: ErrorCode.invalid_union,\n message: c.messages.union.invalid(),\n params: { errors: branchErrors },\n path: [],\n },\n ]);\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), branches: this.schemas.map((s) => s.definition()), kind: 'union' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = this.schemas.map((s) => s.walk(visitor));\n\n if (visitor.union) return visitor.union(this, branches);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"oFAIA,IAAa,EAAb,cAKU,EAAA,MAA8C,CACtD,QAEA,IAAuB,OAAgB,CACrC,MAAO,OACT,CAEA,WAEE,EAIyB,CACzB,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,YAAY,EAAY,CACtB,MAAM,EACN,KAAK,QAAU,OAAO,OAAO,CAAC,GAAG,CAAO,CAAC,CAC3C,CAEA,OAA0B,EAAgB,EAAqD,CAC7F,IAAM,EAA0B,CAAC,EAEjC,IAAK,IAAM,KAAU,KAAK,QAAS,CACjC,IAAM,EAAS,EAAO,eAAe,EAAO,CAAG,EAE/C,GAAI,EAAO,OAAO,SAAW,EAAG,MAAO,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAErF,EAAa,KAAK,EAAO,MAAM,CACjC,CAEA,MAAO,CACL,KAAM,EACN,OAAQ,CACN,CACE,KAAM,EAAA,UAAU,cAChB,QAAS,EAAI,SAAS,MAAM,QAAQ,EACpC,OAAQ,CAAE,OAAQ,CAAa,EAC/B,KAAM,CAAC,CACT,CACF,EACA,OAAQ,EACV,CACF,CAEA,MAAe,WAAW,EAAgB,EAAqD,CAC7F,IAAM,EAAI,GAAO,EAAA,SAAS,EAE1B,OAAO,KAAK,gBAAgB,SAAY,CACtC,IAAM,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,OAAO,EAAS,MAEnC,IAAM,EAAI,EAAS,MAEb,EAA0B,CAAC,EAEjC,IAAK,IAAM,KAAU,KAAK,QAAS,CACjC,IAAM,EAAS,MAAM,EAAO,gBAAgB,EAAG,CAAC,EAEhD,GAAI,EAAO,OAAO,OAAS,EAAG,CAC5B,EAAa,KAAK,EAAO,MAAM,EAC/B,QACF,CAEA,IAAM,EAAmB,MAAM,KAAK,oBAAoB,EAAO,KAAM,CAAC,EAEtE,GAAI,EAAiB,OAAS,EAAG,MAAM,IAAI,EAAA,qBAAqB,CAAgB,EAEhF,OAAO,KAAK,mBAAmB,EAAO,IAAI,CAC5C,CAEA,MAAM,IAAI,EAAA,qBAAqB,CAC7B,CACE,KAAM,EAAA,UAAU,cAChB,QAAS,EAAE,SAAS,MAAM,QAAQ,EAClC,OAAQ,CAAE,OAAQ,CAAa,EAC/B,KAAM,CAAC,CACT,CACF,CAAC,CACH,CAAC,CACH,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,SAAU,KAAK,QAAQ,IAAK,GAAM,EAAE,WAAW,CAAC,EAAG,KAAM,OAAQ,CACrG,CAEA,MAA4B,EAAsD,CAChF,IAAM,EAAW,KAAK,QAAQ,IAAK,GAAM,EAAE,KAAK,CAAO,CAAC,EAIxD,OAFI,EAAQ,MAAc,EAAQ,MAAM,KAAM,CAAQ,EAE/C,MAAM,MAAM,CAAO,CAC5B,CACF"}
@@ -1,13 +1,13 @@
1
1
  import type { AnySchema, InferOutput, ParseContext, ParseValue, SchemaDescriptor } from '../core';
2
2
  import { Schema } from '../core';
3
- export declare class UnionSchema<T extends readonly AnySchema[]> extends Schema<InferOutput<T[number]>> {
3
+ export declare class UnionSchema<T extends readonly AnySchema[], Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<import('../core').InferSchemaMode<T[number]>>> extends Schema<InferOutput<T[number]>, unknown, Mode> {
4
4
  readonly schemas: T;
5
5
  protected get _kind(): string;
6
+ checkAsync(this: UnionSchema<T, 'sync'>, fn: (value: InferOutput<T[number]>, ctx: import('../core').CheckContext) => Promise<import('../core').ValidateResult>): UnionSchema<T, 'async'>;
6
7
  constructor(schemas: T);
7
8
  protected _parse(value: unknown, ctx: ParseContext): ParseValue | Promise<ParseValue>;
8
9
  parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<T[number]>>;
9
10
  protected _toDescriptorImpl(): SchemaDescriptor;
10
11
  protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
11
- protected _equalsImpl(other: import('../core').AnySchema): boolean;
12
12
  }
13
13
  //# sourceMappingURL=union.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"union.d.ts","sourceRoot":"","sources":["../../src/schemas/union.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAS,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEzG,OAAO,EAAa,MAAM,EAAkC,MAAM,SAAS,CAAC;AAE5E,qBAAa,WAAW,CAAC,CAAC,SAAS,SAAS,SAAS,EAAE,CAAE,SAAQ,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,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,GAAG,OAAO,CAAC,UAAU,CAAC;IAyB/E,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;cAkD3E,iBAAiB,IAAI,gBAAgB;cAIrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAQ9D,WAAW,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,SAAS,GAAG,OAAO;CAO5E"}
1
+ {"version":3,"file":"union.d.ts","sourceRoot":"","sources":["../../src/schemas/union.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAS,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEzG,OAAO,EAAa,MAAM,EAAkC,MAAM,SAAS,CAAC;AAE5E,qBAAa,WAAW,CACtB,CAAC,SAAS,SAAS,SAAS,EAAE,EAC9B,IAAI,SAAS,OAAO,SAAS,EAAE,UAAU,GAAG,OAAO,SAAS,EAAE,gBAAgB,CAC5E,OAAO,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAC7C,CACD,SAAQ,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC;IACrD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAEpB,cAAuB,KAAK,IAAI,MAAM,CAErC;IAEQ,UAAU,CACjB,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,EAC5B,EAAE,EAAE,CACF,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAC7B,GAAG,EAAE,OAAO,SAAS,EAAE,YAAY,KAChC,OAAO,CAAC,OAAO,SAAS,EAAE,cAAc,CAAC,GAC7C,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC;gBAId,OAAO,EAAE,CAAC;cAKH,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAyB/E,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;cAsC3E,iBAAiB,IAAI,gBAAgB;cAIrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;CAOlF"}
@@ -1,2 +1,2 @@
1
- import{ErrorCode as e}from"../types.js";import{SpellValidationError as t}from"../errors.js";import{Schema as n,_makeCtx as r}from"../core.js";var i=class i extends n{schemas;get _kind(){return`union`}constructor(e){super(),this.schemas=e}_parse(t,n){let r=[];for(let e of this.schemas){let i=e._parseFullSync(t,n);if(i.issues.length===0)return{data:i.data,issues:[],typeOk:!0};r.push(i.issues)}return{data:t,issues:[{code:e.invalid_union,message:n.messages.union.invalid(),params:{errors:r},path:[]}],typeOk:!1}}async parseAsync(n,i){let a=i??r();return this._withCatchAsync(async()=>{let r=this._prepareInput(n);if(r.skip)return r.value;let i=r.value;try{let e=await Promise.any(this.schemas.map(e=>e.safeParseAsync(i,a).then(e=>{if(e.success)return e.data;throw e.error}))),n=await this._runValidatorsAsync(e,a);if(n.length)throw new t(n);return this._runPostprocessors(e)}catch(n){if(n instanceof AggregateError){let r=n.errors,i=r.find(e=>!t.is(e));if(i!==void 0)throw i;let o=r.map(e=>e.issues);throw new t([{code:e.invalid_union,message:a.messages.union.invalid(),params:{errors:o},path:[]}])}throw n}})}_toDescriptorImpl(){return{...this._describeBase(),branches:this.schemas.map(e=>e.toDescriptor()),kind:`union`}}_walk(e){let t=this.schemas.map(t=>t.walk(e));return e.union?e.union(this,t):super._walk(e)}_equalsImpl(e){return!(e instanceof i)||this.schemas.length!==e.schemas.length?!1:this.schemas.every((t,n)=>t.equals(e.schemas[n]))}};export{i as UnionSchema};
1
+ import{ErrorCode as e}from"../types.js";import{SpellValidationError as t}from"../errors.js";import{Schema as n,_makeCtx as r}from"../core.js";var i=class extends n{schemas;get _kind(){return`union`}checkAsync(e){return this._addCheck(e,!0)}constructor(e){super(),this.schemas=Object.freeze([...e])}_parse(t,n){let r=[];for(let e of this.schemas){let i=e._parseFullSync(t,n);if(i.issues.length===0)return{data:i.data,issues:[],typeOk:!0};r.push(i.issues)}return{data:t,issues:[{code:e.invalid_union,message:n.messages.union.invalid(),params:{errors:r},path:[]}],typeOk:!1}}async parseAsync(n,i){let a=i??r();return this._withCatchAsync(async()=>{let r=this._prepareInput(n);if(r.skip)return r.value;let i=r.value,o=[];for(let e of this.schemas){let n=await e._parseFullAsync(i,a);if(n.issues.length>0){o.push(n.issues);continue}let r=await this._runValidatorsAsync(n.data,a);if(r.length>0)throw new t(r);return this._runPostprocessors(n.data)}throw new t([{code:e.invalid_union,message:a.messages.union.invalid(),params:{errors:o},path:[]}])})}_toDescriptorImpl(){return{...this._describeBase(),branches:this.schemas.map(e=>e.definition()),kind:`union`}}_walk(e){let t=this.schemas.map(t=>t.walk(e));return e.union?e.union(this,t):super._walk(e)}};export{i as UnionSchema};
2
2
  //# sourceMappingURL=union.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"union.js","names":[],"sources":["../../src/schemas/union.ts"],"sourcesContent":["import type { AnySchema, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx } from '../core';\n\nexport class UnionSchema<T extends readonly AnySchema[]> extends Schema<InferOutput<T[number]>> {\n readonly schemas: T;\n\n protected override get _kind(): string {\n return 'union';\n }\n\n constructor(schemas: T) {\n super();\n this.schemas = schemas;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue | Promise<ParseValue> {\n const branchErrors: Issue[][] = [];\n\n for (const schema of this.schemas) {\n const result = schema._parseFullSync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n branchErrors.push(result.issues);\n }\n\n return {\n data: value,\n issues: [\n {\n code: ErrorCode.invalid_union,\n message: ctx.messages.union.invalid(),\n params: { errors: branchErrors },\n path: [],\n },\n ],\n typeOk: false,\n };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<T[number]>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as InferOutput<T[number]>;\n\n const v = prepared.value;\n\n try {\n const data = await Promise.any(\n this.schemas.map((schema) =>\n schema.safeParseAsync(v, c).then((result) => {\n if (result.success) return result.data;\n\n throw result.error;\n }),\n ),\n );\n\n const validationIssues = await this._runValidatorsAsync(data, c);\n\n if (validationIssues.length) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(data) as InferOutput<T[number]>;\n } catch (err) {\n if (err instanceof AggregateError) {\n const errors = err.errors as unknown[];\n const nonValidation = errors.find((e) => !SpellValidationError.is(e));\n\n if (nonValidation !== undefined) throw nonValidation;\n\n const branchErrors = (errors as SpellValidationError[]).map((e) => e.issues);\n\n throw new SpellValidationError([\n {\n code: ErrorCode.invalid_union,\n message: c.messages.union.invalid(),\n params: { errors: branchErrors },\n path: [],\n },\n ]);\n }\n\n throw err;\n }\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), branches: this.schemas.map((s) => s.toDescriptor()), kind: 'union' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = this.schemas.map((s) => s.walk(visitor));\n\n if (visitor.union) return visitor.union(this, branches);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof UnionSchema)) return false;\n\n if (this.schemas.length !== other.schemas.length) return false;\n\n return this.schemas.every((s, i) => s.equals(other.schemas[i]));\n }\n}\n"],"mappings":"8IAIA,IAAa,EAAb,MAAa,UAAoD,CAA+B,CAC9F,QAEA,IAAuB,OAAgB,CACrC,MAAO,OACT,CAEA,YAAY,EAAY,CACtB,MAAM,EACN,KAAK,QAAU,CACjB,CAEA,OAA0B,EAAgB,EAAqD,CAC7F,IAAM,EAA0B,CAAC,EAEjC,IAAK,IAAM,KAAU,KAAK,QAAS,CACjC,IAAM,EAAS,EAAO,eAAe,EAAO,CAAG,EAE/C,GAAI,EAAO,OAAO,SAAW,EAAG,MAAO,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAErF,EAAa,KAAK,EAAO,MAAM,CACjC,CAEA,MAAO,CACL,KAAM,EACN,OAAQ,CACN,CACE,KAAM,EAAU,cAChB,QAAS,EAAI,SAAS,MAAM,QAAQ,EACpC,OAAQ,CAAE,OAAQ,CAAa,EAC/B,KAAM,CAAC,CACT,CACF,EACA,OAAQ,EACV,CACF,CAEA,MAAe,WAAW,EAAgB,EAAqD,CAC7F,IAAM,EAAI,GAAO,EAAS,EAE1B,OAAO,KAAK,gBAAgB,SAAY,CACtC,IAAM,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,OAAO,EAAS,MAEnC,IAAM,EAAI,EAAS,MAEnB,GAAI,CACF,IAAM,EAAO,MAAM,QAAQ,IACzB,KAAK,QAAQ,IAAK,GAChB,EAAO,eAAe,EAAG,CAAC,CAAC,CAAC,KAAM,GAAW,CAC3C,GAAI,EAAO,QAAS,OAAO,EAAO,KAElC,MAAM,EAAO,KACf,CAAC,CACH,CACF,EAEM,EAAmB,MAAM,KAAK,oBAAoB,EAAM,CAAC,EAE/D,GAAI,EAAiB,OAAQ,MAAM,IAAI,EAAqB,CAAgB,EAE5E,OAAO,KAAK,mBAAmB,CAAI,CACrC,OAAS,EAAK,CACZ,GAAI,aAAe,eAAgB,CACjC,IAAM,EAAS,EAAI,OACb,EAAgB,EAAO,KAAM,GAAM,CAAC,EAAqB,GAAG,CAAC,CAAC,EAEpE,GAAI,IAAkB,IAAA,GAAW,MAAM,EAEvC,IAAM,EAAgB,EAAkC,IAAK,GAAM,EAAE,MAAM,EAE3E,MAAM,IAAI,EAAqB,CAC7B,CACE,KAAM,EAAU,cAChB,QAAS,EAAE,SAAS,MAAM,QAAQ,EAClC,OAAQ,CAAE,OAAQ,CAAa,EAC/B,KAAM,CAAC,CACT,CACF,CAAC,CACH,CAEA,MAAM,CACR,CACF,CAAC,CACH,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,SAAU,KAAK,QAAQ,IAAK,GAAM,EAAE,aAAa,CAAC,EAAG,KAAM,OAAQ,CACvG,CAEA,MAA4B,EAAsD,CAChF,IAAM,EAAW,KAAK,QAAQ,IAAK,GAAM,EAAE,KAAK,CAAO,CAAC,EAIxD,OAFI,EAAQ,MAAc,EAAQ,MAAM,KAAM,CAAQ,EAE/C,MAAM,MAAM,CAAO,CAC5B,CAEA,YAA+B,EAA6C,CAK1E,MAJI,EAAE,aAAiB,IAEnB,KAAK,QAAQ,SAAW,EAAM,QAAQ,OAAe,GAElD,KAAK,QAAQ,OAAO,EAAG,IAAM,EAAE,OAAO,EAAM,QAAQ,EAAE,CAAC,CAChE,CACF"}
1
+ {"version":3,"file":"union.js","names":[],"sources":["../../src/schemas/union.ts"],"sourcesContent":["import type { AnySchema, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx } from '../core';\n\nexport class UnionSchema<\n T extends readonly AnySchema[],\n Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<\n import('../core').InferSchemaMode<T[number]>\n >,\n> extends Schema<InferOutput<T[number]>, unknown, Mode> {\n readonly schemas: T;\n\n protected override get _kind(): string {\n return 'union';\n }\n\n override checkAsync(\n this: UnionSchema<T, 'sync'>,\n fn: (\n value: InferOutput<T[number]>,\n ctx: import('../core').CheckContext,\n ) => Promise<import('../core').ValidateResult>,\n ): UnionSchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as UnionSchema<T, 'async'>;\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 | Promise<ParseValue> {\n const branchErrors: Issue[][] = [];\n\n for (const schema of this.schemas) {\n const result = schema._parseFullSync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n branchErrors.push(result.issues);\n }\n\n return {\n data: value,\n issues: [\n {\n code: ErrorCode.invalid_union,\n message: ctx.messages.union.invalid(),\n params: { errors: branchErrors },\n path: [],\n },\n ],\n typeOk: false,\n };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<T[number]>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as InferOutput<T[number]>;\n\n const v = prepared.value;\n\n const branchErrors: Issue[][] = [];\n\n for (const schema of this.schemas) {\n const result = await schema._parseFullAsync(v, c);\n\n if (result.issues.length > 0) {\n branchErrors.push(result.issues);\n continue;\n }\n\n const validationIssues = await this._runValidatorsAsync(result.data, c);\n\n if (validationIssues.length > 0) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(result.data) as InferOutput<T[number]>;\n }\n\n throw new SpellValidationError([\n {\n code: ErrorCode.invalid_union,\n message: c.messages.union.invalid(),\n params: { errors: branchErrors },\n path: [],\n },\n ]);\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), branches: this.schemas.map((s) => s.definition()), kind: 'union' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = this.schemas.map((s) => s.walk(visitor));\n\n if (visitor.union) return visitor.union(this, branches);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"8IAIA,IAAa,EAAb,cAKU,CAA8C,CACtD,QAEA,IAAuB,OAAgB,CACrC,MAAO,OACT,CAEA,WAEE,EAIyB,CACzB,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,YAAY,EAAY,CACtB,MAAM,EACN,KAAK,QAAU,OAAO,OAAO,CAAC,GAAG,CAAO,CAAC,CAC3C,CAEA,OAA0B,EAAgB,EAAqD,CAC7F,IAAM,EAA0B,CAAC,EAEjC,IAAK,IAAM,KAAU,KAAK,QAAS,CACjC,IAAM,EAAS,EAAO,eAAe,EAAO,CAAG,EAE/C,GAAI,EAAO,OAAO,SAAW,EAAG,MAAO,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAErF,EAAa,KAAK,EAAO,MAAM,CACjC,CAEA,MAAO,CACL,KAAM,EACN,OAAQ,CACN,CACE,KAAM,EAAU,cAChB,QAAS,EAAI,SAAS,MAAM,QAAQ,EACpC,OAAQ,CAAE,OAAQ,CAAa,EAC/B,KAAM,CAAC,CACT,CACF,EACA,OAAQ,EACV,CACF,CAEA,MAAe,WAAW,EAAgB,EAAqD,CAC7F,IAAM,EAAI,GAAO,EAAS,EAE1B,OAAO,KAAK,gBAAgB,SAAY,CACtC,IAAM,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,OAAO,EAAS,MAEnC,IAAM,EAAI,EAAS,MAEb,EAA0B,CAAC,EAEjC,IAAK,IAAM,KAAU,KAAK,QAAS,CACjC,IAAM,EAAS,MAAM,EAAO,gBAAgB,EAAG,CAAC,EAEhD,GAAI,EAAO,OAAO,OAAS,EAAG,CAC5B,EAAa,KAAK,EAAO,MAAM,EAC/B,QACF,CAEA,IAAM,EAAmB,MAAM,KAAK,oBAAoB,EAAO,KAAM,CAAC,EAEtE,GAAI,EAAiB,OAAS,EAAG,MAAM,IAAI,EAAqB,CAAgB,EAEhF,OAAO,KAAK,mBAAmB,EAAO,IAAI,CAC5C,CAEA,MAAM,IAAI,EAAqB,CAC7B,CACE,KAAM,EAAU,cAChB,QAAS,EAAE,SAAS,MAAM,QAAQ,EAClC,OAAQ,CAAE,OAAQ,CAAa,EAC/B,KAAM,CAAC,CACT,CACF,CAAC,CACH,CAAC,CACH,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,SAAU,KAAK,QAAQ,IAAK,GAAM,EAAE,WAAW,CAAC,EAAG,KAAM,OAAQ,CACrG,CAEA,MAA4B,EAAsD,CAChF,IAAM,EAAW,KAAK,QAAQ,IAAK,GAAM,EAAE,KAAK,CAAO,CAAC,EAIxD,OAFI,EAAQ,MAAc,EAAQ,MAAM,KAAM,CAAQ,EAE/C,MAAM,MAAM,CAAO,CAC5B,CACF"}
@@ -1,2 +1,2 @@
1
- const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../safe-object.cjs");require("../messages.cjs");const r=require("../core.cjs"),i=require("./literal.cjs");require("./object.cjs");var a=class a extends r.Schema{_map;_discriminator;get _kind(){return`variant`}constructor(e,n){let r=new Map;for(let[a,o]of Object.entries(n)){let n=new i.LiteralSchema(a),s=o.shape[e];if(s&&!s.equals(n))throw new t.SpellError(`s.variant(): branch "${a}" defines a conflicting discriminator schema for "${e}".`);let c={[e]:n};r.set(a,s?o:o.extend(c))}super(),this._discriminator=e,this._map=r}get discriminator(){return this._discriminator}get variantMap(){return this._map}_resolveVariant(t,n){if(typeof t!=`object`||!t||Array.isArray(t))return{issues:[{code:e.ErrorCode.invalid_type,message:n.messages.variant.type(),path:[]}]};let r=t,i=r[this._discriminator],a=this._map.get(i);if(!a){let t=[...this._map.keys()];return{issues:[{code:e.ErrorCode.invalid_variant,message:n.messages.variant.invalidDiscriminator({discriminator:this._discriminator,expected:t}),params:{discriminator:this._discriminator,expected:t},path:[]}]}}return{matched:a,obj:r}}_parse(e,t){let n=this._resolveVariant(e,t);if(`issues`in n)return{data:e,issues:n.issues,typeOk:!1};let r=n.matched._parseFullSync(e,t);return r.issues.length===0?{data:r.data,issues:[],typeOk:!0}:{data:e,issues:r.issues,typeOk:!0}}async parseAsync(e,n){let i=n??r._makeCtx();return this._withCatchAsync(async()=>{let n=this._prepareInput(e);if(n.skip)return n.value;let r=this._resolveVariant(n.value,i);if(`issues`in r)throw new t.SpellValidationError(r.issues);let a=await r.matched.safeParseAsync(n.value,i);if(!a.success)throw a.error;let o=await this._runValidatorsAsync(a.data,i);if(o.length>0)throw new t.SpellValidationError(o);return this._runPostprocessors(a.data)})}_toDescriptorImpl(){let e={};for(let[t,r]of this._map.entries())n.defineOwnProperty(e,t,r.toDescriptor());return{...this._describeBase(),branches:e,discriminator:this._discriminator,kind:`variant`}}_walk(e){let t=n.objectFromEntries([...this._map.entries()].map(([t,n])=>[t,n.walk(e)]));return e.variant?e.variant(this,t):super._walk(e)}_equalsImpl(e){if(!(e instanceof a)||this._discriminator!==e._discriminator||this._map.size!==e._map.size)return!1;for(let[t,n]of this._map){let r=e._map.get(t);if(!r||!n.equals(r))return!1}return!0}};exports.VariantSchema=a;
1
+ const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../safe-object.cjs"),r=require("../core.cjs"),i=require("./literal.cjs");require("./object.cjs");var a=class extends r.Schema{_map;_discriminator;get _kind(){return`variant`}checkAsync(e){return this._addCheck(e,!0)}constructor(e,n){let r=new Map;for(let[a,o]of Object.entries(n)){let n=new i.LiteralSchema(a),s=o.shape[e];if(s&&(!(s instanceof i.LiteralSchema)||s.value!==a))throw new t.SpellError(`s.discriminatedUnion(): branch "${a}" defines a conflicting discriminator schema for "${e}".`);let c={[e]:n};r.set(a,s?o:o.extend(c))}super(),this._discriminator=e,this._map=r}get discriminator(){return this._discriminator}get variantMap(){return new Map(this._map)}_resolveVariant(t,n){if(typeof t!=`object`||!t||Array.isArray(t))return{issues:[{code:e.ErrorCode.invalid_type,message:n.messages.variant.type(),path:[]}]};let r=t,i=r[this._discriminator],a=this._map.get(i);if(!a){let t=[...this._map.keys()];return{issues:[{code:e.ErrorCode.invalid_variant,message:n.messages.variant.invalidDiscriminator({discriminator:this._discriminator,expected:t}),params:{discriminator:this._discriminator,expected:t},path:[]}]}}return{matched:a,obj:r}}_parse(e,t){let n=this._resolveVariant(e,t);if(`issues`in n)return{data:e,issues:n.issues,typeOk:!1};let r=n.matched._parseFullSync(e,t);return r.issues.length===0?{data:r.data,issues:[],typeOk:!0}:{data:e,issues:r.issues,typeOk:!0}}async parseAsync(e,n){let i=n??r._makeCtx();return this._withCatchAsync(async()=>{let n=this._prepareInput(e);if(n.skip)return n.value;let r=this._resolveVariant(n.value,i);if(`issues`in r)throw new t.SpellValidationError(r.issues);let a=await r.matched.safeParseAsync(n.value,i);if(!a.success)throw a.error;let o=await this._runValidatorsAsync(a.data,i);if(o.length>0)throw new t.SpellValidationError(o);return this._runPostprocessors(a.data)})}_toDescriptorImpl(){let e={};for(let[t,r]of this._map.entries())n.defineOwnProperty(e,t,r.definition());return{...this._describeBase(),branches:e,discriminator:this._discriminator,kind:`variant`}}_walk(e){let t=n.objectFromEntries([...this._map.entries()].map(([t,n])=>[t,n.walk(e)]));return e.variant?e.variant(this,t):super._walk(e)}};exports.VariantSchema=a;
2
2
  //# sourceMappingURL=variant.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"variant.cjs","names":[],"sources":["../../src/schemas/variant.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { SpellError } from '../errors';\nimport { _messages } from '../messages';\nimport { defineOwnProperty, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { type InferObject, ObjectSchema, type ObjectShape } from './object';\n\ntype VariantMap = Record<string, ObjectSchema<any>>;\ntype InferVariantMap<K extends string, M extends VariantMap> = {\n [Tag in keyof M & string]: M[Tag] extends ObjectSchema<infer S extends ObjectShape>\n ? InferObject<S> & { [P in K]: Tag }\n : never;\n}[keyof M & string];\n\nexport class VariantSchema<K extends string, M extends VariantMap> extends Schema<InferVariantMap<K, M>> {\n private readonly _map: Map<string, ObjectSchema<any>>;\n private readonly _discriminator: K;\n\n protected override get _kind(): string {\n return 'variant';\n }\n\n constructor(discriminator: K, variantMap: M) {\n const map = new Map<string, ObjectSchema<any>>();\n\n for (const [tag, schema] of Object.entries(variantMap)) {\n const discriminatorSchema = new LiteralSchema(tag);\n const existingDiscriminator = schema.shape[discriminator];\n\n if (existingDiscriminator && !existingDiscriminator.equals(discriminatorSchema)) {\n throw new SpellError(\n `s.variant(): branch \"${tag}\" defines a conflicting discriminator schema for \"${discriminator}\".`,\n );\n }\n\n const discriminatorShape = {\n [discriminator]: discriminatorSchema,\n } as unknown as Record<K, AnySchema>;\n\n map.set(tag, existingDiscriminator ? schema : schema.extend(discriminatorShape));\n }\n\n super();\n this._discriminator = discriminator;\n this._map = map;\n }\n\n /** The discriminator field key used to select the matching variant. */\n get discriminator(): K {\n return this._discriminator;\n }\n\n /** Map from discriminator tag value to the extended ObjectSchema for that variant. */\n get variantMap(): ReadonlyMap<string, ObjectSchema<any>> {\n return this._map;\n }\n\n private _resolveVariant(\n value: unknown,\n ctx: ParseContext,\n ): { matched: ObjectSchema<any>; obj: Record<string, unknown> } | { issues: Issue[] } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.variant.type(), path: [] }],\n };\n }\n\n const obj = value as Record<string, unknown>;\n const discValue = obj[this._discriminator] as string;\n const matched = this._map.get(discValue);\n\n if (!matched) {\n const expected = [...this._map.keys()];\n\n return {\n issues: [\n {\n code: ErrorCode.invalid_variant,\n message: ctx.messages.variant.invalidDiscriminator({\n discriminator: this._discriminator,\n expected,\n }),\n params: { discriminator: this._discriminator, expected },\n path: [],\n },\n ],\n };\n }\n\n return { matched, obj };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const resolved = this._resolveVariant(value, ctx);\n\n if ('issues' in resolved) return { data: value, issues: resolved.issues, typeOk: false };\n\n const result = resolved.matched._parseFullSync(value, ctx);\n\n return result.issues.length === 0\n ? { data: result.data, issues: [], typeOk: true }\n : { data: value, issues: result.issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferVariantMap<K, M>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferVariantMap<K, M>;\n\n const resolved = this._resolveVariant(prepared.value, c);\n\n if ('issues' in resolved) throw new SpellValidationError(resolved.issues);\n\n const branch = await resolved.matched.safeParseAsync(prepared.value, c);\n\n if (!branch.success) throw branch.error;\n\n const validationIssues = await this._runValidatorsAsync(branch.data, c);\n\n if (validationIssues.length > 0) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(branch.data) as InferVariantMap<K, M>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const branches: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of this._map.entries()) {\n defineOwnProperty(branches, key, schema.toDescriptor());\n }\n\n return { ...this._describeBase(), branches, discriminator: this._discriminator, kind: 'variant' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = objectFromEntries([...this._map.entries()].map(([k, s]) => [k, s.walk(visitor)]));\n\n if (visitor.variant) return visitor.variant(this, branches);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof VariantSchema)) return false;\n\n if (this._discriminator !== other._discriminator) return false;\n\n if (this._map.size !== other._map.size) return false;\n\n for (const [tag, schema] of this._map) {\n const otherSchema = other._map.get(tag);\n\n if (!otherSchema || !schema.equals(otherSchema)) return false;\n }\n\n return true;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"variant.cjs","names":[],"sources":["../../src/schemas/variant.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { SpellError } from '../errors';\nimport { defineOwnProperty, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { type InferObject, ObjectSchema, type ObjectShape } from './object';\n\ntype VariantMap = Record<string, ObjectSchema<any, any>>;\ntype InferVariantMap<K extends string, M extends VariantMap> = {\n [Tag in keyof M & string]: M[Tag] extends { shape: infer S extends ObjectShape }\n ? InferObject<S> & { [P in K]: Tag }\n : never;\n}[keyof M & string];\n\nexport class VariantSchema<\n K extends string,\n M extends VariantMap,\n Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<\n import('../core').InferSchemaMode<M[keyof M]>\n >,\n> extends Schema<InferVariantMap<K, M>, unknown, Mode> {\n private readonly _map: Map<string, VariantMap[string]>;\n private readonly _discriminator: K;\n\n protected override get _kind(): string {\n return 'variant';\n }\n\n override checkAsync(\n this: VariantSchema<K, M, 'sync'>,\n fn: (\n value: InferVariantMap<K, M>,\n ctx: import('../core').CheckContext,\n ) => Promise<import('../core').ValidateResult>,\n ): VariantSchema<K, M, 'async'> {\n return this._addCheck(fn, true) as unknown as VariantSchema<K, M, 'async'>;\n }\n\n constructor(discriminator: K, variantMap: M) {\n const map = new Map<string, VariantMap[string]>();\n\n for (const [tag, schema] of Object.entries(variantMap)) {\n const discriminatorSchema = new LiteralSchema(tag);\n const existingDiscriminator = schema.shape[discriminator];\n\n if (\n existingDiscriminator &&\n (!(existingDiscriminator instanceof LiteralSchema) || existingDiscriminator.value !== tag)\n ) {\n throw new SpellError(\n `s.discriminatedUnion(): branch \"${tag}\" defines a conflicting discriminator schema for \"${discriminator}\".`,\n );\n }\n\n const discriminatorShape = {\n [discriminator]: discriminatorSchema,\n } as unknown as Record<K, AnySchema>;\n\n map.set(tag, existingDiscriminator ? schema : schema.extend(discriminatorShape));\n }\n\n super();\n this._discriminator = discriminator;\n this._map = map;\n }\n\n /** The discriminator field key used to select the matching variant. */\n get discriminator(): K {\n return this._discriminator;\n }\n\n /** Map from discriminator tag value to the extended ObjectSchema for that variant. */\n get variantMap(): ReadonlyMap<string, VariantMap[string]> {\n return new Map(this._map);\n }\n\n private _resolveVariant(\n value: unknown,\n ctx: ParseContext,\n ): { matched: VariantMap[string]; obj: Record<string, unknown> } | { issues: Issue[] } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.variant.type(), path: [] }],\n };\n }\n\n const obj = value as Record<string, unknown>;\n const discValue = obj[this._discriminator] as string;\n const matched = this._map.get(discValue);\n\n if (!matched) {\n const expected = [...this._map.keys()];\n\n return {\n issues: [\n {\n code: ErrorCode.invalid_variant,\n message: ctx.messages.variant.invalidDiscriminator({\n discriminator: this._discriminator,\n expected,\n }),\n params: { discriminator: this._discriminator, expected },\n path: [],\n },\n ],\n };\n }\n\n return { matched, obj };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const resolved = this._resolveVariant(value, ctx);\n\n if ('issues' in resolved) return { data: value, issues: resolved.issues, typeOk: false };\n\n const result = resolved.matched._parseFullSync(value, ctx);\n\n return result.issues.length === 0\n ? { data: result.data, issues: [], typeOk: true }\n : { data: value, issues: result.issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferVariantMap<K, M>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferVariantMap<K, M>;\n\n const resolved = this._resolveVariant(prepared.value, c);\n\n if ('issues' in resolved) throw new SpellValidationError(resolved.issues);\n\n const branch = await resolved.matched.safeParseAsync(prepared.value, c);\n\n if (!branch.success) throw branch.error;\n\n const validationIssues = await this._runValidatorsAsync(branch.data, c);\n\n if (validationIssues.length > 0) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(branch.data) as InferVariantMap<K, M>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const branches: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of this._map.entries()) {\n defineOwnProperty(branches, key, schema.definition());\n }\n\n return { ...this._describeBase(), branches, discriminator: this._discriminator, kind: 'variant' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = objectFromEntries([...this._map.entries()].map(([k, s]) => [k, s.walk(visitor)]));\n\n if (visitor.variant) return visitor.variant(this, branches);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"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"}
@@ -1,27 +1,29 @@
1
1
  import type { ParseContext, ParseValue, SchemaDescriptor } from '../core';
2
2
  import { Schema } from '../core';
3
3
  import { type InferObject, ObjectSchema, type ObjectShape } from './object';
4
- type VariantMap = Record<string, ObjectSchema<any>>;
4
+ type VariantMap = Record<string, ObjectSchema<any, any>>;
5
5
  type InferVariantMap<K extends string, M extends VariantMap> = {
6
- [Tag in keyof M & string]: M[Tag] extends ObjectSchema<infer S extends ObjectShape> ? InferObject<S> & {
6
+ [Tag in keyof M & string]: M[Tag] extends {
7
+ shape: infer S extends ObjectShape;
8
+ } ? InferObject<S> & {
7
9
  [P in K]: Tag;
8
10
  } : never;
9
11
  }[keyof M & string];
10
- export declare class VariantSchema<K extends string, M extends VariantMap> extends Schema<InferVariantMap<K, M>> {
12
+ export declare class VariantSchema<K extends string, M extends VariantMap, Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<import('../core').InferSchemaMode<M[keyof M]>>> extends Schema<InferVariantMap<K, M>, unknown, Mode> {
11
13
  private readonly _map;
12
14
  private readonly _discriminator;
13
15
  protected get _kind(): string;
16
+ checkAsync(this: VariantSchema<K, M, 'sync'>, fn: (value: InferVariantMap<K, M>, ctx: import('../core').CheckContext) => Promise<import('../core').ValidateResult>): VariantSchema<K, M, 'async'>;
14
17
  constructor(discriminator: K, variantMap: M);
15
18
  /** The discriminator field key used to select the matching variant. */
16
19
  get discriminator(): K;
17
20
  /** Map from discriminator tag value to the extended ObjectSchema for that variant. */
18
- get variantMap(): ReadonlyMap<string, ObjectSchema<any>>;
21
+ get variantMap(): ReadonlyMap<string, VariantMap[string]>;
19
22
  private _resolveVariant;
20
23
  protected _parse(value: unknown, ctx: ParseContext): ParseValue;
21
24
  parseAsync(value: unknown, ctx?: ParseContext): Promise<InferVariantMap<K, M>>;
22
25
  protected _toDescriptorImpl(): SchemaDescriptor;
23
26
  protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
24
- protected _equalsImpl(other: import('../core').AnySchema): boolean;
25
27
  }
26
28
  export {};
27
29
  //# sourceMappingURL=variant.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"variant.d.ts","sourceRoot":"","sources":["../../src/schemas/variant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAa,MAAM,EAAkC,MAAM,SAAS,CAAC;AAK5E,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5E,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,KAAK,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,UAAU,IAAI;KAC5D,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,YAAY,CAAC,MAAM,CAAC,SAAS,WAAW,CAAC,GAC/E,WAAW,CAAC,CAAC,CAAC,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,GAAG;KAAE,GAClC,KAAK;CACV,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAEpB,qBAAa,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,UAAU,CAAE,SAAQ,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;IACtD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAI;IAEnC,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;IAyB3C,uEAAuE;IACvE,IAAI,aAAa,IAAI,CAAC,CAErB;IAED,sFAAsF;IACtF,IAAI,UAAU,IAAI,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAEvD;IAED,OAAO,CAAC,eAAe;cAmCJ,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IAYzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;cAwB1E,iBAAiB,IAAI,gBAAgB;cAUrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAQ9D,WAAW,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,SAAS,GAAG,OAAO;CAe5E"}
1
+ {"version":3,"file":"variant.d.ts","sourceRoot":"","sources":["../../src/schemas/variant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAa,MAAM,EAAkC,MAAM,SAAS,CAAC;AAI5E,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5E,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACzD,KAAK,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,UAAU,IAAI;KAC5D,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC,SAAS,WAAW,CAAA;KAAE,GAC5E,WAAW,CAAC,CAAC,CAAC,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,GAAG;KAAE,GAClC,KAAK;CACV,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAEpB,qBAAa,aAAa,CACxB,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,UAAU,EACpB,IAAI,SAAS,OAAO,SAAS,EAAE,UAAU,GAAG,OAAO,SAAS,EAAE,gBAAgB,CAC5E,OAAO,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAC9C,CACD,SAAQ,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAI;IAEnC,cAAuB,KAAK,IAAI,MAAM,CAErC;IAEQ,UAAU,CACjB,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EACjC,EAAE,EAAE,CACF,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC5B,GAAG,EAAE,OAAO,SAAS,EAAE,YAAY,KAChC,OAAO,CAAC,OAAO,SAAS,EAAE,cAAc,CAAC,GAC7C,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;gBAInB,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;IA4B3C,uEAAuE;IACvE,IAAI,aAAa,IAAI,CAAC,CAErB;IAED,sFAAsF;IACtF,IAAI,UAAU,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAExD;IAED,OAAO,CAAC,eAAe;cAmCJ,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IAYzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;cAwB1E,iBAAiB,IAAI,gBAAgB;cAUrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;CAOlF"}
@@ -1,2 +1,2 @@
1
- import{ErrorCode as e}from"../types.js";import{SpellError as t,SpellValidationError as n}from"../errors.js";import{defineOwnProperty as r,objectFromEntries as i}from"../safe-object.js";import"../messages.js";import{Schema as a,_makeCtx as o}from"../core.js";import{LiteralSchema as s}from"./literal.js";import"./object.js";var c=class c extends a{_map;_discriminator;get _kind(){return`variant`}constructor(e,n){let r=new Map;for(let[i,a]of Object.entries(n)){let n=new s(i),o=a.shape[e];if(o&&!o.equals(n))throw new t(`s.variant(): branch "${i}" defines a conflicting discriminator schema for "${e}".`);let c={[e]:n};r.set(i,o?a:a.extend(c))}super(),this._discriminator=e,this._map=r}get discriminator(){return this._discriminator}get variantMap(){return this._map}_resolveVariant(t,n){if(typeof t!=`object`||!t||Array.isArray(t))return{issues:[{code:e.invalid_type,message:n.messages.variant.type(),path:[]}]};let r=t,i=r[this._discriminator],a=this._map.get(i);if(!a){let t=[...this._map.keys()];return{issues:[{code:e.invalid_variant,message:n.messages.variant.invalidDiscriminator({discriminator:this._discriminator,expected:t}),params:{discriminator:this._discriminator,expected:t},path:[]}]}}return{matched:a,obj:r}}_parse(e,t){let n=this._resolveVariant(e,t);if(`issues`in n)return{data:e,issues:n.issues,typeOk:!1};let r=n.matched._parseFullSync(e,t);return r.issues.length===0?{data:r.data,issues:[],typeOk:!0}:{data:e,issues:r.issues,typeOk:!0}}async parseAsync(e,t){let r=t??o();return this._withCatchAsync(async()=>{let t=this._prepareInput(e);if(t.skip)return t.value;let i=this._resolveVariant(t.value,r);if(`issues`in i)throw new n(i.issues);let a=await i.matched.safeParseAsync(t.value,r);if(!a.success)throw a.error;let o=await this._runValidatorsAsync(a.data,r);if(o.length>0)throw new n(o);return this._runPostprocessors(a.data)})}_toDescriptorImpl(){let e={};for(let[t,n]of this._map.entries())r(e,t,n.toDescriptor());return{...this._describeBase(),branches:e,discriminator:this._discriminator,kind:`variant`}}_walk(e){let t=i([...this._map.entries()].map(([t,n])=>[t,n.walk(e)]));return e.variant?e.variant(this,t):super._walk(e)}_equalsImpl(e){if(!(e instanceof c)||this._discriminator!==e._discriminator||this._map.size!==e._map.size)return!1;for(let[t,n]of this._map){let r=e._map.get(t);if(!r||!n.equals(r))return!1}return!0}};export{c as VariantSchema};
1
+ import{ErrorCode as e}from"../types.js";import{SpellError as t,SpellValidationError as n}from"../errors.js";import{defineOwnProperty as r,objectFromEntries as i}from"../safe-object.js";import{Schema as a,_makeCtx as o}from"../core.js";import{LiteralSchema as s}from"./literal.js";import"./object.js";var c=class extends a{_map;_discriminator;get _kind(){return`variant`}checkAsync(e){return this._addCheck(e,!0)}constructor(e,n){let r=new Map;for(let[i,a]of Object.entries(n)){let n=new s(i),o=a.shape[e];if(o&&(!(o instanceof s)||o.value!==i))throw new t(`s.discriminatedUnion(): branch "${i}" defines a conflicting discriminator schema for "${e}".`);let c={[e]:n};r.set(i,o?a:a.extend(c))}super(),this._discriminator=e,this._map=r}get discriminator(){return this._discriminator}get variantMap(){return new Map(this._map)}_resolveVariant(t,n){if(typeof t!=`object`||!t||Array.isArray(t))return{issues:[{code:e.invalid_type,message:n.messages.variant.type(),path:[]}]};let r=t,i=r[this._discriminator],a=this._map.get(i);if(!a){let t=[...this._map.keys()];return{issues:[{code:e.invalid_variant,message:n.messages.variant.invalidDiscriminator({discriminator:this._discriminator,expected:t}),params:{discriminator:this._discriminator,expected:t},path:[]}]}}return{matched:a,obj:r}}_parse(e,t){let n=this._resolveVariant(e,t);if(`issues`in n)return{data:e,issues:n.issues,typeOk:!1};let r=n.matched._parseFullSync(e,t);return r.issues.length===0?{data:r.data,issues:[],typeOk:!0}:{data:e,issues:r.issues,typeOk:!0}}async parseAsync(e,t){let r=t??o();return this._withCatchAsync(async()=>{let t=this._prepareInput(e);if(t.skip)return t.value;let i=this._resolveVariant(t.value,r);if(`issues`in i)throw new n(i.issues);let a=await i.matched.safeParseAsync(t.value,r);if(!a.success)throw a.error;let o=await this._runValidatorsAsync(a.data,r);if(o.length>0)throw new n(o);return this._runPostprocessors(a.data)})}_toDescriptorImpl(){let e={};for(let[t,n]of this._map.entries())r(e,t,n.definition());return{...this._describeBase(),branches:e,discriminator:this._discriminator,kind:`variant`}}_walk(e){let t=i([...this._map.entries()].map(([t,n])=>[t,n.walk(e)]));return e.variant?e.variant(this,t):super._walk(e)}};export{c as VariantSchema};
2
2
  //# sourceMappingURL=variant.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"variant.js","names":[],"sources":["../../src/schemas/variant.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { SpellError } from '../errors';\nimport { _messages } from '../messages';\nimport { defineOwnProperty, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { type InferObject, ObjectSchema, type ObjectShape } from './object';\n\ntype VariantMap = Record<string, ObjectSchema<any>>;\ntype InferVariantMap<K extends string, M extends VariantMap> = {\n [Tag in keyof M & string]: M[Tag] extends ObjectSchema<infer S extends ObjectShape>\n ? InferObject<S> & { [P in K]: Tag }\n : never;\n}[keyof M & string];\n\nexport class VariantSchema<K extends string, M extends VariantMap> extends Schema<InferVariantMap<K, M>> {\n private readonly _map: Map<string, ObjectSchema<any>>;\n private readonly _discriminator: K;\n\n protected override get _kind(): string {\n return 'variant';\n }\n\n constructor(discriminator: K, variantMap: M) {\n const map = new Map<string, ObjectSchema<any>>();\n\n for (const [tag, schema] of Object.entries(variantMap)) {\n const discriminatorSchema = new LiteralSchema(tag);\n const existingDiscriminator = schema.shape[discriminator];\n\n if (existingDiscriminator && !existingDiscriminator.equals(discriminatorSchema)) {\n throw new SpellError(\n `s.variant(): branch \"${tag}\" defines a conflicting discriminator schema for \"${discriminator}\".`,\n );\n }\n\n const discriminatorShape = {\n [discriminator]: discriminatorSchema,\n } as unknown as Record<K, AnySchema>;\n\n map.set(tag, existingDiscriminator ? schema : schema.extend(discriminatorShape));\n }\n\n super();\n this._discriminator = discriminator;\n this._map = map;\n }\n\n /** The discriminator field key used to select the matching variant. */\n get discriminator(): K {\n return this._discriminator;\n }\n\n /** Map from discriminator tag value to the extended ObjectSchema for that variant. */\n get variantMap(): ReadonlyMap<string, ObjectSchema<any>> {\n return this._map;\n }\n\n private _resolveVariant(\n value: unknown,\n ctx: ParseContext,\n ): { matched: ObjectSchema<any>; obj: Record<string, unknown> } | { issues: Issue[] } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.variant.type(), path: [] }],\n };\n }\n\n const obj = value as Record<string, unknown>;\n const discValue = obj[this._discriminator] as string;\n const matched = this._map.get(discValue);\n\n if (!matched) {\n const expected = [...this._map.keys()];\n\n return {\n issues: [\n {\n code: ErrorCode.invalid_variant,\n message: ctx.messages.variant.invalidDiscriminator({\n discriminator: this._discriminator,\n expected,\n }),\n params: { discriminator: this._discriminator, expected },\n path: [],\n },\n ],\n };\n }\n\n return { matched, obj };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const resolved = this._resolveVariant(value, ctx);\n\n if ('issues' in resolved) return { data: value, issues: resolved.issues, typeOk: false };\n\n const result = resolved.matched._parseFullSync(value, ctx);\n\n return result.issues.length === 0\n ? { data: result.data, issues: [], typeOk: true }\n : { data: value, issues: result.issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferVariantMap<K, M>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferVariantMap<K, M>;\n\n const resolved = this._resolveVariant(prepared.value, c);\n\n if ('issues' in resolved) throw new SpellValidationError(resolved.issues);\n\n const branch = await resolved.matched.safeParseAsync(prepared.value, c);\n\n if (!branch.success) throw branch.error;\n\n const validationIssues = await this._runValidatorsAsync(branch.data, c);\n\n if (validationIssues.length > 0) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(branch.data) as InferVariantMap<K, M>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const branches: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of this._map.entries()) {\n defineOwnProperty(branches, key, schema.toDescriptor());\n }\n\n return { ...this._describeBase(), branches, discriminator: this._discriminator, kind: 'variant' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = objectFromEntries([...this._map.entries()].map(([k, s]) => [k, s.walk(visitor)]));\n\n if (visitor.variant) return visitor.variant(this, branches);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof VariantSchema)) return false;\n\n if (this._discriminator !== other._discriminator) return false;\n\n if (this._map.size !== other._map.size) return false;\n\n for (const [tag, schema] of this._map) {\n const otherSchema = other._map.get(tag);\n\n if (!otherSchema || !schema.equals(otherSchema)) return false;\n }\n\n return true;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"variant.js","names":[],"sources":["../../src/schemas/variant.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { SpellError } from '../errors';\nimport { defineOwnProperty, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { type InferObject, ObjectSchema, type ObjectShape } from './object';\n\ntype VariantMap = Record<string, ObjectSchema<any, any>>;\ntype InferVariantMap<K extends string, M extends VariantMap> = {\n [Tag in keyof M & string]: M[Tag] extends { shape: infer S extends ObjectShape }\n ? InferObject<S> & { [P in K]: Tag }\n : never;\n}[keyof M & string];\n\nexport class VariantSchema<\n K extends string,\n M extends VariantMap,\n Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<\n import('../core').InferSchemaMode<M[keyof M]>\n >,\n> extends Schema<InferVariantMap<K, M>, unknown, Mode> {\n private readonly _map: Map<string, VariantMap[string]>;\n private readonly _discriminator: K;\n\n protected override get _kind(): string {\n return 'variant';\n }\n\n override checkAsync(\n this: VariantSchema<K, M, 'sync'>,\n fn: (\n value: InferVariantMap<K, M>,\n ctx: import('../core').CheckContext,\n ) => Promise<import('../core').ValidateResult>,\n ): VariantSchema<K, M, 'async'> {\n return this._addCheck(fn, true) as unknown as VariantSchema<K, M, 'async'>;\n }\n\n constructor(discriminator: K, variantMap: M) {\n const map = new Map<string, VariantMap[string]>();\n\n for (const [tag, schema] of Object.entries(variantMap)) {\n const discriminatorSchema = new LiteralSchema(tag);\n const existingDiscriminator = schema.shape[discriminator];\n\n if (\n existingDiscriminator &&\n (!(existingDiscriminator instanceof LiteralSchema) || existingDiscriminator.value !== tag)\n ) {\n throw new SpellError(\n `s.discriminatedUnion(): branch \"${tag}\" defines a conflicting discriminator schema for \"${discriminator}\".`,\n );\n }\n\n const discriminatorShape = {\n [discriminator]: discriminatorSchema,\n } as unknown as Record<K, AnySchema>;\n\n map.set(tag, existingDiscriminator ? schema : schema.extend(discriminatorShape));\n }\n\n super();\n this._discriminator = discriminator;\n this._map = map;\n }\n\n /** The discriminator field key used to select the matching variant. */\n get discriminator(): K {\n return this._discriminator;\n }\n\n /** Map from discriminator tag value to the extended ObjectSchema for that variant. */\n get variantMap(): ReadonlyMap<string, VariantMap[string]> {\n return new Map(this._map);\n }\n\n private _resolveVariant(\n value: unknown,\n ctx: ParseContext,\n ): { matched: VariantMap[string]; obj: Record<string, unknown> } | { issues: Issue[] } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.variant.type(), path: [] }],\n };\n }\n\n const obj = value as Record<string, unknown>;\n const discValue = obj[this._discriminator] as string;\n const matched = this._map.get(discValue);\n\n if (!matched) {\n const expected = [...this._map.keys()];\n\n return {\n issues: [\n {\n code: ErrorCode.invalid_variant,\n message: ctx.messages.variant.invalidDiscriminator({\n discriminator: this._discriminator,\n expected,\n }),\n params: { discriminator: this._discriminator, expected },\n path: [],\n },\n ],\n };\n }\n\n return { matched, obj };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const resolved = this._resolveVariant(value, ctx);\n\n if ('issues' in resolved) return { data: value, issues: resolved.issues, typeOk: false };\n\n const result = resolved.matched._parseFullSync(value, ctx);\n\n return result.issues.length === 0\n ? { data: result.data, issues: [], typeOk: true }\n : { data: value, issues: result.issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferVariantMap<K, M>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferVariantMap<K, M>;\n\n const resolved = this._resolveVariant(prepared.value, c);\n\n if ('issues' in resolved) throw new SpellValidationError(resolved.issues);\n\n const branch = await resolved.matched.safeParseAsync(prepared.value, c);\n\n if (!branch.success) throw branch.error;\n\n const validationIssues = await this._runValidatorsAsync(branch.data, c);\n\n if (validationIssues.length > 0) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(branch.data) as InferVariantMap<K, M>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const branches: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of this._map.entries()) {\n defineOwnProperty(branches, key, schema.definition());\n }\n\n return { ...this._describeBase(), branches, discriminator: this._discriminator, kind: 'variant' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = objectFromEntries([...this._map.entries()].map(([k, s]) => [k, s.walk(visitor)]));\n\n if (visitor.variant) return visitor.variant(this, branches);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"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"}