@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
package/dist/messages.cjs CHANGED
@@ -1,2 +1,2 @@
1
- const e=require("./safe-object.cjs"),t=require("./_dev.cjs");var n={array:{length:({exact:e})=>`Must have exactly ${e} items`,max:({max:e})=>`Must have at most ${e} items`,min:({min:e})=>`Must have at least ${e} items`,nonEmpty:()=>`Cannot be empty`,type:()=>`Expected array`,unique:()=>`All items must be unique`},bigint:{max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,type:()=>`Expected bigint`},boolean:{type:()=>`Expected boolean`},check:{default:()=>`Invalid value`},date:{max:({max:e})=>`Must be before ${e.toISOString()}`,min:({min:e})=>`Must be after ${e.toISOString()}`,type:()=>`Expected valid date`},enum:{invalid:({values:e})=>`Expected one of: ${e.map(e=>JSON.stringify(e)).join(`, `)}`},instanceof:{type:({className:e})=>`Expected instance of ${e}`},literal:{expected:({expected:e})=>`Expected ${JSON.stringify(e)}`},map:{max:({max:e})=>`Must contain at most ${e} entries`,min:({min:e})=>`Must contain at least ${e} entries`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} entries`,type:()=>`Expected map`},never:{invalid:()=>`Value is not allowed`},number:{finite:()=>`Must be finite`,int:()=>`Must be an integer`,max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,safe:()=>`Must be a safe integer`,type:()=>`Expected number`},object:{invalidKeys:({keys:e})=>`Unrecognized keys: ${e.join(`, `)}`,type:()=>`Expected object`},set:{max:({max:e})=>`Must contain at most ${e} items`,min:({min:e})=>`Must contain at least ${e} items`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} items`,type:()=>`Expected set`},string:{base64:()=>`Invalid base64`,base64url:()=>`Invalid base64url`,cuid:()=>`Invalid CUID`,cuid2:()=>`Invalid CUID2`,date:()=>`Invalid date`,dateTime:()=>`Invalid datetime`,duration:()=>`Invalid ISO 8601 duration`,email:()=>`Invalid email address`,emoji:()=>`Invalid emoji sequence`,endsWith:({suffix:e})=>`Must end with "${e}"`,hex:()=>`Invalid hex`,hexColor:()=>`Invalid hex color`,includes:({substr:e})=>`Must include "${e}"`,ip:()=>`Invalid IP address`,jwt:()=>`Invalid JWT`,length:({exact:e})=>`Must be exactly ${e} characters`,max:({max:e})=>`Must be at most ${e} characters`,min:({min:e})=>`Must be at least ${e} characters`,nanoid:()=>`Invalid NanoID`,nonEmpty:()=>`Cannot be empty`,numeric:()=>`Invalid numeric string`,regex:()=>`Invalid format`,semver:()=>`Invalid semver`,slug:()=>`Invalid slug`,startsWith:({prefix:e})=>`Must start with "${e}"`,time:()=>`Invalid time`,type:()=>`Expected string`,ulid:()=>`Invalid ULID`,url:()=>`Invalid URL`,uuid:()=>`Invalid UUID`},tuple:{length:({exact:e})=>`Expected tuple of length ${e}`,min:({min:e})=>`Expected tuple with at least ${e} items`,type:()=>`Expected array`},union:{invalid:()=>`Does not match any of the expected types`},variant:{invalidDiscriminator:({discriminator:e,expected:t})=>`Invalid discriminator value at "${e}": expected ${t.map(e=>JSON.stringify(e)).join(` | `)}`,type:()=>`Expected object`}},r=n,i=e=>{t.warn(e)};function a(e){i(e)}function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(t,n){let r=e.cloneRecord(t);for(let[t,i]of Object.entries(n)){if(i===void 0)continue;if(e.isUnsafeObjectKey(t)){a(`[spell] Ignoring unsafe message override key "${t}" to prevent prototype mutation.`);continue}let n=r[t];o(n)&&o(i)?e.defineOwnProperty(r,t,s(n,i)):e.defineOwnProperty(r,t,i)}return r}function c(e){r=s(n,e)}function l(e){i=e??(()=>{})}function u(){r=n}function d(e){return e===void 0?{messages:r}:{messages:s(r,e)}}function f(e,t){let i=r;r=s(n,e);try{let e=t();return e instanceof Promise?e.finally(()=>{r=i}):(r=i,e)}catch(e){throw r=i,e}}function p(e,t){let n=i;i=e??(()=>{});try{let e=t();return e instanceof Promise?e.finally(()=>{i=n}):(i=n,e)}catch(e){throw i=n,e}}function m(){return r}exports._dev=a,exports._messages=m,exports.createParseContext=d,exports.resetMessages=u,exports.setLogger=l,exports.setMessages=c,exports.withLogger=p,exports.withMessages=f;
1
+ require("./_dev.cjs");const e=require("./safe-object.cjs");var t={array:{length:({exact:e})=>`Must have exactly ${e} items`,max:({max:e})=>`Must have at most ${e} items`,min:({min:e})=>`Must have at least ${e} items`,nonEmpty:()=>`Cannot be empty`,type:()=>`Expected array`,unique:()=>`All items must be unique`},bigint:{max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,type:()=>`Expected bigint`},boolean:{type:()=>`Expected boolean`},check:{default:()=>`Invalid value`},date:{max:({max:e})=>`Must be before ${e.toISOString()}`,min:({min:e})=>`Must be after ${e.toISOString()}`,type:()=>`Expected valid date`},enum:{invalid:({values:e})=>`Expected one of: ${e.map(e=>JSON.stringify(e)).join(`, `)}`},instanceof:{type:({className:e})=>`Expected instance of ${e}`},literal:{expected:({expected:e})=>`Expected ${JSON.stringify(e)}`},map:{max:({max:e})=>`Must contain at most ${e} entries`,min:({min:e})=>`Must contain at least ${e} entries`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} entries`,type:()=>`Expected map`},never:{invalid:()=>`Value is not allowed`},number:{finite:()=>`Must be finite`,int:()=>`Must be an integer`,max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,safe:()=>`Must be a safe integer`,type:()=>`Expected number`},object:{invalidKeys:({keys:e})=>`Unrecognized keys: ${e.join(`, `)}`,type:()=>`Expected object`},set:{max:({max:e})=>`Must contain at most ${e} items`,min:({min:e})=>`Must contain at least ${e} items`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} items`,type:()=>`Expected set`},string:{base64:()=>`Invalid base64`,base64url:()=>`Invalid base64url`,cuid:()=>`Invalid CUID`,cuid2:()=>`Invalid CUID2`,date:()=>`Invalid date`,dateTime:()=>`Invalid datetime`,duration:()=>`Invalid ISO 8601 duration`,email:()=>`Invalid email address`,emoji:()=>`Invalid emoji sequence`,endsWith:({suffix:e})=>`Must end with "${e}"`,hex:()=>`Invalid hex`,hexColor:()=>`Invalid hex color`,includes:({substr:e})=>`Must include "${e}"`,ip:()=>`Invalid IP address`,jwt:()=>`Invalid JWT`,length:({exact:e})=>`Must be exactly ${e} characters`,max:({max:e})=>`Must be at most ${e} characters`,min:({min:e})=>`Must be at least ${e} characters`,nanoid:()=>`Invalid NanoID`,nonEmpty:()=>`Cannot be empty`,numeric:()=>`Invalid numeric string`,regex:()=>`Invalid format`,semver:()=>`Invalid semver`,slug:()=>`Invalid slug`,startsWith:({prefix:e})=>`Must start with "${e}"`,time:()=>`Invalid time`,type:()=>`Expected string`,ulid:()=>`Invalid ULID`,url:()=>`Invalid URL`,uuid:()=>`Invalid UUID`},tuple:{length:({exact:e})=>`Expected tuple of length ${e}`,min:({min:e})=>`Expected tuple with at least ${e} items`,type:()=>`Expected array`},union:{invalid:()=>`Does not match any of the expected types`},variant:{invalidDiscriminator:({discriminator:e,expected:t})=>`Invalid discriminator value at "${e}": expected ${t.map(e=>JSON.stringify(e)).join(` | `)}`,type:()=>`Expected object`}};function n(e){}function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function i(t,n){let a=e.cloneRecord(t);for(let[t,o]of Object.entries(n)){if(o===void 0)continue;if(e.isUnsafeObjectKey(t)){`${t}`;continue}let n=a[t];r(n)&&r(o)?e.defineOwnProperty(a,t,i(n,o)):e.defineOwnProperty(a,t,o)}return a}function a(e={}){return{messages:i(t,e)}}exports._dev=n,exports.createParseContext=a;
2
2
  //# sourceMappingURL=messages.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.cjs","names":[],"sources":["../src/messages.ts"],"sourcesContent":["import type { ParseContext } from './types';\n\nimport { warn as _warnFn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\nlet _activeMessages: Messages = _builtinMessages;\n\n/** A function that receives internal warning messages from spell. */\nexport type Logger = (message: string) => void;\n\nlet _logger: Logger = (msg) => {\n _warnFn(msg);\n};\n\n/** @internal */\nexport function _dev(message: string): void {\n _logger(message);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n _dev(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Override any subset of the default validation messages globally.\n * Each call starts from built-ins and applies the provided deep overrides.\n * It does not accumulate previous overrides.\n *\n * For locale integration (e.g. with \\@vielzeug/lingua), call this inside\n * your locale-change handler:\n * ```ts\n * i18n.subscribe(() => setMessages(spellMessages[i18n.locale]));\n * ```\n */\nexport function setMessages(messages: DeepPartial<Messages>): void {\n _activeMessages = mergeMessages(_builtinMessages, messages);\n}\n\n/**\n * Override the internal warning logger.\n * Pass `null` to silence all internal warnings.\n */\nexport function setLogger(logger: Logger | null): void {\n _logger = logger ?? (() => {});\n}\n\n/** Reset all messages to the built-in defaults. */\nexport function resetMessages(): void {\n _activeMessages = _builtinMessages;\n}\n\n/**\n * Creates a parse context with request-scoped message overrides.\n * Does not mutate global message state.\n */\nexport function createParseContext(messages?: DeepPartial<Messages>): ParseContext {\n if (messages === undefined) return { messages: _activeMessages };\n\n return { messages: mergeMessages(_activeMessages, messages) };\n}\n\n/**\n * Runs a callback with temporary global message overrides, then restores the previous state.\n * Supports both sync and async callbacks.\n */\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => T): T;\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => Promise<T>): Promise<T>;\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => T | Promise<T>): T | Promise<T> {\n const previous = _activeMessages;\n\n _activeMessages = mergeMessages(_builtinMessages, messages);\n\n try {\n const result = run();\n\n if (result instanceof Promise) {\n return result.finally(() => {\n _activeMessages = previous;\n });\n }\n\n _activeMessages = previous;\n\n return result;\n } catch (error) {\n _activeMessages = previous;\n throw error;\n }\n}\n\n/**\n * Runs a callback with a temporary logger override, then restores the previous logger.\n * Supports both sync and async callbacks.\n */\nexport function withLogger<T>(logger: Logger | null, run: () => T): T;\nexport function withLogger<T>(logger: Logger | null, run: () => Promise<T>): Promise<T>;\nexport function withLogger<T>(logger: Logger | null, run: () => T | Promise<T>): T | Promise<T> {\n const previous = _logger;\n\n _logger = logger ?? (() => {});\n\n try {\n const result = run();\n\n if (result instanceof Promise) {\n return result.finally(() => {\n _logger = previous;\n });\n }\n\n _logger = previous;\n\n return result;\n } catch (error) {\n _logger = previous;\n throw error;\n }\n}\n\n/** @internal — returns the active (possibly overridden) message set. */\nexport function _messages(): Messages {\n return _activeMessages;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"messages.cjs","names":[],"sources":["../src/messages.ts"],"sourcesContent":["import type { ParseContext } from './types';\n\nimport { warn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\n/**\n * Built-in constraint callbacks predate ParseContext and resolve their default\n * messages lazily. This stack scopes that lookup to one synchronous validator\n * invocation; it never crosses an await boundary, so concurrent parses stay isolated.\n * @internal\n */\n/** @internal */\nexport function _dev(message: string): void {\n warn(message);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n _dev(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Creates an immutable parse context. Pass this context to parse methods when\n * validation messages vary by request, locale, or form. Spell never stores it globally.\n */\nexport function createParseContext(messages: DeepPartial<Messages> = {}): ParseContext {\n return { messages: mergeMessages(_builtinMessages, messages) };\n}\n\n/** @internal */\n"],"mappings":"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"}
