@vielzeug/spell 26.11.9 → 26.11.10

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 (236) hide show
  1. package/README.md +1 -1
  2. package/dist/_dev.cjs.map +1 -1
  3. package/dist/_dev.js.map +1 -1
  4. package/dist/_object.cjs +2 -0
  5. package/dist/_object.cjs.map +1 -0
  6. package/dist/_object.d.ts +9 -0
  7. package/dist/_object.d.ts.map +1 -0
  8. package/dist/_object.js +2 -0
  9. package/dist/_object.js.map +1 -0
  10. package/dist/_parse.cjs +2 -0
  11. package/dist/_parse.cjs.map +1 -0
  12. package/dist/_parse.d.ts +38 -0
  13. package/dist/_parse.d.ts.map +1 -0
  14. package/dist/_parse.js +2 -0
  15. package/dist/_parse.js.map +1 -0
  16. package/dist/errors.cjs +2 -2
  17. package/dist/errors.cjs.map +1 -1
  18. package/dist/errors.d.ts +15 -26
  19. package/dist/errors.d.ts.map +1 -1
  20. package/dist/errors.js +2 -2
  21. package/dist/errors.js.map +1 -1
  22. package/dist/index.cjs +1 -1
  23. package/dist/index.d.ts +4 -4
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/json.cjs +2 -1
  27. package/dist/json.cjs.map +1 -0
  28. package/dist/json.d.ts +8 -1
  29. package/dist/json.d.ts.map +1 -1
  30. package/dist/json.js +2 -1
  31. package/dist/json.js.map +1 -0
  32. package/dist/messages.cjs +1 -1
  33. package/dist/messages.cjs.map +1 -1
  34. package/dist/messages.d.ts +7 -6
  35. package/dist/messages.d.ts.map +1 -1
  36. package/dist/messages.js +1 -1
  37. package/dist/messages.js.map +1 -1
  38. package/dist/predicates.cjs +2 -1
  39. package/dist/predicates.cjs.map +1 -0
  40. package/dist/predicates.d.ts +41 -2
  41. package/dist/predicates.d.ts.map +1 -1
  42. package/dist/predicates.js +2 -1
  43. package/dist/predicates.js.map +1 -0
  44. package/dist/s.cjs +1 -1
  45. package/dist/s.cjs.map +1 -1
  46. package/dist/s.d.ts +21 -22
  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/schema.cjs +2 -0
  51. package/dist/schema.cjs.map +1 -0
  52. package/dist/schema.d.ts +93 -0
  53. package/dist/schema.d.ts.map +1 -0
  54. package/dist/schema.js +2 -0
  55. package/dist/schema.js.map +1 -0
  56. package/dist/schemas/array.cjs +1 -1
  57. package/dist/schemas/array.cjs.map +1 -1
  58. package/dist/schemas/array.d.ts +22 -32
  59. package/dist/schemas/array.d.ts.map +1 -1
  60. package/dist/schemas/array.js +1 -1
  61. package/dist/schemas/array.js.map +1 -1
  62. package/dist/schemas/bigint.cjs +1 -1
  63. package/dist/schemas/bigint.cjs.map +1 -1
  64. package/dist/schemas/bigint.d.ts +14 -18
  65. package/dist/schemas/bigint.d.ts.map +1 -1
  66. package/dist/schemas/bigint.js +1 -1
  67. package/dist/schemas/bigint.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 +7 -6
  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/discriminated-union.cjs +2 -0
  75. package/dist/schemas/discriminated-union.cjs.map +1 -0
  76. package/dist/schemas/discriminated-union.d.ts +39 -0
  77. package/dist/schemas/discriminated-union.d.ts.map +1 -0
  78. package/dist/schemas/discriminated-union.js +2 -0
  79. package/dist/schemas/discriminated-union.js.map +1 -0
  80. package/dist/schemas/intersect.cjs +1 -1
  81. package/dist/schemas/intersect.cjs.map +1 -1
  82. package/dist/schemas/intersect.d.ts +10 -9
  83. package/dist/schemas/intersect.d.ts.map +1 -1
  84. package/dist/schemas/intersect.js +1 -1
  85. package/dist/schemas/intersect.js.map +1 -1
  86. package/dist/schemas/lazy.cjs +1 -1
  87. package/dist/schemas/lazy.cjs.map +1 -1
  88. package/dist/schemas/lazy.d.ts +10 -10
  89. package/dist/schemas/lazy.d.ts.map +1 -1
  90. package/dist/schemas/lazy.js +1 -1
  91. package/dist/schemas/lazy.js.map +1 -1
  92. package/dist/schemas/map.cjs +1 -1
  93. package/dist/schemas/map.cjs.map +1 -1
  94. package/dist/schemas/map.d.ts +8 -7
  95. package/dist/schemas/map.d.ts.map +1 -1
  96. package/dist/schemas/map.js +1 -1
  97. package/dist/schemas/map.js.map +1 -1
  98. package/dist/schemas/number.cjs +1 -1
  99. package/dist/schemas/number.cjs.map +1 -1
  100. package/dist/schemas/number.d.ts +20 -27
  101. package/dist/schemas/number.d.ts.map +1 -1
  102. package/dist/schemas/number.js +1 -1
  103. package/dist/schemas/number.js.map +1 -1
  104. package/dist/schemas/object.cjs +1 -1
  105. package/dist/schemas/object.cjs.map +1 -1
  106. package/dist/schemas/object.d.ts +40 -88
  107. package/dist/schemas/object.d.ts.map +1 -1
  108. package/dist/schemas/object.js +1 -1
  109. package/dist/schemas/object.js.map +1 -1
  110. package/dist/schemas/primitives.cjs +2 -0
  111. package/dist/schemas/primitives.cjs.map +1 -0
  112. package/dist/schemas/primitives.d.ts +38 -0
  113. package/dist/schemas/primitives.d.ts.map +1 -0
  114. package/dist/schemas/primitives.js +2 -0
  115. package/dist/schemas/primitives.js.map +1 -0
  116. package/dist/schemas/record.cjs +1 -1
  117. package/dist/schemas/record.cjs.map +1 -1
  118. package/dist/schemas/record.d.ts +7 -8
  119. package/dist/schemas/record.d.ts.map +1 -1
  120. package/dist/schemas/record.js +1 -1
  121. package/dist/schemas/record.js.map +1 -1
  122. package/dist/schemas/set.cjs +1 -1
  123. package/dist/schemas/set.cjs.map +1 -1
  124. package/dist/schemas/set.d.ts +8 -7
  125. package/dist/schemas/set.d.ts.map +1 -1
  126. package/dist/schemas/set.js +1 -1
  127. package/dist/schemas/set.js.map +1 -1
  128. package/dist/schemas/string.cjs +1 -1
  129. package/dist/schemas/string.cjs.map +1 -1
  130. package/dist/schemas/string.d.ts +42 -98
  131. package/dist/schemas/string.d.ts.map +1 -1
  132. package/dist/schemas/string.js +1 -1
  133. package/dist/schemas/string.js.map +1 -1
  134. package/dist/schemas/tuple.cjs +1 -1
  135. package/dist/schemas/tuple.cjs.map +1 -1
  136. package/dist/schemas/tuple.d.ts +9 -9
  137. package/dist/schemas/tuple.d.ts.map +1 -1
  138. package/dist/schemas/tuple.js +1 -1
  139. package/dist/schemas/tuple.js.map +1 -1
  140. package/dist/schemas/union.cjs +1 -1
  141. package/dist/schemas/union.cjs.map +1 -1
  142. package/dist/schemas/union.d.ts +9 -7
  143. package/dist/schemas/union.d.ts.map +1 -1
  144. package/dist/schemas/union.js +1 -1
  145. package/dist/schemas/union.js.map +1 -1
  146. package/dist/spell.cjs +2 -2
  147. package/dist/spell.cjs.map +1 -1
  148. package/dist/spell.iife.js +2 -2
  149. package/dist/spell.iife.js.map +1 -1
  150. package/dist/spell.js +842 -1601
  151. package/dist/spell.js.map +1 -1
  152. package/dist/types.cjs +1 -1
  153. package/dist/types.cjs.map +1 -1
  154. package/dist/types.d.ts +151 -265
  155. package/dist/types.d.ts.map +1 -1
  156. package/dist/types.js +1 -1
  157. package/dist/types.js.map +1 -1
  158. package/package.json +2 -2
  159. package/dist/core.cjs +0 -2
  160. package/dist/core.cjs.map +0 -1
  161. package/dist/core.d.ts +0 -101
  162. package/dist/core.d.ts.map +0 -1
  163. package/dist/core.js +0 -2
  164. package/dist/core.js.map +0 -1
  165. package/dist/formats.cjs +0 -2
  166. package/dist/formats.cjs.map +0 -1
  167. package/dist/formats.d.ts +0 -41
  168. package/dist/formats.d.ts.map +0 -1
  169. package/dist/formats.js +0 -2
  170. package/dist/formats.js.map +0 -1
  171. package/dist/json-schema.cjs +0 -2
  172. package/dist/json-schema.cjs.map +0 -1
  173. package/dist/json-schema.d.ts +0 -5
  174. package/dist/json-schema.d.ts.map +0 -1
  175. package/dist/json-schema.js +0 -2
  176. package/dist/json-schema.js.map +0 -1
  177. package/dist/safe-object.cjs +0 -2
  178. package/dist/safe-object.cjs.map +0 -1
  179. package/dist/safe-object.d.ts +0 -6
  180. package/dist/safe-object.d.ts.map +0 -1
  181. package/dist/safe-object.js +0 -2
  182. package/dist/safe-object.js.map +0 -1
  183. package/dist/schemas/boolean.cjs +0 -2
  184. package/dist/schemas/boolean.cjs.map +0 -1
  185. package/dist/schemas/boolean.d.ts +0 -9
  186. package/dist/schemas/boolean.d.ts.map +0 -1
  187. package/dist/schemas/boolean.js +0 -2
  188. package/dist/schemas/boolean.js.map +0 -1
  189. package/dist/schemas/enum.cjs +0 -2
  190. package/dist/schemas/enum.cjs.map +0 -1
  191. package/dist/schemas/enum.d.ts +0 -12
  192. package/dist/schemas/enum.d.ts.map +0 -1
  193. package/dist/schemas/enum.js +0 -2
  194. package/dist/schemas/enum.js.map +0 -1
  195. package/dist/schemas/instanceof.cjs +0 -2
  196. package/dist/schemas/instanceof.cjs.map +0 -1
  197. package/dist/schemas/instanceof.d.ts +0 -9
  198. package/dist/schemas/instanceof.d.ts.map +0 -1
  199. package/dist/schemas/instanceof.js +0 -2
  200. package/dist/schemas/instanceof.js.map +0 -1
  201. package/dist/schemas/literal.cjs +0 -2
  202. package/dist/schemas/literal.cjs.map +0 -1
  203. package/dist/schemas/literal.d.ts +0 -9
  204. package/dist/schemas/literal.d.ts.map +0 -1
  205. package/dist/schemas/literal.js +0 -2
  206. package/dist/schemas/literal.js.map +0 -1
  207. package/dist/schemas/never.cjs +0 -2
  208. package/dist/schemas/never.cjs.map +0 -1
  209. package/dist/schemas/never.d.ts +0 -8
  210. package/dist/schemas/never.d.ts.map +0 -1
  211. package/dist/schemas/never.js +0 -2
  212. package/dist/schemas/never.js.map +0 -1
  213. package/dist/schemas/raw-or.cjs +0 -2
  214. package/dist/schemas/raw-or.cjs.map +0 -1
  215. package/dist/schemas/raw-or.d.ts +0 -17
  216. package/dist/schemas/raw-or.d.ts.map +0 -1
  217. package/dist/schemas/raw-or.js +0 -2
  218. package/dist/schemas/raw-or.js.map +0 -1
  219. package/dist/schemas/variant.cjs +0 -2
  220. package/dist/schemas/variant.cjs.map +0 -1
  221. package/dist/schemas/variant.d.ts +0 -37
  222. package/dist/schemas/variant.d.ts.map +0 -1
  223. package/dist/schemas/variant.js +0 -2
  224. package/dist/schemas/variant.js.map +0 -1
  225. package/dist/tolerate.cjs +0 -2
  226. package/dist/tolerate.cjs.map +0 -1
  227. package/dist/tolerate.d.ts +0 -10
  228. package/dist/tolerate.d.ts.map +0 -1
  229. package/dist/tolerate.js +0 -2
  230. package/dist/tolerate.js.map +0 -1
  231. package/dist/validators.cjs +0 -2
  232. package/dist/validators.cjs.map +0 -1
  233. package/dist/validators.d.ts +0 -20
  234. package/dist/validators.d.ts.map +0 -1
  235. package/dist/validators.js +0 -2
  236. package/dist/validators.js.map +0 -1
package/README.md CHANGED
@@ -19,7 +19,7 @@ const UserSchema = s.object({
19
19
  id: s.coerce.number().int().positive(),
20
20
  name: s.string().trim().min(1),
21
21
  email: s.string().trim().email(),
22
- role: s.union('admin', 'editor', 'viewer').default('viewer'),
22
+ role: s.enum(['admin', 'editor', 'viewer']).default('viewer'),
23
23
  tags: s.array(s.string()).unique().default([]),
24
24
  });
25
25
 
