@vielzeug/spell 1.2.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/README.md +4 -4
  2. package/dist/_dev.cjs +1 -1
  3. package/dist/_dev.cjs.map +1 -1
  4. package/dist/_dev.js +1 -1
  5. package/dist/_dev.js.map +1 -1
  6. package/dist/core.cjs +1 -1
  7. package/dist/core.cjs.map +1 -1
  8. package/dist/core.d.ts +29 -43
  9. package/dist/core.d.ts.map +1 -1
  10. package/dist/core.js +1 -1
  11. package/dist/core.js.map +1 -1
  12. package/dist/errors.cjs +2 -2
  13. package/dist/errors.cjs.map +1 -1
  14. package/dist/errors.d.ts +9 -11
  15. package/dist/errors.d.ts.map +1 -1
  16. package/dist/errors.js +2 -2
  17. package/dist/errors.js.map +1 -1
  18. package/dist/index.cjs +2 -1
  19. package/dist/index.cjs.map +1 -0
  20. package/dist/index.d.ts +11 -5
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -1
  23. package/dist/index.js.map +1 -0
  24. package/dist/json-schema.cjs +1 -1
  25. package/dist/json-schema.cjs.map +1 -1
  26. package/dist/json-schema.d.ts +3 -13
  27. package/dist/json-schema.d.ts.map +1 -1
  28. package/dist/json-schema.js +1 -1
  29. package/dist/json-schema.js.map +1 -1
  30. package/dist/json.cjs +1 -0
  31. package/dist/json.d.ts +2 -0
  32. package/dist/json.d.ts.map +1 -0
  33. package/dist/json.js +1 -0
  34. package/dist/messages.cjs +1 -1
  35. package/dist/messages.cjs.map +1 -1
  36. package/dist/messages.d.ts +3 -35
  37. package/dist/messages.d.ts.map +1 -1
  38. package/dist/messages.js +1 -1
  39. package/dist/messages.js.map +1 -1
  40. package/dist/predicates.cjs +1 -0
  41. package/dist/predicates.d.ts +3 -0
  42. package/dist/predicates.d.ts.map +1 -0
  43. package/dist/predicates.js +1 -0
  44. package/dist/s.cjs +1 -1
  45. package/dist/s.cjs.map +1 -1
  46. package/dist/s.d.ts +12 -14
  47. package/dist/s.d.ts.map +1 -1
  48. package/dist/s.js +1 -1
  49. package/dist/s.js.map +1 -1
  50. package/dist/schemas/array.cjs +1 -1
  51. package/dist/schemas/array.cjs.map +1 -1
  52. package/dist/schemas/array.d.ts +7 -7
  53. package/dist/schemas/array.d.ts.map +1 -1
  54. package/dist/schemas/array.js +1 -1
  55. package/dist/schemas/array.js.map +1 -1
  56. package/dist/schemas/bigint.cjs +1 -1
  57. package/dist/schemas/bigint.cjs.map +1 -1
  58. package/dist/schemas/bigint.d.ts +2 -2
  59. package/dist/schemas/bigint.d.ts.map +1 -1
  60. package/dist/schemas/bigint.js +1 -1
  61. package/dist/schemas/bigint.js.map +1 -1
  62. package/dist/schemas/boolean.cjs +1 -1
  63. package/dist/schemas/boolean.cjs.map +1 -1
  64. package/dist/schemas/boolean.d.ts +2 -2
  65. package/dist/schemas/boolean.d.ts.map +1 -1
  66. package/dist/schemas/boolean.js +1 -1
  67. package/dist/schemas/boolean.js.map +1 -1
  68. package/dist/schemas/date.cjs +1 -1
  69. package/dist/schemas/date.cjs.map +1 -1
  70. package/dist/schemas/date.d.ts +2 -2
  71. package/dist/schemas/date.d.ts.map +1 -1
  72. package/dist/schemas/date.js +1 -1
  73. package/dist/schemas/date.js.map +1 -1
  74. package/dist/schemas/enum.cjs +1 -1
  75. package/dist/schemas/enum.cjs.map +1 -1
  76. package/dist/schemas/enum.d.ts +2 -2
  77. package/dist/schemas/enum.d.ts.map +1 -1
  78. package/dist/schemas/enum.js +1 -1
  79. package/dist/schemas/enum.js.map +1 -1
  80. package/dist/schemas/instanceof.cjs +1 -1
  81. package/dist/schemas/instanceof.cjs.map +1 -1
  82. package/dist/schemas/instanceof.d.ts +2 -2
  83. package/dist/schemas/instanceof.d.ts.map +1 -1
  84. package/dist/schemas/instanceof.js +1 -1
  85. package/dist/schemas/instanceof.js.map +1 -1
  86. package/dist/schemas/intersect.cjs +1 -1
  87. package/dist/schemas/intersect.cjs.map +1 -1
  88. package/dist/schemas/intersect.d.ts +2 -2
  89. package/dist/schemas/intersect.d.ts.map +1 -1
  90. package/dist/schemas/intersect.js +1 -1
  91. package/dist/schemas/intersect.js.map +1 -1
  92. package/dist/schemas/lazy.cjs +1 -1
  93. package/dist/schemas/lazy.cjs.map +1 -1
  94. package/dist/schemas/lazy.d.ts +3 -3
  95. package/dist/schemas/lazy.d.ts.map +1 -1
  96. package/dist/schemas/lazy.js +1 -1
  97. package/dist/schemas/lazy.js.map +1 -1
  98. package/dist/schemas/literal.cjs +1 -1
  99. package/dist/schemas/literal.cjs.map +1 -1
  100. package/dist/schemas/literal.d.ts +2 -2
  101. package/dist/schemas/literal.d.ts.map +1 -1
  102. package/dist/schemas/literal.js +1 -1
  103. package/dist/schemas/literal.js.map +1 -1
  104. package/dist/schemas/map.cjs +1 -1
  105. package/dist/schemas/map.cjs.map +1 -1
  106. package/dist/schemas/map.d.ts +7 -7
  107. package/dist/schemas/map.d.ts.map +1 -1
  108. package/dist/schemas/map.js +1 -1
  109. package/dist/schemas/map.js.map +1 -1
  110. package/dist/schemas/never.cjs +1 -1
  111. package/dist/schemas/never.cjs.map +1 -1
  112. package/dist/schemas/never.d.ts +2 -2
  113. package/dist/schemas/never.d.ts.map +1 -1
  114. package/dist/schemas/never.js +1 -1
  115. package/dist/schemas/never.js.map +1 -1
  116. package/dist/schemas/number.cjs +1 -1
  117. package/dist/schemas/number.cjs.map +1 -1
  118. package/dist/schemas/number.d.ts +3 -3
  119. package/dist/schemas/number.d.ts.map +1 -1
  120. package/dist/schemas/number.js +1 -1
  121. package/dist/schemas/number.js.map +1 -1
  122. package/dist/schemas/object.cjs +1 -1
  123. package/dist/schemas/object.cjs.map +1 -1
  124. package/dist/schemas/object.d.ts +21 -15
  125. package/dist/schemas/object.d.ts.map +1 -1
  126. package/dist/schemas/object.js +1 -1
  127. package/dist/schemas/object.js.map +1 -1
  128. package/dist/schemas/record.cjs +1 -1
  129. package/dist/schemas/record.cjs.map +1 -1
  130. package/dist/schemas/record.d.ts +7 -7
  131. package/dist/schemas/record.d.ts.map +1 -1
  132. package/dist/schemas/record.js +1 -1
  133. package/dist/schemas/record.js.map +1 -1
  134. package/dist/schemas/set.cjs +1 -1
  135. package/dist/schemas/set.cjs.map +1 -1
  136. package/dist/schemas/set.d.ts +6 -6
  137. package/dist/schemas/set.d.ts.map +1 -1
  138. package/dist/schemas/set.js +1 -1
  139. package/dist/schemas/set.js.map +1 -1
  140. package/dist/schemas/string.cjs +1 -1
  141. package/dist/schemas/string.cjs.map +1 -1
  142. package/dist/schemas/string.d.ts +6 -12
  143. package/dist/schemas/string.d.ts.map +1 -1
  144. package/dist/schemas/string.js +1 -1
  145. package/dist/schemas/string.js.map +1 -1
  146. package/dist/schemas/tuple.cjs +1 -1
  147. package/dist/schemas/tuple.cjs.map +1 -1
  148. package/dist/schemas/tuple.d.ts +3 -3
  149. package/dist/schemas/tuple.d.ts.map +1 -1
  150. package/dist/schemas/tuple.js +1 -1
  151. package/dist/schemas/tuple.js.map +1 -1
  152. package/dist/schemas/union.cjs +1 -1
  153. package/dist/schemas/union.cjs.map +1 -1
  154. package/dist/schemas/union.d.ts +2 -2
  155. package/dist/schemas/union.d.ts.map +1 -1
  156. package/dist/schemas/union.js +1 -1
  157. package/dist/schemas/union.js.map +1 -1
  158. package/dist/schemas/variant.cjs +1 -1
  159. package/dist/schemas/variant.cjs.map +1 -1
  160. package/dist/schemas/variant.d.ts +7 -5
  161. package/dist/schemas/variant.d.ts.map +1 -1
  162. package/dist/schemas/variant.js +1 -1
  163. package/dist/schemas/variant.js.map +1 -1
  164. package/dist/spell.cjs +2 -2
  165. package/dist/spell.cjs.map +1 -1
  166. package/dist/spell.iife.js +2 -2
  167. package/dist/spell.iife.js.map +1 -1
  168. package/dist/spell.js +2 -2
  169. package/dist/spell.js.map +1 -1
  170. package/dist/types.cjs +1 -1
  171. package/dist/types.cjs.map +1 -1
  172. package/dist/types.d.ts +61 -26
  173. package/dist/types.d.ts.map +1 -1
  174. package/dist/types.js +1 -1
  175. package/dist/types.js.map +1 -1
  176. package/package.json +18 -5
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @vielzeug/spell
2
2
 