@@ -206,42 +206,10 @@ export type Messages = {
206
206
  export type DeepPartial<T> = {
207
207
  [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];
208
208
  };
209
- /** A function that receives internal warning messages from spell. */
210
- export type Logger = (message: string) => void;
211
209
  /**
212
- * Override any subset of the default validation messages globally.
213
- * Each call starts from built-ins and applies the provided deep overrides.
214
- * It does not accumulate previous overrides.
215
- *
216
- * For locale integration (e.g. with \@vielzeug/lingua), call this inside
217
- * your locale-change handler:
218
- * ```ts
219
- * i18n.subscribe(() => setMessages(spellMessages[i18n.locale]));
220
- * ```
221
- */
222
- export declare function setMessages(messages: DeepPartial<Messages>): void;
223
- /**
224
- * Override the internal warning logger.
225
- * Pass `null` to silence all internal warnings.
226
- */
227
- export declare function setLogger(logger: Logger | null): void;
228
- /** Reset all messages to the built-in defaults. */
229
- export declare function resetMessages(): void;
230
- /**
231
- * Creates a parse context with request-scoped message overrides.
232
- * Does not mutate global message state.
210
+ * Creates an immutable parse context. Pass this context to parse methods when
211
+ * validation messages vary by request, locale, or form. Spell never stores it globally.
233
212
  */
234
213
  export declare function createParseContext(messages?: DeepPartial<Messages>): ParseContext;
235
- /**
236
- * Runs a callback with temporary global message overrides, then restores the previous state.
237
- * Supports both sync and async callbacks.
238
- */
239
- export declare function withMessages<T>(messages: DeepPartial<Messages>, run: () => T): T;
240
- export declare function withMessages<T>(messages: DeepPartial<Messages>, run: () => Promise<T>): Promise<T>;
241
- /**
242
- * Runs a callback with a temporary logger override, then restores the previous logger.
243
- * Supports both sync and async callbacks.
244
- */
245
- export declare function withLogger<T>(logger: Logger | null, run: () => T): T;
246
- export declare function withLogger<T>(logger: Logger | null, run: () => Promise<T>): Promise<T>;
214
+ /** @internal */
247
215
  //# sourceMappingURL=messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
package/dist/messages.js CHANGED
@@ -1,2 +1,2 @@
1
- import{cloneRecord as e,defineOwnProperty as t,isUnsafeObjectKey as n}from"./safe-object.js";import{warn as r}from"./_dev.js";var i={array:{length:({exact:e})=>`Must have exactly ${e} items`,max:({max:e})=>`Must have at most ${e} items`,min:({min:e})=>`Must have at least ${e} items`,nonEmpty:()=>`Cannot be empty`,type:()=>`Expected array`,unique:()=>`All items must be unique`},bigint:{max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,type:()=>`Expected bigint`},boolean:{type:()=>`Expected boolean`},check:{default:()=>`Invalid value`},date:{max:({max:e})=>`Must be before ${e.toISOString()}`,min:({min:e})=>`Must be after ${e.toISOString()}`,type:()=>`Expected valid date`},enum:{invalid:({values:e})=>`Expected one of: ${e.map(e=>JSON.stringify(e)).join(`, `)}`},instanceof:{type:({className:e})=>`Expected instance of ${e}`},literal:{expected:({expected:e})=>`Expected ${JSON.stringify(e)}`},map:{max:({max:e})=>`Must contain at most ${e} entries`,min:({min:e})=>`Must contain at least ${e} entries`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} entries`,type:()=>`Expected map`},never:{invalid:()=>`Value is not allowed`},number:{finite:()=>`Must be finite`,int:()=>`Must be an integer`,max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,safe:()=>`Must be a safe integer`,type:()=>`Expected number`},object:{invalidKeys:({keys:e})=>`Unrecognized keys: ${e.join(`, `)}`,type:()=>`Expected object`},set:{max:({max:e})=>`Must contain at most ${e} items`,min:({min:e})=>`Must contain at least ${e} items`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} items`,type:()=>`Expected set`},string:{base64:()=>`Invalid base64`,base64url:()=>`Invalid base64url`,cuid:()=>`Invalid CUID`,cuid2:()=>`Invalid CUID2`,date:()=>`Invalid date`,dateTime:()=>`Invalid datetime`,duration:()=>`Invalid ISO 8601 duration`,email:()=>`Invalid email address`,emoji:()=>`Invalid emoji sequence`,endsWith:({suffix:e})=>`Must end with "${e}"`,hex:()=>`Invalid hex`,hexColor:()=>`Invalid hex color`,includes:({substr:e})=>`Must include "${e}"`,ip:()=>`Invalid IP address`,jwt:()=>`Invalid JWT`,length:({exact:e})=>`Must be exactly ${e} characters`,max:({max:e})=>`Must be at most ${e} characters`,min:({min:e})=>`Must be at least ${e} characters`,nanoid:()=>`Invalid NanoID`,nonEmpty:()=>`Cannot be empty`,numeric:()=>`Invalid numeric string`,regex:()=>`Invalid format`,semver:()=>`Invalid semver`,slug:()=>`Invalid slug`,startsWith:({prefix:e})=>`Must start with "${e}"`,time:()=>`Invalid time`,type:()=>`Expected string`,ulid:()=>`Invalid ULID`,url:()=>`Invalid URL`,uuid:()=>`Invalid UUID`},tuple:{length:({exact:e})=>`Expected tuple of length ${e}`,min:({min:e})=>`Expected tuple with at least ${e} items`,type:()=>`Expected array`},union:{invalid:()=>`Does not match any of the expected types`},variant:{invalidDiscriminator:({discriminator:e,expected:t})=>`Invalid discriminator value at "${e}": expected ${t.map(e=>JSON.stringify(e)).join(` | `)}`,type:()=>`Expected object`}},a=i,o=e=>{r(e)};function s(e){o(e)}function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function l(r,i){let a=e(r);for(let[e,r]of Object.entries(i)){if(r===void 0)continue;if(n(e)){s(`[spell] Ignoring unsafe message override key "${e}" to prevent prototype mutation.`);continue}let i=a[e];c(i)&&c(r)?t(a,e,l(i,r)):t(a,e,r)}return a}function u(e){a=l(i,e)}function d(e){o=e??(()=>{})}function f(){a=i}function p(e){return e===void 0?{messages:a}:{messages:l(a,e)}}function m(e,t){let n=a;a=l(i,e);try{let e=t();return e instanceof Promise?e.finally(()=>{a=n}):(a=n,e)}catch(e){throw a=n,e}}function h(e,t){let n=o;o=e??(()=>{});try{let e=t();return e instanceof Promise?e.finally(()=>{o=n}):(o=n,e)}catch(e){throw o=n,e}}function g(){return a}export{s as _dev,g as _messages,p as createParseContext,f as resetMessages,d as setLogger,u as setMessages,h as withLogger,m as withMessages};
1
+ import"./_dev.js";import{cloneRecord as e,defineOwnProperty as t,isUnsafeObjectKey as n}from"./safe-object.js";var r={array:{length:({exact:e})=>`Must have exactly ${e} items`,max:({max:e})=>`Must have at most ${e} items`,min:({min:e})=>`Must have at least ${e} items`,nonEmpty:()=>`Cannot be empty`,type:()=>`Expected array`,unique:()=>`All items must be unique`},bigint:{max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,type:()=>`Expected bigint`},boolean:{type:()=>`Expected boolean`},check:{default:()=>`Invalid value`},date:{max:({max:e})=>`Must be before ${e.toISOString()}`,min:({min:e})=>`Must be after ${e.toISOString()}`,type:()=>`Expected valid date`},enum:{invalid:({values:e})=>`Expected one of: ${e.map(e=>JSON.stringify(e)).join(`, `)}`},instanceof:{type:({className:e})=>`Expected instance of ${e}`},literal:{expected:({expected:e})=>`Expected ${JSON.stringify(e)}`},map:{max:({max:e})=>`Must contain at most ${e} entries`,min:({min:e})=>`Must contain at least ${e} entries`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} entries`,type:()=>`Expected map`},never:{invalid:()=>`Value is not allowed`},number:{finite:()=>`Must be finite`,int:()=>`Must be an integer`,max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,safe:()=>`Must be a safe integer`,type:()=>`Expected number`},object:{invalidKeys:({keys:e})=>`Unrecognized keys: ${e.join(`, `)}`,type:()=>`Expected object`},set:{max:({max:e})=>`Must contain at most ${e} items`,min:({min:e})=>`Must contain at least ${e} items`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} items`,type:()=>`Expected set`},string:{base64:()=>`Invalid base64`,base64url:()=>`Invalid base64url`,cuid:()=>`Invalid CUID`,cuid2:()=>`Invalid CUID2`,date:()=>`Invalid date`,dateTime:()=>`Invalid datetime`,duration:()=>`Invalid ISO 8601 duration`,email:()=>`Invalid email address`,emoji:()=>`Invalid emoji sequence`,endsWith:({suffix:e})=>`Must end with "${e}"`,hex:()=>`Invalid hex`,hexColor:()=>`Invalid hex color`,includes:({substr:e})=>`Must include "${e}"`,ip:()=>`Invalid IP address`,jwt:()=>`Invalid JWT`,length:({exact:e})=>`Must be exactly ${e} characters`,max:({max:e})=>`Must be at most ${e} characters`,min:({min:e})=>`Must be at least ${e} characters`,nanoid:()=>`Invalid NanoID`,nonEmpty:()=>`Cannot be empty`,numeric:()=>`Invalid numeric string`,regex:()=>`Invalid format`,semver:()=>`Invalid semver`,slug:()=>`Invalid slug`,startsWith:({prefix:e})=>`Must start with "${e}"`,time:()=>`Invalid time`,type:()=>`Expected string`,ulid:()=>`Invalid ULID`,url:()=>`Invalid URL`,uuid:()=>`Invalid UUID`},tuple:{length:({exact:e})=>`Expected tuple of length ${e}`,min:({min:e})=>`Expected tuple with at least ${e} items`,type:()=>`Expected array`},union:{invalid:()=>`Does not match any of the expected types`},variant:{invalidDiscriminator:({discriminator:e,expected:t})=>`Invalid discriminator value at "${e}": expected ${t.map(e=>JSON.stringify(e)).join(` | `)}`,type:()=>`Expected object`}};function i(e){}function a(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function o(r,i){let s=e(r);for(let[e,r]of Object.entries(i)){if(r===void 0)continue;if(n(e)){`${e}`;continue}let i=s[e];a(i)&&a(r)?t(s,e,o(i,r)):t(s,e,r)}return s}function s(e={}){return{messages:o(r,e)}}export{i as _dev,s as createParseContext};
2
2
  //# sourceMappingURL=messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","names":[],"sources":["../src/messages.ts"],"sourcesContent":["import type { ParseContext } from './types';\n\nimport { warn as _warnFn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\nlet _activeMessages: Messages = _builtinMessages;\n\n/** A function that receives internal warning messages from spell. */\nexport type Logger = (message: string) => void;\n\nlet _logger: Logger = (msg) => {\n _warnFn(msg);\n};\n\n/** @internal */\nexport function _dev(message: string): void {\n _logger(message);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n _dev(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Override any subset of the default validation messages globally.\n * Each call starts from built-ins and applies the provided deep overrides.\n * It does not accumulate previous overrides.\n *\n * For locale integration (e.g. with \\@vielzeug/lingua), call this inside\n * your locale-change handler:\n * ```ts\n * i18n.subscribe(() => setMessages(spellMessages[i18n.locale]));\n * ```\n */\nexport function setMessages(messages: DeepPartial<Messages>): void {\n _activeMessages = mergeMessages(_builtinMessages, messages);\n}\n\n/**\n * Override the internal warning logger.\n * Pass `null` to silence all internal warnings.\n */\nexport function setLogger(logger: Logger | null): void {\n _logger = logger ?? (() => {});\n}\n\n/** Reset all messages to the built-in defaults. */\nexport function resetMessages(): void {\n _activeMessages = _builtinMessages;\n}\n\n/**\n * Creates a parse context with request-scoped message overrides.\n * Does not mutate global message state.\n */\nexport function createParseContext(messages?: DeepPartial<Messages>): ParseContext {\n if (messages === undefined) return { messages: _activeMessages };\n\n return { messages: mergeMessages(_activeMessages, messages) };\n}\n\n/**\n * Runs a callback with temporary global message overrides, then restores the previous state.\n * Supports both sync and async callbacks.\n */\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => T): T;\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => Promise<T>): Promise<T>;\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => T | Promise<T>): T | Promise<T> {\n const previous = _activeMessages;\n\n _activeMessages = mergeMessages(_builtinMessages, messages);\n\n try {\n const result = run();\n\n if (result instanceof Promise) {\n return result.finally(() => {\n _activeMessages = previous;\n });\n }\n\n _activeMessages = previous;\n\n return result;\n } catch (error) {\n _activeMessages = previous;\n throw error;\n }\n}\n\n/**\n * Runs a callback with a temporary logger override, then restores the previous logger.\n * Supports both sync and async callbacks.\n */\nexport function withLogger<T>(logger: Logger | null, run: () => T): T;\nexport function withLogger<T>(logger: Logger | null, run: () => Promise<T>): Promise<T>;\nexport function withLogger<T>(logger: Logger | null, run: () => T | Promise<T>): T | Promise<T> {\n const previous = _logger;\n\n _logger = logger ?? (() => {});\n\n try {\n const result = run();\n\n if (result instanceof Promise) {\n return result.finally(() => {\n _logger = previous;\n });\n }\n\n _logger = previous;\n\n return result;\n } catch (error) {\n _logger = previous;\n throw error;\n }\n}\n\n/** @internal — returns the active (possibly overridden) message set. */\nexport function _messages(): Messages {\n return _activeMessages;\n}\n"],"mappings":"8HAgIA,IAAM,EAA6B,CACjC,MAAO,CACL,QAAS,CAAE,WAAY,qBAAqB,EAAM,QAClD,KAAM,CAAE,SAAU,qBAAqB,EAAI,QAC3C,KAAM,CAAE,SAAU,sBAAsB,EAAI,QAC5C,aAAgB,kBAChB,SAAY,iBACZ,WAAc,0BAChB,EACA,OAAQ,CACN,KAAM,CAAE,SAAU,mBAAmB,IACrC,KAAM,CAAE,SAAU,oBAAoB,IACtC,YAAa,CAAE,UAAW,yBAAyB,IACnD,aAAgB,mBAChB,gBAAmB,uBACnB,gBAAmB,uBACnB,aAAgB,mBAChB,SAAY,iBACd,EACA,QAAS,CACP,SAAY,kBACd,EACA,MAAO,CACL,YAAe,eACjB,EACA,KAAM,CACJ,KAAM,CAAE,SAAU,kBAAkB,EAAI,YAAY,IACpD,KAAM,CAAE,SAAU,iBAAiB,EAAI,YAAY,IACnD,SAAY,qBACd,EACA,KAAM,CACJ,SAAU,CAAE,YAAa,oBAAoB,EAAO,IAAK,GAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC7F,EACA,WAAY,CACV,MAAO,CAAE,eAAgB,wBAAwB,GACnD,EACA,QAAS,CACP,UAAW,CAAE,cAAe,YAAY,KAAK,UAAU,CAAQ,GACjE,EACA,IAAK,CACH,KAAM,CAAE,SAAU,wBAAwB,EAAI,UAC9C,KAAM,CAAE,SAAU,yBAAyB,EAAI,UAC/C,aAAgB,kBAChB,MAAO,CAAE,WAAY,wBAAwB,EAAM,UACnD,SAAY,cACd,EACA,MAAO,CACL,YAAe,sBACjB,EACA,OAAQ,CACN,WAAc,iBACd,QAAW,qBACX,KAAM,CAAE,SAAU,mBAAmB,IACrC,KAAM,CAAE,SAAU,oBAAoB,IACtC,YAAa,CAAE,UAAW,yBAAyB,IACnD,aAAgB,mBAChB,gBAAmB,uBACnB,gBAAmB,uBACnB,aAAgB,mBAChB,SAAY,yBACZ,SAAY,iBACd,EACA,OAAQ,CACN,aAAc,CAAE,UAAW,sBAAsB,EAAK,KAAK,IAAI,IAC/D,SAAY,iBACd,EACA,IAAK,CACH,KAAM,CAAE,SAAU,wBAAwB,EAAI,QAC9C,KAAM,CAAE,SAAU,yBAAyB,EAAI,QAC/C,aAAgB,kBAChB,MAAO,CAAE,WAAY,wBAAwB,EAAM,QACnD,SAAY,cACd,EACA,OAAQ,CACN,WAAc,iBACd,cAAiB,oBACjB,SAAY,eACZ,UAAa,gBACb,SAAY,eACZ,aAAgB,mBAChB,aAAgB,4BAChB,UAAa,wBACb,UAAa,yBACb,UAAW,CAAE,YAAa,kBAAkB,EAAO,GACnD,QAAW,cACX,aAAgB,oBAChB,UAAW,CAAE,YAAa,iBAAiB,EAAO,GAClD,OAAU,qBACV,QAAW,cACX,QAAS,CAAE,WAAY,mBAAmB,EAAM,aAChD,KAAM,CAAE,SAAU,mBAAmB,EAAI,aACzC,KAAM,CAAE,SAAU,oBAAoB,EAAI,aAC1C,WAAc,iBACd,aAAgB,kBAChB,YAAe,yBACf,UAAa,iBACb,WAAc,iBACd,SAAY,eACZ,YAAa,CAAE,YAAa,oBAAoB,EAAO,GACvD,SAAY,eACZ,SAAY,kBACZ,SAAY,eACZ,QAAW,cACX,SAAY,cACd,EACA,MAAO,CACL,QAAS,CAAE,WAAY,4BAA4B,IACnD,KAAM,CAAE,SAAU,gCAAgC,EAAI,QACtD,SAAY,gBACd,EACA,MAAO,CACL,YAAe,0CACjB,EACA,QAAS,CACP,sBAAuB,CAAE,gBAAe,cACtC,mCAAmC,EAAc,cAAc,EAAS,IAAK,GAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAClH,SAAY,iBACd,CACF,EAEI,EAA4B,EAK5B,EAAmB,GAAQ,CAC7B,EAAQ,CAAG,CACb,EAGA,SAAgB,EAAK,EAAuB,CAC1C,EAAQ,CAAO,CACjB,CAEA,SAAS,EAAS,EAAkD,CAClE,OAAyB,OAAO,GAAU,YAAnC,GAA+C,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAEA,SAAS,EAAiD,EAAS,EAA0B,CAC3F,IAAM,EAAM,EAAY,CAAI,EAE5B,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAK,EAAG,CAChD,GAAI,IAAU,IAAA,GAAW,SAEzB,GAAI,EAAkB,CAAG,EAAG,CAC1B,EAAK,iDAAiD,EAAI,iCAAiC,EAC3F,QACF,CAEA,IAAM,EAAY,EAAI,GAElB,EAAS,CAAS,GAAK,EAAS,CAAK,EACvC,EAAkB,EAAK,EAAK,EAAc,EAAW,CAAsC,CAAC,EAE5F,EAAkB,EAAK,EAAK,CAAK,CAErC,CAEA,OAAO,CACT,CAaA,SAAgB,EAAY,EAAuC,CACjE,EAAkB,EAAc,EAAkB,CAAQ,CAC5D,CAMA,SAAgB,EAAU,EAA6B,CACrD,EAAU,QAAiB,CAAC,EAC9B,CAGA,SAAgB,GAAsB,CACpC,EAAkB,CACpB,CAMA,SAAgB,EAAmB,EAAgD,CAGjF,OAFI,IAAa,IAAA,GAAkB,CAAE,SAAU,CAAgB,EAExD,CAAE,SAAU,EAAc,EAAiB,CAAQ,CAAE,CAC9D,CAQA,SAAgB,EAAgB,EAAiC,EAA2C,CAC1G,IAAM,EAAW,EAEjB,EAAkB,EAAc,EAAkB,CAAQ,EAE1D,GAAI,CACF,IAAM,EAAS,EAAI,EAUnB,OARI,aAAkB,QACb,EAAO,YAAc,CAC1B,EAAkB,CACpB,CAAC,GAGH,EAAkB,EAEX,EACT,OAAS,EAAO,CAEd,KADA,GAAkB,EACZ,CACR,CACF,CAQA,SAAgB,EAAc,EAAuB,EAA2C,CAC9F,IAAM,EAAW,EAEjB,EAAU,QAAiB,CAAC,GAE5B,GAAI,CACF,IAAM,EAAS,EAAI,EAUnB,OARI,aAAkB,QACb,EAAO,YAAc,CAC1B,EAAU,CACZ,CAAC,GAGH,EAAU,EAEH,EACT,OAAS,EAAO,CAEd,KADA,GAAU,EACJ,CACR,CACF,CAGA,SAAgB,GAAsB,CACpC,OAAO,CACT"}
1
+ {"version":3,"file":"messages.js","names":[],"sources":["../src/messages.ts"],"sourcesContent":["import type { ParseContext } from './types';\n\nimport { warn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\n/**\n * Built-in constraint callbacks predate ParseContext and resolve their default\n * messages lazily. This stack scopes that lookup to one synchronous validator\n * invocation; it never crosses an await boundary, so concurrent parses stay isolated.\n * @internal\n */\n/** @internal */\nexport function _dev(message: string): void {\n warn(message);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n _dev(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Creates an immutable parse context. Pass this context to parse methods when\n * validation messages vary by request, locale, or form. Spell never stores it globally.\n */\nexport function createParseContext(messages: DeepPartial<Messages> = {}): ParseContext {\n return { messages: mergeMessages(_builtinMessages, messages) };\n}\n\n/** @internal */\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./formats.cjs"),t=require("./validators.cjs");exports.hasMaxLength=t.hasMaxLength,exports.hasMinLength=t.hasMinLength,exports.isArray=t.isArray,exports.isBase64=e.isBase64,exports.isBase64url=e.isBase64url,exports.isBoolean=t.isBoolean,exports.isCuid=e.isCuid,exports.isCuid2=e.isCuid2,exports.isDate=t.isDate,exports.isDuration=e.isDuration,exports.isEmail=e.isEmail,exports.isEmoji=e.isEmoji,exports.isHex=e.isHex,exports.isHexColor=e.isHexColor,exports.isInRange=t.isInRange,exports.isInteger=t.isInteger,exports.isIp=e.isIp,exports.isIsoDate=e.isIsoDate,exports.isIsoDateTime=e.isIsoDateTime,exports.isJwt=e.isJwt,exports.isMultipleOf=t.isMultipleOf,exports.isNanoid=e.isNanoid,exports.isNegative=t.isNegative,exports.isNonNegative=t.isNonNegative,exports.isNullOrUndefined=t.isNullOrUndefined,exports.isNumber=t.isNumber,exports.isNumeric=e.isNumeric,exports.isPositive=t.isPositive,exports.isSemver=e.isSemver,exports.isSlug=e.isSlug,exports.isString=t.isString,exports.isTime=e.isTime,exports.isUlid=e.isUlid,exports.isUrl=e.isUrl,exports.isUuid=e.isUuid;
@@ -0,0 +1,3 @@
1
+ export { isBase64, isBase64url, isCuid, isCuid2, isDuration, isEmail, isEmoji, isHex, isHexColor, isIp, isIsoDate, isIsoDateTime, isJwt, isNanoid, isNumeric, isSemver, isSlug, isTime, isUlid, isUrl, isUuid, } from './formats';
2
+ export { hasMaxLength, hasMinLength, isArray, isBoolean, isDate, isInRange, isInteger, isMultipleOf, isNegative, isNonNegative, isNullOrUndefined, isNumber, isPositive, isString, } from './validators';
3
+ //# sourceMappingURL=predicates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicates.d.ts","sourceRoot":"","sources":["../src/predicates.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,KAAK,EACL,UAAU,EACV,IAAI,EACJ,SAAS,EACT,aAAa,EACb,KAAK,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,MAAM,EACN,MAAM,EACN,MAAM,EACN,KAAK,EACL,MAAM,GACP,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,SAAS,EACT,MAAM,EACN,SAAS,EACT,SAAS,EACT,YAAY,EACZ,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,QAAQ,GACT,MAAM,cAAc,CAAC"}
@@ -0,0 +1 @@
1
+ import{isBase64 as e,isBase64url as t,isCuid as n,isCuid2 as r,isDuration as i,isEmail as a,isEmoji as o,isHex as s,isHexColor as c,isIp as l,isIsoDate as u,isIsoDateTime as d,isJwt as f,isNanoid as p,isNumeric as m,isSemver as h,isSlug as g,isTime as _,isUlid as v,isUrl as y,isUuid as b}from"./formats.js";import{hasMaxLength as x,hasMinLength as S,isArray as C,isBoolean as w,isDate as T,isInRange as E,isInteger as D,isMultipleOf as O,isNegative as k,isNonNegative as A,isNullOrUndefined as j,isNumber as M,isPositive as N,isString as P}from"./validators.js";export{x as hasMaxLength,S as hasMinLength,C as isArray,e as isBase64,t as isBase64url,w as isBoolean,n as isCuid,r as isCuid2,T as isDate,i as isDuration,a as isEmail,o as isEmoji,s as isHex,c as isHexColor,E as isInRange,D as isInteger,l as isIp,u as isIsoDate,d as isIsoDateTime,f as isJwt,O as isMultipleOf,p as isNanoid,k as isNegative,A as isNonNegative,j as isNullOrUndefined,M as isNumber,m as isNumeric,N as isPositive,h as isSemver,g as isSlug,P as isString,_ as isTime,v as isUlid,y as isUrl,b as isUuid};
package/dist/s.cjs CHANGED
@@ -1,2 +1,2 @@
1
- const e=require("./core.cjs"),t=require("./schemas/array.cjs"),n=require("./schemas/bigint.cjs"),r=require("./schemas/boolean.cjs"),i=require("./schemas/date.cjs"),a=require("./schemas/enum.cjs"),o=require("./schemas/instanceof.cjs"),s=require("./schemas/intersect.cjs"),c=require("./schemas/lazy.cjs"),l=require("./schemas/literal.cjs"),u=require("./schemas/map.cjs"),d=require("./schemas/never.cjs"),f=require("./schemas/number.cjs"),p=require("./schemas/union.cjs"),m=require("./schemas/object.cjs"),h=require("./schemas/raw-or.cjs"),g=require("./schemas/record.cjs"),_=require("./schemas/set.cjs"),v=require("./schemas/string.cjs"),y=require("./schemas/tuple.cjs"),b=require("./schemas/variant.cjs");var x=(e,t)=>k(e,t),S=()=>new e.Schema,C=e=>new t.ArraySchema(e),w=()=>new n.BigIntSchema,T=()=>new r.BooleanSchema,E=()=>new i.DateSchema,D=e=>new a.EnumSchema(e),O=e=>new o.InstanceOfSchema(e),k=(...e)=>new s.IntersectSchema(h.normalizeToSchemas(e)),A=e=>new c.LazySchema(e),j=e=>new l.LiteralSchema(e),M=(e,t)=>new u.MapSchema(e,t),N=()=>new d.NeverSchema,P=()=>new l.LiteralSchema(null),F=()=>new f.NumberSchema,I=e=>new m.ObjectSchema(e),L=(e,t)=>new g.RecordSchema(e,t),R=e=>new _.SetSchema(e),z=()=>new v.StringSchema,B=e=>new y.TupleSchema(e),V=()=>new l.LiteralSchema(void 0),H=(...e)=>new p.UnionSchema(h.normalizeToSchemas(e)),U={and:x,any:S,array:C,bigint:w,boolean:T,coerce:{bigint:()=>n.BigIntSchema.coerce(),boolean:()=>r.BooleanSchema.coerce(),date:()=>i.DateSchema.coerce(),number:()=>f.NumberSchema.coerce(),string:()=>v.StringSchema.coerce()},date:E,enum:D,instanceof:O,intersect:k,lazy:A,literal:j,map:M,never:N,null:P,number:F,object:I,or:(e,t)=>H(e,t),record:L,set:R,string:z,tuple:B,undefined:V,union:H,unknown:()=>new e.Schema,variant:(e,t)=>new b.VariantSchema(e,t)};exports.s=U;
1
+ const e=require("./core.cjs"),t=require("./schemas/array.cjs"),n=require("./schemas/bigint.cjs"),r=require("./schemas/boolean.cjs"),i=require("./schemas/date.cjs"),a=require("./schemas/enum.cjs"),o=require("./schemas/instanceof.cjs"),s=require("./schemas/intersect.cjs"),c=require("./schemas/lazy.cjs"),l=require("./schemas/literal.cjs"),u=require("./schemas/map.cjs"),d=require("./schemas/never.cjs"),f=require("./schemas/number.cjs"),p=require("./schemas/union.cjs"),m=require("./schemas/object.cjs"),h=require("./schemas/raw-or.cjs"),g=require("./schemas/record.cjs"),_=require("./schemas/set.cjs"),v=require("./schemas/string.cjs"),y=require("./schemas/tuple.cjs"),b=require("./schemas/variant.cjs");var x={any:()=>new e.Schema,array:e=>new t.ArraySchema(e),bigint:()=>new n.BigIntSchema,boolean:()=>new r.BooleanSchema,coerce:{bigint:()=>n.BigIntSchema.coerce(),boolean:()=>r.BooleanSchema.coerce(),date:()=>i.DateSchema.coerce(),number:()=>f.NumberSchema.coerce(),string:()=>v.StringSchema.coerce()},date:()=>new i.DateSchema,discriminatedUnion:(e,t)=>new b.VariantSchema(e,t),enum:e=>new a.EnumSchema(e),instanceof:e=>new o.InstanceOfSchema(e),intersect:(...e)=>new s.IntersectSchema(h.normalizeToSchemas(e)),lazy:e=>new c.LazySchema(e),literal:e=>new l.LiteralSchema(e),map:(e,t)=>new u.MapSchema(e,t),never:()=>new d.NeverSchema,null:()=>new l.LiteralSchema(null),number:()=>new f.NumberSchema,object:e=>new m.ObjectSchema(e),record:(e,t)=>new g.RecordSchema(e,t),set:e=>new _.SetSchema(e),string:()=>new v.StringSchema,tuple:e=>new y.TupleSchema(e),undefined:()=>new l.LiteralSchema(void 0),union:(...e)=>new p.UnionSchema(h.normalizeToSchemas(e)),unknown:()=>new e.Schema};exports.s=x;
2
2
  //# sourceMappingURL=s.cjs.map
package/dist/s.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.cjs","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sAnd = <A, B>(a: Schema<A, any>, b: Schema<B, any>): IntersectSchema<readonly [Schema<A, any>, Schema<B, any>]> =>\n sIntersect(a, b);\nconst sAny = (): Schema<any> => new Schema();\nconst sArray = <T>(schema: Schema<T, any>): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: any[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T>(getter: () => Schema<T, any>): LazySchema<T> => new LazySchema(getter);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K, V>(keySchema: Schema<K, any>, valueSchema: Schema<V, any>): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends string, V>(keySchema: Schema<K, any>, valueSchema: Schema<V, any>): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T>(schema: Schema<T, any>): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sOr = <A, B>(a: Schema<A, any>, b: Schema<B, any>): UnionSchema<readonly [Schema<A, any>, Schema<B, any>]> =>\n sUnion(a, b);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema => BigIntSchema.coerce(),\n boolean: (): BooleanSchema => BooleanSchema.coerce(),\n date: (): DateSchema => DateSchema.coerce(),\n number: (): NumberSchema => NumberSchema.coerce(),\n string: (): StringSchema => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n and: sAnd,\n any: sAny,\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n or: sOr,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n variant: sVariant,\n};\n"],"mappings":"gsBAwBA,IAAM,GAAc,EAAmB,IACrC,EAAW,EAAG,CAAC,EACX,MAA0B,IAAI,EAAA,OAC9B,EAAa,GAA2C,IAAI,EAAA,YAAY,CAAM,EAC9E,MAA8B,IAAI,EAAA,aAClC,MAAgC,IAAI,EAAA,cACpC,MAA0B,IAAI,EAAA,WAC9B,EAAqC,GAA6B,IAAI,EAAA,WAAW,CAAM,EACvF,EAAkB,GAAwD,IAAI,EAAA,iBAAiB,CAAG,EAClG,GACJ,GAAG,IAEH,IAAI,EAAA,gBAAgB,EAAA,mBAAmB,CAAK,CAA6C,EACrF,EAAY,GAAgD,IAAI,EAAA,WAAW,CAAM,EACjF,EAAoE,GACxE,IAAI,EAAA,cAAc,CAAK,EACnB,GAAc,EAA2B,IAC7C,IAAI,EAAA,UAAU,EAAW,CAAW,EAChC,MAA4B,IAAI,EAAA,YAChC,MAAmC,IAAI,EAAA,cAAc,IAAI,EACzD,MAA8B,IAAI,EAAA,aAClC,EAAkC,GAA8B,IAAI,EAAA,aAAa,CAAK,EACtF,GAAgC,EAA2B,IAC/D,IAAI,EAAA,aAAa,EAAW,CAAW,EACnC,EAAW,GAAyC,IAAI,EAAA,UAAU,CAAM,EACxE,MAA8B,IAAI,EAAA,aAClC,EAAwC,GAA6B,IAAI,EAAA,YAAY,CAAK,EAC1F,MAA6C,IAAI,EAAA,cAAc,IAAA,EAAS,EACxE,GACJ,GAAG,IAEH,IAAI,EAAA,YAAY,EAAA,mBAAmB,CAAK,CAA6C,EA2B1E,EAAI,CACf,IAAK,EACL,IAAK,EACL,MAAO,EACP,OAAQ,EACR,QAAS,EACT,OAAQ,CAxBR,WAA4B,EAAA,aAAa,OAAO,EAChD,YAA8B,EAAA,cAAc,OAAO,EACnD,SAAwB,EAAA,WAAW,OAAO,EAC1C,WAA4B,EAAA,aAAa,OAAO,EAChD,WAA4B,EAAA,aAAa,OAAO,CAoBxC,EACR,KAAM,EACN,KAAM,EACN,WAAY,EACZ,UAAW,EACX,KAAM,EACN,QAAS,EACT,IAAK,EACL,MAAO,EACP,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,IA5CiB,EAAmB,IACpC,EAAO,EAAG,CAAC,EA4CX,OAAQ,EACR,IAAK,EACL,OAAQ,EACR,MAAO,EACP,UAAW,EACX,MAAO,EACP,YAjDsC,IAAI,EAAA,OAkD1C,SAhDA,EACA,IACwB,IAAI,EAAA,cAAc,EAAe,CAAG,CA+C9D"}
1
+ {"version":3,"file":"s.cjs","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferOutput, type InferSchemaMode, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sAny = (): Schema<any> => new Schema();\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: any[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, unknown, InferSchemaMode<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, unknown, InferSchemaMode<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any, any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n any: sAny,\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"gsBA+EA,IAAa,EAAI,CACf,QAxD8B,IAAI,EAAA,OAyDlC,MAxDmC,GAA8B,IAAI,EAAA,YAAY,CAAM,EAyDvF,WAxDkC,IAAI,EAAA,aAyDtC,YAxDoC,IAAI,EAAA,cAyDxC,OAAQ,CAvBR,WAAqC,EAAA,aAAa,OAAO,EACzD,YAAuC,EAAA,cAAc,OAAO,EAC5D,SAAiC,EAAA,WAAW,OAAO,EACnD,WAAqC,EAAA,aAAa,OAAO,EACzD,WAAqC,EAAA,aAAa,OAAO,CAmBjD,EACR,SAzD8B,IAAI,EAAA,WA0DlC,oBA7BA,EACA,IACwB,IAAI,EAAA,cAAc,EAAe,CAAG,EA4B5D,KA1DyC,GAA6B,IAAI,EAAA,WAAW,CAAM,EA2D3F,WA1DsB,GAAwD,IAAI,EAAA,iBAAiB,CAAG,EA2DtG,WAzDA,GAAG,IAEH,IAAI,EAAA,gBAAgB,EAAA,mBAAmB,CAAK,CAA6C,EAwDzF,KAvDkC,GAClC,IAAI,EAAA,WAAW,CAA8E,EAuD7F,QAtDwE,GACxE,IAAI,EAAA,cAAc,CAAK,EAsDvB,KArDsD,EAAc,IACpE,IAAI,EAAA,UAAU,EAAW,CAAW,EAqDpC,UApDgC,IAAI,EAAA,YAqDpC,SApDuC,IAAI,EAAA,cAAc,IAAI,EAqD7D,WApDkC,IAAI,EAAA,aAqDtC,OApDsC,GAA8B,IAAI,EAAA,aAAa,CAAK,EAqD1F,QApDyD,EAAc,IACvE,IAAI,EAAA,aAAa,EAAW,CAAW,EAoDvC,IAnDiC,GAA4B,IAAI,EAAA,UAAU,CAAM,EAoDjF,WAnDkC,IAAI,EAAA,aAoDtC,MAnD4C,GAA6B,IAAI,EAAA,YAAY,CAAK,EAoD9F,cAnDiD,IAAI,EAAA,cAAc,IAAA,EAAS,EAoD5E,OAlDA,GAAG,IAEH,IAAI,EAAA,YAAY,EAAA,mBAAmB,CAAK,CAA6C,EAiDrF,YAhDsC,IAAI,EAAA,MAiD5C"}
package/dist/s.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type AnySchema, Schema } from './core';
1
+ import { type AnySchema, type InferOutput, type InferSchemaMode, Schema } from './core';
2
2
  import { ArraySchema } from './schemas/array';
3
3
  import { BigIntSchema } from './schemas/bigint';
4
4
  import { BooleanSchema } from './schemas/boolean';
@@ -29,37 +29,35 @@ import { VariantSchema } from './schemas/variant';
29
29
  * type User = Infer<typeof User>;
30
30
  */
31
31
  export declare const s: {
32
- and: <A, B>(a: Schema<A, any>, b: Schema<B, any>) => IntersectSchema<readonly [Schema<A, any>, Schema<B, any>]>;
33
32
  any: () => Schema<any>;
34
- array: <T>(schema: Schema<T, any>) => ArraySchema<T>;
33
+ array: <T extends AnySchema>(schema: T) => ArraySchema<T>;
35
34
  bigint: () => BigIntSchema;
36
35
  boolean: () => BooleanSchema;
37
36
  coerce: {
38
- bigint: () => BigIntSchema;
39
- boolean: () => BooleanSchema;
40
- date: () => DateSchema;
41
- number: () => NumberSchema;
42
- string: () => StringSchema;
37
+ bigint: () => BigIntSchema<unknown>;
38
+ boolean: () => BooleanSchema<unknown>;
39
+ date: () => DateSchema<unknown>;
40
+ number: () => NumberSchema<unknown>;
41
+ string: () => StringSchema<unknown>;
43
42
  };
44
43
  date: () => DateSchema;
44
+ discriminatedUnion: <K extends string, M extends Record<string, ObjectSchema<any, any>>>(discriminator: K, map: M) => VariantSchema<K, M>;
45
45
  enum: <const T extends EnumValues>(values: T) => EnumSchema<T>;
46
46
  instanceof: <T>(cls: new (...args: any[]) => T) => InstanceOfSchema<T>;
47
47
  intersect: <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(...items: T) => IntersectSchema<NormalizeItems<T> & readonly AnySchema[]>;
48
- lazy: <T>(getter: () => Schema<T, any>) => LazySchema<T>;
48
+ lazy: <T extends AnySchema>(getter: () => T) => LazySchema<InferOutput<T>, unknown, InferSchemaMode<T>>;
49
49
  literal: <T extends string | number | boolean | null | undefined>(value: T) => LiteralSchema<T>;
50
- map: <K, V>(keySchema: Schema<K, any>, valueSchema: Schema<V, any>) => MapSchema<K, V>;
50
+ map: <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V) => MapSchema<K, V>;
51
51
  never: () => NeverSchema;
52
52
  null: () => LiteralSchema<null>;
53
53
  number: () => NumberSchema;
54
54
  object: <T extends ObjectShape>(shape: T) => ObjectSchema<T>;
55
- or: <A, B>(a: Schema<A, any>, b: Schema<B, any>) => UnionSchema<readonly [Schema<A, any>, Schema<B, any>]>;
56
- record: <K extends string, V>(keySchema: Schema<K, any>, valueSchema: Schema<V, any>) => RecordSchema<K, V>;
57
- set: <T>(schema: Schema<T, any>) => SetSchema<T>;
55
+ record: <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V) => RecordSchema<K, V>;
56
+ set: <T extends AnySchema>(schema: T) => SetSchema<T>;
58
57
  string: () => StringSchema;
59
58
  tuple: <const T extends TupleSchemas>(items: T) => TupleSchema<T>;
60
59
  undefined: () => LiteralSchema<undefined>;
61
60
  union: <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(...items: T) => UnionSchema<NormalizeItems<T> & readonly AnySchema[]>;
62
61
  unknown: () => Schema<unknown>;
63
- variant: <K extends string, M extends Record<string, ObjectSchema<any>>>(discriminator: K, map: M) => VariantSchema<K, M>;
64
62
  };