package/dist/_dev.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.cjs","names":["warn"],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgBA,EAAK,EAAmB,CAExC,C"}
1
+ {"version":3,"file":"_dev.cjs","names":["warn"],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n"],"mappings":"AAGA,SAAgBA,EAAK,EAAmB,CAExC,C"}
package/dist/_dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.js","names":["warn"],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgBA,EAAK,EAAmB,CAExC,C"}
1
+ {"version":3,"file":"_dev.js","names":["warn"],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n"],"mappings":"AAGA,SAAgBA,EAAK,EAAmB,CAExC,C"}
@@ -0,0 +1,2 @@
1
+ let e=require("@vielzeug/arsenal");var t=new Set([`__proto__`,`constructor`,`prototype`]);function n(e){return t.has(e)}function r(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0})}function i(e){let t={};for(let[n,i]of e)r(t,n,i);return t}function a(t){return Array.isArray(t)?t.map(a):t instanceof Date?new Date(t.getTime()):t instanceof Map?new Map([...t].map(([e,t])=>[a(e),a(t)])):t instanceof Set?new Set([...t].map(a)):(0,e.isPlainObject)(t)?i(Object.entries(t).map(([e,t])=>[e,a(t)])):t}function o(e){if(typeof e!=`object`||!e||Object.isFrozen(e))return e;for(let t of Object.values(e))o(t);return Object.freeze(e)}exports.deepFreeze=o,exports.defineOwnProperty=r,exports.isUnsafeObjectKey=n,exports.materialize=a,exports.objectFromEntries=i;
2
+ //# sourceMappingURL=_object.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_object.cjs","names":["isPlainObject","_vielzeug_arsenal","UNSAFE_OBJECT_KEYS","isUnsafeObjectKey","key","defineOwnProperty","target","objectFromEntries","out","value","entries","materialize","k","v","entry","deepFreeze","child"],"sources":["../src/_object.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nconst UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** Keys that would mutate a prototype when assigned through `obj[key] = value`. */\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n\n/** Assigns an own enumerable property without triggering inherited setters such as `__proto__`. */\nexport function defineOwnProperty<T>(target: Record<string, T>, key: string, value: T): void {\n Object.defineProperty(target, key, { configurable: true, enumerable: true, value, writable: true });\n}\n\nexport function objectFromEntries<T>(entries: Iterable<readonly [string, T]>): Record<string, T> {\n const out: Record<string, T> = {};\n\n for (const [key, value] of entries) defineOwnProperty(out, key, value);\n\n return out;\n}\n\n/** Deep-copies arrays, plain objects, dates, maps, and sets; returns every other value as-is. */\nexport function materialize<T>(value: T): T {\n if (Array.isArray(value)) return value.map(materialize) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) return new Map([...value].map(([k, v]) => [materialize(k), materialize(v)])) as T;\n\n if (value instanceof Set) return new Set([...value].map(materialize)) as T;\n\n if (isPlainObject(value)) {\n return objectFromEntries(Object.entries(value).map(([key, entry]) => [key, materialize(entry)])) as T;\n }\n\n return value;\n}\n\nexport function deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n"],"mappings":"A,mCAEA,IAAME,EAAqB,IAAI,IAAI,CAAC,YAAa,cAAe,WAAW,CAAC,EAG5E,SAAgBC,EAAkB,EAAsB,CACtD,OAAOD,EAAmB,IAAIE,CAAG,CACnC,CAGA,SAAgBC,EAAqB,EAA2B,EAAa,EAAgB,CAC3F,OAAO,eAAeC,EAAQF,EAAK,CAAE,aAAc,GAAM,WAAY,GAAM,QAAO,SAAU,EAAK,CAAC,CACpG,CAEA,SAAgBG,EAAqB,EAA4D,CAC/F,IAAMC,EAAyB,CAAC,EAEhC,IAAK,GAAM,CAACJ,EAAKK,KAAUC,EAASL,EAAkBG,EAAKJ,EAAKK,CAAK,EAErE,OAAOD,CACT,CAGA,SAAgBG,EAAe,EAAa,CAa1C,OAZI,MAAM,QAAQF,CAAK,EAAUA,EAAM,IAAIE,CAAW,EAElDF,aAAiB,KAAa,IAAI,KAAKA,EAAM,QAAQ,CAAC,EAEtDA,aAAiB,IAAY,IAAI,IAAI,CAAC,GAAGA,CAAK,CAAC,CAAC,KAAK,CAACG,EAAGC,KAAO,CAACF,EAAYC,CAAC,EAAGD,EAAYE,CAAC,CAAC,CAAC,CAAC,EAEjGJ,aAAiB,IAAY,IAAI,IAAI,CAAC,GAAGA,CAAK,CAAC,CAAC,IAAIE,CAAW,CAAC,GAEpE,EAAIX,EAAAA,cAAAA,CAAcS,CAAK,EACdF,EAAkB,OAAO,QAAQE,CAAK,CAAC,CAAC,KAAK,CAACL,EAAKU,KAAW,CAACV,EAAKO,EAAYG,CAAK,CAAC,CAAC,CAAC,EAG1FL,CACT,CAEA,SAAgBM,EAAc,EAAa,CACzC,GAAsB,OAAON,GAAU,WAAnCA,GAA+C,OAAO,SAASA,CAAK,EAAG,OAAOA,EAElF,IAAK,IAAMO,KAAS,OAAO,OAAOP,CAAK,EAAGM,EAAWC,CAAK,EAE1D,OAAO,OAAO,OAAOP,CAAK,CAC5B,C"}
@@ -0,0 +1,9 @@
1
+ /** Keys that would mutate a prototype when assigned through `obj[key] = value`. */
2
+ export declare function isUnsafeObjectKey(key: string): boolean;
3
+ /** Assigns an own enumerable property without triggering inherited setters such as `__proto__`. */
4
+ export declare function defineOwnProperty<T>(target: Record<string, T>, key: string, value: T): void;
5
+ export declare function objectFromEntries<T>(entries: Iterable<readonly [string, T]>): Record<string, T>;
6
+ /** Deep-copies arrays, plain objects, dates, maps, and sets; returns every other value as-is. */
7
+ export declare function materialize<T>(value: T): T;
8
+ export declare function deepFreeze<T>(value: T): T;
9
+ //# sourceMappingURL=_object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_object.d.ts","sourceRoot":"","sources":["../src/_object.ts"],"names":[],"mappings":"AAIA,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAE3F;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAM/F;AAED,iGAAiG;AACjG,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAc1C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAMzC"}
@@ -0,0 +1,2 @@
1
+ import{isPlainObject as e}from"@vielzeug/arsenal";var t=/* @__PURE__ */ new Set([`__proto__`,`constructor`,`prototype`]);function n(e){return t.has(e)}function r(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0})}function i(e){let t={};for(let[n,i]of e)r(t,n,i);return t}function a(t){return Array.isArray(t)?t.map(a):t instanceof Date?new Date(t.getTime()):t instanceof Map?new Map([...t].map(([e,t])=>[a(e),a(t)])):t instanceof Set?new Set([...t].map(a)):e(t)?i(Object.entries(t).map(([e,t])=>[e,a(t)])):t}function o(e){if(typeof e!=`object`||!e||Object.isFrozen(e))return e;for(let t of Object.values(e))o(t);return Object.freeze(e)}export{o as deepFreeze,r as defineOwnProperty,n as isUnsafeObjectKey,a as materialize,i as objectFromEntries};
2
+ //# sourceMappingURL=_object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_object.js","names":["UNSAFE_OBJECT_KEYS","isUnsafeObjectKey","key","defineOwnProperty","target","objectFromEntries","out","value","entries","materialize","k","v","isPlainObject","entry","deepFreeze","child"],"sources":["../src/_object.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nconst UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** Keys that would mutate a prototype when assigned through `obj[key] = value`. */\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n\n/** Assigns an own enumerable property without triggering inherited setters such as `__proto__`. */\nexport function defineOwnProperty<T>(target: Record<string, T>, key: string, value: T): void {\n Object.defineProperty(target, key, { configurable: true, enumerable: true, value, writable: true });\n}\n\nexport function objectFromEntries<T>(entries: Iterable<readonly [string, T]>): Record<string, T> {\n const out: Record<string, T> = {};\n\n for (const [key, value] of entries) defineOwnProperty(out, key, value);\n\n return out;\n}\n\n/** Deep-copies arrays, plain objects, dates, maps, and sets; returns every other value as-is. */\nexport function materialize<T>(value: T): T {\n if (Array.isArray(value)) return value.map(materialize) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) return new Map([...value].map(([k, v]) => [materialize(k), materialize(v)])) as T;\n\n if (value instanceof Set) return new Set([...value].map(materialize)) as T;\n\n if (isPlainObject(value)) {\n return objectFromEntries(Object.entries(value).map(([key, entry]) => [key, materialize(entry)])) as T;\n }\n\n return value;\n}\n\nexport function deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n"],"mappings":"A,kDAEA,IAAMA,kBAAqB,IAAI,IAAI,CAAC,YAAa,cAAe,WAAW,CAAC,EAG5E,SAAgBC,EAAkB,EAAsB,CACtD,OAAOD,EAAmB,IAAIE,CAAG,CACnC,CAGA,SAAgBC,EAAqB,EAA2B,EAAa,EAAgB,CAC3F,OAAO,eAAeC,EAAQF,EAAK,CAAE,aAAc,GAAM,WAAY,GAAM,QAAO,SAAU,EAAK,CAAC,CACpG,CAEA,SAAgBG,EAAqB,EAA4D,CAC/F,IAAMC,EAAyB,CAAC,EAEhC,IAAK,GAAM,CAACJ,EAAKK,KAAUC,EAASL,EAAkBG,EAAKJ,EAAKK,CAAK,EAErE,OAAOD,CACT,CAGA,SAAgBG,EAAe,EAAa,CAa1C,OAZI,MAAM,QAAQF,CAAK,EAAUA,EAAM,IAAIE,CAAW,EAElDF,aAAiB,KAAa,IAAI,KAAKA,EAAM,QAAQ,CAAC,EAEtDA,aAAiB,IAAY,IAAI,IAAI,CAAC,GAAGA,CAAK,CAAC,CAAC,KAAK,CAACG,EAAGC,KAAO,CAACF,EAAYC,CAAC,EAAGD,EAAYE,CAAC,CAAC,CAAC,CAAC,EAEjGJ,aAAiB,IAAY,IAAI,IAAI,CAAC,GAAGA,CAAK,CAAC,CAAC,IAAIE,CAAW,CAAC,EAEhEG,EAAcL,CAAK,EACdF,EAAkB,OAAO,QAAQE,CAAK,CAAC,CAAC,KAAK,CAACL,EAAKW,KAAW,CAACX,EAAKO,EAAYI,CAAK,CAAC,CAAC,CAAC,EAG1FN,CACT,CAEA,SAAgBO,EAAc,EAAa,CACzC,GAAsB,OAAOP,GAAU,WAAnCA,GAA+C,OAAO,SAASA,CAAK,EAAG,OAAOA,EAElF,IAAK,IAAMQ,KAAS,OAAO,OAAOR,CAAK,EAAGO,EAAWC,CAAK,EAE1D,OAAO,OAAO,OAAOR,CAAK,CAC5B,C"}
@@ -0,0 +1,2 @@
1
+ function e(e,t){return e instanceof Promise?e.then(t):t(e)}function t(e){return e.some(e=>e instanceof Promise)?Promise.all(e):e}function n(e,t,...[n]){return n===void 0?{code:e,message:t,path:[]}:{code:e,message:t,params:n,path:[]}}function r(e,t){return typeof e==`function`?e(t):e}function i(e,t){return e.map(e=>({...e,path:[t,...e.path]}))}var a=(e,t)=>e===void 0||t>e?t:e,o=(e,t)=>e===void 0||t<e?t:e,s=e=>({issues:[],typeOk:!0,value:e}),c=(e,...t)=>({issues:t,typeOk:!1,value:e});exports.all=t,exports.atLeast=a,exports.atMost=o,exports.chain=e,exports.invalid=c,exports.issue=n,exports.ok=s,exports.prefixIssues=i,exports.resolveMessage=r;
2
+ //# sourceMappingURL=_parse.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_parse.cjs","names":["chain","value","fn","all","values","issue","params","resolveMessage","message","ctx","prefixIssues","issues","entry","segment","atLeast","current","next","atMost","ok","invalid"],"sources":["../src/_parse.ts"],"sourcesContent":["import type { Messages } from './messages';\nimport type { ErrorCode, Issue, MessageFn } from './types';\n\nexport type MaybePromise<T> = T | Promise<T>;\n\n/** Context threaded through one parse. `async: false` forbids async checks. */\nexport type RunContext = { readonly async: boolean; readonly messages: Messages };\n\n/** Result of running a schema: `issues` is empty on success. */\nexport type Outcome = { issues: Issue[]; value: unknown };\n\n/**\n * Result of a schema's own structural parse. `typeOk: false` means the value has the wrong shape,\n * so the schema's checks and transforms must not run.\n */\nexport type ParseValue = Outcome & { typeOk: boolean };\n\n/** Applies `fn` synchronously when `value` is not a promise. */\nexport function chain<T, R>(value: MaybePromise<T>, fn: (value: T) => MaybePromise<R>): MaybePromise<R> {\n return value instanceof Promise ? value.then(fn) : fn(value);\n}\n\n/** `Promise.all` that stays synchronous when no element is a promise. */\nexport function all<T>(values: MaybePromise<T>[]): MaybePromise<T[]> {\n return values.some((value) => value instanceof Promise) ? Promise.all(values) : (values as T[]);\n}\n\ntype IssueParams<C extends ErrorCode> = Extract<Issue, { code: C }>['params'];\n\nexport function issue<C extends ErrorCode>(\n code: C,\n message: string,\n ...[params]: undefined extends IssueParams<C> ? [params?: IssueParams<C>] : [params: IssueParams<C>]\n): Issue {\n return (params === undefined ? { code, message, path: [] } : { code, message, params, path: [] }) as Issue;\n}\n\nexport function resolveMessage<Ctx extends Record<string, unknown>>(message: MessageFn<Ctx>, ctx: Ctx): string {\n return typeof message === 'function' ? message(ctx) : message;\n}\n\nexport function prefixIssues(issues: readonly Issue[], segment: string | number): Issue[] {\n return issues.map((entry) => ({ ...entry, path: [segment, ...entry.path] }));\n}\n\n/** Tightest lower bound of an existing (optional) bound and a new one. */\nexport const atLeast = <N extends number | bigint>(current: N | undefined, next: N): N =>\n current === undefined || next > current ? next : current;\n\n/** Tightest upper bound of an existing (optional) bound and a new one. */\nexport const atMost = <N extends number | bigint>(current: N | undefined, next: N): N =>\n current === undefined || next < current ? next : current;\n\nexport const ok = (value: unknown): ParseValue => ({ issues: [], typeOk: true, value });\n\nexport const invalid = (value: unknown, ...issues: Issue[]): ParseValue => ({ issues, typeOk: false, value });\n"],"mappings":"AAkBA,SAAgBA,EAAY,EAAwB,EAAoD,CACtG,OAAOC,aAAiB,QAAUA,EAAM,KAAKC,CAAE,EAAIA,EAAGD,CAAK,CAC7D,CAGA,SAAgBE,EAAO,EAA8C,CACnE,OAAOC,EAAO,KAAM,GAAUH,aAAiB,OAAO,EAAI,QAAQ,IAAIG,CAAM,EAAKA,CACnF,CAIA,SAAgBC,EACd,EACA,EACA,GAAG,CAACC,GACG,CACP,OAAQA,IAAW,IAAA,GAAY,CAAE,OAAM,UAAS,KAAM,CAAC,CAAE,EAAI,CAAE,OAAM,UAAS,SAAQ,KAAM,CAAC,CAAE,CACjG,CAEA,SAAgBC,EAAoD,EAAyB,EAAkB,CAC7G,OAAO,OAAOC,GAAY,WAAaA,EAAQC,CAAG,EAAID,CACxD,CAEA,SAAgBE,EAAa,EAA0B,EAAmC,CACxF,OAAOC,EAAO,IAAK,IAAW,CAAE,GAAGC,EAAO,KAAM,CAACC,EAAS,GAAGD,EAAM,IAAI,CAAE,EAAE,CAC7E,CAGA,IAAaE,GAAsC,EAAwB,IACzEC,IAAY,IAAA,IAAaC,EAAOD,EAAUC,EAAOD,EAGtCE,GAAqC,EAAwB,IACxEF,IAAY,IAAA,IAAaC,EAAOD,EAAUC,EAAOD,EAEtCG,EAAM,IAAgC,CAAE,OAAQ,CAAC,EAAG,OAAQ,GAAM,OAAM,GAExEC,GAAW,EAAgB,GAAGR,KAAiC,CAAE,SAAQ,OAAQ,GAAO,OAAM,G"}
@@ -0,0 +1,38 @@
1
+ import type { Messages } from './messages';
2
+ import type { ErrorCode, Issue, MessageFn } from './types';
3
+ export type MaybePromise<T> = T | Promise<T>;
4
+ /** Context threaded through one parse. `async: false` forbids async checks. */
5
+ export type RunContext = {
6
+ readonly async: boolean;
7
+ readonly messages: Messages;
8
+ };
9
+ /** Result of running a schema: `issues` is empty on success. */
10
+ export type Outcome = {
11
+ issues: Issue[];
12
+ value: unknown;
13
+ };
14
+ /**
15
+ * Result of a schema's own structural parse. `typeOk: false` means the value has the wrong shape,
16
+ * so the schema's checks and transforms must not run.
17
+ */
18
+ export type ParseValue = Outcome & {
19
+ typeOk: boolean;
20
+ };
21
+ /** Applies `fn` synchronously when `value` is not a promise. */
22
+ export declare function chain<T, R>(value: MaybePromise<T>, fn: (value: T) => MaybePromise<R>): MaybePromise<R>;
23
+ /** `Promise.all` that stays synchronous when no element is a promise. */
24
+ export declare function all<T>(values: MaybePromise<T>[]): MaybePromise<T[]>;
25
+ type IssueParams<C extends ErrorCode> = Extract<Issue, {
26
+ code: C;
27
+ }>['params'];
28
+ export declare function issue<C extends ErrorCode>(code: C, message: string, ...[params]: undefined extends IssueParams<C> ? [params?: IssueParams<C>] : [params: IssueParams<C>]): Issue;
29
+ export declare function resolveMessage<Ctx extends Record<string, unknown>>(message: MessageFn<Ctx>, ctx: Ctx): string;
30
+ export declare function prefixIssues(issues: readonly Issue[], segment: string | number): Issue[];
31
+ /** Tightest lower bound of an existing (optional) bound and a new one. */
32
+ export declare const atLeast: <N extends number | bigint>(current: N | undefined, next: N) => N;
33
+ /** Tightest upper bound of an existing (optional) bound and a new one. */
34
+ export declare const atMost: <N extends number | bigint>(current: N | undefined, next: N) => N;
35
+ export declare const ok: (value: unknown) => ParseValue;
36
+ export declare const invalid: (value: unknown, ...issues: Issue[]) => ParseValue;
37
+ export {};
38
+ //# sourceMappingURL=_parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_parse.d.ts","sourceRoot":"","sources":["../src/_parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE3D,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;AAElF,gEAAgE;AAChE,MAAM,MAAM,OAAO,GAAG;IAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvD,gEAAgE;AAChE,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAEtG;AAED,yEAAyE;AACzE,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAEnE;AAED,KAAK,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE9E,wBAAgB,KAAK,CAAC,CAAC,SAAS,SAAS,EACvC,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,SAAS,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GACnG,KAAK,CAEP;AAED,wBAAgB,cAAc,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAE7G;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,CAExF;AAED,0EAA0E;AAC1E,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,KAAG,CAC3B,CAAC;AAE3D,0EAA0E;AAC1E,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,KAAG,CAC1B,CAAC;AAE3D,eAAO,MAAM,EAAE,GAAI,OAAO,OAAO,KAAG,UAAmD,CAAC;AAExF,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,EAAE,GAAG,QAAQ,KAAK,EAAE,KAAG,UAAgD,CAAC"}
package/dist/_parse.js ADDED
@@ -0,0 +1,2 @@
1
+ function e(e,t){return e instanceof Promise?e.then(t):t(e)}function t(e){return e.some(e=>e instanceof Promise)?Promise.all(e):e}function n(e,t,...[n]){return n===void 0?{code:e,message:t,path:[]}:{code:e,message:t,params:n,path:[]}}function r(e,t){return typeof e==`function`?e(t):e}function i(e,t){return e.map(e=>({...e,path:[t,...e.path]}))}var a=(e,t)=>e===void 0||t>e?t:e,o=(e,t)=>e===void 0||t<e?t:e,s=e=>({issues:[],typeOk:!0,value:e}),c=(e,...t)=>({issues:t,typeOk:!1,value:e});export{t as all,a as atLeast,o as atMost,e as chain,c as invalid,n as issue,s as ok,i as prefixIssues,r as resolveMessage};
2
+ //# sourceMappingURL=_parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_parse.js","names":["chain","value","fn","all","values","issue","params","resolveMessage","message","ctx","prefixIssues","issues","entry","segment","atLeast","current","next","atMost","ok","invalid"],"sources":["../src/_parse.ts"],"sourcesContent":["import type { Messages } from './messages';\nimport type { ErrorCode, Issue, MessageFn } from './types';\n\nexport type MaybePromise<T> = T | Promise<T>;\n\n/** Context threaded through one parse. `async: false` forbids async checks. */\nexport type RunContext = { readonly async: boolean; readonly messages: Messages };\n\n/** Result of running a schema: `issues` is empty on success. */\nexport type Outcome = { issues: Issue[]; value: unknown };\n\n/**\n * Result of a schema's own structural parse. `typeOk: false` means the value has the wrong shape,\n * so the schema's checks and transforms must not run.\n */\nexport type ParseValue = Outcome & { typeOk: boolean };\n\n/** Applies `fn` synchronously when `value` is not a promise. */\nexport function chain<T, R>(value: MaybePromise<T>, fn: (value: T) => MaybePromise<R>): MaybePromise<R> {\n return value instanceof Promise ? value.then(fn) : fn(value);\n}\n\n/** `Promise.all` that stays synchronous when no element is a promise. */\nexport function all<T>(values: MaybePromise<T>[]): MaybePromise<T[]> {\n return values.some((value) => value instanceof Promise) ? Promise.all(values) : (values as T[]);\n}\n\ntype IssueParams<C extends ErrorCode> = Extract<Issue, { code: C }>['params'];\n\nexport function issue<C extends ErrorCode>(\n code: C,\n message: string,\n ...[params]: undefined extends IssueParams<C> ? [params?: IssueParams<C>] : [params: IssueParams<C>]\n): Issue {\n return (params === undefined ? { code, message, path: [] } : { code, message, params, path: [] }) as Issue;\n}\n\nexport function resolveMessage<Ctx extends Record<string, unknown>>(message: MessageFn<Ctx>, ctx: Ctx): string {\n return typeof message === 'function' ? message(ctx) : message;\n}\n\nexport function prefixIssues(issues: readonly Issue[], segment: string | number): Issue[] {\n return issues.map((entry) => ({ ...entry, path: [segment, ...entry.path] }));\n}\n\n/** Tightest lower bound of an existing (optional) bound and a new one. */\nexport const atLeast = <N extends number | bigint>(current: N | undefined, next: N): N =>\n current === undefined || next > current ? next : current;\n\n/** Tightest upper bound of an existing (optional) bound and a new one. */\nexport const atMost = <N extends number | bigint>(current: N | undefined, next: N): N =>\n current === undefined || next < current ? next : current;\n\nexport const ok = (value: unknown): ParseValue => ({ issues: [], typeOk: true, value });\n\nexport const invalid = (value: unknown, ...issues: Issue[]): ParseValue => ({ issues, typeOk: false, value });\n"],"mappings":"AAkBA,SAAgBA,EAAY,EAAwB,EAAoD,CACtG,OAAOC,aAAiB,QAAUA,EAAM,KAAKC,CAAE,EAAIA,EAAGD,CAAK,CAC7D,CAGA,SAAgBE,EAAO,EAA8C,CACnE,OAAOC,EAAO,KAAM,GAAUH,aAAiB,OAAO,EAAI,QAAQ,IAAIG,CAAM,EAAKA,CACnF,CAIA,SAAgBC,EACd,EACA,EACA,GAAG,CAACC,GACG,CACP,OAAQA,IAAW,IAAA,GAAY,CAAE,OAAM,UAAS,KAAM,CAAC,CAAE,EAAI,CAAE,OAAM,UAAS,SAAQ,KAAM,CAAC,CAAE,CACjG,CAEA,SAAgBC,EAAoD,EAAyB,EAAkB,CAC7G,OAAO,OAAOC,GAAY,WAAaA,EAAQC,CAAG,EAAID,CACxD,CAEA,SAAgBE,EAAa,EAA0B,EAAmC,CACxF,OAAOC,EAAO,IAAK,IAAW,CAAE,GAAGC,EAAO,KAAM,CAACC,EAAS,GAAGD,EAAM,IAAI,CAAE,EAAE,CAC7E,CAGA,IAAaE,GAAsC,EAAwB,IACzEC,IAAY,IAAA,IAAaC,EAAOD,EAAUC,EAAOD,EAGtCE,GAAqC,EAAwB,IACxEF,IAAY,IAAA,IAAaC,EAAOD,EAAUC,EAAOD,EAEtCG,EAAM,IAAgC,CAAE,OAAQ,CAAC,EAAG,OAAQ,GAAM,OAAM,GAExEC,GAAW,EAAgB,GAAGR,KAAiC,CAAE,SAAQ,OAAQ,GAAO,OAAM,G"}
package/dist/errors.cjs CHANGED
@@ -1,3 +1,3 @@
1
- function e(e,t,n){return[{code:e,message:t,params:n,path:[]}]}function t(e,t){return typeof e==`function`?e(t):e}function n(e,t){return e.map(e=>({...e,path:[t,...e.path]}))}function r(e,t=`.`){return!e||e.length===0?``:e.map(e=>typeof e==`object`&&e&&`key`in e?String(e.key):String(e)).join(t)}var i=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}};function a(e){return e.map(({code:e,message:t,path:n})=>`${n.length?n.join(`.`):`value`}: ${t} [${e}]`).join(`
2
- `)}function o(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var s=class extends i{},c=class extends i{issues;constructor(e,t){super(a(e),{cause:t}),this.issues=Object.freeze([...e])}flatten(){let e=[],t=[],n=new Map;for(let r of this.issues)if(r.path.length===0)t.push(r.message);else{let t=JSON.stringify(r.path),i=n.get(t);i===void 0?(n.set(t,e.length),e.push({messages:[r.message],path:[...r.path]})):e[i]?.messages.push(r.message)}return{fieldErrors:e,formErrors:t}}flattenFirst(){let{fieldErrors:e,formErrors:t}=this.flatten();return{fieldErrors:e.map(e=>({message:e.messages[0],path:e.path})),formErrors:t}}messagesAt(...e){return this.issues.filter(t=>o(t.path,e)).map(e=>e.message)}};exports.SpellDefinitionError=s,exports.SpellError=i,exports.SpellValidationError=c,exports.fail=e,exports.joinIssuePath=r,exports.prependIssuePath=n,exports.resolveMessage=t;
1
+ var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{};function n(e,t=`.`){return e?e.map(e=>String(typeof e==`object`&&e?e.key:e)).join(t):``}function r(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var i=class extends e{issues;constructor(e,t){super(e.map(({code:e,message:t,path:r})=>`${n(r)||`value`}: ${t} [${e}]`).join(`
2
+ `),t),this.issues=Object.freeze([...e])}flatten(){let e=[],t=[],n=new Map;for(let r of this.issues){if(r.path.length===0){t.push(r.message);continue}let i=JSON.stringify(r.path),a=n.get(i);if(a)a.messages.push(r.message);else{let t={messages:[r.message],path:[...r.path]};n.set(i,t),e.push(t)}}return{fieldErrors:e,formErrors:t}}flattenFirst(){let{fieldErrors:e,formErrors:t}=this.flatten();return{fieldErrors:e.map(({messages:e,path:t})=>({message:e[0],path:t})),formErrors:t}}messagesAt(...e){return this.issues.filter(t=>r(t.path,e)).map(e=>e.message)}};exports.SpellDefinitionError=t,exports.SpellError=e,exports.SpellValidationError=i,exports.joinIssuePath=n;
3
3
  //# sourceMappingURL=errors.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":["fail","resolveMessage","msg","ctx","prependIssuePath","issues","issue","prefix","joinIssuePath","path","segment","separator","SpellError","message","opts","formatIssues","code","pathsEqual","left","right","index","SpellDefinitionError","SpellValidationError","fieldErrors","formErrors","pathMap","key","existing","fe"],"sources":["../src/errors.ts"],"sourcesContent":["import type { ErrorCode, Issue, IssuePath, MessageFn } from './types';\n\n/* -------------------- Helpers -------------------- */\n\ntype IssueParams<C extends string> = Extract<Issue, { code: C }> extends { params: infer P } ? P : undefined;\n\n/**\n * Creates a single-error failure array. Use in validator functions instead of building the array manually.\n * Typed overloads ensure params match the given error code.\n */\nexport function fail<C extends ErrorCode>(code: C, message: string, params: IssueParams<C>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[] {\n return [{ code, message, params, path: [] } as Issue];\n}\n\n/** Resolve a message value or factory against a context. Re-exported by `core` for schema modules. */\nexport function resolveMessage<Ctx extends Record<string, unknown>>(msg: MessageFn<Ctx>, ctx: Ctx): string {\n return typeof msg === 'function' ? msg(ctx) : msg;\n}\n\nexport function prependIssuePath(issues: Issue[], prefix: string | number): Issue[] {\n return issues.map((issue) => ({ ...issue, path: [prefix, ...issue.path] }));\n}\n\n/**\n * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native\n * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or\n * undefined paths join to `''`.\n */\nexport function joinIssuePath(path: IssuePath | undefined, separator = '.'): string {\n if (!path || path.length === 0) return '';\n\n return path\n .map((segment) => {\n if (typeof segment === 'object' && segment !== null && 'key' in segment) return String(segment.key);\n return String(segment);\n })\n .join(separator);\n}\n\n/* -------------------- SpellError -------------------- */\n\n/** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */\nexport class SpellError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/* -------------------- SpellValidationError -------------------- */\n\nfunction formatIssues(issues: Issue[]): string {\n return issues\n .map(({ code, message, path }) => {\n const pathStr = path.length ? path.join('.') : 'value';\n\n return `${pathStr}: ${message} [${code}]`;\n })\n .join('\\n');\n}\n\nfunction pathsEqual(left: readonly (string | number)[], right: readonly (string | number)[]): boolean {\n return left.length === right.length && left.every((segment, index) => segment === right[index]);\n}\n\nexport type FlatError = { messages: string[]; path: (string | number)[] };\nexport type FlatErrorFirst = { message: string; path: (string | number)[] };\n\nexport class SpellDefinitionError extends SpellError {}\n\nexport class SpellValidationError extends SpellError {\n readonly issues: Issue[];\n\n constructor(issues: Issue[], cause?: unknown) {\n super(formatIssues(issues), { cause });\n this.issues = Object.freeze([...issues]) as Issue[];\n }\n\n flatten(): { fieldErrors: FlatError[]; formErrors: string[] } {\n const fieldErrors: FlatError[] = [];\n const formErrors: string[] = [];\n const pathMap = new Map<string, number>();\n\n for (const issue of this.issues) {\n if (issue.path.length === 0) {\n formErrors.push(issue.message);\n } else {\n const key = JSON.stringify(issue.path);\n const existing = pathMap.get(key);\n\n if (existing !== undefined) {\n fieldErrors[existing]?.messages.push(issue.message);\n } else {\n pathMap.set(key, fieldErrors.length);\n fieldErrors.push({ messages: [issue.message], path: [...issue.path] });\n }\n }\n }\n\n return { fieldErrors, formErrors };\n }\n\n flattenFirst(): { fieldErrors: FlatErrorFirst[]; formErrors: string[] } {\n const { fieldErrors, formErrors } = this.flatten();\n\n return {\n fieldErrors: fieldErrors.map((fe) => ({ message: fe.messages[0]!, path: fe.path })),\n formErrors,\n };\n }\n\n /** Returns every message attached to exactly `path`, in issue order. */\n messagesAt(...path: (string | number)[]): string[] {\n return this.issues.filter((issue) => pathsEqual(issue.path, path)).map((issue) => issue.message);\n }\n}\n"],"mappings":"AAYA,SAAgBA,EAAK,EAAc,EAAiB,EAA2C,CAC7F,MAAO,CAAC,CAAE,OAAM,UAAS,SAAQ,KAAM,CAAC,CAAE,CAAU,CACtD,CAGA,SAAgBC,EAAoD,EAAqB,EAAkB,CACzG,OAAO,OAAOC,GAAQ,WAAaA,EAAIC,CAAG,EAAID,CAChD,CAEA,SAAgBE,EAAiB,EAAiB,EAAkC,CAClF,OAAOC,EAAO,IAAK,IAAW,CAAE,GAAGC,EAAO,KAAM,CAACC,EAAQ,GAAGD,EAAM,IAAI,CAAE,EAAE,CAC5E,CAOA,SAAgBE,EAAc,EAA6B,EAAY,IAAa,CAGlF,MAFI,CAACC,GAAQA,EAAK,SAAW,EAAU,GAEhCA,EACJ,IAAK,GACA,OAAOC,GAAY,UAAYA,GAAoB,QAASA,EAAgB,OAAOA,EAAQ,GAAG,EAC3F,OAAOA,CAAO,CACtB,CAAC,CACD,KAAKC,CAAS,CACnB,CAKA,IAAaC,EAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAMC,EAASC,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAIA,SAASC,EAAa,EAAyB,CAC7C,OAAOV,EACJ,KAAK,CAAE,OAAM,UAAS,UAGd,GAFSI,EAAK,OAASA,EAAK,KAAK,GAAG,EAAI,QAE7B,IAAII,EAAQ,IAAIG,EAAK,EACxC,CAAC,CACD,KAAK;CAAI,CACd,CAEA,SAASC,EAAW,EAAoC,EAA8C,CACpG,OAAOC,EAAK,SAAWC,EAAM,QAAUD,EAAK,OAAO,EAAS,IAAUR,IAAYS,EAAMC,EAAM,CAChG,CAKA,IAAaC,EAAb,cAA0CT,CAAW,CAAC,EAEzCU,EAAb,cAA0CV,CAAW,CACnD,OAEA,YAAY,EAAiB,EAAiB,CAC5C,MAAMG,EAAaV,CAAM,EAAG,CAAE,OAAM,CAAC,EACrC,KAAK,OAAS,OAAO,OAAO,CAAC,GAAGA,CAAM,CAAC,CACzC,CAEA,SAA8D,CAC5D,IAAMkB,EAA2B,CAAC,EAC5BC,EAAuB,CAAC,EACxBC,EAAU,IAAI,IAEpB,IAAK,IAAMnB,KAAS,KAAK,OACvB,GAAIA,EAAM,KAAK,SAAW,EACxBkB,EAAW,KAAKlB,EAAM,OAAO,MACxB,CACL,IAAMoB,EAAM,KAAK,UAAUpB,EAAM,IAAI,EAC/BqB,EAAWF,EAAQ,IAAIC,CAAG,EAE5BC,IAAa,IAAA,IAGfF,EAAQ,IAAIC,EAAKH,EAAY,MAAM,EACnCA,EAAY,KAAK,CAAE,SAAU,CAACjB,EAAM,OAAO,EAAG,KAAM,CAAC,GAAGA,EAAM,IAAI,CAAE,CAAC,GAHrEiB,EAAYI,EAAS,EAAE,SAAS,KAAKrB,EAAM,OAAO,CAKtD,CAGF,MAAO,CAAE,cAAa,YAAW,CACnC,CAEA,cAAwE,CACtE,GAAM,CAAE,cAAa,cAAe,KAAK,QAAQ,EAEjD,MAAO,CACL,YAAaiB,EAAY,IAAK,IAAQ,CAAE,QAASK,EAAG,SAAS,GAAK,KAAMA,EAAG,IAAK,EAAE,EAClF,YACF,CACF,CAGA,WAAW,GAAGnB,EAAqC,CACjD,OAAO,KAAK,OAAO,OAAQ,GAAUQ,EAAWX,EAAM,KAAMG,CAAI,CAAC,CAAC,CAAC,IAAK,GAAUH,EAAM,OAAO,CACjG,CACF,E"}
1
+ {"version":3,"file":"errors.cjs","names":["SpellError","message","opts","SpellDefinitionError","joinIssuePath","path","segment","separator","pathsEqual","left","right","index","SpellValidationError","issues","code","fieldErrors","formErrors","byPath","issue","key","existing","entry","messages"],"sources":["../src/errors.ts"],"sourcesContent":["import type { Issue, IssuePath } from './types';\n\n/** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */\nexport class SpellError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** The schema cannot perform the requested operation: a non-portable `definition()` or an invalid derivation. */\nexport class SpellDefinitionError extends SpellError {}\n\nexport type FlatError = { messages: string[]; path: (string | number)[] };\nexport type FlatErrorFirst = { message: string; path: (string | number)[] };\n\n/**\n * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native\n * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or\n * undefined paths join to `''`.\n */\nexport function joinIssuePath(path: IssuePath | undefined, separator = '.'): string {\n if (!path) return '';\n\n return path\n .map((segment) => String(typeof segment === 'object' && segment !== null ? segment.key : segment))\n .join(separator);\n}\n\nfunction pathsEqual(left: readonly (string | number)[], right: readonly (string | number)[]): boolean {\n return left.length === right.length && left.every((segment, index) => segment === right[index]);\n}\n\n/** Validation failure carrying every issue found during the parse. */\nexport class SpellValidationError extends SpellError {\n readonly issues: readonly Issue[];\n\n constructor(issues: readonly Issue[], opts?: ErrorOptions) {\n super(\n issues.map(({ code, message, path }) => `${joinIssuePath(path) || 'value'}: ${message} [${code}]`).join('\\n'),\n opts,\n );\n this.issues = Object.freeze([...issues]);\n }\n\n /** Groups messages by exact path; root-level messages become `formErrors`. */\n flatten(): { fieldErrors: FlatError[]; formErrors: string[] } {\n const fieldErrors: FlatError[] = [];\n const formErrors: string[] = [];\n const byPath = new Map<string, FlatError>();\n\n for (const issue of this.issues) {\n if (issue.path.length === 0) {\n formErrors.push(issue.message);\n continue;\n }\n\n const key = JSON.stringify(issue.path);\n const existing = byPath.get(key);\n\n if (existing) {\n existing.messages.push(issue.message);\n } else {\n const entry = { messages: [issue.message], path: [...issue.path] };\n\n byPath.set(key, entry);\n fieldErrors.push(entry);\n }\n }\n\n return { fieldErrors, formErrors };\n }\n\n /** Like `flatten()`, keeping only the first message per path. */\n flattenFirst(): { fieldErrors: FlatErrorFirst[]; formErrors: string[] } {\n const { fieldErrors, formErrors } = this.flatten();\n\n return { fieldErrors: fieldErrors.map(({ messages, path }) => ({ message: messages[0]!, path })), formErrors };\n }\n\n /** Returns every message attached to exactly `path`, in issue order. */\n messagesAt(...path: (string | number)[]): string[] {\n return this.issues.filter((issue) => pathsEqual(issue.path, path)).map((issue) => issue.message);\n }\n}\n"],"mappings":"AAGA,IAAaA,EAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAMC,EAASC,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGaC,EAAb,cAA0CH,CAAW,CAAC,EAUtD,SAAgBI,EAAc,EAA6B,EAAY,IAAa,CAGlF,OAFKC,EAEEA,EACJ,IAAK,GAAY,OAAO,OAAOC,GAAY,UAAYA,EAAmBA,EAAQ,IAAMA,CAAO,CAAC,CAAC,CACjG,KAAKC,CAAS,EAJC,EAKpB,CAEA,SAASC,EAAW,EAAoC,EAA8C,CACpG,OAAOC,EAAK,SAAWC,EAAM,QAAUD,EAAK,OAAO,EAAS,IAAUH,IAAYI,EAAMC,EAAM,CAChG,CAGA,IAAaC,EAAb,cAA0CZ,CAAW,CACnD,OAEA,YAAY,EAA0B,EAAqB,CACzD,MACEa,EAAO,KAAK,CAAE,OAAM,UAAS,UAAW,GAAGT,EAAcC,CAAI,GAAK,QAAQ,IAAIJ,EAAQ,IAAIa,EAAK,EAAE,CAAC,CAAC,KAAK;CAAI,EAC5GZ,CACF,EACA,KAAK,OAAS,OAAO,OAAO,CAAC,GAAGW,CAAM,CAAC,CACzC,CAGA,SAA8D,CAC5D,IAAME,EAA2B,CAAC,EAC5BC,EAAuB,CAAC,EACxBC,EAAS,IAAI,IAEnB,IAAK,IAAMC,KAAS,KAAK,OAAQ,CAC/B,GAAIA,EAAM,KAAK,SAAW,EAAG,CAC3BF,EAAW,KAAKE,EAAM,OAAO,EAC7B,QACF,CAEA,IAAMC,EAAM,KAAK,UAAUD,EAAM,IAAI,EAC/BE,EAAWH,EAAO,IAAIE,CAAG,EAE/B,GAAIC,EACFA,EAAS,SAAS,KAAKF,EAAM,OAAO,MAC/B,CACL,IAAMG,EAAQ,CAAE,SAAU,CAACH,EAAM,OAAO,EAAG,KAAM,CAAC,GAAGA,EAAM,IAAI,CAAE,EAEjED,EAAO,IAAIE,EAAKE,CAAK,EACrBN,EAAY,KAAKM,CAAK,CACxB,CACF,CAEA,MAAO,CAAE,cAAa,YAAW,CACnC,CAGA,cAAwE,CACtE,GAAM,CAAE,cAAa,cAAe,KAAK,QAAQ,EAEjD,MAAO,CAAE,YAAaN,EAAY,KAAK,CAAE,WAAU,WAAY,CAAE,QAASO,EAAS,GAAK,MAAK,EAAE,EAAG,YAAW,CAC/G,CAGA,WAAW,GAAGjB,EAAqC,CACjD,OAAO,KAAK,OAAO,OAAQ,GAAUG,EAAWU,EAAM,KAAMb,CAAI,CAAC,CAAC,CAAC,IAAK,GAAUa,EAAM,OAAO,CACjG,CACF,E"}
package/dist/errors.d.ts CHANGED
@@ -1,28 +1,11 @@
1
- import type { ErrorCode, Issue, IssuePath, MessageFn } from './types';
2
- type IssueParams<C extends string> = Extract<Issue, {
3
- code: C;
4
- }> extends {
5
- params: infer P;
6
- } ? P : undefined;
7
- /**
8
- * Creates a single-error failure array. Use in validator functions instead of building the array manually.
9
- * Typed overloads ensure params match the given error code.
10
- */
11
- export declare function fail<C extends ErrorCode>(code: C, message: string, params: IssueParams<C>): Issue[];
12
- export declare function fail(code: string, message: string, params?: Record<string, unknown>): Issue[];
13
- /** Resolve a message value or factory against a context. Re-exported by `core` for schema modules. */
14
- export declare function resolveMessage<Ctx extends Record<string, unknown>>(msg: MessageFn<Ctx>, ctx: Ctx): string;
15
- export declare function prependIssuePath(issues: Issue[], prefix: string | number): Issue[];
16
- /**
17
- * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native
18
- * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or
19
- * undefined paths join to `''`.
20
- */
21
- export declare function joinIssuePath(path: IssuePath | undefined, separator?: string): string;
1
+ import type { Issue, IssuePath } from './types';
22
2
  /** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */
23
3
  export declare class SpellError extends Error {
24
4
  constructor(message: string, opts?: ErrorOptions);
25
5
  }
6
+ /** The schema cannot perform the requested operation: a non-portable `definition()` or an invalid derivation. */
7
+ export declare class SpellDefinitionError extends SpellError {
8
+ }
26
9
  export type FlatError = {
27
10
  messages: string[];
28
11
  path: (string | number)[];
@@ -31,15 +14,22 @@ export type FlatErrorFirst = {
31
14
  message: string;
32
15
  path: (string | number)[];
33
16
  };
34
- export declare class SpellDefinitionError extends SpellError {
35
- }
17
+ /**
18
+ * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native
19
+ * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or
20
+ * undefined paths join to `''`.
21
+ */
22
+ export declare function joinIssuePath(path: IssuePath | undefined, separator?: string): string;
23
+ /** Validation failure carrying every issue found during the parse. */
36
24
  export declare class SpellValidationError extends SpellError {
37
- readonly issues: Issue[];
38
- constructor(issues: Issue[], cause?: unknown);
25
+ readonly issues: readonly Issue[];
26
+ constructor(issues: readonly Issue[], opts?: ErrorOptions);
27
+ /** Groups messages by exact path; root-level messages become `formErrors`. */
39
28
  flatten(): {
40
29
  fieldErrors: FlatError[];
41
30
  formErrors: string[];
42
31
  };
32
+ /** Like `flatten()`, keeping only the first message per path. */
43
33
  flattenFirst(): {
44
34
  fieldErrors: FlatErrorFirst[];
45
35
  formErrors: string[];
@@ -47,5 +37,4 @@ export declare class SpellValidationError extends SpellError {
47
37
  /** Returns every message attached to exactly `path`, in issue order. */
48
38
  messagesAt(...path: (string | number)[]): string[];
49
39
  }
50
- export {};
51
40
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAItE,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,CAAC,GAAG,SAAS,CAAC;AAE7G;;;GAGG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;AACrG,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC;AAK/F,sGAAsG;AACtG,wBAAgB,cAAc,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAEzG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,CAElF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,SAAS,SAAM,GAAG,MAAM,CASlF;AAID,wGAAwG;AACxG,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;CAKjD;AAkBD,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAE5E,qBAAa,oBAAqB,SAAQ,UAAU;CAAG;AAEvD,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;gBAEb,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO;IAK5C,OAAO,IAAI;QAAE,WAAW,EAAE,SAAS,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IAwB7D,YAAY,IAAI;QAAE,WAAW,EAAE,cAAc,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IASvE,wEAAwE;IACxE,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE;CAGnD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,wGAAwG;AACxG,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;CAKjD;AAED,iHAAiH;AACjH,qBAAa,oBAAqB,SAAQ,UAAU;CAAG;AAEvD,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAE5E;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,SAAS,SAAM,GAAG,MAAM,CAMlF;AAMD,sEAAsE;AACtE,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;gBAEtB,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY;IAQzD,8EAA8E;IAC9E,OAAO,IAAI;QAAE,WAAW,EAAE,SAAS,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IA2B7D,iEAAiE;IACjE,YAAY,IAAI;QAAE,WAAW,EAAE,cAAc,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IAMvE,wEAAwE;IACxE,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE;CAGnD"}
package/dist/errors.js CHANGED
@@ -1,3 +1,3 @@
1
- function e(e,t,n){return[{code:e,message:t,params:n,path:[]}]}function t(e,t){return typeof e==`function`?e(t):e}function n(e,t){return e.map(e=>({...e,path:[t,...e.path]}))}function r(e,t=`.`){return!e||e.length===0?``:e.map(e=>typeof e==`object`&&e&&`key`in e?String(e.key):String(e)).join(t)}var i=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}};function a(e){return e.map(({code:e,message:t,path:n})=>`${n.length?n.join(`.`):`value`}: ${t} [${e}]`).join(`
2
- `)}function o(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var s=class extends i{},c=class extends i{issues;constructor(e,t){super(a(e),{cause:t}),this.issues=Object.freeze([...e])}flatten(){let e=[],t=[],n=/* @__PURE__ */ new Map;for(let r of this.issues)if(r.path.length===0)t.push(r.message);else{let t=JSON.stringify(r.path),i=n.get(t);i===void 0?(n.set(t,e.length),e.push({messages:[r.message],path:[...r.path]})):e[i]?.messages.push(r.message)}return{fieldErrors:e,formErrors:t}}flattenFirst(){let{fieldErrors:e,formErrors:t}=this.flatten();return{fieldErrors:e.map(e=>({message:e.messages[0],path:e.path})),formErrors:t}}messagesAt(...e){return this.issues.filter(t=>o(t.path,e)).map(e=>e.message)}};export{s as SpellDefinitionError,i as SpellError,c as SpellValidationError,e as fail,r as joinIssuePath,n as prependIssuePath,t as resolveMessage};
1
+ var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{};function n(e,t=`.`){return e?e.map(e=>String(typeof e==`object`&&e?e.key:e)).join(t):``}function r(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var i=class extends e{issues;constructor(e,t){super(e.map(({code:e,message:t,path:r})=>`${n(r)||`value`}: ${t} [${e}]`).join(`
2
+ `),t),this.issues=Object.freeze([...e])}flatten(){let e=[],t=[],n=/* @__PURE__ */ new Map;for(let r of this.issues){if(r.path.length===0){t.push(r.message);continue}let i=JSON.stringify(r.path),a=n.get(i);if(a)a.messages.push(r.message);else{let t={messages:[r.message],path:[...r.path]};n.set(i,t),e.push(t)}}return{fieldErrors:e,formErrors:t}}flattenFirst(){let{fieldErrors:e,formErrors:t}=this.flatten();return{fieldErrors:e.map(({messages:e,path:t})=>({message:e[0],path:t})),formErrors:t}}messagesAt(...e){return this.issues.filter(t=>r(t.path,e)).map(e=>e.message)}};export{t as SpellDefinitionError,e as SpellError,i as SpellValidationError,n as joinIssuePath};
3
3
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":["fail","resolveMessage","msg","ctx","prependIssuePath","issues","issue","prefix","joinIssuePath","path","segment","separator","SpellError","message","opts","formatIssues","code","pathsEqual","left","right","index","SpellDefinitionError","SpellValidationError","fieldErrors","formErrors","pathMap","key","existing","fe"],"sources":["../src/errors.ts"],"sourcesContent":["import type { ErrorCode, Issue, IssuePath, MessageFn } from './types';\n\n/* -------------------- Helpers -------------------- */\n\ntype IssueParams<C extends string> = Extract<Issue, { code: C }> extends { params: infer P } ? P : undefined;\n\n/**\n * Creates a single-error failure array. Use in validator functions instead of building the array manually.\n * Typed overloads ensure params match the given error code.\n */\nexport function fail<C extends ErrorCode>(code: C, message: string, params: IssueParams<C>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[] {\n return [{ code, message, params, path: [] } as Issue];\n}\n\n/** Resolve a message value or factory against a context. Re-exported by `core` for schema modules. */\nexport function resolveMessage<Ctx extends Record<string, unknown>>(msg: MessageFn<Ctx>, ctx: Ctx): string {\n return typeof msg === 'function' ? msg(ctx) : msg;\n}\n\nexport function prependIssuePath(issues: Issue[], prefix: string | number): Issue[] {\n return issues.map((issue) => ({ ...issue, path: [prefix, ...issue.path] }));\n}\n\n/**\n * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native\n * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or\n * undefined paths join to `''`.\n */\nexport function joinIssuePath(path: IssuePath | undefined, separator = '.'): string {\n if (!path || path.length === 0) return '';\n\n return path\n .map((segment) => {\n if (typeof segment === 'object' && segment !== null && 'key' in segment) return String(segment.key);\n return String(segment);\n })\n .join(separator);\n}\n\n/* -------------------- SpellError -------------------- */\n\n/** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */\nexport class SpellError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/* -------------------- SpellValidationError -------------------- */\n\nfunction formatIssues(issues: Issue[]): string {\n return issues\n .map(({ code, message, path }) => {\n const pathStr = path.length ? path.join('.') : 'value';\n\n return `${pathStr}: ${message} [${code}]`;\n })\n .join('\\n');\n}\n\nfunction pathsEqual(left: readonly (string | number)[], right: readonly (string | number)[]): boolean {\n return left.length === right.length && left.every((segment, index) => segment === right[index]);\n}\n\nexport type FlatError = { messages: string[]; path: (string | number)[] };\nexport type FlatErrorFirst = { message: string; path: (string | number)[] };\n\nexport class SpellDefinitionError extends SpellError {}\n\nexport class SpellValidationError extends SpellError {\n readonly issues: Issue[];\n\n constructor(issues: Issue[], cause?: unknown) {\n super(formatIssues(issues), { cause });\n this.issues = Object.freeze([...issues]) as Issue[];\n }\n\n flatten(): { fieldErrors: FlatError[]; formErrors: string[] } {\n const fieldErrors: FlatError[] = [];\n const formErrors: string[] = [];\n const pathMap = new Map<string, number>();\n\n for (const issue of this.issues) {\n if (issue.path.length === 0) {\n formErrors.push(issue.message);\n } else {\n const key = JSON.stringify(issue.path);\n const existing = pathMap.get(key);\n\n if (existing !== undefined) {\n fieldErrors[existing]?.messages.push(issue.message);\n } else {\n pathMap.set(key, fieldErrors.length);\n fieldErrors.push({ messages: [issue.message], path: [...issue.path] });\n }\n }\n }\n\n return { fieldErrors, formErrors };\n }\n\n flattenFirst(): { fieldErrors: FlatErrorFirst[]; formErrors: string[] } {\n const { fieldErrors, formErrors } = this.flatten();\n\n return {\n fieldErrors: fieldErrors.map((fe) => ({ message: fe.messages[0]!, path: fe.path })),\n formErrors,\n };\n }\n\n /** Returns every message attached to exactly `path`, in issue order. */\n messagesAt(...path: (string | number)[]): string[] {\n return this.issues.filter((issue) => pathsEqual(issue.path, path)).map((issue) => issue.message);\n }\n}\n"],"mappings":"AAYA,SAAgBA,EAAK,EAAc,EAAiB,EAA2C,CAC7F,MAAO,CAAC,CAAE,OAAM,UAAS,SAAQ,KAAM,CAAC,CAAE,CAAU,CACtD,CAGA,SAAgBC,EAAoD,EAAqB,EAAkB,CACzG,OAAO,OAAOC,GAAQ,WAAaA,EAAIC,CAAG,EAAID,CAChD,CAEA,SAAgBE,EAAiB,EAAiB,EAAkC,CAClF,OAAOC,EAAO,IAAK,IAAW,CAAE,GAAGC,EAAO,KAAM,CAACC,EAAQ,GAAGD,EAAM,IAAI,CAAE,EAAE,CAC5E,CAOA,SAAgBE,EAAc,EAA6B,EAAY,IAAa,CAGlF,MAFI,CAACC,GAAQA,EAAK,SAAW,EAAU,GAEhCA,EACJ,IAAK,GACA,OAAOC,GAAY,UAAYA,GAAoB,QAASA,EAAgB,OAAOA,EAAQ,GAAG,EAC3F,OAAOA,CAAO,CACtB,CAAC,CACD,KAAKC,CAAS,CACnB,CAKA,IAAaC,EAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAMC,EAASC,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAIA,SAASC,EAAa,EAAyB,CAC7C,OAAOV,EACJ,KAAK,CAAE,OAAM,UAAS,UAGd,GAFSI,EAAK,OAASA,EAAK,KAAK,GAAG,EAAI,QAE7B,IAAII,EAAQ,IAAIG,EAAK,EACxC,CAAC,CACD,KAAK;CAAI,CACd,CAEA,SAASC,EAAW,EAAoC,EAA8C,CACpG,OAAOC,EAAK,SAAWC,EAAM,QAAUD,EAAK,OAAO,EAAS,IAAUR,IAAYS,EAAMC,EAAM,CAChG,CAKA,IAAaC,EAAb,cAA0CT,CAAW,CAAC,EAEzCU,EAAb,cAA0CV,CAAW,CACnD,OAEA,YAAY,EAAiB,EAAiB,CAC5C,MAAMG,EAAaV,CAAM,EAAG,CAAE,OAAM,CAAC,EACrC,KAAK,OAAS,OAAO,OAAO,CAAC,GAAGA,CAAM,CAAC,CACzC,CAEA,SAA8D,CAC5D,IAAMkB,EAA2B,CAAC,EAC5BC,EAAuB,CAAC,EACxBC,kBAAU,IAAI,IAEpB,IAAK,IAAMnB,KAAS,KAAK,OACvB,GAAIA,EAAM,KAAK,SAAW,EACxBkB,EAAW,KAAKlB,EAAM,OAAO,MACxB,CACL,IAAMoB,EAAM,KAAK,UAAUpB,EAAM,IAAI,EAC/BqB,EAAWF,EAAQ,IAAIC,CAAG,EAE5BC,IAAa,IAAA,IAGfF,EAAQ,IAAIC,EAAKH,EAAY,MAAM,EACnCA,EAAY,KAAK,CAAE,SAAU,CAACjB,EAAM,OAAO,EAAG,KAAM,CAAC,GAAGA,EAAM,IAAI,CAAE,CAAC,GAHrEiB,EAAYI,EAAS,EAAE,SAAS,KAAKrB,EAAM,OAAO,CAKtD,CAGF,MAAO,CAAE,cAAa,YAAW,CACnC,CAEA,cAAwE,CACtE,GAAM,CAAE,cAAa,cAAe,KAAK,QAAQ,EAEjD,MAAO,CACL,YAAaiB,EAAY,IAAK,IAAQ,CAAE,QAASK,EAAG,SAAS,GAAK,KAAMA,EAAG,IAAK,EAAE,EAClF,YACF,CACF,CAGA,WAAW,GAAGnB,EAAqC,CACjD,OAAO,KAAK,OAAO,OAAQ,GAAUQ,EAAWX,EAAM,KAAMG,CAAI,CAAC,CAAC,CAAC,IAAK,GAAUH,EAAM,OAAO,CACjG,CACF,E"}
1
+ {"version":3,"file":"errors.js","names":["SpellError","message","opts","SpellDefinitionError","joinIssuePath","path","segment","separator","pathsEqual","left","right","index","SpellValidationError","issues","code","fieldErrors","formErrors","byPath","issue","key","existing","entry","messages"],"sources":["../src/errors.ts"],"sourcesContent":["import type { Issue, IssuePath } from './types';\n\n/** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */\nexport class SpellError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** The schema cannot perform the requested operation: a non-portable `definition()` or an invalid derivation. */\nexport class SpellDefinitionError extends SpellError {}\n\nexport type FlatError = { messages: string[]; path: (string | number)[] };\nexport type FlatErrorFirst = { message: string; path: (string | number)[] };\n\n/**\n * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native\n * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or\n * undefined paths join to `''`.\n */\nexport function joinIssuePath(path: IssuePath | undefined, separator = '.'): string {\n if (!path) return '';\n\n return path\n .map((segment) => String(typeof segment === 'object' && segment !== null ? segment.key : segment))\n .join(separator);\n}\n\nfunction pathsEqual(left: readonly (string | number)[], right: readonly (string | number)[]): boolean {\n return left.length === right.length && left.every((segment, index) => segment === right[index]);\n}\n\n/** Validation failure carrying every issue found during the parse. */\nexport class SpellValidationError extends SpellError {\n readonly issues: readonly Issue[];\n\n constructor(issues: readonly Issue[], opts?: ErrorOptions) {\n super(\n issues.map(({ code, message, path }) => `${joinIssuePath(path) || 'value'}: ${message} [${code}]`).join('\\n'),\n opts,\n );\n this.issues = Object.freeze([...issues]);\n }\n\n /** Groups messages by exact path; root-level messages become `formErrors`. */\n flatten(): { fieldErrors: FlatError[]; formErrors: string[] } {\n const fieldErrors: FlatError[] = [];\n const formErrors: string[] = [];\n const byPath = new Map<string, FlatError>();\n\n for (const issue of this.issues) {\n if (issue.path.length === 0) {\n formErrors.push(issue.message);\n continue;\n }\n\n const key = JSON.stringify(issue.path);\n const existing = byPath.get(key);\n\n if (existing) {\n existing.messages.push(issue.message);\n } else {\n const entry = { messages: [issue.message], path: [...issue.path] };\n\n byPath.set(key, entry);\n fieldErrors.push(entry);\n }\n }\n\n return { fieldErrors, formErrors };\n }\n\n /** Like `flatten()`, keeping only the first message per path. */\n flattenFirst(): { fieldErrors: FlatErrorFirst[]; formErrors: string[] } {\n const { fieldErrors, formErrors } = this.flatten();\n\n return { fieldErrors: fieldErrors.map(({ messages, path }) => ({ message: messages[0]!, path })), formErrors };\n }\n\n /** Returns every message attached to exactly `path`, in issue order. */\n messagesAt(...path: (string | number)[]): string[] {\n return this.issues.filter((issue) => pathsEqual(issue.path, path)).map((issue) => issue.message);\n }\n}\n"],"mappings":"AAGA,IAAaA,EAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAMC,EAASC,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGaC,EAAb,cAA0CH,CAAW,CAAC,EAUtD,SAAgBI,EAAc,EAA6B,EAAY,IAAa,CAGlF,OAFKC,EAEEA,EACJ,IAAK,GAAY,OAAO,OAAOC,GAAY,UAAYA,EAAmBA,EAAQ,IAAMA,CAAO,CAAC,CAAC,CACjG,KAAKC,CAAS,EAJC,EAKpB,CAEA,SAASC,EAAW,EAAoC,EAA8C,CACpG,OAAOC,EAAK,SAAWC,EAAM,QAAUD,EAAK,OAAO,EAAS,IAAUH,IAAYI,EAAMC,EAAM,CAChG,CAGA,IAAaC,EAAb,cAA0CZ,CAAW,CACnD,OAEA,YAAY,EAA0B,EAAqB,CACzD,MACEa,EAAO,KAAK,CAAE,OAAM,UAAS,UAAW,GAAGT,EAAcC,CAAI,GAAK,QAAQ,IAAIJ,EAAQ,IAAIa,EAAK,EAAE,CAAC,CAAC,KAAK;CAAI,EAC5GZ,CACF,EACA,KAAK,OAAS,OAAO,OAAO,CAAC,GAAGW,CAAM,CAAC,CACzC,CAGA,SAA8D,CAC5D,IAAME,EAA2B,CAAC,EAC5BC,EAAuB,CAAC,EACxBC,kBAAS,IAAI,IAEnB,IAAK,IAAMC,KAAS,KAAK,OAAQ,CAC/B,GAAIA,EAAM,KAAK,SAAW,EAAG,CAC3BF,EAAW,KAAKE,EAAM,OAAO,EAC7B,QACF,CAEA,IAAMC,EAAM,KAAK,UAAUD,EAAM,IAAI,EAC/BE,EAAWH,EAAO,IAAIE,CAAG,EAE/B,GAAIC,EACFA,EAAS,SAAS,KAAKF,EAAM,OAAO,MAC/B,CACL,IAAMG,EAAQ,CAAE,SAAU,CAACH,EAAM,OAAO,EAAG,KAAM,CAAC,GAAGA,EAAM,IAAI,CAAE,EAEjED,EAAO,IAAIE,EAAKE,CAAK,EACrBN,EAAY,KAAKM,CAAK,CACxB,CACF,CAEA,MAAO,CAAE,cAAa,YAAW,CACnC,CAGA,cAAwE,CACtE,GAAM,CAAE,cAAa,cAAe,KAAK,QAAQ,EAEjD,MAAO,CAAE,YAAaN,EAAY,KAAK,CAAE,WAAU,WAAY,CAAE,QAASO,EAAS,GAAK,MAAK,EAAE,EAAG,YAAW,CAC/G,CAGA,WAAW,GAAGjB,EAAqC,CACjD,OAAO,KAAK,OAAO,OAAQ,GAAUG,EAAWU,EAAM,KAAMb,CAAI,CAAC,CAAC,CAAC,IAAK,GAAUa,EAAM,OAAO,CACjG,CACF,E"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./core.cjs"),n=require("./types.cjs"),r=require("./messages.cjs"),i=require("./s.cjs"),a=require("./tolerate.cjs");exports.ErrorCode=n.ErrorCode,exports.Schema=t.Schema,exports.SpellDefinitionError=e.SpellDefinitionError,exports.SpellError=e.SpellError,exports.SpellValidationError=e.SpellValidationError,exports.createParseContext=r.createParseContext,exports.joinIssuePath=e.joinIssuePath,exports.s=i.s,exports.tolerate=a.tolerate;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./messages.cjs"),n=require("./s.cjs"),r=require("./schema.cjs"),i=require("./types.cjs");exports.ErrorCode=i.ErrorCode,exports.Schema=r.Schema,exports.SpellDefinitionError=e.SpellDefinitionError,exports.SpellError=e.SpellError,exports.SpellValidationError=e.SpellValidationError,exports.createParseContext=t.createParseContext,exports.joinIssuePath=e.joinIssuePath,exports.s=n.s;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export type { AnySchema, CheckContext, FlatError, FlatErrorFirst, Infer, InferInput, InferOutput, Issue, IssuePath, IssuePathSegment, JsonSchema, MessageFn, Messages, ParseContext, ParseResult, SchemaDescriptor, StandardSchemaV1, SyncParsable, ValidateResult, } from './core';
2
- export { ErrorCode, joinIssuePath, Schema, SpellDefinitionError, SpellError, SpellValidationError } from './core';
3
- export { createParseContext, type DeepPartial } from './messages';
1
+ export { type FlatError, type FlatErrorFirst, joinIssuePath, SpellDefinitionError, SpellError, SpellValidationError, } from './errors';
2
+ export { createParseContext, type DeepPartial, type Messages } from './messages';
4
3
  export { s } from './s';
5
- export { tolerate } from './tolerate';
4
+ export { Schema } from './schema';
5
+ export { type AnySchema, type CheckContext, ErrorCode, type Infer, type InferInput, type InferOutput, type Issue, type IssuePath, type IssuePathSegment, type MessageFn, type ParseContext, type ParseResult, type PatternDescriptor, type SchemaDescriptor, type SchemaKind, type StandardSchemaV1, type ValidateResult, } from './types';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,SAAS,EACT,YAAY,EACZ,SAAS,EACT,cAAc,EACd,KAAK,EACL,UAAU,EACV,WAAW,EACX,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,cAAc,GACf,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,oBAAoB,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAClH,OAAO,EAAE,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,kBAAkB,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EACL,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,SAAS,EACT,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{SpellDefinitionError as e,SpellError as t,SpellValidationError as n,joinIssuePath as r}from"./errors.js";import{Schema as i}from"./core.js";import{ErrorCode as a}from"./types.js";import{createParseContext as o}from"./messages.js";import{s}from"./s.js";import{tolerate as c}from"./tolerate.js";export{a as ErrorCode,i as Schema,e as SpellDefinitionError,t as SpellError,n as SpellValidationError,o as createParseContext,r as joinIssuePath,s,c as tolerate};
1
+ import{SpellDefinitionError as e,SpellError as t,SpellValidationError as n,joinIssuePath as r}from"./errors.js";import{createParseContext as i}from"./messages.js";import{s as a}from"./s.js";import{Schema as o}from"./schema.js";import{ErrorCode as s}from"./types.js";export{s as ErrorCode,o as Schema,e as SpellDefinitionError,t as SpellError,n as SpellValidationError,i as createParseContext,r as joinIssuePath,a as s};
package/dist/json.cjs CHANGED
@@ -1 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./json-schema.cjs");exports.fromDefinition=e.definitionToJsonSchema;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./_object.cjs");var t={isoDate:`date`,isoDateTime:`date-time`,url:`uri`};function n(e){return e===`base64`||e===`base64url`?{contentEncoding:e}:e===`ip`?{anyOf:[{format:`ipv4`},{format:`ipv6`}]}:{format:t[e]??e}}function r(e,t){let r=[...e.map(n),...t.map(({source:e})=>({pattern:e}))];if(r.length===0)return{};let[i,...a]=r;return a.length===0?i:{allOf:r}}var i=e=>e===void 0?void 0:Number(e);function a(e,t){for(let[n,r]of Object.entries(t))r!==void 0&&(e[n]=r);return e}function o(t){switch(t.kind){case`unknown`:case`lazy`:return{};case`never`:return{not:{}};case`boolean`:return{type:`boolean`};case`string`:return a({type:`string`,...r(t.formats??[],t.patterns??[])},{maxLength:t.maxLength,minLength:t.minLength});case`number`:return a({type:t.integer?`integer`:`number`},{exclusiveMaximum:t.exclusiveMaximum,exclusiveMinimum:t.exclusiveMinimum,maximum:t.maximum,minimum:t.minimum,multipleOf:t.multipleOf});case`bigint`:return a({type:`integer`},{exclusiveMaximum:i(t.exclusiveMaximum),exclusiveMinimum:i(t.exclusiveMinimum),maximum:i(t.maximum),minimum:i(t.minimum),multipleOf:i(t.multipleOf)});case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`enum`:return{enum:[...t.values]};case`array`:return a({items:s(t.items),type:`array`},{maxItems:t.maxItems,minItems:t.minItems,uniqueItems:t.uniqueItems});case`tuple`:return{items:t.rest!==null&&s(t.rest),prefixItems:t.items.map(s),type:`array`};case`set`:return a({$comment:`Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:s(t.items),type:`array`,uniqueItems:!0},{maxItems:t.maxSize,minItems:t.minSize});case`map`:return a({$comment:`Map: represented as an object; key constraints are not representable.`,additionalProperties:s(t.value),type:`object`},{maxProperties:t.maxSize,minProperties:t.minSize});case`record`:return{additionalProperties:s(t.value),propertyNames:s(t.key),type:`object`};case`object`:{let n={},r=[];for(let[i,a]of Object.entries(t.fields))e.defineOwnProperty(n,i,s(a)),a.isOptional||r.push(i);for(let r of t.tolerated??[])Object.hasOwn(n,r)||e.defineOwnProperty(n,r,{});return a({properties:n,type:`object`},{additionalProperties:!t.strict&&void 0,required:r.length>0?r:void 0})}case`union`:return{anyOf:t.branches.map(s)};case`intersect`:return{allOf:t.branches.map(s)};case`discriminatedUnion`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(s)};case`pipe`:return s(t.to)}}function s(e){let t=o(e),n=e.isNullable?{anyOf:[t,{type:`null`}]}:t;return e.description===void 0?n:{...n,description:e.description}}exports.toJsonSchema=s;
2
+ //# sourceMappingURL=json.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.cjs","names":["require__object","JSON_FORMATS","stringFormat","format","stringConstraints","parts","formats","patterns","source","first","rest","toNumber","value","withDefined","key","extra","base","toBase","d","toJsonSchema","properties","required","field","definition","schema"],"sources":["../src/json.ts"],"sourcesContent":["import { defineOwnProperty } from './_object';\nimport type { PatternDescriptor, SchemaDescriptor } from './types';\n\n/** Plain JSON Schema object (targeting JSON Schema 2020-12). */\nexport type JsonSchema = Record<string, unknown>;\n\n/** Spell format names with a different JSON Schema `format` spelling. */\nconst JSON_FORMATS: Readonly<Record<string, string>> = { isoDate: 'date', isoDateTime: 'date-time', url: 'uri' };\n\nfunction stringFormat(format: string): JsonSchema {\n if (format === 'base64' || format === 'base64url') return { contentEncoding: format };\n\n if (format === 'ip') return { anyOf: [{ format: 'ipv4' }, { format: 'ipv6' }] };\n\n return { format: JSON_FORMATS[format] ?? format };\n}\n\n/** JSON Schema patterns are flagless ECMA-262 regexes, so regex flags are not carried over. */\nfunction stringConstraints(formats: readonly string[], patterns: readonly PatternDescriptor[]): JsonSchema {\n const parts = [...formats.map(stringFormat), ...patterns.map(({ source }) => ({ pattern: source }))];\n\n if (parts.length === 0) return {};\n\n const [first, ...rest] = parts;\n\n return rest.length === 0 ? first! : { allOf: parts };\n}\n\nconst toNumber = (value: bigint | undefined) => (value === undefined ? undefined : Number(value));\n\nfunction withDefined(base: JsonSchema, extra: Record<string, unknown>): JsonSchema {\n for (const [key, value] of Object.entries(extra)) if (value !== undefined) base[key] = value;\n\n return base;\n}\n\nfunction toBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n case 'lazy':\n return {};\n\n case 'never':\n return { not: {} };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'string':\n return withDefined(\n { type: 'string', ...stringConstraints(d.formats ?? [], d.patterns ?? []) },\n { maxLength: d.maxLength, minLength: d.minLength },\n );\n\n case 'number':\n return withDefined(\n { type: d.integer ? 'integer' : 'number' },\n {\n exclusiveMaximum: d.exclusiveMaximum,\n exclusiveMinimum: d.exclusiveMinimum,\n maximum: d.maximum,\n minimum: d.minimum,\n multipleOf: d.multipleOf,\n },\n );\n\n case 'bigint':\n return withDefined(\n { type: 'integer' },\n {\n exclusiveMaximum: toNumber(d.exclusiveMaximum),\n exclusiveMinimum: toNumber(d.exclusiveMinimum),\n maximum: toNumber(d.maximum),\n minimum: toNumber(d.minimum),\n multipleOf: toNumber(d.multipleOf),\n },\n );\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'instanceof':\n return { $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.` };\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n return d.value === undefined ? {} : { const: d.value };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'array':\n return withDefined(\n { items: toJsonSchema(d.items), type: 'array' },\n { maxItems: d.maxItems, minItems: d.minItems, uniqueItems: d.uniqueItems },\n );\n\n case 'tuple':\n return {\n items: d.rest === null ? false : toJsonSchema(d.rest),\n prefixItems: d.items.map(toJsonSchema),\n type: 'array',\n };\n\n case 'set':\n return withDefined(\n {\n $comment: 'Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: toJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n },\n { maxItems: d.maxSize, minItems: d.minSize },\n );\n\n case 'map':\n return withDefined(\n {\n $comment: 'Map: represented as an object; key constraints are not representable.',\n additionalProperties: toJsonSchema(d.value),\n type: 'object',\n },\n { maxProperties: d.maxSize, minProperties: d.minSize },\n );\n\n case 'record':\n return { additionalProperties: toJsonSchema(d.value), propertyNames: toJsonSchema(d.key), type: 'object' };\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, field] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, toJsonSchema(field));\n\n if (!field.isOptional) required.push(key);\n }\n\n for (const key of d.tolerated ?? []) if (!Object.hasOwn(properties, key)) defineOwnProperty(properties, key, {});\n\n return withDefined(\n { properties, type: 'object' },\n { additionalProperties: d.strict ? false : undefined, required: required.length > 0 ? required : undefined },\n );\n }\n\n case 'union':\n return { anyOf: d.branches.map(toJsonSchema) };\n\n case 'intersect':\n return { allOf: d.branches.map(toJsonSchema) };\n\n case 'discriminatedUnion':\n return { discriminator: { propertyName: d.discriminator }, oneOf: Object.values(d.branches).map(toJsonSchema) };\n\n case 'pipe':\n return toJsonSchema(d.to);\n }\n}\n\n/**\n * Converts a schema definition (`schema.definition()`) to a JSON Schema 2020-12 object.\n * Non-JSON types (`date`, `map`, `set`, `instanceof`) are approximated and annotated with `$comment`.\n */\nexport function toJsonSchema(definition: SchemaDescriptor): JsonSchema {\n const base = toBase(definition);\n const schema = definition.isNullable ? { anyOf: [base, { type: 'null' }] } : base;\n\n return definition.description === undefined ? schema : { ...schema, description: definition.description };\n}\n"],"mappings":"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"}
package/dist/json.d.ts CHANGED
@@ -1,2 +1,9 @@
1
- export { definitionToJsonSchema as fromDefinition } from './json-schema';
1
+ import type { SchemaDescriptor } from './types';
2
+ /** Plain JSON Schema object (targeting JSON Schema 2020-12). */
3
+ export type JsonSchema = Record<string, unknown>;
4
+ /**
5
+ * Converts a schema definition (`schema.definition()`) to a JSON Schema 2020-12 object.
6
+ * Non-JSON types (`date`, `map`, `set`, `instanceof`) are approximated and annotated with `$comment`.
7
+ */
8
+ export declare function toJsonSchema(definition: SchemaDescriptor): JsonSchema;
2
9
  //# sourceMappingURL=json.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,IAAI,cAAc,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEnE,gEAAgE;AAChE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAgKjD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,gBAAgB,GAAG,UAAU,CAKrE"}
package/dist/json.js CHANGED
@@ -1 +1,2 @@
1
- export{definitionToJsonSchema as fromDefinition}from"./json-schema.js";
1
+ import{defineOwnProperty as e}from"./_object.js";var t={isoDate:`date`,isoDateTime:`date-time`,url:`uri`};function n(e){return e===`base64`||e===`base64url`?{contentEncoding:e}:e===`ip`?{anyOf:[{format:`ipv4`},{format:`ipv6`}]}:{format:t[e]??e}}function r(e,t){let r=[...e.map(n),...t.map(({source:e})=>({pattern:e}))];if(r.length===0)return{};let[i,...a]=r;return a.length===0?i:{allOf:r}}var i=e=>e===void 0?void 0:Number(e);function a(e,t){for(let[n,r]of Object.entries(t))r!==void 0&&(e[n]=r);return e}function o(t){switch(t.kind){case`unknown`:case`lazy`:return{};case`never`:return{not:{}};case`boolean`:return{type:`boolean`};case`string`:return a({type:`string`,...r(t.formats??[],t.patterns??[])},{maxLength:t.maxLength,minLength:t.minLength});case`number`:return a({type:t.integer?`integer`:`number`},{exclusiveMaximum:t.exclusiveMaximum,exclusiveMinimum:t.exclusiveMinimum,maximum:t.maximum,minimum:t.minimum,multipleOf:t.multipleOf});case`bigint`:return a({type:`integer`},{exclusiveMaximum:i(t.exclusiveMaximum),exclusiveMinimum:i(t.exclusiveMinimum),maximum:i(t.maximum),minimum:i(t.minimum),multipleOf:i(t.multipleOf)});case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`enum`:return{enum:[...t.values]};case`array`:return a({items:s(t.items),type:`array`},{maxItems:t.maxItems,minItems:t.minItems,uniqueItems:t.uniqueItems});case`tuple`:return{items:t.rest!==null&&s(t.rest),prefixItems:t.items.map(s),type:`array`};case`set`:return a({$comment:`Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:s(t.items),type:`array`,uniqueItems:!0},{maxItems:t.maxSize,minItems:t.minSize});case`map`:return a({$comment:`Map: represented as an object; key constraints are not representable.`,additionalProperties:s(t.value),type:`object`},{maxProperties:t.maxSize,minProperties:t.minSize});case`record`:return{additionalProperties:s(t.value),propertyNames:s(t.key),type:`object`};case`object`:{let n={},r=[];for(let[i,a]of Object.entries(t.fields))e(n,i,s(a)),a.isOptional||r.push(i);for(let r of t.tolerated??[])Object.hasOwn(n,r)||e(n,r,{});return a({properties:n,type:`object`},{additionalProperties:!t.strict&&void 0,required:r.length>0?r:void 0})}case`union`:return{anyOf:t.branches.map(s)};case`intersect`:return{allOf:t.branches.map(s)};case`discriminatedUnion`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(s)};case`pipe`:return s(t.to)}}function s(e){let t=o(e),n=e.isNullable?{anyOf:[t,{type:`null`}]}:t;return e.description===void 0?n:{...n,description:e.description}}export{s as toJsonSchema};
2
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","names":["JSON_FORMATS","stringFormat","format","stringConstraints","parts","formats","patterns","source","first","rest","toNumber","value","withDefined","key","extra","base","toBase","d","toJsonSchema","properties","required","field","defineOwnProperty","definition","schema"],"sources":["../src/json.ts"],"sourcesContent":["import { defineOwnProperty } from './_object';\nimport type { PatternDescriptor, SchemaDescriptor } from './types';\n\n/** Plain JSON Schema object (targeting JSON Schema 2020-12). */\nexport type JsonSchema = Record<string, unknown>;\n\n/** Spell format names with a different JSON Schema `format` spelling. */\nconst JSON_FORMATS: Readonly<Record<string, string>> = { isoDate: 'date', isoDateTime: 'date-time', url: 'uri' };\n\nfunction stringFormat(format: string): JsonSchema {\n if (format === 'base64' || format === 'base64url') return { contentEncoding: format };\n\n if (format === 'ip') return { anyOf: [{ format: 'ipv4' }, { format: 'ipv6' }] };\n\n return { format: JSON_FORMATS[format] ?? format };\n}\n\n/** JSON Schema patterns are flagless ECMA-262 regexes, so regex flags are not carried over. */\nfunction stringConstraints(formats: readonly string[], patterns: readonly PatternDescriptor[]): JsonSchema {\n const parts = [...formats.map(stringFormat), ...patterns.map(({ source }) => ({ pattern: source }))];\n\n if (parts.length === 0) return {};\n\n const [first, ...rest] = parts;\n\n return rest.length === 0 ? first! : { allOf: parts };\n}\n\nconst toNumber = (value: bigint | undefined) => (value === undefined ? undefined : Number(value));\n\nfunction withDefined(base: JsonSchema, extra: Record<string, unknown>): JsonSchema {\n for (const [key, value] of Object.entries(extra)) if (value !== undefined) base[key] = value;\n\n return base;\n}\n\nfunction toBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n case 'lazy':\n return {};\n\n case 'never':\n return { not: {} };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'string':\n return withDefined(\n { type: 'string', ...stringConstraints(d.formats ?? [], d.patterns ?? []) },\n { maxLength: d.maxLength, minLength: d.minLength },\n );\n\n case 'number':\n return withDefined(\n { type: d.integer ? 'integer' : 'number' },\n {\n exclusiveMaximum: d.exclusiveMaximum,\n exclusiveMinimum: d.exclusiveMinimum,\n maximum: d.maximum,\n minimum: d.minimum,\n multipleOf: d.multipleOf,\n },\n );\n\n case 'bigint':\n return withDefined(\n { type: 'integer' },\n {\n exclusiveMaximum: toNumber(d.exclusiveMaximum),\n exclusiveMinimum: toNumber(d.exclusiveMinimum),\n maximum: toNumber(d.maximum),\n minimum: toNumber(d.minimum),\n multipleOf: toNumber(d.multipleOf),\n },\n );\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'instanceof':\n return { $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.` };\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n return d.value === undefined ? {} : { const: d.value };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'array':\n return withDefined(\n { items: toJsonSchema(d.items), type: 'array' },\n { maxItems: d.maxItems, minItems: d.minItems, uniqueItems: d.uniqueItems },\n );\n\n case 'tuple':\n return {\n items: d.rest === null ? false : toJsonSchema(d.rest),\n prefixItems: d.items.map(toJsonSchema),\n type: 'array',\n };\n\n case 'set':\n return withDefined(\n {\n $comment: 'Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: toJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n },\n { maxItems: d.maxSize, minItems: d.minSize },\n );\n\n case 'map':\n return withDefined(\n {\n $comment: 'Map: represented as an object; key constraints are not representable.',\n additionalProperties: toJsonSchema(d.value),\n type: 'object',\n },\n { maxProperties: d.maxSize, minProperties: d.minSize },\n );\n\n case 'record':\n return { additionalProperties: toJsonSchema(d.value), propertyNames: toJsonSchema(d.key), type: 'object' };\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, field] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, toJsonSchema(field));\n\n if (!field.isOptional) required.push(key);\n }\n\n for (const key of d.tolerated ?? []) if (!Object.hasOwn(properties, key)) defineOwnProperty(properties, key, {});\n\n return withDefined(\n { properties, type: 'object' },\n { additionalProperties: d.strict ? false : undefined, required: required.length > 0 ? required : undefined },\n );\n }\n\n case 'union':\n return { anyOf: d.branches.map(toJsonSchema) };\n\n case 'intersect':\n return { allOf: d.branches.map(toJsonSchema) };\n\n case 'discriminatedUnion':\n return { discriminator: { propertyName: d.discriminator }, oneOf: Object.values(d.branches).map(toJsonSchema) };\n\n case 'pipe':\n return toJsonSchema(d.to);\n }\n}\n\n/**\n * Converts a schema definition (`schema.definition()`) to a JSON Schema 2020-12 object.\n * Non-JSON types (`date`, `map`, `set`, `instanceof`) are approximated and annotated with `$comment`.\n */\nexport function toJsonSchema(definition: SchemaDescriptor): JsonSchema {\n const base = toBase(definition);\n const schema = definition.isNullable ? { anyOf: [base, { type: 'null' }] } : base;\n\n return definition.description === undefined ? schema : { ...schema, description: definition.description };\n}\n"],"mappings":"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"}
package/dist/messages.cjs CHANGED
@@ -1,2 +1,2 @@
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){return typeof e==`object`&&!!e&&!Array.isArray(e)}function r(t,i){let a=e.cloneRecord(t);for(let[t,o]of Object.entries(i)){if(o===void 0)continue;if(e.isUnsafeObjectKey(t)){`${t}`;continue}let i=a[t];n(i)&&n(o)?e.defineOwnProperty(a,t,r(i,o)):e.defineOwnProperty(a,t,o)}return a}function i(e={}){return{messages:r(t,e)}}exports.createParseContext=i;
1
+ require("./_dev.cjs");const e=require("./_object.cjs");let t=require("@vielzeug/arsenal");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`},discriminatedUnion:{invalidDiscriminator:({discriminator:e,expected:t})=>`Invalid discriminator value at "${e}": expected ${t.map(e=>JSON.stringify(e)).join(` | `)}`,type:()=>`Expected object`},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`,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`,isoDate:()=>`Invalid date`,isoDateTime:()=>`Invalid datetime`,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`}};function r(n,i){let a=e.objectFromEntries(Object.entries(n));for(let[n,o]of Object.entries(i)){if(o===void 0)continue;if(e.isUnsafeObjectKey(n)){`${n}`;continue}let i=a[n];e.defineOwnProperty(a,n,(0,t.isPlainObject)(i)&&(0,t.isPlainObject)(o)?r(i,o):o)}return a}function i(t={}){return e.deepFreeze({messages:r(n,t)})}var a=i();exports.createParseContext=i,exports.defaultContext=a;
2
2
  //# sourceMappingURL=messages.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.cjs","names":["cloneRecord","isUnsafeObjectKey","require_safe_object","_builtinMessages","exact","max","min","step","values","v","className","expected","keys","suffix","substr","prefix","discriminator","k","isRecord","value","mergeMessages","out","base","key","patch","baseValue","createParseContext","messages"],"sources":["../src/messages.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\nimport type { ParseContext } from './types';\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\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 warn(`[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":"A,2DA+HA,IAAMG,EAA6B,CACjC,MAAO,CACL,QAAS,CAAE,WAAY,qBAAqBC,EAAM,QAClD,KAAM,CAAE,SAAU,qBAAqBC,EAAI,QAC3C,KAAM,CAAE,SAAU,sBAAsBC,EAAI,QAC5C,aAAgB,kBAChB,SAAY,iBACZ,WAAc,0BAChB,EACA,OAAQ,CACN,KAAM,CAAE,SAAU,mBAAmBD,IACrC,KAAM,CAAE,SAAU,oBAAoBC,IACtC,YAAa,CAAE,UAAW,yBAAyBC,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,kBAAkBF,EAAI,YAAY,IACpD,KAAM,CAAE,SAAU,iBAAiBC,EAAI,YAAY,IACnD,SAAY,qBACd,EACA,KAAM,CACJ,SAAU,CAAE,YAAa,oBAAoBE,EAAO,IAAK,GAAM,KAAK,UAAUC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC7F,EACA,WAAY,CACV,MAAO,CAAE,eAAgB,wBAAwBC,GACnD,EACA,QAAS,CACP,UAAW,CAAE,cAAe,YAAY,KAAK,UAAUC,CAAQ,GACjE,EACA,IAAK,CACH,KAAM,CAAE,SAAU,wBAAwBN,EAAI,UAC9C,KAAM,CAAE,SAAU,yBAAyBC,EAAI,UAC/C,aAAgB,kBAChB,MAAO,CAAE,WAAY,wBAAwBF,EAAM,UACnD,SAAY,cACd,EACA,MAAO,CACL,YAAe,sBACjB,EACA,OAAQ,CACN,WAAc,iBACd,QAAW,qBACX,KAAM,CAAE,SAAU,mBAAmBC,IACrC,KAAM,CAAE,SAAU,oBAAoBC,IACtC,YAAa,CAAE,UAAW,yBAAyBC,IACnD,aAAgB,mBAChB,gBAAmB,uBACnB,gBAAmB,uBACnB,aAAgB,mBAChB,SAAY,yBACZ,SAAY,iBACd,EACA,OAAQ,CACN,aAAc,CAAE,UAAW,sBAAsBK,EAAK,KAAK,IAAI,IAC/D,SAAY,iBACd,EACA,IAAK,CACH,KAAM,CAAE,SAAU,wBAAwBP,EAAI,QAC9C,KAAM,CAAE,SAAU,yBAAyBC,EAAI,QAC/C,aAAgB,kBAChB,MAAO,CAAE,WAAY,wBAAwBF,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,kBAAkBS,EAAO,GACnD,QAAW,cACX,aAAgB,oBAChB,UAAW,CAAE,YAAa,iBAAiBC,EAAO,GAClD,OAAU,qBACV,QAAW,cACX,QAAS,CAAE,WAAY,mBAAmBV,EAAM,aAChD,KAAM,CAAE,SAAU,mBAAmBC,EAAI,aACzC,KAAM,CAAE,SAAU,oBAAoBC,EAAI,aAC1C,WAAc,iBACd,aAAgB,kBAChB,YAAe,yBACf,UAAa,iBACb,WAAc,iBACd,SAAY,eACZ,YAAa,CAAE,YAAa,oBAAoBS,EAAO,GACvD,SAAY,eACZ,SAAY,kBACZ,SAAY,eACZ,QAAW,cACX,SAAY,cACd,EACA,MAAO,CACL,QAAS,CAAE,WAAY,4BAA4BX,IACnD,KAAM,CAAE,SAAU,gCAAgCE,EAAI,QACtD,SAAY,gBACd,EACA,MAAO,CACL,YAAe,0CACjB,EACA,QAAS,CACP,sBAAuB,CAAE,gBAAe,cACtC,mCAAmCU,EAAc,cAAcL,EAAS,IAAK,GAAM,KAAK,UAAUM,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAClH,SAAY,iBACd,CACF,EAEA,SAASC,EAAS,EAAkD,CAClE,OAAyB,OAAOC,GAAU,YAAnCA,GAA+C,CAAC,MAAM,QAAQA,CAAK,CAC5E,CAEA,SAASC,EAAiD,EAAS,EAA0B,CAC3F,IAAMC,EAAMrB,EAAAA,YAAYsB,CAAI,EAE5B,IAAK,GAAM,CAACC,EAAKJ,KAAU,OAAO,QAAQK,CAAK,EAAG,CAChD,GAAIL,IAAU,IAAA,GAAW,SAEzB,GAAIlB,EAAAA,kBAAkBsB,CAAG,EAAG,CACrB,GAAiDA,EAAjD,EACL,QACF,CAEA,IAAME,EAAYJ,EAAIE,GAElBL,EAASO,CAAS,GAAKP,EAASC,CAAK,EACvCjB,EAAA,kBAAkBmB,EAAKE,EAAKH,EAAcK,EAAWN,CAAsC,CAAC,EAE5FjB,EAAA,kBAAkBmB,EAAKE,EAAKJ,CAAK,CAErC,CAEA,OAAOE,CACT,CAMA,SAAgBK,EAAmB,EAAkC,CAAC,EAAiB,CACrF,MAAO,CAAE,SAAUN,EAAcjB,EAAkBwB,CAAQ,CAAE,CAC/D,C"}
1
+ {"version":3,"file":"messages.cjs","names":["objectFromEntries","isUnsafeObjectKey","isPlainObject","deepFreeze","require__object","_vielzeug_arsenal","builtinMessages","exact","max","min","step","discriminator","expected","k","values","v","className","keys","suffix","substr","prefix","mergeMessages","out","base","key","value","patch","baseValue","createParseContext","messages","defaultContext"],"sources":["../src/messages.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport { warn } from './_dev';\nimport { deepFreeze, defineOwnProperty, isUnsafeObjectKey, objectFromEntries } from './_object';\nimport type { ParseContext } from './types';\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 isoDate: () => string;\n isoDateTime: () => 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 discriminatedUnion: {\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 discriminatedUnion: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\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 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 isoDate: () => 'Invalid date',\n isoDateTime: () => 'Invalid datetime',\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};\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = objectFromEntries(Object.entries(base));\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n warn(`Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n defineOwnProperty(\n out,\n key,\n isPlainObject(baseValue) && isPlainObject(value)\n ? mergeMessages(baseValue, value as DeepPartial<typeof baseValue>)\n : value,\n );\n }\n\n return out as T;\n}\n\n/**\n * Creates a frozen parse context with the built-in messages merged with `messages`. Pass it to\n * parse methods when validation messages vary by request, locale, or form. Spell never stores it globally.\n */\nexport function createParseContext(messages: DeepPartial<Messages> = {}): ParseContext {\n return deepFreeze({ messages: mergeMessages(builtinMessages, messages) });\n}\n\n/** The context used when a parse method receives none. */\nexport const defaultContext: ParseContext = createParseContext();\n"],"mappings":"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"}