3
- > Zero-dependency schema validation library with strict-by-default objects, unified sync/async `validate()`, coercion, flexible schema composition, and full TypeScript inference.
3
+ > Schema validation with strict-by-default objects, explicit sync/async checks, coercion, composition, and TypeScript inference.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@vielzeug/spell)](https://www.npmjs.com/package/@vielzeug/spell) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
6
 
@@ -9,15 +9,15 @@
9
9
 
10
10
  **Package:** `@vielzeug/spell`  ·  **Category:** Validation
11
11
 
12
- **Key exports:** `s`, `SpellValidationError`, `setMessages`, `setLogger`, `resetMessages`, `createParseContext`, `withMessages`, `withLogger`, `ErrorCode`, `errorsAt`, `descriptorToJsonSchema`
12
+ **Key exports:** `s`, `SpellValidationError`, `SpellDefinitionError`, `diagnostics`, `ErrorCode`; tooling subpaths: `@vielzeug/spell/json`, `@vielzeug/spell/predicates`
13
13
 
14
- **When to use:** Zero-dependency schema validation library with strict-by-default objects, async refinements, coercion, flexible schema composition, and full TypeScript inference.
14
+ **When to use:** Schema validation with strict-by-default objects, explicit async checks, coercion, composition, and TypeScript inference.
15
15
 
16
16
  **Related:** [@vielzeug/forge](https://vielzeug.dev/forge/) · [@vielzeug/courier](https://vielzeug.dev/courier/) · [@vielzeug/vault](https://vielzeug.dev/vault/)
17
17
 
18
18
  </details>
19
19
 
20
- `@vielzeug/spell` is part of Vielzeug and ships as a zero-dependency TypeScript package with ESM+CJS output.
20
+ `@vielzeug/spell` is part of Vielzeug and ships as a TypeScript package with ESM+CJS output.
21
21
 
22
22
  ## Installation
23
23
 
package/dist/_dev.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=!globalThis.__SPELL_PROD__;function t(t){e&&console.warn(`[@vielzeug/spell] ${t}`)}exports.warn=t;
1
+ function e(e){}exports.warn=e;
2
2
  //# sourceMappingURL=_dev.cjs.map
package/dist/_dev.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal — Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAAA,IAAM,EAAQ,CAAE,WAA4C,eAG5D,SAAgB,EAAK,EAAmB,CAClC,GAAO,QAAQ,KAAK,qBAAqB,GAAK,CACpD"}
1
+ {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal — Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
package/dist/_dev.js CHANGED
@@ -1,2 +1,2 @@
1
- var e=!globalThis.__SPELL_PROD__;function t(t){e&&console.warn(`[@vielzeug/spell] ${t}`)}export{t as warn};
1
+ function e(e){}export{e as warn};
2
2
  //# sourceMappingURL=_dev.js.map
package/dist/_dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal — Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAAA,IAAM,EAAQ,CAAE,WAA4C,eAG5D,SAAgB,EAAK,EAAmB,CAClC,GAAO,QAAQ,KAAK,qBAAqB,GAAK,CACpD"}
1
+ {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal — Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
package/dist/core.cjs CHANGED
@@ -1,2 +1,2 @@
1
- const e=require("./types.cjs"),t=require("./errors.cjs"),n=require("./safe-object.cjs"),r=require("./json-schema.cjs"),i=require("./messages.cjs");let a=require("@vielzeug/arsenal");function o(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(e=>o(e));if(e instanceof Date)return new Date(e.getTime());if(e instanceof Map){let t=new Map;for(let[n,r]of e.entries())t.set(o(n),o(r));return t}if(e instanceof Set)return new Set([...e.values()].map(e=>o(e)));if((0,a.isPlainObject)(e)){let t={};for(let[r,i]of Object.entries(e))n.defineOwnProperty(t,r,o(i));return t}return e}function s(){return{isNullable:!1,isOptional:!1,postprocessors:[],preprocessors:[],validators:[]}}function c(e){return{catch:e.catch,defaultValue:e.defaultValue,description:e.description,isNullable:e.isNullable,isOptional:e.isOptional,postprocessors:[...e.postprocessors],preprocessors:[...e.preprocessors],validators:[...e.validators]}}function l(e){return{messages:e??i._messages()}}function u(t,n){let r=[...n];return typeof t==`string`?r.push({code:e.ErrorCode.custom,message:t,path:[]}):t===!1&&r.length===0&&r.push({code:e.ErrorCode.custom,message:i._messages().check.default(),path:[]}),r.length?r:null}var d=class{state;_annotations={};_typeValidator=null;constructor(e){this.state=s(),this._typeValidator=e??null}parse(n,r){let i=r??l();return this._withCatch(()=>{let r=this._prepareInput(n);if(r.skip)return r.value;let a=this._parse(r.value,i);if(a instanceof Promise)throw new t.SpellValidationError([{code:e.ErrorCode.custom,message:`parse() received an async schema. Use parseAsync() instead.`,path:[]}]);let o=a,s=o.typeOk?this._runValidatorsSync(o.data,i):[],c=[...o.issues,...s];if(c.length)throw new t.SpellValidationError(c);return this._runPostprocessors(o.data)})}safeParse(e,n){try{return{data:this.parse(e,n),success:!0}}catch(e){if(t.SpellValidationError.is(e))return{error:e,success:!1};throw e}}async parseAsync(e,n){let r=n??l();return this._withCatchAsync(async()=>{let n=this._prepareInput(e);if(n.skip)return n.value;let i=await this._parse(n.value,r),a=i.typeOk?await this._runValidatorsAsync(i.data,r):[],o=[...i.issues,...a];if(o.length)throw new t.SpellValidationError(o);return this._runPostprocessors(i.data)})}async safeParseAsync(e,n){try{return{data:await this.parseAsync(e,n),success:!0}}catch(e){if(t.SpellValidationError.is(e))return{error:e,success:!1};throw e}}_parseFullSync(n,r){let i=r??l(),a=this._prepareInput(n);if(a.skip)return{data:a.value,issues:[]};let o=this._parse(a.value,i);if(o instanceof Promise)throw new t.SpellValidationError([{code:e.ErrorCode.custom,message:`Sync parse path received an async schema. Use parseAsync() instead.`,path:[]}]);let s=o,c=s.typeOk?this._runValidatorsSync(s.data,i):[],u=[...s.issues,...c];return u.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:s.data,issues:u}:{data:this._runPostprocessors(s.data),issues:[]}}async _parseFullAsync(e,t){let n=t??l(),r=this._prepareInput(e);if(r.skip)return{data:r.value,issues:[]};let i=await this._parse(r.value,n),a=i.typeOk?await this._runValidatorsAsync(i.data,n):[],o=[...i.issues,...a];return o.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:i.data,issues:o}:{data:this._runPostprocessors(i.data),issues:[]}}validate(e){return this._addConstraint((t,n)=>{let r=[],i=e(t,{addIssue:e=>r.push({...e,path:e.path??[]})});return i instanceof Promise?i.then(e=>u(e,r)):u(i,r)})}refine(n,r){return this._addConstraint((i,a)=>{if(n(i))return null;let o=r?t.resolveMessage(r,{value:i}):a.messages.check.default();return t.fail(e.ErrorCode.custom,o)})}optional(){let e=this._clone();return e.state.isOptional=!0,e}nullable(){let e=this._clone();return e.state.isNullable=!0,e}nullish(){let e=this._clone();return e.state.isOptional=!0,e.state.isNullable=!0,e}required(){let e=this._clone();return e.state.isOptional=!1,e}default(e){let t=this._clone();return t.state.defaultValue=typeof e==`function`?e:()=>o(e),t}catch(e){let t=this._clone();return t.state.catch=typeof e==`function`?e:()=>o(e),t}transform(e){let t=this._clone();return t.state.postprocessors.push(e),t}preprocess(e){let t=this._clone();return t.state.preprocessors.push(e),t}pipe(e){return new f(this,e)}label(e){let t=this._clone();return t.state.description=e,t}toDescriptor(){return this.state.preprocessors.length>0&&i._dev(`toDescriptor(): this schema has preprocessors (e.g. trim(), lowercase(), coerce()). Preprocessors are not serializable and will not appear in the descriptor output.`),this._toDescriptorImpl()}get description(){return this.state.description}get isOptional(){return this.state.isOptional}get isNullable(){return this.state.isNullable}is(e){return this.safeParse(e).success}toJsonSchema(){return r.schemaToJsonSchema(this)}assert(e,n){let r=this._parseFullSync(e);if(r.issues.length!==0)throw new t.SpellValidationError(n?r.issues.map(e=>({...e,message:e.path.length===0?`${n}: ${e.message}`:e.message})):r.issues)}walk(e){return this._walk(e)}equals(e){return e===this?!0:Object.getPrototypeOf(e)!==Object.getPrototypeOf(this)||e.isOptional!==this.isOptional||e.isNullable!==this.isNullable||e.description!==this.description?!1:this._equalsImpl(e)}get kind(){return this._kind}get _kind(){return`any`}_describeBase(){return{...this.state.description===void 0?{}:{description:this.state.description},...this.state.isNullable?{isNullable:!0}:{},...this.state.isOptional?{isOptional:!0}:{}}}_annotationsEqual(e){let t=this._annotations,n=e._annotations,r=Object.keys(t),i=Object.keys(n);return r.length===i.length?r.every(e=>t[e]===n[e]):!1}_addConstraint(e,t){let n=this._clone();return n.state.validators.push(e),t&&(n._annotations=t({...n._annotations})),n}_construct(e){let t=Object.assign(Object.create(Object.getPrototypeOf(this)),this,{state:e});return t._annotations={...this._annotations},t}_clone(){return this._construct(c(this.state))}_copyStateTo(e){return e.state=c(this.state),e}_walk(e){return e.unknown?e.unknown(this):null}_toDescriptorImpl(){return{...this._describeBase(),kind:`any`}}_equalsImpl(e){return!0}_withCatch(e){if(!this.state.catch)return e();try{return e()}catch(e){if(t.SpellValidationError.is(e))return this.state.catch();throw e}}async _withCatchAsync(e){if(!this.state.catch)return e();try{return await e()}catch(e){if(t.SpellValidationError.is(e))return this.state.catch();throw e}}_prepareInput(e){let t=this._runPreprocessors(e),n=t===void 0&&this.state.defaultValue?this.state.defaultValue():t;return this.state.isOptional&&n===void 0||this.state.isNullable&&n===null?{skip:!0,value:n}:{skip:!1,value:n}}_runPreprocessors(e){let t=e;for(let e of this.state.preprocessors)t=e(t);return t}_runPostprocessors(e){let t=e;for(let e of this.state.postprocessors)t=e(t);return t}_runValidatorsSync(n,r){if(this._typeValidator){let i=this._typeValidator(n,r);if(i instanceof Promise)throw new t.SpellValidationError([{code:e.ErrorCode.custom,message:`Type validator returned a Promise. Use parseAsync() for async validation.`,path:[]}]);if(i&&i.length>0)return i}let a=[];for(let e of this.state.validators){let t=e(n,r);if(t instanceof Promise){i._dev(`An async validate() callback was skipped because parse()/safeParse() cannot await it. The value passed this check unvalidated use parseAsync()/safeParseAsync() instead.`);continue}t&&a.push(...t)}return a}async _runValidatorsAsync(e,t){if(this._typeValidator){let n=await this._typeValidator(e,t);if(n&&n.length>0)return n}let n=[];for(let r of this.state.validators){let i=await r(e,t);i&&n.push(...i)}return n}_parse(e,t){return{data:e,issues:[],typeOk:!0}}},f=class e extends d{from;to;get _kind(){return`pipe`}constructor(e,t){super(),this.from=e,this.to=t}_parse(e,t){let n=this.from._parseFullSync(e,t);if(n instanceof Promise)return n.then(n=>n.issues.length>0?{data:e,issues:n.issues,typeOk:!1}:this.to._parseFullAsync(n.data,t).then(e=>e.issues.length>0?{data:n.data,issues:e.issues,typeOk:!1}:{data:e.data,issues:[],typeOk:!0}));if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=this.to._parseFullSync(n.data,t);return r instanceof Promise?r.then(e=>e.issues.length>0?{data:n.data,issues:e.issues,typeOk:!1}:{data:e.data,issues:[],typeOk:!0}):r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}_walk(e){let t=this.from.walk(e),n=this.to.walk(e);return e.pipe?e.pipe(this,t,n):super._walk(e)}_toDescriptorImpl(){return{...this._describeBase(),from:this.from.toDescriptor(),kind:`pipe`,to:this.to.toDescriptor()}}_equalsImpl(t){return t instanceof e?this.from.equals(t.from)&&this.to.equals(t.to):!1}};exports.ErrorCode=e.ErrorCode,exports.PipeSchema=f,exports.Schema=d,exports.SpellError=t.SpellError,exports.SpellValidationError=t.SpellValidationError,exports._makeCtx=l,exports.errorsAt=t.errorsAt,exports.fail=t.fail,exports.prependIssuePath=t.prependIssuePath,exports.resolveMessage=t.resolveMessage;
1
+ const e=require("./types.cjs"),t=require("./errors.cjs"),n=require("./safe-object.cjs"),r=require("./messages.cjs");let i=require("@vielzeug/arsenal/guards");function a(e){if(typeof e!=`object`||!e||Object.isFrozen(e))return e;for(let t of Object.values(e))a(t);return Object.freeze(e)}function o(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(e=>o(e));if(e instanceof Date)return new Date(e.getTime());if(e instanceof Map){let t=new Map;for(let[n,r]of e.entries())t.set(o(n),o(r));return t}if(e instanceof Set)return new Set([...e.values()].map(e=>o(e)));if((0,i.isPlainObject)(e)){let t={};for(let[r,i]of Object.entries(e))n.defineOwnProperty(t,r,o(i));return t}return e}function s(){return{hasAsyncChecks:!1,hasRuntimeChecks:!1,isNullable:!1,isOptional:!1,postprocessors:[],preprocessors:[],validators:[]}}function c(e){return{catch:e.catch,defaultValue:e.defaultValue,description:e.description,hasAsyncChecks:e.hasAsyncChecks,hasRuntimeChecks:e.hasRuntimeChecks,isNullable:e.isNullable,isOptional:e.isOptional,postprocessors:[...e.postprocessors],preprocessors:[...e.preprocessors],validators:[...e.validators]}}function l(e){return e?{messages:e}:r.createParseContext()}function u(t,n,r){let i=[...n];return typeof t==`string`?i.push({code:e.ErrorCode.custom,message:t,path:[]}):t===!1&&i.length===0&&i.push({code:e.ErrorCode.custom,message:r.messages.check.default(),path:[]}),i.length?i:null}var d=class{state;_annotations={};_typeValidator=null;constructor(e){this.state=s(),this._typeValidator=e??null}parse(n,r){if(this.state.hasAsyncChecks)throw new t.SpellValidationError([{code:e.ErrorCode.custom,message:`parse() cannot evaluate async checks. Use parseAsync().`,path:[]}]);let i=r??l();return this._withCatch(()=>{let r=this._prepareInput(n);if(r.skip)return r.value;let a=this._parse(r.value,i);if(a instanceof Promise)throw new t.SpellValidationError([{code:e.ErrorCode.custom,message:`parse() received an async schema. Use parseAsync() instead.`,path:[]}]);let o=a,s=o.typeOk?this._runValidatorsSync(o.data,i):[],c=[...o.issues,...s];if(c.length)throw new t.SpellValidationError(c);return this._runPostprocessors(o.data)})}safeParse(e,n){try{return{data:this.parse(e,n),success:!0}}catch(e){if(e instanceof t.SpellValidationError)return{error:e,success:!1};throw e}}async parseAsync(e,n){let r=n??l();return this._withCatchAsync(async()=>{let n=this._prepareInput(e);if(n.skip)return n.value;let i=await this._parse(n.value,r),a=i.typeOk?await this._runValidatorsAsync(i.data,r):[],o=[...i.issues,...a];if(o.length)throw new t.SpellValidationError(o);return this._runPostprocessors(i.data)})}async safeParseAsync(e,n){try{return{data:await this.parseAsync(e,n),success:!0}}catch(e){if(e instanceof t.SpellValidationError)return{error:e,success:!1};throw e}}_parseFullSync(n,r){if(this.state.hasAsyncChecks)throw new t.SpellValidationError([{code:e.ErrorCode.custom,message:`Sync parsing cannot evaluate async checks. Use parseAsync().`,path:[]}]);let i=r??l(),a=this._prepareInput(n);if(a.skip)return{data:a.value,issues:[]};let o=this._parse(a.value,i);if(o instanceof Promise)throw new t.SpellValidationError([{code:e.ErrorCode.custom,message:`Sync parse path received an async schema. Use parseAsync() instead.`,path:[]}]);let s=o,c=s.typeOk?this._runValidatorsSync(s.data,i):[],u=[...s.issues,...c];return u.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:s.data,issues:u}:{data:this._runPostprocessors(s.data),issues:[]}}async _parseFullAsync(e,t){let n=t??l(),r=this._prepareInput(e);if(r.skip)return{data:r.value,issues:[]};let i=await this._parse(r.value,n),a=i.typeOk?await this._runValidatorsAsync(i.data,n):[],o=[...i.issues,...a];return o.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:i.data,issues:o}:{data:this._runPostprocessors(i.data),issues:[]}}check(e){return this._addCheck(e,!1)}checkAsync(e){return this._addCheck(e,!0)}_addCheck(e,t){let n=this._addConstraint((t,n)=>{let r=[],i=e(t,{addIssue:e=>r.push({...e,path:e.path??[]})});return i instanceof Promise?i.then(e=>u(e,r,n)):u(i,r,n)});return n.state.hasRuntimeChecks=!0,t&&(n.state.hasAsyncChecks=!0),n}optional(){let e=this._clone();return e.state.isOptional=!0,e}nullable(){let e=this._clone();return e.state.isNullable=!0,e}nullish(){let e=this._clone();return e.state.isOptional=!0,e.state.isNullable=!0,e}required(){let e=this._clone();return e.state.isOptional=!1,e}default(e){let t=this._clone();return t.state.defaultValue=typeof e==`function`?e:()=>o(e),t}catch(e){let t=this._clone();return t.state.catch=typeof e==`function`?e:()=>o(e),t}transform(e){let t=this._clone();return t.state.postprocessors.push(e),t}preprocess(e){let t=this._clone();return t.state.preprocessors.push(e),t}pipe(e){return new f(this,e)}label(e){let t=this._clone();return t.state.description=e,t}definition(){if(this.state.catch||this.state.defaultValue||this.state.postprocessors.length>0||this.state.preprocessors.length>0||this.state.hasRuntimeChecks)throw new t.SpellDefinitionError(`Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.`);return a(this._toDescriptorImpl())}get description(){return this.state.description}get isOptional(){return this.state.isOptional}get isNullable(){return this.state.isNullable}is(e){return this.safeParse(e).success}assert(e,n){let r=this._parseFullSync(e);if(r.issues.length===0)return;let i=n?r.issues.map(e=>({...e,message:e.path.length===0?`${n}: ${e.message}`:e.message})):r.issues;throw new t.SpellValidationError(i)}walk(e){return this._walk(e)}get kind(){return this._kind}get _kind(){return`any`}_describeBase(){return{...this.state.description===void 0?{}:{description:this.state.description},...this.state.isNullable?{isNullable:!0}:{},...this.state.isOptional?{isOptional:!0}:{}}}_addConstraint(e,t){let n=this._clone();return n.state.validators.push(e),t&&(n._annotations=t({...n._annotations})),n}_construct(e){let t=Object.assign(Object.create(Object.getPrototypeOf(this)),this,{state:e});return t._annotations={...this._annotations},t}_clone(){return this._construct(c(this.state))}_copyStateTo(e){return e.state=c(this.state),e}_walk(e){return e.unknown?e.unknown(this):null}_toDescriptorImpl(){return{...this._describeBase(),kind:`any`}}_withCatch(e){if(!this.state.catch)return e();try{return e()}catch(e){if(e instanceof t.SpellValidationError)return this.state.catch();throw e}}async _withCatchAsync(e){if(!this.state.catch)return e();try{return await e()}catch(e){if(e instanceof t.SpellValidationError)return this.state.catch();throw e}}_prepareInput(e){let t=this._runPreprocessors(e),n=t===void 0&&this.state.defaultValue?this.state.defaultValue():t;return this.state.isOptional&&n===void 0||this.state.isNullable&&n===null?{skip:!0,value:n}:{skip:!1,value:n}}_runPreprocessors(e){let t=e;for(let e of this.state.preprocessors)t=e(t);return t}_runPostprocessors(e){let t=e;for(let e of this.state.postprocessors)t=e(t);return t}_runValidatorsSync(n,r){if(this._typeValidator){let i=this._typeValidator(n,r);if(i instanceof Promise)throw new t.SpellValidationError([{code:e.ErrorCode.custom,message:`Type validator returned a Promise. Use parseAsync() for async validation.`,path:[]}]);if(i&&i.length>0)return i}let i=[];for(let a of this.state.validators){let o=a(n,r);if(o instanceof Promise)throw new t.SpellValidationError([{code:e.ErrorCode.custom,message:`Sync parsing received an async check. Use checkAsync() and parseAsync().`,path:[]}]);o&&i.push(...o)}return i}async _runValidatorsAsync(e,t){if(this._typeValidator){let n=await this._typeValidator(e,t);if(n&&n.length>0)return n}let n=[];for(let r of this.state.validators){let i=await r(e,t);i&&n.push(...i)}return n}_parse(e,t){return{data:e,issues:[],typeOk:!0}}},f=class extends d{from;to;get _kind(){return`pipe`}checkAsync(e){return this._addCheck(e,!0)}constructor(e,t){super(),this.from=e,this.to=t}_parse(e,t){let n=this.from._parseFullSync(e,t);if(n instanceof Promise)return n.then(n=>n.issues.length>0?{data:e,issues:n.issues,typeOk:!1}:this.to._parseFullAsync(n.data,t).then(e=>e.issues.length>0?{data:n.data,issues:e.issues,typeOk:!1}:{data:e.data,issues:[],typeOk:!0}));if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=this.to._parseFullSync(n.data,t);return r instanceof Promise?r.then(e=>e.issues.length>0?{data:n.data,issues:e.issues,typeOk:!1}:{data:e.data,issues:[],typeOk:!0}):r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}async parseAsync(e,n){let r=n??l(),i=await this.from._parseFullAsync(e,r);if(i.issues.length>0)throw new t.SpellValidationError(i.issues);let a=await this.to._parseFullAsync(i.data,r);if(a.issues.length>0)throw new t.SpellValidationError(a.issues);let o=await this._runValidatorsAsync(a.data,r);if(o.length>0)throw new t.SpellValidationError(o);return this._runPostprocessors(a.data)}_walk(e){let t=this.from.walk(e),n=this.to.walk(e);return e.pipe?e.pipe(this,t,n):super._walk(e)}_toDescriptorImpl(){return{...this._describeBase(),from:this.from.definition(),kind:`pipe`,to:this.to.definition()}}};exports.ErrorCode=e.ErrorCode,exports.PipeSchema=f,exports.Schema=d,exports.SpellDefinitionError=t.SpellDefinitionError,exports.SpellError=t.SpellError,exports.SpellValidationError=t.SpellValidationError,exports._makeCtx=l,exports.fail=t.fail,exports.prependIssuePath=t.prependIssuePath,exports.resolveMessage=t.resolveMessage,exports.schemaMode=e.schemaMode;
2
2
  //# sourceMappingURL=core.cjs.map
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.cjs","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport { fail, resolveMessage, SpellValidationError } from './errors';\nimport { schemaToJsonSchema } from './json-schema';\nimport { _messages, _dev } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type FormattedErrors,\n type Infer,\n type InferInput,\n type InferOutput,\n type Issue,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaWalker,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n ErrorCode,\n type AnySchema,\n type CheckContext,\n type FlatError,\n type FlatErrorFirst,\n type FormattedErrors,\n type Infer,\n type InferInput,\n type InferOutput,\n type Issue,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaWalker,\n type ValidateFn,\n type ValidateResult,\n};\n\nexport { SpellError, SpellValidationError, errorsAt, fail, prependIssuePath, resolveMessage } from './errors';\n\nfunction materializeValue<T>(value: T): T {\n if (value == null || typeof value !== 'object') return value;\n\n if (Array.isArray(value)) return value.map((item) => materializeValue(item)) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) {\n const out = new Map<unknown, unknown>();\n\n for (const [key, mapValue] of value.entries()) out.set(materializeValue(key), materializeValue(mapValue));\n\n return out as T;\n }\n\n if (value instanceof Set) return new Set([...value.values()].map((item) => materializeValue(item))) as T;\n\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) defineOwnProperty(out, key, materializeValue(entry));\n\n return out as T;\n }\n\n return value;\n}\n\n/* -------------------- Schema State -------------------- */\n\ntype Preprocessor = (value: unknown) => unknown;\ntype Postprocessor = (value: unknown) => unknown;\n\nexport interface SchemaState<Output = unknown> {\n catch?: () => Output;\n defaultValue?: () => Output;\n description?: string;\n isNullable: boolean;\n isOptional: boolean;\n postprocessors: Postprocessor[];\n preprocessors: Preprocessor[];\n validators: ValidateFn[];\n}\n\nfunction defaultState<Output>(): SchemaState<Output> {\n return { isNullable: false, isOptional: false, postprocessors: [], preprocessors: [], validators: [] };\n}\n\nfunction cloneState<Output>(state: SchemaState<Output>): SchemaState<Output> {\n return {\n catch: state.catch,\n defaultValue: state.defaultValue,\n description: state.description,\n isNullable: state.isNullable,\n isOptional: state.isOptional,\n postprocessors: [...state.postprocessors],\n preprocessors: [...state.preprocessors],\n validators: [...state.validators],\n };\n}\n\n/* -------------------- Internal parse-value return type -------------------- */\n\n/** @internal */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/* -------------------- ParseContext default -------------------- */\n\n/** @internal */\nexport function _makeCtx(messages?: Messages): ParseContext {\n return { messages: messages ?? _messages() };\n}\n\n/* -------------------- ValidateResult normalizer -------------------- */\n\nfunction normalizeValidateResult(result: ValidateResult, ctxIssues: Issue[]): Issue[] | null {\n const issues = [...ctxIssues];\n\n if (typeof result === 'string') {\n issues.push({ code: ErrorCode.custom, message: result, path: [] });\n } else if (result === false && issues.length === 0) {\n issues.push({ code: ErrorCode.custom, message: _messages().check.default(), path: [] });\n }\n\n return issues.length ? issues : null;\n}\n\n/* -------------------- Base Schema -------------------- */\n\nexport class Schema<Output = unknown, Input = Output> {\n protected state: SchemaState<Output>;\n\n protected _annotations: Record<string, unknown> = {};\n\n private _typeValidator: ValidateFn | null = null;\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(value: unknown, ctx?: ParseContext): Output {\n const c = ctx ?? _makeCtx();\n\n return this._withCatch(() => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'parse() received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return { data: this.parse(value, ctx), success: true };\n } catch (error) {\n if (SpellValidationError.is(error)) return { error, success: false };\n\n throw error;\n }\n }\n\n async parseAsync(value: unknown, ctx?: ParseContext): Promise<Output> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n async safeParseAsync(value: unknown, ctx?: ParseContext): Promise<ParseResult<Output>> {\n try {\n return { data: await this.parseAsync(value, ctx), success: true };\n } catch (error) {\n if (SpellValidationError.is(error)) return { error, success: false };\n\n throw error;\n }\n }\n\n /**\n * Internal full parse without throwing. Returns { data, issues }.\n * Used by composite schemas (array, object, union, etc.) to avoid\n * the try/catch + object allocation overhead of safeParse().\n * @internal\n */\n _parseFullSync(value: unknown, ctx?: ParseContext): { data: unknown; issues: Issue[] } {\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parse path received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /**\n * Async version of _parseFullSync.\n * @internal\n */\n async _parseFullAsync(value: unknown, ctx?: ParseContext): Promise<{ data: unknown; issues: Issue[] }> {\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /* -------------------- Validators -------------------- */\n\n /**\n * Add a custom validation rule. The callback receives the typed value and an optional\n * `{ addIssue }` context for reporting multiple issues in one pass.\n *\n * **Return values:**\n * - `string` — fail with that message\n * - `false` — fail silently (use `addIssue` to report)\n * - `true` / `null` / `void` — pass\n *\n * The `|| 'message'` shorthand works naturally:\n * ```ts\n * s.string().validate(v => v.length > 0 || 'Cannot be empty')\n * ```\n *\n * For async validation, return a Promise:\n * ```ts\n * s.string().validate(async v => (await db.exists(v)) ? 'Already taken' : null)\n * ```\n */\n validate(\n fn:\n | ((value: Output, ctx: CheckContext) => ValidateResult)\n | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>),\n ): this {\n const validator: ValidateFn = (value, _ctx) => {\n const ctxIssues: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: (issue) => ctxIssues.push({ ...issue, path: issue.path ?? [] } as Issue),\n };\n const result = fn(value as Output, checkCtx);\n\n if (result instanceof Promise) {\n return result.then((r) => normalizeValidateResult(r, ctxIssues));\n }\n\n return normalizeValidateResult(result, ctxIssues);\n };\n\n return this._addConstraint(validator);\n }\n\n refine(predicate: (value: Output) => boolean, message?: MessageFn<{ value: Output }>): this {\n return this._addConstraint((value, ctx) => {\n if ((predicate as (v: unknown) => boolean)(value)) return null;\n\n const msg = message ? resolveMessage(message, { value: value as Output }) : ctx!.messages.check.default();\n\n return fail(ErrorCode.custom, msg);\n });\n }\n\n /* -------------------- Nullability / Optionality -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined> {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined>;\n\n cloned.state.isOptional = true;\n\n return cloned;\n }\n\n nullable(): Schema<Output | null, Input | null> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined> {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned;\n }\n\n catch(fallback: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input> {\n const next = this._clone() as unknown as Schema<NewOutput, Input>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B>(next: Schema<B, NoInfer<Output>>): Schema<B, Input> {\n return new PipeSchema<B, Input>(this, next);\n }\n\n /* -------------------- Introspection -------------------- */\n\n label(description: string): this {\n const cloned = this._clone();\n\n cloned.state.description = description;\n\n return cloned;\n }\n\n toDescriptor(): SchemaDescriptor {\n if (this.state.preprocessors.length > 0) {\n _dev(\n 'toDescriptor(): this schema has preprocessors (e.g. trim(), lowercase(), coerce()). ' +\n 'Preprocessors are not serializable and will not appear in the descriptor output.',\n );\n }\n\n return this._toDescriptorImpl();\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n get isOptional(): boolean {\n return this.state.isOptional;\n }\n\n get isNullable(): boolean {\n return this.state.isNullable;\n }\n\n is(value: unknown): value is Output {\n return this.safeParse(value).success;\n }\n\n toJsonSchema(): JsonSchema {\n return schemaToJsonSchema(this);\n }\n\n assert(value: unknown, label?: string): asserts value is Output {\n const result = this._parseFullSync(value);\n\n if (result.issues.length === 0) return;\n\n const issues = label\n ? result.issues.map((issue) => ({\n ...issue,\n message: issue.path.length === 0 ? `${label}: ${issue.message}` : issue.message,\n }))\n : result.issues;\n\n throw new SpellValidationError(issues);\n }\n\n walk<R>(visitor: SchemaWalker<R>): R | null {\n return this._walk(visitor);\n }\n\n equals(other: AnySchema): boolean {\n if (other === this) return true;\n\n if (Object.getPrototypeOf(other) !== Object.getPrototypeOf(this)) return false;\n\n if (other.isOptional !== this.isOptional) return false;\n\n if (other.isNullable !== this.isNullable) return false;\n\n if (other.description !== this.description) return false;\n\n return this._equalsImpl(other);\n }\n\n get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'any';\n }\n\n /* -------------------- Protected helpers -------------------- */\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n return {\n ...(this.state.description !== undefined ? { description: this.state.description } : {}),\n ...(this.state.isNullable ? { isNullable: true as const } : {}),\n ...(this.state.isOptional ? { isOptional: true as const } : {}),\n };\n }\n\n protected _annotationsEqual(other: AnySchema): boolean {\n const a = this._annotations;\n const b = (other as Schema)._annotations;\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((k) => a[k] === b[k]);\n }\n\n protected _addConstraint(\n validator: ValidateFn,\n mergeAnnotations?: (current: Record<string, unknown>) => Record<string, unknown>,\n ): this {\n const next = this._clone();\n\n next.state.validators.push(validator);\n\n if (mergeAnnotations) {\n next._annotations = mergeAnnotations({ ...next._annotations });\n }\n\n return next;\n }\n\n protected _construct(state: SchemaState<any>): this {\n const next = Object.assign(Object.create(Object.getPrototypeOf(this)), this, { state }) as this;\n\n next._annotations = { ...this._annotations };\n\n return next;\n }\n\n protected _clone(): this {\n return this._construct(cloneState(this.state));\n }\n\n protected _copyStateTo<T extends Schema<any, any>>(target: T): T {\n target.state = cloneState(this.state);\n\n return target;\n }\n\n protected _walk<R>(visitor: SchemaWalker<R>): R | null {\n if (visitor.unknown) return visitor.unknown(this);\n\n return null;\n }\n\n protected _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'any' };\n }\n\n protected _equalsImpl(_other: AnySchema): boolean {\n return true;\n }\n\n /* -------------------- Private -------------------- */\n\n private _withCatch<T>(fn: () => T): T {\n if (!this.state.catch) return fn();\n\n try {\n return fn();\n } catch (error) {\n if (SpellValidationError.is(error)) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected async _withCatchAsync<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.state.catch) return fn();\n\n try {\n return await fn();\n } catch (error) {\n if (SpellValidationError.is(error)) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected _prepareInput(value: unknown): { skip: true; value: null | undefined } | { skip: false; value: unknown } {\n const processed = this._runPreprocessors(value);\n const withDefault = processed === undefined && this.state.defaultValue ? this.state.defaultValue() : processed;\n\n if ((this.state.isOptional && withDefault === undefined) || (this.state.isNullable && withDefault === null)) {\n return { skip: true, value: withDefault };\n }\n\n return { skip: false, value: withDefault };\n }\n\n protected _runPreprocessors(value: unknown): unknown {\n let current = value;\n\n for (const preprocess of this.state.preprocessors) current = preprocess(current);\n\n return current;\n }\n\n protected _runPostprocessors(value: unknown): unknown {\n let current = value;\n\n for (const postprocess of this.state.postprocessors) current = postprocess(current);\n\n return current;\n }\n\n private _runValidatorsSync(value: unknown, ctx: ParseContext): Issue[] {\n if (this._typeValidator) {\n const typeResult = this._typeValidator(value, ctx);\n\n if (typeResult instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Type validator returned a Promise. Use parseAsync() for async validation.',\n path: [],\n },\n ]);\n }\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = validate(value, ctx);\n\n if (result instanceof Promise) {\n _dev(\n 'An async validate() callback was skipped because parse()/safeParse() cannot await it. ' +\n 'The value passed this check unvalidated — use parseAsync()/safeParseAsync() instead.',\n );\n continue;\n }\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected async _runValidatorsAsync(value: unknown, ctx: ParseContext): Promise<Issue[]> {\n if (this._typeValidator) {\n const typeResult = await this._typeValidator(value, ctx);\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = await validate(value, ctx);\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected _parse(_value: unknown, _ctx: ParseContext): MaybePromise<ParseValue> {\n return { data: _value, issues: [], typeOk: true };\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<Output, Input = unknown> extends Schema<Output, Input> {\n readonly from: Schema<any, Input>;\n readonly to: Schema<Output, any>;\n\n protected override get _kind(): string {\n return 'pipe';\n }\n\n constructor(from: Schema<any, Input>, to: Schema<Output, any>) {\n super();\n this.from = from;\n this.to = to;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): MaybePromise<ParseValue> {\n const r1OrPromise = this.from._parseFullSync(value, ctx);\n\n if (r1OrPromise instanceof Promise) {\n return (r1OrPromise as Promise<{ data: unknown; issues: Issue[] }>).then((r1) => {\n if (r1.issues.length > 0) return { data: value, issues: r1.issues, typeOk: false };\n\n return this.to\n ._parseFullAsync(r1.data, ctx)\n .then((r2) =>\n r2.issues.length > 0\n ? { data: r1.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n });\n }\n\n if (r1OrPromise.issues.length > 0) return { data: value, issues: r1OrPromise.issues, typeOk: false };\n\n const r2OrPromise = this.to._parseFullSync(r1OrPromise.data, ctx);\n\n if (r2OrPromise instanceof Promise) {\n return r2OrPromise.then((r2) =>\n r2.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n }\n\n return r2OrPromise.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2OrPromise.issues, typeOk: false }\n : { data: r2OrPromise.data, issues: [], typeOk: true };\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const fromR = this.from.walk(visitor);\n const toR = this.to.walk(visitor);\n\n if (visitor.pipe) return visitor.pipe(this, fromR, toR);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n from: this.from.toDescriptor(),\n kind: 'pipe',\n to: this.to.toDescriptor(),\n };\n }\n\n protected override _equalsImpl(other: AnySchema): boolean {\n if (!(other instanceof PipeSchema)) return false;\n\n return this.from.equals(other.from) && this.to.equals(other.to);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.cjs","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal/guards';\n\nimport { SpellDefinitionError, SpellValidationError } from './errors';\nimport { createParseContext } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type InferSchemaMode,\n type MergeSchemaModes,\n type SchemaMode,\n type Issue,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDefinition,\n type SchemaDescriptor,\n type SchemaWalker,\n schemaInput,\n schemaMode,\n schemaOutput,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n ErrorCode,\n type AnySchema,\n type CheckContext,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type InferSchemaMode,\n type MergeSchemaModes,\n type SchemaMode,\n type Issue,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDefinition,\n type SchemaDescriptor,\n type SchemaWalker,\n schemaMode,\n type ValidateFn,\n type ValidateResult,\n};\n\nexport {\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n fail,\n prependIssuePath,\n resolveMessage,\n} from './errors';\n\nfunction 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 as Record<string, unknown>)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n\nfunction materializeValue<T>(value: T): T {\n if (value == null || typeof value !== 'object') return value;\n\n if (Array.isArray(value)) return value.map((item) => materializeValue(item)) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) {\n const out = new Map<unknown, unknown>();\n\n for (const [key, mapValue] of value.entries()) out.set(materializeValue(key), materializeValue(mapValue));\n\n return out as T;\n }\n\n if (value instanceof Set) return new Set([...value.values()].map((item) => materializeValue(item))) as T;\n\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) defineOwnProperty(out, key, materializeValue(entry));\n\n return out as T;\n }\n\n return value;\n}\n\n/* -------------------- Schema State -------------------- */\n\ntype Preprocessor = (value: unknown) => unknown;\ntype Postprocessor = (value: unknown) => unknown;\n\nexport interface SchemaState<Output = unknown> {\n catch?: () => Output;\n defaultValue?: () => Output;\n description?: string;\n hasAsyncChecks: boolean;\n hasRuntimeChecks: boolean;\n isNullable: boolean;\n isOptional: boolean;\n postprocessors: Postprocessor[];\n preprocessors: Preprocessor[];\n validators: ValidateFn[];\n}\n\nfunction defaultState<Output>(): SchemaState<Output> {\n return {\n hasAsyncChecks: false,\n hasRuntimeChecks: false,\n isNullable: false,\n isOptional: false,\n postprocessors: [],\n preprocessors: [],\n validators: [],\n };\n}\n\nfunction cloneState<Output>(state: SchemaState<Output>): SchemaState<Output> {\n return {\n catch: state.catch,\n defaultValue: state.defaultValue,\n description: state.description,\n hasAsyncChecks: state.hasAsyncChecks,\n hasRuntimeChecks: state.hasRuntimeChecks,\n isNullable: state.isNullable,\n isOptional: state.isOptional,\n postprocessors: [...state.postprocessors],\n preprocessors: [...state.preprocessors],\n validators: [...state.validators],\n };\n}\n\n/* -------------------- Internal parse-value return type -------------------- */\n\n/** @internal */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/* -------------------- ParseContext default -------------------- */\n\n/** @internal */\nexport function _makeCtx(messages?: Messages): ParseContext {\n return messages ? { messages } : createParseContext();\n}\n\n/* -------------------- ValidateResult normalizer -------------------- */\n\nfunction normalizeValidateResult(result: ValidateResult, ctxIssues: Issue[], ctx: ParseContext): Issue[] | null {\n const issues = [...ctxIssues];\n\n if (typeof result === 'string') {\n issues.push({ code: ErrorCode.custom, message: result, path: [] });\n } else if (result === false && issues.length === 0) {\n issues.push({ code: ErrorCode.custom, message: ctx.messages.check.default(), path: [] });\n }\n\n return issues.length ? issues : null;\n}\n\n/* -------------------- Base Schema -------------------- */\n\nexport class Schema<Output = unknown, Input = Output, Mode extends SchemaMode = 'sync'> {\n declare readonly [schemaInput]: Input;\n declare readonly [schemaMode]: Mode;\n declare readonly [schemaOutput]: Output;\n\n protected state: SchemaState<Output>;\n\n protected _annotations: Record<string, unknown> = {};\n\n private _typeValidator: ValidateFn | null = null;\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): Output;\n parse(value: unknown, ctx?: ParseContext): Output {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'parse() cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n\n return this._withCatch(() => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'parse() received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): ParseResult<Output>;\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return {\n data: (this.parse as unknown as (value: unknown, ctx?: ParseContext) => Output)(value, ctx),\n success: true,\n };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n async parseAsync(value: unknown, ctx?: ParseContext): Promise<Output> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n async safeParseAsync(value: unknown, ctx?: ParseContext): Promise<ParseResult<Output>> {\n try {\n return { data: await this.parseAsync(value, ctx), success: true };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n /**\n * Internal full parse without throwing. Returns { data, issues }.\n * Used by composite schemas (array, object, union, etc.) to avoid\n * the try/catch + object allocation overhead of safeParse().\n * @internal\n */\n _parseFullSync(value: unknown, ctx?: ParseContext): { data: unknown; issues: Issue[] } {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'Sync parsing cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parse path received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /**\n * Async version of _parseFullSync.\n * @internal\n */\n async _parseFullAsync(value: unknown, ctx?: ParseContext): Promise<{ data: unknown; issues: Issue[] }> {\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /* -------------------- Validators -------------------- */\n\n /**\n * Add a synchronous domain rule. For asynchronous work, use `checkAsync()`;\n * making execution mode explicit prevents unchecked Promise-returning callbacks.\n */\n check<F extends (value: Output, ctx: CheckContext) => ValidateResult | Promise<ValidateResult>>(\n fn: ReturnType<F> extends PromiseLike<unknown> ? never : F,\n ): this {\n return this._addCheck(fn as (value: Output, ctx: CheckContext) => ValidateResult, false);\n }\n\n checkAsync(\n this: Schema<Output, Input, 'sync'>,\n fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>,\n ): Schema<Output, Input, 'async'> {\n return this._addCheck(fn, true) as unknown as Schema<Output, Input, 'async'>;\n }\n\n protected _addCheck(\n fn:\n | ((value: Output, ctx: CheckContext) => ValidateResult)\n | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>),\n async: boolean,\n ): this {\n const validator: ValidateFn = (value, ctx) => {\n const ctxIssues: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: (issue) => ctxIssues.push({ ...issue, path: issue.path ?? [] } as Issue),\n };\n const result = fn(value as Output, checkCtx);\n\n if (result instanceof Promise) {\n return result.then((r) => normalizeValidateResult(r, ctxIssues, ctx!));\n }\n\n return normalizeValidateResult(result, ctxIssues, ctx!);\n };\n\n const next = this._addConstraint(validator);\n\n next.state.hasRuntimeChecks = true;\n\n if (async) next.state.hasAsyncChecks = true;\n\n return next;\n }\n\n /* -------------------- Nullability / Optionality -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined, Mode>;\n\n cloned.state.isOptional = true;\n\n return cloned;\n }\n\n nullable(): Schema<Output | null, Input | null, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null, Mode>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined, Mode>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>, Mode> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>, Mode>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned;\n }\n\n catch(fallback: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input, Mode> {\n const next = this._clone() as unknown as Schema<NewOutput, Input, Mode>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B extends AnySchema>(next: B): PipeSchema<B, this, MergeSchemaModes<Mode | InferSchemaMode<B>>> {\n return new PipeSchema(this, next);\n }\n\n /* -------------------- Introspection -------------------- */\n\n label(description: string): this {\n const cloned = this._clone();\n\n cloned.state.description = description;\n\n return cloned;\n }\n\n definition(): SchemaDefinition {\n if (\n this.state.catch ||\n this.state.defaultValue ||\n this.state.postprocessors.length > 0 ||\n this.state.preprocessors.length > 0 ||\n this.state.hasRuntimeChecks\n ) {\n throw new SpellDefinitionError(\n 'Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.',\n );\n }\n\n return deepFreeze(this._toDescriptorImpl()) as SchemaDefinition;\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n get isOptional(): boolean {\n return this.state.isOptional;\n }\n\n get isNullable(): boolean {\n return this.state.isNullable;\n }\n\n is(value: unknown): value is Output {\n return (this.safeParse as unknown as (value: unknown) => ParseResult<Output>)(value).success;\n }\n\n assert(value: unknown, label?: string): asserts value is Output {\n const result = this._parseFullSync(value);\n\n if (result.issues.length === 0) return;\n\n const issues = label\n ? result.issues.map((issue) => ({\n ...issue,\n message: issue.path.length === 0 ? `${label}: ${issue.message}` : issue.message,\n }))\n : result.issues;\n\n throw new SpellValidationError(issues);\n }\n\n walk<R>(visitor: SchemaWalker<R>): R | null {\n return this._walk(visitor);\n }\n\n get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'any';\n }\n\n /* -------------------- Protected helpers -------------------- */\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n return {\n ...(this.state.description !== undefined ? { description: this.state.description } : {}),\n ...(this.state.isNullable ? { isNullable: true as const } : {}),\n ...(this.state.isOptional ? { isOptional: true as const } : {}),\n };\n }\n\n protected _addConstraint(\n validator: ValidateFn,\n mergeAnnotations?: (current: Record<string, unknown>) => Record<string, unknown>,\n ): this {\n const next = this._clone();\n\n next.state.validators.push(validator);\n\n if (mergeAnnotations) {\n next._annotations = mergeAnnotations({ ...next._annotations });\n }\n\n return next;\n }\n\n protected _construct(state: SchemaState<any>): this {\n const next = Object.assign(Object.create(Object.getPrototypeOf(this)), this, { state }) as this;\n\n next._annotations = { ...this._annotations };\n\n return next;\n }\n\n protected _clone(): this {\n return this._construct(cloneState(this.state));\n }\n\n protected _copyStateTo<T extends Schema<any, any>>(target: T): T {\n target.state = cloneState(this.state);\n\n return target;\n }\n\n protected _walk<R>(visitor: SchemaWalker<R>): R | null {\n if (visitor.unknown) return visitor.unknown(this);\n\n return null;\n }\n\n protected _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'any' };\n }\n\n /* -------------------- Private -------------------- */\n\n private _withCatch<T>(fn: () => T): T {\n if (!this.state.catch) return fn();\n\n try {\n return fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected async _withCatchAsync<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.state.catch) return fn();\n\n try {\n return await fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected _prepareInput(value: unknown): { skip: true; value: null | undefined } | { skip: false; value: unknown } {\n const processed = this._runPreprocessors(value);\n const withDefault = processed === undefined && this.state.defaultValue ? this.state.defaultValue() : processed;\n\n if ((this.state.isOptional && withDefault === undefined) || (this.state.isNullable && withDefault === null)) {\n return { skip: true, value: withDefault };\n }\n\n return { skip: false, value: withDefault };\n }\n\n protected _runPreprocessors(value: unknown): unknown {\n let current = value;\n\n for (const preprocess of this.state.preprocessors) current = preprocess(current);\n\n return current;\n }\n\n protected _runPostprocessors(value: unknown): unknown {\n let current = value;\n\n for (const postprocess of this.state.postprocessors) current = postprocess(current);\n\n return current;\n }\n\n private _runValidatorsSync(value: unknown, ctx: ParseContext): Issue[] {\n if (this._typeValidator) {\n const typeResult = this._typeValidator(value, ctx);\n\n if (typeResult instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Type validator returned a Promise. Use parseAsync() for async validation.',\n path: [],\n },\n ]);\n }\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = validate(value, ctx);\n\n if (result instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parsing received an async check. Use checkAsync() and parseAsync().',\n path: [],\n },\n ]);\n }\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected async _runValidatorsAsync(value: unknown, ctx: ParseContext): Promise<Issue[]> {\n if (this._typeValidator) {\n const typeResult = await this._typeValidator(value, ctx);\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = await validate(value, ctx);\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected _parse(_value: unknown, _ctx: ParseContext): MaybePromise<ParseValue> {\n return { data: _value, issues: [], typeOk: true };\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<\n To extends AnySchema,\n From extends AnySchema,\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<To | From>>,\n> extends Schema<InferOutput<To>, InferInput<From>, Mode> {\n readonly from: From;\n readonly to: To;\n\n protected override get _kind(): string {\n return 'pipe';\n }\n\n override checkAsync(\n this: PipeSchema<To, From, 'sync'>,\n fn: (value: InferOutput<To>, ctx: CheckContext) => Promise<ValidateResult>,\n ): PipeSchema<To, From, 'async'> {\n return this._addCheck(fn, true) as unknown as PipeSchema<To, From, 'async'>;\n }\n\n constructor(from: From, to: To) {\n super();\n this.from = from;\n this.to = to;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): MaybePromise<ParseValue> {\n const r1OrPromise = this.from._parseFullSync(value, ctx);\n\n if (r1OrPromise instanceof Promise) {\n return (r1OrPromise as Promise<{ data: unknown; issues: Issue[] }>).then((r1) => {\n if (r1.issues.length > 0) return { data: value, issues: r1.issues, typeOk: false };\n\n return this.to\n ._parseFullAsync(r1.data, ctx)\n .then((r2) =>\n r2.issues.length > 0\n ? { data: r1.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n });\n }\n\n if (r1OrPromise.issues.length > 0) return { data: value, issues: r1OrPromise.issues, typeOk: false };\n\n const r2OrPromise = this.to._parseFullSync(r1OrPromise.data, ctx);\n\n if (r2OrPromise instanceof Promise) {\n return r2OrPromise.then((r2) =>\n r2.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n }\n\n return r2OrPromise.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2OrPromise.issues, typeOk: false }\n : { data: r2OrPromise.data, issues: [], typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<To>> {\n const c = ctx ?? _makeCtx();\n const first = await this.from._parseFullAsync(value, c);\n\n if (first.issues.length > 0) throw new SpellValidationError(first.issues);\n\n const second = await this.to._parseFullAsync(first.data, c);\n\n if (second.issues.length > 0) throw new SpellValidationError(second.issues);\n\n const issues = await this._runValidatorsAsync(second.data, c);\n\n if (issues.length > 0) throw new SpellValidationError(issues);\n\n return this._runPostprocessors(second.data) as InferOutput<To>;\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const fromR = this.from.walk(visitor);\n const toR = this.to.walk(visitor);\n\n if (visitor.pipe) return visitor.pipe(this, fromR, toR);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n from: this.from.definition(),\n kind: 'pipe',\n to: this.to.definition(),\n };\n }\n}\n"],"mappings":"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"}
package/dist/core.d.ts CHANGED
@@ -1,12 +1,14 @@
1
- import { type AnySchema, type CheckContext, ErrorCode, type FlatError, type FlatErrorFirst, type FormattedErrors, type Infer, type InferInput, type InferOutput, type Issue, type JsonSchema, type MessageFn, type Messages, type ParseContext, type ParseResult, type SchemaDescriptor, type SchemaWalker, type ValidateFn, type ValidateResult } from './types';
2
- export { ErrorCode, type AnySchema, type CheckContext, type FlatError, type FlatErrorFirst, type FormattedErrors, type Infer, type InferInput, type InferOutput, type Issue, type JsonSchema, type MessageFn, type Messages, type ParseContext, type ParseResult, type SchemaDescriptor, type SchemaWalker, type ValidateFn, type ValidateResult, };
3
- export { SpellError, SpellValidationError, errorsAt, fail, prependIssuePath, resolveMessage } from './errors';
1
+ import { type AnySchema, type CheckContext, ErrorCode, type FlatError, type FlatErrorFirst, type Infer, type InferInput, type InferOutput, type InferSchemaMode, type MergeSchemaModes, type SchemaMode, type Issue, type JsonSchema, type MessageFn, type Messages, type ParseContext, type ParseResult, type SchemaDefinition, type SchemaDescriptor, type SchemaWalker, schemaInput, schemaMode, schemaOutput, type ValidateFn, type ValidateResult } from './types';
2
+ export { ErrorCode, type AnySchema, type CheckContext, type FlatError, type FlatErrorFirst, type Infer, type InferInput, type InferOutput, type InferSchemaMode, type MergeSchemaModes, type SchemaMode, type Issue, type JsonSchema, type MessageFn, type Messages, type ParseContext, type ParseResult, type SchemaDefinition, type SchemaDescriptor, type SchemaWalker, schemaMode, type ValidateFn, type ValidateResult, };
3
+ export { SpellDefinitionError, SpellError, SpellValidationError, fail, prependIssuePath, resolveMessage, } from './errors';
4
4
  type Preprocessor = (value: unknown) => unknown;
5
5
  type Postprocessor = (value: unknown) => unknown;
6
6
  export interface SchemaState<Output = unknown> {
7
7
  catch?: () => Output;
8
8
  defaultValue?: () => Output;
9
9
  description?: string;
10
+ hasAsyncChecks: boolean;
11
+ hasRuntimeChecks: boolean;
10
12
  isNullable: boolean;
11
13
  isOptional: boolean;
12
14
  postprocessors: Postprocessor[];
@@ -14,57 +16,42 @@ export interface SchemaState<Output = unknown> {
14
16
  validators: ValidateFn[];
15
17
  }
16
18
  type MaybePromise<T> = T | Promise<T>;
17
- export declare class Schema<Output = unknown, Input = Output> {
19
+ export declare class Schema<Output = unknown, Input = Output, Mode extends SchemaMode = 'sync'> {
20
+ readonly [schemaInput]: Input;
21
+ readonly [schemaMode]: Mode;
22
+ readonly [schemaOutput]: Output;
18
23
  protected state: SchemaState<Output>;
19
24
  protected _annotations: Record<string, unknown>;
20
25
  private _typeValidator;
21
26
  constructor(typeValidator?: ValidateFn);
22
- parse(value: unknown, ctx?: ParseContext): Output;
23
- safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output>;
27
+ parse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): Output;
28
+ safeParse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): ParseResult<Output>;
24
29
  parseAsync(value: unknown, ctx?: ParseContext): Promise<Output>;
25
30
  safeParseAsync(value: unknown, ctx?: ParseContext): Promise<ParseResult<Output>>;
26
31
  /**
27
- * Add a custom validation rule. The callback receives the typed value and an optional
28
- * `{ addIssue }` context for reporting multiple issues in one pass.
29
- *
30
- * **Return values:**
31
- * - `string` — fail with that message
32
- * - `false` — fail silently (use `addIssue` to report)
33
- * - `true` / `null` / `void` — pass
34
- *
35
- * The `|| 'message'` shorthand works naturally:
36
- * ```ts
37
- * s.string().validate(v => v.length > 0 || 'Cannot be empty')
38
- * ```
39
- *
40
- * For async validation, return a Promise:
41
- * ```ts
42
- * s.string().validate(async v => (await db.exists(v)) ? 'Already taken' : null)
43
- * ```
32
+ * Add a synchronous domain rule. For asynchronous work, use `checkAsync()`;
33
+ * making execution mode explicit prevents unchecked Promise-returning callbacks.
44
34
  */
45
- validate(fn: ((value: Output, ctx: CheckContext) => ValidateResult) | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>)): this;
46
- refine(predicate: (value: Output) => boolean, message?: MessageFn<{
47
- value: Output;
48
- }>): this;
49
- optional(): Schema<Output | undefined, Input | undefined>;
50
- nullable(): Schema<Output | null, Input | null>;
51
- nullish(): Schema<Output | null | undefined, Input | null | undefined>;
52
- required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>>;
35
+ check<F extends (value: Output, ctx: CheckContext) => ValidateResult | Promise<ValidateResult>>(fn: ReturnType<F> extends PromiseLike<unknown> ? never : F): this;
36
+ checkAsync(this: Schema<Output, Input, 'sync'>, fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>): Schema<Output, Input, 'async'>;
37
+ protected _addCheck(fn: ((value: Output, ctx: CheckContext) => ValidateResult) | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>), async: boolean): this;
38
+ optional(): Schema<Output | undefined, Input | undefined, Mode>;
39
+ nullable(): Schema<Output | null, Input | null, Mode>;
40
+ nullish(): Schema<Output | null | undefined, Input | null | undefined, Mode>;
41
+ required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>, Mode>;
53
42
  default(defaultValue: Output | (() => Output)): this;
54
43
  catch(fallback: Output | (() => Output)): this;
55
- transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input>;
44
+ transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input, Mode>;
56
45
  preprocess(fn: (value: unknown) => unknown): this;
57
- pipe<B>(next: Schema<B, NoInfer<Output>>): Schema<B, Input>;
46
+ pipe<B extends AnySchema>(next: B): PipeSchema<B, this, MergeSchemaModes<Mode | InferSchemaMode<B>>>;
58
47
  label(description: string): this;
59
- toDescriptor(): SchemaDescriptor;
48
+ definition(): SchemaDefinition;
60
49
  get description(): string | undefined;
61
50
  get isOptional(): boolean;
62
51
  get isNullable(): boolean;
63
52
  is(value: unknown): value is Output;
64
- toJsonSchema(): JsonSchema;
65
53
  assert(value: unknown, label?: string): asserts value is Output;
66
54
  walk<R>(visitor: SchemaWalker<R>): R | null;
67
- equals(other: AnySchema): boolean;
68
55
  get kind(): string;
69
56
  protected get _kind(): string;
70
57
  protected _describeBase(): {
@@ -72,14 +59,12 @@ export declare class Schema<Output = unknown, Input = Output> {
72
59
  isNullable?: true;
73
60
  isOptional?: true;
74
61
  };
75
- protected _annotationsEqual(other: AnySchema): boolean;
76
62
  protected _addConstraint(validator: ValidateFn, mergeAnnotations?: (current: Record<string, unknown>) => Record<string, unknown>): this;
77
63
  protected _construct(state: SchemaState<any>): this;
78
64
  protected _clone(): this;
79
65
  protected _copyStateTo<T extends Schema<any, any>>(target: T): T;
80
66
  protected _walk<R>(visitor: SchemaWalker<R>): R | null;
81
67
  protected _toDescriptorImpl(): SchemaDescriptor;
82
- protected _equalsImpl(_other: AnySchema): boolean;
83
68
  private _withCatch;
84
69
  protected _withCatchAsync<T>(fn: () => Promise<T>): Promise<T>;
85
70
  protected _prepareInput(value: unknown): {
@@ -95,14 +80,15 @@ export declare class Schema<Output = unknown, Input = Output> {
95
80
  protected _runValidatorsAsync(value: unknown, ctx: ParseContext): Promise<Issue[]>;
96
81
  protected _parse(_value: unknown, _ctx: ParseContext): MaybePromise<ParseValue>;
97
82
  }
98
- export declare class PipeSchema<Output, Input = unknown> extends Schema<Output, Input> {
99
- readonly from: Schema<any, Input>;
100
- readonly to: Schema<Output, any>;
83
+ export declare class PipeSchema<To extends AnySchema, From extends AnySchema, Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<To | From>>> extends Schema<InferOutput<To>, InferInput<From>, Mode> {
84
+ readonly from: From;
85
+ readonly to: To;
101
86
  protected get _kind(): string;
102
- constructor(from: Schema<any, Input>, to: Schema<Output, any>);
87
+ checkAsync(this: PipeSchema<To, From, 'sync'>, fn: (value: InferOutput<To>, ctx: CheckContext) => Promise<ValidateResult>): PipeSchema<To, From, 'async'>;
88
+ constructor(from: From, to: To);
103
89
  protected _parse(value: unknown, ctx: ParseContext): MaybePromise<ParseValue>;
90
+ parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<To>>;
104
91
  protected _walk<R>(visitor: SchemaWalker<R>): R | null;
105
92
  protected _toDescriptorImpl(): SchemaDescriptor;
106
- protected _equalsImpl(other: AnySchema): boolean;
107
93
  }
108
94
  //# sourceMappingURL=core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
package/dist/core.js CHANGED
@@ -1,2 +1,2 @@
1
- import{ErrorCode as e}from"./types.js";import{SpellError as t,SpellValidationError as n,errorsAt as r,fail as i,prependIssuePath as a,resolveMessage as o}from"./errors.js";import{defineOwnProperty as s}from"./safe-object.js";import{schemaToJsonSchema as c}from"./json-schema.js";import{_dev as l,_messages as u}from"./messages.js";import{isPlainObject as d}from"@vielzeug/arsenal";function f(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(e=>f(e));if(e instanceof Date)return new Date(e.getTime());if(e instanceof Map){let t=new Map;for(let[n,r]of e.entries())t.set(f(n),f(r));return t}if(e instanceof Set)return new Set([...e.values()].map(e=>f(e)));if(d(e)){let t={};for(let[n,r]of Object.entries(e))s(t,n,f(r));return t}return e}function p(){return{isNullable:!1,isOptional:!1,postprocessors:[],preprocessors:[],validators:[]}}function m(e){return{catch:e.catch,defaultValue:e.defaultValue,description:e.description,isNullable:e.isNullable,isOptional:e.isOptional,postprocessors:[...e.postprocessors],preprocessors:[...e.preprocessors],validators:[...e.validators]}}function h(e){return{messages:e??u()}}function g(t,n){let r=[...n];return typeof t==`string`?r.push({code:e.custom,message:t,path:[]}):t===!1&&r.length===0&&r.push({code:e.custom,message:u().check.default(),path:[]}),r.length?r:null}var _=class{state;_annotations={};_typeValidator=null;constructor(e){this.state=p(),this._typeValidator=e??null}parse(t,r){let i=r??h();return this._withCatch(()=>{let r=this._prepareInput(t);if(r.skip)return r.value;let a=this._parse(r.value,i);if(a instanceof Promise)throw new n([{code:e.custom,message:`parse() received an async schema. Use parseAsync() instead.`,path:[]}]);let o=a,s=o.typeOk?this._runValidatorsSync(o.data,i):[],c=[...o.issues,...s];if(c.length)throw new n(c);return this._runPostprocessors(o.data)})}safeParse(e,t){try{return{data:this.parse(e,t),success:!0}}catch(e){if(n.is(e))return{error:e,success:!1};throw e}}async parseAsync(e,t){let r=t??h();return this._withCatchAsync(async()=>{let t=this._prepareInput(e);if(t.skip)return t.value;let i=await this._parse(t.value,r),a=i.typeOk?await this._runValidatorsAsync(i.data,r):[],o=[...i.issues,...a];if(o.length)throw new n(o);return this._runPostprocessors(i.data)})}async safeParseAsync(e,t){try{return{data:await this.parseAsync(e,t),success:!0}}catch(e){if(n.is(e))return{error:e,success:!1};throw e}}_parseFullSync(t,r){let i=r??h(),a=this._prepareInput(t);if(a.skip)return{data:a.value,issues:[]};let o=this._parse(a.value,i);if(o instanceof Promise)throw new n([{code:e.custom,message:`Sync parse path received an async schema. Use parseAsync() instead.`,path:[]}]);let s=o,c=s.typeOk?this._runValidatorsSync(s.data,i):[],l=[...s.issues,...c];return l.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:s.data,issues:l}:{data:this._runPostprocessors(s.data),issues:[]}}async _parseFullAsync(e,t){let n=t??h(),r=this._prepareInput(e);if(r.skip)return{data:r.value,issues:[]};let i=await this._parse(r.value,n),a=i.typeOk?await this._runValidatorsAsync(i.data,n):[],o=[...i.issues,...a];return o.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:i.data,issues:o}:{data:this._runPostprocessors(i.data),issues:[]}}validate(e){return this._addConstraint((t,n)=>{let r=[],i=e(t,{addIssue:e=>r.push({...e,path:e.path??[]})});return i instanceof Promise?i.then(e=>g(e,r)):g(i,r)})}refine(t,n){return this._addConstraint((r,a)=>{if(t(r))return null;let s=n?o(n,{value:r}):a.messages.check.default();return i(e.custom,s)})}optional(){let e=this._clone();return e.state.isOptional=!0,e}nullable(){let e=this._clone();return e.state.isNullable=!0,e}nullish(){let e=this._clone();return e.state.isOptional=!0,e.state.isNullable=!0,e}required(){let e=this._clone();return e.state.isOptional=!1,e}default(e){let t=this._clone();return t.state.defaultValue=typeof e==`function`?e:()=>f(e),t}catch(e){let t=this._clone();return t.state.catch=typeof e==`function`?e:()=>f(e),t}transform(e){let t=this._clone();return t.state.postprocessors.push(e),t}preprocess(e){let t=this._clone();return t.state.preprocessors.push(e),t}pipe(e){return new v(this,e)}label(e){let t=this._clone();return t.state.description=e,t}toDescriptor(){return this.state.preprocessors.length>0&&l(`toDescriptor(): this schema has preprocessors (e.g. trim(), lowercase(), coerce()). Preprocessors are not serializable and will not appear in the descriptor output.`),this._toDescriptorImpl()}get description(){return this.state.description}get isOptional(){return this.state.isOptional}get isNullable(){return this.state.isNullable}is(e){return this.safeParse(e).success}toJsonSchema(){return c(this)}assert(e,t){let r=this._parseFullSync(e);if(r.issues.length!==0)throw new n(t?r.issues.map(e=>({...e,message:e.path.length===0?`${t}: ${e.message}`:e.message})):r.issues)}walk(e){return this._walk(e)}equals(e){return e===this?!0:Object.getPrototypeOf(e)!==Object.getPrototypeOf(this)||e.isOptional!==this.isOptional||e.isNullable!==this.isNullable||e.description!==this.description?!1:this._equalsImpl(e)}get kind(){return this._kind}get _kind(){return`any`}_describeBase(){return{...this.state.description===void 0?{}:{description:this.state.description},...this.state.isNullable?{isNullable:!0}:{},...this.state.isOptional?{isOptional:!0}:{}}}_annotationsEqual(e){let t=this._annotations,n=e._annotations,r=Object.keys(t),i=Object.keys(n);return r.length===i.length?r.every(e=>t[e]===n[e]):!1}_addConstraint(e,t){let n=this._clone();return n.state.validators.push(e),t&&(n._annotations=t({...n._annotations})),n}_construct(e){let t=Object.assign(Object.create(Object.getPrototypeOf(this)),this,{state:e});return t._annotations={...this._annotations},t}_clone(){return this._construct(m(this.state))}_copyStateTo(e){return e.state=m(this.state),e}_walk(e){return e.unknown?e.unknown(this):null}_toDescriptorImpl(){return{...this._describeBase(),kind:`any`}}_equalsImpl(e){return!0}_withCatch(e){if(!this.state.catch)return e();try{return e()}catch(e){if(n.is(e))return this.state.catch();throw e}}async _withCatchAsync(e){if(!this.state.catch)return e();try{return await e()}catch(e){if(n.is(e))return this.state.catch();throw e}}_prepareInput(e){let t=this._runPreprocessors(e),n=t===void 0&&this.state.defaultValue?this.state.defaultValue():t;return this.state.isOptional&&n===void 0||this.state.isNullable&&n===null?{skip:!0,value:n}:{skip:!1,value:n}}_runPreprocessors(e){let t=e;for(let e of this.state.preprocessors)t=e(t);return t}_runPostprocessors(e){let t=e;for(let e of this.state.postprocessors)t=e(t);return t}_runValidatorsSync(t,r){if(this._typeValidator){let i=this._typeValidator(t,r);if(i instanceof Promise)throw new n([{code:e.custom,message:`Type validator returned a Promise. Use parseAsync() for async validation.`,path:[]}]);if(i&&i.length>0)return i}let i=[];for(let e of this.state.validators){let n=e(t,r);if(n instanceof Promise){l(`An async validate() callback was skipped because parse()/safeParse() cannot await it. The value passed this check unvalidated use parseAsync()/safeParseAsync() instead.`);continue}n&&i.push(...n)}return i}async _runValidatorsAsync(e,t){if(this._typeValidator){let n=await this._typeValidator(e,t);if(n&&n.length>0)return n}let n=[];for(let r of this.state.validators){let i=await r(e,t);i&&n.push(...i)}return n}_parse(e,t){return{data:e,issues:[],typeOk:!0}}},v=class e extends _{from;to;get _kind(){return`pipe`}constructor(e,t){super(),this.from=e,this.to=t}_parse(e,t){let n=this.from._parseFullSync(e,t);if(n instanceof Promise)return n.then(n=>n.issues.length>0?{data:e,issues:n.issues,typeOk:!1}:this.to._parseFullAsync(n.data,t).then(e=>e.issues.length>0?{data:n.data,issues:e.issues,typeOk:!1}:{data:e.data,issues:[],typeOk:!0}));if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=this.to._parseFullSync(n.data,t);return r instanceof Promise?r.then(e=>e.issues.length>0?{data:n.data,issues:e.issues,typeOk:!1}:{data:e.data,issues:[],typeOk:!0}):r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}_walk(e){let t=this.from.walk(e),n=this.to.walk(e);return e.pipe?e.pipe(this,t,n):super._walk(e)}_toDescriptorImpl(){return{...this._describeBase(),from:this.from.toDescriptor(),kind:`pipe`,to:this.to.toDescriptor()}}_equalsImpl(t){return t instanceof e?this.from.equals(t.from)&&this.to.equals(t.to):!1}};export{e as ErrorCode,v as PipeSchema,_ as Schema,t as SpellError,n as SpellValidationError,h as _makeCtx,r as errorsAt,i as fail,a as prependIssuePath,o as resolveMessage};
1
+ import{ErrorCode as e,schemaMode as t}from"./types.js";import{SpellDefinitionError as n,SpellError as r,SpellValidationError as i,fail as a,prependIssuePath as o,resolveMessage as s}from"./errors.js";import{defineOwnProperty as c}from"./safe-object.js";import{createParseContext as l}from"./messages.js";import{isPlainObject as u}from"@vielzeug/arsenal/guards";function d(e){if(typeof e!=`object`||!e||Object.isFrozen(e))return e;for(let t of Object.values(e))d(t);return Object.freeze(e)}function f(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(e=>f(e));if(e instanceof Date)return new Date(e.getTime());if(e instanceof Map){let t=new Map;for(let[n,r]of e.entries())t.set(f(n),f(r));return t}if(e instanceof Set)return new Set([...e.values()].map(e=>f(e)));if(u(e)){let t={};for(let[n,r]of Object.entries(e))c(t,n,f(r));return t}return e}function p(){return{hasAsyncChecks:!1,hasRuntimeChecks:!1,isNullable:!1,isOptional:!1,postprocessors:[],preprocessors:[],validators:[]}}function m(e){return{catch:e.catch,defaultValue:e.defaultValue,description:e.description,hasAsyncChecks:e.hasAsyncChecks,hasRuntimeChecks:e.hasRuntimeChecks,isNullable:e.isNullable,isOptional:e.isOptional,postprocessors:[...e.postprocessors],preprocessors:[...e.preprocessors],validators:[...e.validators]}}function h(e){return e?{messages:e}:l()}function g(t,n,r){let i=[...n];return typeof t==`string`?i.push({code:e.custom,message:t,path:[]}):t===!1&&i.length===0&&i.push({code:e.custom,message:r.messages.check.default(),path:[]}),i.length?i:null}var _=class{state;_annotations={};_typeValidator=null;constructor(e){this.state=p(),this._typeValidator=e??null}parse(t,n){if(this.state.hasAsyncChecks)throw new i([{code:e.custom,message:`parse() cannot evaluate async checks. Use parseAsync().`,path:[]}]);let r=n??h();return this._withCatch(()=>{let n=this._prepareInput(t);if(n.skip)return n.value;let a=this._parse(n.value,r);if(a instanceof Promise)throw new i([{code:e.custom,message:`parse() received an async schema. Use parseAsync() instead.`,path:[]}]);let o=a,s=o.typeOk?this._runValidatorsSync(o.data,r):[],c=[...o.issues,...s];if(c.length)throw new i(c);return this._runPostprocessors(o.data)})}safeParse(e,t){try{return{data:this.parse(e,t),success:!0}}catch(e){if(e instanceof i)return{error:e,success:!1};throw e}}async parseAsync(e,t){let n=t??h();return this._withCatchAsync(async()=>{let t=this._prepareInput(e);if(t.skip)return t.value;let r=await this._parse(t.value,n),a=r.typeOk?await this._runValidatorsAsync(r.data,n):[],o=[...r.issues,...a];if(o.length)throw new i(o);return this._runPostprocessors(r.data)})}async safeParseAsync(e,t){try{return{data:await this.parseAsync(e,t),success:!0}}catch(e){if(e instanceof i)return{error:e,success:!1};throw e}}_parseFullSync(t,n){if(this.state.hasAsyncChecks)throw new i([{code:e.custom,message:`Sync parsing cannot evaluate async checks. Use parseAsync().`,path:[]}]);let r=n??h(),a=this._prepareInput(t);if(a.skip)return{data:a.value,issues:[]};let o=this._parse(a.value,r);if(o instanceof Promise)throw new i([{code:e.custom,message:`Sync parse path received an async schema. Use parseAsync() instead.`,path:[]}]);let s=o,c=s.typeOk?this._runValidatorsSync(s.data,r):[],l=[...s.issues,...c];return l.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:s.data,issues:l}:{data:this._runPostprocessors(s.data),issues:[]}}async _parseFullAsync(e,t){let n=t??h(),r=this._prepareInput(e);if(r.skip)return{data:r.value,issues:[]};let i=await this._parse(r.value,n),a=i.typeOk?await this._runValidatorsAsync(i.data,n):[],o=[...i.issues,...a];return o.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:i.data,issues:o}:{data:this._runPostprocessors(i.data),issues:[]}}check(e){return this._addCheck(e,!1)}checkAsync(e){return this._addCheck(e,!0)}_addCheck(e,t){let n=this._addConstraint((t,n)=>{let r=[],i=e(t,{addIssue:e=>r.push({...e,path:e.path??[]})});return i instanceof Promise?i.then(e=>g(e,r,n)):g(i,r,n)});return n.state.hasRuntimeChecks=!0,t&&(n.state.hasAsyncChecks=!0),n}optional(){let e=this._clone();return e.state.isOptional=!0,e}nullable(){let e=this._clone();return e.state.isNullable=!0,e}nullish(){let e=this._clone();return e.state.isOptional=!0,e.state.isNullable=!0,e}required(){let e=this._clone();return e.state.isOptional=!1,e}default(e){let t=this._clone();return t.state.defaultValue=typeof e==`function`?e:()=>f(e),t}catch(e){let t=this._clone();return t.state.catch=typeof e==`function`?e:()=>f(e),t}transform(e){let t=this._clone();return t.state.postprocessors.push(e),t}preprocess(e){let t=this._clone();return t.state.preprocessors.push(e),t}pipe(e){return new v(this,e)}label(e){let t=this._clone();return t.state.description=e,t}definition(){if(this.state.catch||this.state.defaultValue||this.state.postprocessors.length>0||this.state.preprocessors.length>0||this.state.hasRuntimeChecks)throw new n(`Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.`);return d(this._toDescriptorImpl())}get description(){return this.state.description}get isOptional(){return this.state.isOptional}get isNullable(){return this.state.isNullable}is(e){return this.safeParse(e).success}assert(e,t){let n=this._parseFullSync(e);if(n.issues.length===0)return;let r=t?n.issues.map(e=>({...e,message:e.path.length===0?`${t}: ${e.message}`:e.message})):n.issues;throw new i(r)}walk(e){return this._walk(e)}get kind(){return this._kind}get _kind(){return`any`}_describeBase(){return{...this.state.description===void 0?{}:{description:this.state.description},...this.state.isNullable?{isNullable:!0}:{},...this.state.isOptional?{isOptional:!0}:{}}}_addConstraint(e,t){let n=this._clone();return n.state.validators.push(e),t&&(n._annotations=t({...n._annotations})),n}_construct(e){let t=Object.assign(Object.create(Object.getPrototypeOf(this)),this,{state:e});return t._annotations={...this._annotations},t}_clone(){return this._construct(m(this.state))}_copyStateTo(e){return e.state=m(this.state),e}_walk(e){return e.unknown?e.unknown(this):null}_toDescriptorImpl(){return{...this._describeBase(),kind:`any`}}_withCatch(e){if(!this.state.catch)return e();try{return e()}catch(e){if(e instanceof i)return this.state.catch();throw e}}async _withCatchAsync(e){if(!this.state.catch)return e();try{return await e()}catch(e){if(e instanceof i)return this.state.catch();throw e}}_prepareInput(e){let t=this._runPreprocessors(e),n=t===void 0&&this.state.defaultValue?this.state.defaultValue():t;return this.state.isOptional&&n===void 0||this.state.isNullable&&n===null?{skip:!0,value:n}:{skip:!1,value:n}}_runPreprocessors(e){let t=e;for(let e of this.state.preprocessors)t=e(t);return t}_runPostprocessors(e){let t=e;for(let e of this.state.postprocessors)t=e(t);return t}_runValidatorsSync(t,n){if(this._typeValidator){let r=this._typeValidator(t,n);if(r instanceof Promise)throw new i([{code:e.custom,message:`Type validator returned a Promise. Use parseAsync() for async validation.`,path:[]}]);if(r&&r.length>0)return r}let r=[];for(let a of this.state.validators){let o=a(t,n);if(o instanceof Promise)throw new i([{code:e.custom,message:`Sync parsing received an async check. Use checkAsync() and parseAsync().`,path:[]}]);o&&r.push(...o)}return r}async _runValidatorsAsync(e,t){if(this._typeValidator){let n=await this._typeValidator(e,t);if(n&&n.length>0)return n}let n=[];for(let r of this.state.validators){let i=await r(e,t);i&&n.push(...i)}return n}_parse(e,t){return{data:e,issues:[],typeOk:!0}}},v=class extends _{from;to;get _kind(){return`pipe`}checkAsync(e){return this._addCheck(e,!0)}constructor(e,t){super(),this.from=e,this.to=t}_parse(e,t){let n=this.from._parseFullSync(e,t);if(n instanceof Promise)return n.then(n=>n.issues.length>0?{data:e,issues:n.issues,typeOk:!1}:this.to._parseFullAsync(n.data,t).then(e=>e.issues.length>0?{data:n.data,issues:e.issues,typeOk:!1}:{data:e.data,issues:[],typeOk:!0}));if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=this.to._parseFullSync(n.data,t);return r instanceof Promise?r.then(e=>e.issues.length>0?{data:n.data,issues:e.issues,typeOk:!1}:{data:e.data,issues:[],typeOk:!0}):r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}async parseAsync(e,t){let n=t??h(),r=await this.from._parseFullAsync(e,n);if(r.issues.length>0)throw new i(r.issues);let a=await this.to._parseFullAsync(r.data,n);if(a.issues.length>0)throw new i(a.issues);let o=await this._runValidatorsAsync(a.data,n);if(o.length>0)throw new i(o);return this._runPostprocessors(a.data)}_walk(e){let t=this.from.walk(e),n=this.to.walk(e);return e.pipe?e.pipe(this,t,n):super._walk(e)}_toDescriptorImpl(){return{...this._describeBase(),from:this.from.definition(),kind:`pipe`,to:this.to.definition()}}};export{e as ErrorCode,v as PipeSchema,_ as Schema,n as SpellDefinitionError,r as SpellError,i as SpellValidationError,h as _makeCtx,a as fail,o as prependIssuePath,s as resolveMessage,t as schemaMode};
2
2
  //# sourceMappingURL=core.js.map