65
63
  //# sourceMappingURL=s.d.ts.map
package/dist/s.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.d.ts","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"s.d.ts","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,KAAK,cAAc,EAAsB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAkDlD;;;;;;;;GAQG;AACH,eAAO,MAAM,CAAC;eAvDG,MAAM,CAAC,GAAG,CAAC;YACZ,CAAC,SAAS,SAAS,UAAU,CAAC,KAAG,WAAW,CAAC,CAAC,CAAC;kBAC3C,YAAY;mBACX,aAAa;;sBAkCpB,YAAY,CAAC,OAAO,CAAC;uBACpB,aAAa,CAAC,OAAO,CAAC;oBACzB,UAAU,CAAC,OAAO,CAAC;sBACjB,YAAY,CAAC,OAAO,CAAC;sBACrB,YAAY,CAAC,OAAO,CAAC;;gBArCjB,UAAU;yBA4BV,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,iBACnE,CAAC,OACX,CAAC,KACL,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;iBA9BD,CAAC,SAAS,UAAU,UAAU,CAAC,KAAG,UAAU,CAAC,CAAC,CAAC;iBAC/C,CAAC,OAAO,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,KAAG,gBAAgB,CAAC,CAAC,CAAC;gBACxD,CAAC,SAAS,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAAC,YACvE,CAAC,KACV,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,SAAS,EAAE,CAAC;WAE7C,CAAC,SAAS,SAAS,UAAU,MAAM,CAAC,KAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;cAE3F,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,SAAS,CAAC,KAAG,aAAa,CAAC,CAAC,CAAC;UAEvF,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,aAAa,CAAC,eAAe,CAAC,KAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;iBAEnF,WAAW;gBACZ,aAAa,CAAC,IAAI,CAAC;kBACjB,YAAY;aACf,CAAC,SAAS,WAAW,SAAS,CAAC,KAAG,YAAY,CAAC,CAAC,CAAC;aACjD,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,aAAa,CAAC,eAAe,CAAC,KAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;UAE9F,CAAC,SAAS,SAAS,UAAU,CAAC,KAAG,SAAS,CAAC,CAAC,CAAC;kBACvC,YAAY;kBACV,CAAC,SAAS,YAAY,SAAS,CAAC,KAAG,WAAW,CAAC,CAAC,CAAC;qBAChD,aAAa,CAAC,SAAS,CAAC;YAC/B,CAAC,SAAS,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAAC,YACnE,CAAC,KACV,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,SAAS,EAAE,CAAC;mBAEnC,MAAM,CAAC,OAAO,CAAC;CAiDnC,CAAC"}
package/dist/s.js CHANGED
@@ -1,2 +1,2 @@
1
- import{Schema as e}from"./core.js";import{ArraySchema as t}from"./schemas/array.js";import{BigIntSchema as n}from"./schemas/bigint.js";import{BooleanSchema as r}from"./schemas/boolean.js";import{DateSchema as i}from"./schemas/date.js";import{EnumSchema as a}from"./schemas/enum.js";import{InstanceOfSchema as o}from"./schemas/instanceof.js";import{IntersectSchema as s}from"./schemas/intersect.js";import{LazySchema as c}from"./schemas/lazy.js";import{LiteralSchema as l}from"./schemas/literal.js";import{MapSchema as u}from"./schemas/map.js";import{NeverSchema as d}from"./schemas/never.js";import{NumberSchema as f}from"./schemas/number.js";import{UnionSchema as p}from"./schemas/union.js";import{ObjectSchema as m}from"./schemas/object.js";import{normalizeToSchemas as h}from"./schemas/raw-or.js";import{RecordSchema as g}from"./schemas/record.js";import{SetSchema as _}from"./schemas/set.js";import{StringSchema as v}from"./schemas/string.js";import{TupleSchema as y}from"./schemas/tuple.js";import{VariantSchema as b}from"./schemas/variant.js";var x=(e,t)=>k(e,t),S=()=>new e,C=e=>new t(e),w=()=>new n,T=()=>new r,E=()=>new i,D=e=>new a(e),O=e=>new o(e),k=(...e)=>new s(h(e)),A=e=>new c(e),j=e=>new l(e),M=(e,t)=>new u(e,t),N=()=>new d,P=()=>new l(null),F=()=>new f,I=e=>new m(e),L=(e,t)=>new g(e,t),R=e=>new _(e),z=()=>new v,B=e=>new y(e),V=()=>new l(void 0),H=(...e)=>new p(h(e)),U={and:x,any:S,array:C,bigint:w,boolean:T,coerce:{bigint:()=>n.coerce(),boolean:()=>r.coerce(),date:()=>i.coerce(),number:()=>f.coerce(),string:()=>v.coerce()},date:E,enum:D,instanceof:O,intersect:k,lazy:A,literal:j,map:M,never:N,null:P,number:F,object:I,or:(e,t)=>H(e,t),record:L,set:R,string:z,tuple:B,undefined:V,union:H,unknown:()=>new e,variant:(e,t)=>new b(e,t)};export{U as s};
1
+ import{Schema as e}from"./core.js";import{ArraySchema as t}from"./schemas/array.js";import{BigIntSchema as n}from"./schemas/bigint.js";import{BooleanSchema as r}from"./schemas/boolean.js";import{DateSchema as i}from"./schemas/date.js";import{EnumSchema as a}from"./schemas/enum.js";import{InstanceOfSchema as o}from"./schemas/instanceof.js";import{IntersectSchema as s}from"./schemas/intersect.js";import{LazySchema as c}from"./schemas/lazy.js";import{LiteralSchema as l}from"./schemas/literal.js";import{MapSchema as u}from"./schemas/map.js";import{NeverSchema as d}from"./schemas/never.js";import{NumberSchema as f}from"./schemas/number.js";import{UnionSchema as p}from"./schemas/union.js";import{ObjectSchema as m}from"./schemas/object.js";import{normalizeToSchemas as h}from"./schemas/raw-or.js";import{RecordSchema as g}from"./schemas/record.js";import{SetSchema as _}from"./schemas/set.js";import{StringSchema as v}from"./schemas/string.js";import{TupleSchema as y}from"./schemas/tuple.js";import{VariantSchema as b}from"./schemas/variant.js";var x={any:()=>new e,array:e=>new t(e),bigint:()=>new n,boolean:()=>new r,coerce:{bigint:()=>n.coerce(),boolean:()=>r.coerce(),date:()=>i.coerce(),number:()=>f.coerce(),string:()=>v.coerce()},date:()=>new i,discriminatedUnion:(e,t)=>new b(e,t),enum:e=>new a(e),instanceof:e=>new o(e),intersect:(...e)=>new s(h(e)),lazy:e=>new c(e),literal:e=>new l(e),map:(e,t)=>new u(e,t),never:()=>new d,null:()=>new l(null),number:()=>new f,object:e=>new m(e),record:(e,t)=>new g(e,t),set:e=>new _(e),string:()=>new v,tuple:e=>new y(e),undefined:()=>new l(void 0),union:(...e)=>new p(h(e)),unknown:()=>new e};export{x as s};
2
2
  //# sourceMappingURL=s.js.map
package/dist/s.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.js","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sAnd = <A, B>(a: Schema<A, any>, b: Schema<B, any>): IntersectSchema<readonly [Schema<A, any>, Schema<B, any>]> =>\n sIntersect(a, b);\nconst sAny = (): Schema<any> => new Schema();\nconst sArray = <T>(schema: Schema<T, any>): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: any[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T>(getter: () => Schema<T, any>): LazySchema<T> => new LazySchema(getter);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K, V>(keySchema: Schema<K, any>, valueSchema: Schema<V, any>): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends string, V>(keySchema: Schema<K, any>, valueSchema: Schema<V, any>): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T>(schema: Schema<T, any>): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sOr = <A, B>(a: Schema<A, any>, b: Schema<B, any>): UnionSchema<readonly [Schema<A, any>, Schema<B, any>]> =>\n sUnion(a, b);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema => BigIntSchema.coerce(),\n boolean: (): BooleanSchema => BooleanSchema.coerce(),\n date: (): DateSchema => DateSchema.coerce(),\n number: (): NumberSchema => NumberSchema.coerce(),\n string: (): StringSchema => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n and: sAnd,\n any: sAny,\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n or: sOr,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n variant: sVariant,\n};\n"],"mappings":"yhCAwBA,IAAM,GAAc,EAAmB,IACrC,EAAW,EAAG,CAAC,EACX,MAA0B,IAAI,EAC9B,EAAa,GAA2C,IAAI,EAAY,CAAM,EAC9E,MAA8B,IAAI,EAClC,MAAgC,IAAI,EACpC,MAA0B,IAAI,EAC9B,EAAqC,GAA6B,IAAI,EAAW,CAAM,EACvF,EAAkB,GAAwD,IAAI,EAAiB,CAAG,EAClG,GACJ,GAAG,IAEH,IAAI,EAAgB,EAAmB,CAAK,CAA6C,EACrF,EAAY,GAAgD,IAAI,EAAW,CAAM,EACjF,EAAoE,GACxE,IAAI,EAAc,CAAK,EACnB,GAAc,EAA2B,IAC7C,IAAI,EAAU,EAAW,CAAW,EAChC,MAA4B,IAAI,EAChC,MAAmC,IAAI,EAAc,IAAI,EACzD,MAA8B,IAAI,EAClC,EAAkC,GAA8B,IAAI,EAAa,CAAK,EACtF,GAAgC,EAA2B,IAC/D,IAAI,EAAa,EAAW,CAAW,EACnC,EAAW,GAAyC,IAAI,EAAU,CAAM,EACxE,MAA8B,IAAI,EAClC,EAAwC,GAA6B,IAAI,EAAY,CAAK,EAC1F,MAA6C,IAAI,EAAc,IAAA,EAAS,EACxE,GACJ,GAAG,IAEH,IAAI,EAAY,EAAmB,CAAK,CAA6C,EA2B1E,EAAI,CACf,IAAK,EACL,IAAK,EACL,MAAO,EACP,OAAQ,EACR,QAAS,EACT,OAAQ,CAxBR,WAA4B,EAAa,OAAO,EAChD,YAA8B,EAAc,OAAO,EACnD,SAAwB,EAAW,OAAO,EAC1C,WAA4B,EAAa,OAAO,EAChD,WAA4B,EAAa,OAAO,CAoBxC,EACR,KAAM,EACN,KAAM,EACN,WAAY,EACZ,UAAW,EACX,KAAM,EACN,QAAS,EACT,IAAK,EACL,MAAO,EACP,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,IA5CiB,EAAmB,IACpC,EAAO,EAAG,CAAC,EA4CX,OAAQ,EACR,IAAK,EACL,OAAQ,EACR,MAAO,EACP,UAAW,EACX,MAAO,EACP,YAjDsC,IAAI,EAkD1C,SAhDA,EACA,IACwB,IAAI,EAAc,EAAe,CAAG,CA+C9D"}
1
+ {"version":3,"file":"s.js","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferOutput, type InferSchemaMode, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sAny = (): Schema<any> => new Schema();\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: any[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, unknown, InferSchemaMode<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, unknown, InferSchemaMode<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any, any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n any: sAny,\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"yhCA+EA,IAAa,EAAI,CACf,QAxD8B,IAAI,EAyDlC,MAxDmC,GAA8B,IAAI,EAAY,CAAM,EAyDvF,WAxDkC,IAAI,EAyDtC,YAxDoC,IAAI,EAyDxC,OAAQ,CAvBR,WAAqC,EAAa,OAAO,EACzD,YAAuC,EAAc,OAAO,EAC5D,SAAiC,EAAW,OAAO,EACnD,WAAqC,EAAa,OAAO,EACzD,WAAqC,EAAa,OAAO,CAmBjD,EACR,SAzD8B,IAAI,EA0DlC,oBA7BA,EACA,IACwB,IAAI,EAAc,EAAe,CAAG,EA4B5D,KA1DyC,GAA6B,IAAI,EAAW,CAAM,EA2D3F,WA1DsB,GAAwD,IAAI,EAAiB,CAAG,EA2DtG,WAzDA,GAAG,IAEH,IAAI,EAAgB,EAAmB,CAAK,CAA6C,EAwDzF,KAvDkC,GAClC,IAAI,EAAW,CAA8E,EAuD7F,QAtDwE,GACxE,IAAI,EAAc,CAAK,EAsDvB,KArDsD,EAAc,IACpE,IAAI,EAAU,EAAW,CAAW,EAqDpC,UApDgC,IAAI,EAqDpC,SApDuC,IAAI,EAAc,IAAI,EAqD7D,WApDkC,IAAI,EAqDtC,OApDsC,GAA8B,IAAI,EAAa,CAAK,EAqD1F,QApDyD,EAAc,IACvE,IAAI,EAAa,EAAW,CAAW,EAoDvC,IAnDiC,GAA4B,IAAI,EAAU,CAAM,EAoDjF,WAnDkC,IAAI,EAoDtC,MAnD4C,GAA6B,IAAI,EAAY,CAAK,EAoD9F,cAnDiD,IAAI,EAAc,IAAA,EAAS,EAoD5E,OAlDA,GAAG,IAEH,IAAI,EAAY,EAAmB,CAAK,CAA6C,EAiDrF,YAhDsC,IAAI,CAiD5C"}
@@ -1,2 +1,2 @@
1
- const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../messages.cjs"),r=require("../core.cjs");var i=class i extends r.Schema{itemSchema;get _kind(){return`array`}constructor(e){super(),this.itemSchema=e}_parseItemsSync(e,n){let r=[],i=[];for(let a=0;a<e.length;a++){let o=this.itemSchema._parseFullSync(e[a],n);o.issues.length===0?i.push(o.data):(r.push(...t.prependIssuePath(o.issues,a)),i.push(e[a]))}return{data:i,issues:r}}_parse(n,r){if(!Array.isArray(n))return{data:n,issues:t.fail(e.ErrorCode.invalid_type,r.messages.array.type()),typeOk:!1};let{data:i,issues:a}=this._parseItemsSync(n,r);return{data:i,issues:a,typeOk:!0}}async parseAsync(n,i){let a=i??r._makeCtx();return this._withCatchAsync(async()=>{let r=this._prepareInput(n);if(r.skip)return r.value;let i=r.value;if(!Array.isArray(i))throw new t.SpellValidationError(t.fail(e.ErrorCode.invalid_type,a.messages.array.type()));let o=await Promise.all(i.map(e=>this.itemSchema._parseFullAsync(e,a))),s=[],c=[];for(let e=0;e<o.length;e++){let n=o[e];n.issues.length===0?c.push(n.data):(s.push(...t.prependIssuePath(n.issues,e)),c.push(i[e]))}let l=await this._runValidatorsAsync(c,a),u=[...s,...l];if(u.length>0)throw new t.SpellValidationError(u);return this._runPostprocessors(c)})}min(r,i=e=>n._messages().array.min(e)){return this._addConstraint((n,a)=>n.length>=r?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(i,{min:r,value:n}),{min:r}),e=>{let t=e;return{...t,minItems:t.minItems===void 0?r:Math.max(t.minItems,r)}})}max(r,i=e=>n._messages().array.max(e)){return this._addConstraint((n,a)=>n.length<=r?null:t.fail(e.ErrorCode.too_big,t.resolveMessage(i,{max:r,value:n}),{max:r}),e=>{let t=e;return{...t,maxItems:t.maxItems===void 0?r:Math.min(t.maxItems,r)}})}length(r,i=e=>n._messages().array.length(e)){return this._addConstraint((n,a)=>n.length===r?null:t.fail(e.ErrorCode.invalid_length,t.resolveMessage(i,{exact:r,value:n}),{exact:r}),e=>({...e,maxItems:r,minItems:r}))}nonEmpty(e=()=>n._messages().array.nonEmpty()){return this.min(1,e)}unique(r,i=()=>n._messages().array.unique()){let a=typeof r==`function`&&r.length===2,o=a?r:null,s=a?i:typeof r==`function`?r:()=>n._messages().array.unique();return this._addConstraint((n,r)=>{let i=n,a;return a=o?i.every((e,t)=>i.slice(0,t).every(t=>!o(e,t))):new Set(i).size===i.length,a?null:t.fail(e.ErrorCode.invalid_unique,t.resolveMessage(s,{value:i}),{unique:!0})})}_toDescriptorImpl(){let e=this._annotations;return{...this._describeBase(),...e.maxItems===void 0?{}:{maxItems:e.maxItems},...e.minItems===void 0?{}:{minItems:e.minItems},items:this.itemSchema.toDescriptor(),kind:`array`}}_walk(e){let t=this.itemSchema.walk(e);return e.array?e.array(this,t):super._walk(e)}_equalsImpl(e){if(!(e instanceof i))return!1;let t=e,n=this._annotations,r=e._annotations;return this.itemSchema.equals(t.itemSchema)&&n.minItems===r.minItems&&n.maxItems===r.maxItems}};exports.ArraySchema=i;
1
+ const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../core.cjs");var r=class extends n.Schema{itemSchema;get _kind(){return`array`}checkAsync(e){return this._addCheck(e,!0)}constructor(e){super(),this.itemSchema=e}_parseItemsSync(e,n){let r=[],i=[];for(let a=0;a<e.length;a++){let o=this.itemSchema._parseFullSync(e[a],n);o.issues.length===0?i.push(o.data):(r.push(...t.prependIssuePath(o.issues,a)),i.push(e[a]))}return{data:i,issues:r}}_parse(n,r){if(!Array.isArray(n))return{data:n,issues:t.fail(e.ErrorCode.invalid_type,r.messages.array.type()),typeOk:!1};let{data:i,issues:a}=this._parseItemsSync(n,r);return{data:i,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(t.fail(e.ErrorCode.invalid_type,a.messages.array.type()));let o=await Promise.all(i.map(e=>this.itemSchema._parseFullAsync(e,a))),s=[],c=[];for(let e=0;e<o.length;e++){let n=o[e];n.issues.length===0?c.push(n.data):(s.push(...t.prependIssuePath(n.issues,e)),c.push(i[e]))}let l=await this._runValidatorsAsync(c,a),u=[...s,...l];if(u.length>0)throw new t.SpellValidationError(u);return this._runPostprocessors(c)})}min(n,r){return this._addConstraint((i,a)=>i.length>=n?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(r??a.messages.array.min,{min:n,value:i}),{min:n}),e=>{let t=e;return{...t,minItems:t.minItems===void 0?n:Math.max(t.minItems,n)}})}max(n,r){return this._addConstraint((i,a)=>i.length<=n?null:t.fail(e.ErrorCode.too_big,t.resolveMessage(r??a.messages.array.max,{max:n,value:i}),{max:n}),e=>{let t=e;return{...t,maxItems:t.maxItems===void 0?n:Math.min(t.maxItems,n)}})}length(n,r){return this._addConstraint((i,a)=>i.length===n?null:t.fail(e.ErrorCode.invalid_length,t.resolveMessage(r??a.messages.array.length,{exact:n,value:i}),{exact:n}),e=>({...e,maxItems:n,minItems:n}))}nonEmpty(n){return this._addConstraint((r,i)=>{let a=r;return a.length>0?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(n??i.messages.array.nonEmpty,{min:1,value:a}),{min:1})})}unique(n,r){let i=typeof n==`function`&&n.length===2,a=i?n:null,o=i?r:typeof n==`function`?n:void 0;return this._addConstraint((n,r)=>{let i=n,s;return s=a?i.every((e,t)=>i.slice(0,t).every(t=>!a(e,t))):new Set(i).size===i.length,s?null:t.fail(e.ErrorCode.invalid_unique,t.resolveMessage(o??r.messages.array.unique,{value:i}),{unique:!0})})}_toDescriptorImpl(){let e=this._annotations;return{...this._describeBase(),...e.maxItems===void 0?{}:{maxItems:e.maxItems},...e.minItems===void 0?{}:{minItems:e.minItems},items:this.itemSchema.definition(),kind:`array`}}_walk(e){let t=this.itemSchema.walk(e);return e.array?e.array(this,t):super._walk(e)}};exports.ArraySchema=r;
2
2
  //# sourceMappingURL=array.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"array.cjs","names":[],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type { Issue, MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx, fail, prependIssuePath, resolveMessage } from '../core';\nimport { _messages } from '../messages';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<T> extends Schema<T[]> {\n readonly itemSchema: Schema<T, any>;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n constructor(itemSchema: Schema<T, any>) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: T[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: T[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as T);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as T);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<T[]> {\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 T[];\n\n const raw = prepared.value;\n\n if (!Array.isArray(raw)) {\n throw new SpellValidationError(fail(ErrorCode.invalid_type, c.messages.array.type()));\n }\n\n const settled = await Promise.all(raw.map((item) => this.itemSchema._parseFullAsync(item, c)));\n\n const issues: Issue[] = [];\n const parsed: T[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as T);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(raw[i] as T);\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(parsed, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(parsed) as T[];\n });\n }\n\n min(\n length: number,\n message: MessageFn<{ min: number; value: unknown[] }> = (ctx) => _messages().array.min(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: length, value: value as unknown[] }), {\n min: length,\n });\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(\n length: number,\n message: MessageFn<{ max: number; value: unknown[] }> = (ctx) => _messages().array.max(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { max: length, value: value as unknown[] }), {\n max: length,\n });\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(\n exact: number,\n message: MessageFn<{ exact: number; value: unknown[] }> = (ctx) => _messages().array.length(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(ErrorCode.invalid_length, resolveMessage(message, { exact, value: value as unknown[] }), { exact });\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message: MessageFn<{ min: number; value: unknown[] }> = () => _messages().array.nonEmpty()): this {\n return this.min(1, message);\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: T, b: T) => boolean) | MessageFn<{ value: unknown[] }>,\n message: MessageFn<{ value: unknown[] }> = () => _messages().array.unique(),\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: T, b: T) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : () => _messages().array.unique();\n\n return this._addConstraint((value, _ctx) => {\n const typed = value as T[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(ErrorCode.invalid_unique, resolveMessage(resolvedMessage, { value: typed as unknown[] }), {\n unique: true,\n });\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.toDescriptor(),\n kind: 'array',\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const item = this.itemSchema.walk(visitor);\n\n if (visitor.array) return visitor.array(this, item);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof ArraySchema)) return false;\n\n const o = other as ArraySchema<any>;\n\n const annotations = this._annotations as ArrayAnnotations;\n const otherAnnotations = other._annotations as ArrayAnnotations;\n\n return (\n this.itemSchema.equals(o.itemSchema as import('../core').AnySchema) &&\n annotations.minItems === otherAnnotations.minItems &&\n annotations.maxItems === otherAnnotations.maxItems\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"array.cjs","names":[],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type { AnySchema, InferOutput, Issue, MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx, fail, prependIssuePath, resolveMessage } from '../core';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<\n T extends AnySchema,\n Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<import('../core').InferSchemaMode<T>>,\n> extends Schema<InferOutput<T>[], unknown, Mode> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n override checkAsync(\n this: ArraySchema<T, 'sync'>,\n fn: (value: InferOutput<T>[], ctx: import('../core').CheckContext) => Promise<import('../core').ValidateResult>,\n ): ArraySchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as ArraySchema<T, 'async'>;\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: InferOutput<T>[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<T>[]> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync<InferOutput<T>[]>(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferOutput<T>[];\n\n const raw = prepared.value;\n\n if (!Array.isArray(raw)) {\n throw new SpellValidationError(fail(ErrorCode.invalid_type, c.messages.array.type()));\n }\n\n const settled = await Promise.all(raw.map((item) => this.itemSchema._parseFullAsync(item, c)));\n\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(raw[i] as InferOutput<T>);\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(parsed, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(parsed) as InferOutput<T>[];\n });\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.array.min, { min: length, value: value as unknown[] }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.array.max, { max: length, value: value as unknown[] }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.array.length, { exact, value: value as unknown[] }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as unknown[];\n\n return typed.length > 0\n ? null\n : fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.array.nonEmpty, { min: 1, value: typed }), {\n min: 1,\n });\n });\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{ value: unknown[] }>,\n message?: MessageFn<{ value: unknown[] }>,\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: InferOutput<T>, b: InferOutput<T>) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : undefined;\n\n return this._addConstraint((value, ctx) => {\n const typed = value as InferOutput<T>[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(\n ErrorCode.invalid_unique,\n resolveMessage(resolvedMessage ?? ctx!.messages.array.unique, { value: typed as unknown[] }),\n {\n unique: true,\n },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const item = this.itemSchema.walk(visitor);\n\n if (visitor.array) return visitor.array(this, item);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"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"}