@vielzeug/spell 26.11.9 → 26.11.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/README.md +1 -1
  2. package/dist/_dev.cjs.map +1 -1
  3. package/dist/_dev.js.map +1 -1
  4. package/dist/_object.cjs +2 -0
  5. package/dist/_object.cjs.map +1 -0
  6. package/dist/_object.d.ts +9 -0
  7. package/dist/_object.d.ts.map +1 -0
  8. package/dist/_object.js +2 -0
  9. package/dist/_object.js.map +1 -0
  10. package/dist/_parse.cjs +2 -0
  11. package/dist/_parse.cjs.map +1 -0
  12. package/dist/_parse.d.ts +38 -0
  13. package/dist/_parse.d.ts.map +1 -0
  14. package/dist/_parse.js +2 -0
  15. package/dist/_parse.js.map +1 -0
  16. package/dist/errors.cjs +2 -2
  17. package/dist/errors.cjs.map +1 -1
  18. package/dist/errors.d.ts +15 -26
  19. package/dist/errors.d.ts.map +1 -1
  20. package/dist/errors.js +2 -2
  21. package/dist/errors.js.map +1 -1
  22. package/dist/index.cjs +1 -1
  23. package/dist/index.d.ts +4 -4
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/json.cjs +2 -1
  27. package/dist/json.cjs.map +1 -0
  28. package/dist/json.d.ts +8 -1
  29. package/dist/json.d.ts.map +1 -1
  30. package/dist/json.js +2 -1
  31. package/dist/json.js.map +1 -0
  32. package/dist/messages.cjs +1 -1
  33. package/dist/messages.cjs.map +1 -1
  34. package/dist/messages.d.ts +7 -6
  35. package/dist/messages.d.ts.map +1 -1
  36. package/dist/messages.js +1 -1
  37. package/dist/messages.js.map +1 -1
  38. package/dist/predicates.cjs +2 -1
  39. package/dist/predicates.cjs.map +1 -0
  40. package/dist/predicates.d.ts +41 -2
  41. package/dist/predicates.d.ts.map +1 -1
  42. package/dist/predicates.js +2 -1
  43. package/dist/predicates.js.map +1 -0
  44. package/dist/s.cjs +1 -1
  45. package/dist/s.cjs.map +1 -1
  46. package/dist/s.d.ts +21 -22
  47. package/dist/s.d.ts.map +1 -1
  48. package/dist/s.js +1 -1
  49. package/dist/s.js.map +1 -1
  50. package/dist/schema.cjs +2 -0
  51. package/dist/schema.cjs.map +1 -0
  52. package/dist/schema.d.ts +93 -0
  53. package/dist/schema.d.ts.map +1 -0
  54. package/dist/schema.js +2 -0
  55. package/dist/schema.js.map +1 -0
  56. package/dist/schemas/array.cjs +1 -1
  57. package/dist/schemas/array.cjs.map +1 -1
  58. package/dist/schemas/array.d.ts +22 -32
  59. package/dist/schemas/array.d.ts.map +1 -1
  60. package/dist/schemas/array.js +1 -1
  61. package/dist/schemas/array.js.map +1 -1
  62. package/dist/schemas/bigint.cjs +1 -1
  63. package/dist/schemas/bigint.cjs.map +1 -1
  64. package/dist/schemas/bigint.d.ts +14 -18
  65. package/dist/schemas/bigint.d.ts.map +1 -1
  66. package/dist/schemas/bigint.js +1 -1
  67. package/dist/schemas/bigint.js.map +1 -1
  68. package/dist/schemas/date.cjs +1 -1
  69. package/dist/schemas/date.cjs.map +1 -1
  70. package/dist/schemas/date.d.ts +7 -6
  71. package/dist/schemas/date.d.ts.map +1 -1
  72. package/dist/schemas/date.js +1 -1
  73. package/dist/schemas/date.js.map +1 -1
  74. package/dist/schemas/discriminated-union.cjs +2 -0
  75. package/dist/schemas/discriminated-union.cjs.map +1 -0
  76. package/dist/schemas/discriminated-union.d.ts +39 -0
  77. package/dist/schemas/discriminated-union.d.ts.map +1 -0
  78. package/dist/schemas/discriminated-union.js +2 -0
  79. package/dist/schemas/discriminated-union.js.map +1 -0
  80. package/dist/schemas/intersect.cjs +1 -1
  81. package/dist/schemas/intersect.cjs.map +1 -1
  82. package/dist/schemas/intersect.d.ts +10 -9
  83. package/dist/schemas/intersect.d.ts.map +1 -1
  84. package/dist/schemas/intersect.js +1 -1
  85. package/dist/schemas/intersect.js.map +1 -1
  86. package/dist/schemas/lazy.cjs +1 -1
  87. package/dist/schemas/lazy.cjs.map +1 -1
  88. package/dist/schemas/lazy.d.ts +10 -10
  89. package/dist/schemas/lazy.d.ts.map +1 -1
  90. package/dist/schemas/lazy.js +1 -1
  91. package/dist/schemas/lazy.js.map +1 -1
  92. package/dist/schemas/map.cjs +1 -1
  93. package/dist/schemas/map.cjs.map +1 -1
  94. package/dist/schemas/map.d.ts +8 -7
  95. package/dist/schemas/map.d.ts.map +1 -1
  96. package/dist/schemas/map.js +1 -1
  97. package/dist/schemas/map.js.map +1 -1
  98. package/dist/schemas/number.cjs +1 -1
  99. package/dist/schemas/number.cjs.map +1 -1
  100. package/dist/schemas/number.d.ts +20 -27
  101. package/dist/schemas/number.d.ts.map +1 -1
  102. package/dist/schemas/number.js +1 -1
  103. package/dist/schemas/number.js.map +1 -1
  104. package/dist/schemas/object.cjs +1 -1
  105. package/dist/schemas/object.cjs.map +1 -1
  106. package/dist/schemas/object.d.ts +40 -88
  107. package/dist/schemas/object.d.ts.map +1 -1
  108. package/dist/schemas/object.js +1 -1
  109. package/dist/schemas/object.js.map +1 -1
  110. package/dist/schemas/primitives.cjs +2 -0
  111. package/dist/schemas/primitives.cjs.map +1 -0
  112. package/dist/schemas/primitives.d.ts +38 -0
  113. package/dist/schemas/primitives.d.ts.map +1 -0
  114. package/dist/schemas/primitives.js +2 -0
  115. package/dist/schemas/primitives.js.map +1 -0
  116. package/dist/schemas/record.cjs +1 -1
  117. package/dist/schemas/record.cjs.map +1 -1
  118. package/dist/schemas/record.d.ts +7 -8
  119. package/dist/schemas/record.d.ts.map +1 -1
  120. package/dist/schemas/record.js +1 -1
  121. package/dist/schemas/record.js.map +1 -1
  122. package/dist/schemas/set.cjs +1 -1
  123. package/dist/schemas/set.cjs.map +1 -1
  124. package/dist/schemas/set.d.ts +8 -7
  125. package/dist/schemas/set.d.ts.map +1 -1
  126. package/dist/schemas/set.js +1 -1
  127. package/dist/schemas/set.js.map +1 -1
  128. package/dist/schemas/string.cjs +1 -1
  129. package/dist/schemas/string.cjs.map +1 -1
  130. package/dist/schemas/string.d.ts +42 -98
  131. package/dist/schemas/string.d.ts.map +1 -1
  132. package/dist/schemas/string.js +1 -1
  133. package/dist/schemas/string.js.map +1 -1
  134. package/dist/schemas/tuple.cjs +1 -1
  135. package/dist/schemas/tuple.cjs.map +1 -1
  136. package/dist/schemas/tuple.d.ts +9 -9
  137. package/dist/schemas/tuple.d.ts.map +1 -1
  138. package/dist/schemas/tuple.js +1 -1
  139. package/dist/schemas/tuple.js.map +1 -1
  140. package/dist/schemas/union.cjs +1 -1
  141. package/dist/schemas/union.cjs.map +1 -1
  142. package/dist/schemas/union.d.ts +9 -7
  143. package/dist/schemas/union.d.ts.map +1 -1
  144. package/dist/schemas/union.js +1 -1
  145. package/dist/schemas/union.js.map +1 -1
  146. package/dist/spell.cjs +2 -2
  147. package/dist/spell.cjs.map +1 -1
  148. package/dist/spell.iife.js +2 -2
  149. package/dist/spell.iife.js.map +1 -1
  150. package/dist/spell.js +842 -1601
  151. package/dist/spell.js.map +1 -1
  152. package/dist/types.cjs +1 -1
  153. package/dist/types.cjs.map +1 -1
  154. package/dist/types.d.ts +151 -265
  155. package/dist/types.d.ts.map +1 -1
  156. package/dist/types.js +1 -1
  157. package/dist/types.js.map +1 -1
  158. package/package.json +2 -2
  159. package/dist/core.cjs +0 -2
  160. package/dist/core.cjs.map +0 -1
  161. package/dist/core.d.ts +0 -101
  162. package/dist/core.d.ts.map +0 -1
  163. package/dist/core.js +0 -2
  164. package/dist/core.js.map +0 -1
  165. package/dist/formats.cjs +0 -2
  166. package/dist/formats.cjs.map +0 -1
  167. package/dist/formats.d.ts +0 -41
  168. package/dist/formats.d.ts.map +0 -1
  169. package/dist/formats.js +0 -2
  170. package/dist/formats.js.map +0 -1
  171. package/dist/json-schema.cjs +0 -2
  172. package/dist/json-schema.cjs.map +0 -1
  173. package/dist/json-schema.d.ts +0 -5
  174. package/dist/json-schema.d.ts.map +0 -1
  175. package/dist/json-schema.js +0 -2
  176. package/dist/json-schema.js.map +0 -1
  177. package/dist/safe-object.cjs +0 -2
  178. package/dist/safe-object.cjs.map +0 -1
  179. package/dist/safe-object.d.ts +0 -6
  180. package/dist/safe-object.d.ts.map +0 -1
  181. package/dist/safe-object.js +0 -2
  182. package/dist/safe-object.js.map +0 -1
  183. package/dist/schemas/boolean.cjs +0 -2
  184. package/dist/schemas/boolean.cjs.map +0 -1
  185. package/dist/schemas/boolean.d.ts +0 -9
  186. package/dist/schemas/boolean.d.ts.map +0 -1
  187. package/dist/schemas/boolean.js +0 -2
  188. package/dist/schemas/boolean.js.map +0 -1
  189. package/dist/schemas/enum.cjs +0 -2
  190. package/dist/schemas/enum.cjs.map +0 -1
  191. package/dist/schemas/enum.d.ts +0 -12
  192. package/dist/schemas/enum.d.ts.map +0 -1
  193. package/dist/schemas/enum.js +0 -2
  194. package/dist/schemas/enum.js.map +0 -1
  195. package/dist/schemas/instanceof.cjs +0 -2
  196. package/dist/schemas/instanceof.cjs.map +0 -1
  197. package/dist/schemas/instanceof.d.ts +0 -9
  198. package/dist/schemas/instanceof.d.ts.map +0 -1
  199. package/dist/schemas/instanceof.js +0 -2
  200. package/dist/schemas/instanceof.js.map +0 -1
  201. package/dist/schemas/literal.cjs +0 -2
  202. package/dist/schemas/literal.cjs.map +0 -1
  203. package/dist/schemas/literal.d.ts +0 -9
  204. package/dist/schemas/literal.d.ts.map +0 -1
  205. package/dist/schemas/literal.js +0 -2
  206. package/dist/schemas/literal.js.map +0 -1
  207. package/dist/schemas/never.cjs +0 -2
  208. package/dist/schemas/never.cjs.map +0 -1
  209. package/dist/schemas/never.d.ts +0 -8
  210. package/dist/schemas/never.d.ts.map +0 -1
  211. package/dist/schemas/never.js +0 -2
  212. package/dist/schemas/never.js.map +0 -1
  213. package/dist/schemas/raw-or.cjs +0 -2
  214. package/dist/schemas/raw-or.cjs.map +0 -1
  215. package/dist/schemas/raw-or.d.ts +0 -17
  216. package/dist/schemas/raw-or.d.ts.map +0 -1
  217. package/dist/schemas/raw-or.js +0 -2
  218. package/dist/schemas/raw-or.js.map +0 -1
  219. package/dist/schemas/variant.cjs +0 -2
  220. package/dist/schemas/variant.cjs.map +0 -1
  221. package/dist/schemas/variant.d.ts +0 -37
  222. package/dist/schemas/variant.d.ts.map +0 -1
  223. package/dist/schemas/variant.js +0 -2
  224. package/dist/schemas/variant.js.map +0 -1
  225. package/dist/tolerate.cjs +0 -2
  226. package/dist/tolerate.cjs.map +0 -1
  227. package/dist/tolerate.d.ts +0 -10
  228. package/dist/tolerate.d.ts.map +0 -1
  229. package/dist/tolerate.js +0 -2
  230. package/dist/tolerate.js.map +0 -1
  231. package/dist/validators.cjs +0 -2
  232. package/dist/validators.cjs.map +0 -1
  233. package/dist/validators.d.ts +0 -20
  234. package/dist/validators.d.ts.map +0 -1
  235. package/dist/validators.js +0 -2
  236. package/dist/validators.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ const e=require("./_object.cjs"),t=require("./_parse.cjs"),n=require("./errors.cjs"),r=require("./messages.cjs"),i=require("./types.cjs");var a={meta:{},nullable:!1,optional:!1,portable:!0,preprocess:[],steps:[]},o=()=>new n.SpellError(`Schema contains async checks; use parseAsync() or safeParseAsync().`);function s({issues:e,value:t}){return e.length===0?{data:t,success:!0}:{error:new n.SpellValidationError(e),success:!1}}function c(e,n,r){return typeof e==`string`?n.push(t.issue(i.ErrorCode.custom,e)):e===!1&&n.length===0&&n.push(t.issue(i.ErrorCode.custom,r.check.default())),n.length>0?n:null}var l=class{state=a;get kind(){return`unknown`}get description(){return this.state.description}get isOptional(){return this.state.optional||this.state.default!==void 0||this.state.catch!==void 0}get isNullable(){return this.state.nullable}get"~standard"(){return{validate:e=>t.chain(this._run(e,{async:!0,messages:r.defaultContext.messages}),({issues:e,value:t})=>e.length===0?{value:t}:{issues:e.map(({message:e,path:t})=>({message:e,path:t}))}),vendor:`vielzeug`,version:1}}parse(e,t){let n=this.safeParse(e,t);if(n.success)return n.data;throw n.error}safeParse(e,t=r.defaultContext){let n=this._run(e,{async:!1,messages:t.messages});if(n instanceof Promise)throw o();return s(n)}async parseAsync(e,t){let n=await this.safeParseAsync(e,t);if(n.success)return n.data;throw n.error}async safeParseAsync(e,t=r.defaultContext){return s(await this._run(e,{async:!0,messages:t.messages}))}is(e){return this.safeParse(e).success}assert(e,t){let r=this.safeParse(e);if(!r.success)throw t?new n.SpellValidationError(r.error.issues.map(e=>e.path.length===0?{...e,message:`${t}: ${e.message}`}:e)):r.error}_run(e,n){let{catch:r,default:i,nullable:a,optional:o,preprocess:s}=this.state,c=e;for(let e of s)c=e(c);if(c===void 0){if(i)return{issues:[],value:i()};if(o)return{issues:[],value:c}}if(c===null&&a)return{issues:[],value:c};let l=t.chain(this._parse(c,n),e=>e.typeOk?this._runSteps(e.value,e.issues,n,0):e);return r?t.chain(l,e=>e.issues.length===0?e:{issues:[],value:r()}):l}_runSteps(e,t,n,r){let{steps:i}=this.state,a=e;for(let e=r;e<i.length;e++){let r=i[e];if(r.kind===`transform`){if(t.length>0)break;a=r.run(a);continue}if(r.async&&!n.async)throw o();let s=r.run(a,n);if(s instanceof Promise){if(!n.async)throw s.catch(()=>{}),o();let r=a;return s.then(i=>this._runSteps(r,i?[...t,...i]:t,n,e+1))}s&&(t=[...t,...s])}return{issues:t,value:a}}_parse(e,n){return t.ok(e)}check(e){return this._addCheck(e,!1)}checkAsync(e){return this._addCheck(e,!0)}_addCheck(e,n){let r=(n,r)=>{let i=[];return t.chain(e(n,{addIssue:({path:e=[],...t})=>i.push({...t,path:e})}),e=>c(e,i,r.messages))};return this._with({portable:!1,steps:[...this.state.steps,{async:n,kind:`check`,run:r}]})}_refine(e,t,n){let r=(n,r)=>e(n)?null:[t(n,r.messages)];return this._with({meta:n?{...this.state.meta,...n(this.state.meta)}:this.state.meta,steps:[...this.state.steps,{async:!1,kind:`check`,run:r}]})}optional(){return this._with({optional:!0})}nullable(){return this._with({nullable:!0})}nullish(){return this._with({nullable:!0,optional:!0})}required(){return this._with({default:void 0,optional:!1})}default(t){let n=typeof t==`function`?t:()=>e.materialize(t);return this._with({default:n,portable:!1})}catch(t){let n=typeof t==`function`?t:()=>e.materialize(t);return this._with({catch:n,portable:!1})}transform(e){let t={kind:`transform`,run:e};return this._with({portable:!1,steps:[...this.state.steps,t]})}preprocess(e){return this._with({portable:!1,preprocess:[...this.state.preprocess,e]})}pipe(e){return new u(this,e)}describe(e){return this._with({description:e})}definition(){if(!this.state.portable)throw new n.SpellDefinitionError(`Schemas with custom checks, transforms, preprocessors, defaults, or catches have no declarative definition.`);return e.deepFreeze(this._describe())}_describe(){return{...this._describeBase(),kind:`unknown`}}_describeBase(){let{description:e,nullable:t,optional:n}=this.state;return{...e!==void 0&&{description:e},...t&&{isNullable:!0},...n&&{isOptional:!0}}}_with(e){return Object.assign(Object.create(Object.getPrototypeOf(this)),this,{state:{...this.state,...e}})}},u=class extends l{from;to;constructor(e,t){super(),this.from=e,this.to=t}get kind(){return`pipe`}_parse(e,n){return t.chain(this.from._run(e,n),r=>r.issues.length>0?t.invalid(e,...r.issues):t.chain(this.to._run(r.value,n),e=>e.issues.length>0?t.invalid(r.value,...e.issues):t.ok(e.value)))}_describe(){return{...this._describeBase(),from:this.from.definition(),kind:`pipe`,to:this.to.definition()}}};exports.PipeSchema=u,exports.Schema=l;
2
+ //# sourceMappingURL=schema.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.cjs","names":["SpellError","SpellValidationError","issue","ErrorCode","chain","defaultContext","ok","materialize","SpellDefinitionError","deepFreeze","invalid","require__object","require__parse","require_errors","require_messages","require_types","initialState","asyncMisuse","toResult","issues","value","checkIssues","result","reported","messages","Schema","data","context","outcome","label","entry","fallback","defaultValue","input","fn","preprocess","optional","nullable","ctx","parsed","current","index","from","steps","step","found","settled","late","run","rest","test","fail","meta","factory","PipeSchema","next","description","patch","to","first","second"],"sources":["../src/schema.ts"],"sourcesContent":["import { deepFreeze, materialize } from './_object';\nimport { chain, invalid, issue, type MaybePromise, type Outcome, ok, type ParseValue, type RunContext } from './_parse';\nimport { SpellDefinitionError, SpellError, SpellValidationError } from './errors';\nimport { defaultContext, type Messages } from './messages';\nimport {\n type AcceptsMissing,\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type InferInput,\n type InferOutput,\n type Issue,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaKind,\n type StandardSchemaV1,\n schemaInput,\n schemaOutput,\n type ValidateResult,\n} from './types';\n\ntype Step =\n | {\n readonly async: boolean;\n readonly kind: 'check';\n readonly run: (value: unknown, ctx: RunContext) => MaybePromise<Issue[] | null>;\n }\n | { readonly kind: 'transform'; readonly run: (value: unknown) => unknown };\n\n/** Immutable configuration shared by every schema; each modifier returns a copy with a new state. */\nexport type SchemaState = {\n readonly catch?: () => unknown;\n readonly default?: () => unknown;\n readonly description?: string;\n /** Declarative contributions of built-in constraints, read by `definition()`. */\n readonly meta: Readonly<Record<string, unknown>>;\n readonly nullable: boolean;\n readonly optional: boolean;\n /** False once runtime-only behavior is attached; `definition()` then throws. */\n readonly portable: boolean;\n readonly preprocess: readonly ((value: unknown) => unknown)[];\n /** Checks and transforms, run in the order they were chained. */\n readonly steps: readonly Step[];\n};\n\nconst initialState: SchemaState = {\n meta: {},\n nullable: false,\n optional: false,\n portable: true,\n preprocess: [],\n steps: [],\n};\n\nconst asyncMisuse = () => new SpellError('Schema contains async checks; use parseAsync() or safeParseAsync().');\n\nfunction toResult<T>({ issues, value }: Outcome): ParseResult<T> {\n return issues.length === 0\n ? { data: value as T, success: true }\n : { error: new SpellValidationError(issues), success: false };\n}\n\nfunction checkIssues(result: ValidateResult, reported: Issue[], messages: Messages): Issue[] | null {\n if (typeof result === 'string') reported.push(issue(ErrorCode.custom, result));\n else if (result === false && reported.length === 0) reported.push(issue(ErrorCode.custom, messages.check.default()));\n\n return reported.length > 0 ? reported : null;\n}\n\nexport class Schema<Output = unknown, Input = Output> implements StandardSchemaV1<Input, Output> {\n declare readonly [schemaInput]: Input;\n declare readonly [schemaOutput]: Output;\n\n protected state: SchemaState = initialState;\n\n get kind(): SchemaKind {\n return 'unknown';\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n /** Whether missing (`undefined`) input is accepted: `optional()`, `nullish()`, `default()`, or `catch()`. */\n get isOptional(): boolean {\n return this.state.optional || this.state.default !== undefined || this.state.catch !== undefined;\n }\n\n get isNullable(): boolean {\n return this.state.nullable;\n }\n\n get '~standard'(): StandardSchemaV1.Props<Input, Output> {\n return {\n validate: (value) =>\n chain(this._run(value, { async: true, messages: defaultContext.messages }), ({ issues, value: data }) =>\n issues.length === 0\n ? { value: data as Output }\n : { issues: issues.map(({ message, path }) => ({ message, path })) },\n ),\n vendor: 'vielzeug',\n version: 1,\n };\n }\n\n /* -------------------- Parsing -------------------- */\n\n /** Parses synchronously; throws `SpellValidationError` on invalid input and `SpellError` when async checks are present. */\n parse(value: unknown, context?: ParseContext): Output {\n const result = this.safeParse(value, context);\n\n if (result.success) return result.data;\n\n throw result.error;\n }\n\n safeParse(value: unknown, context: ParseContext = defaultContext): ParseResult<Output> {\n const outcome = this._run(value, { async: false, messages: context.messages });\n\n if (outcome instanceof Promise) throw asyncMisuse();\n\n return toResult(outcome);\n }\n\n async parseAsync(value: unknown, context?: ParseContext): Promise<Output> {\n const result = await this.safeParseAsync(value, context);\n\n if (result.success) return result.data;\n\n throw result.error;\n }\n\n async safeParseAsync(value: unknown, context: ParseContext = defaultContext): Promise<ParseResult<Output>> {\n return toResult(await this._run(value, { async: true, messages: context.messages }));\n }\n\n is(value: unknown): value is Output {\n return this.safeParse(value).success;\n }\n\n /** Narrows `value` or throws `SpellValidationError`; `label` prefixes root-level messages. */\n assert(value: unknown, label?: string): asserts value is Output {\n const result = this.safeParse(value);\n\n if (result.success) return;\n\n if (!label) throw result.error;\n\n throw new SpellValidationError(\n result.error.issues.map((entry) =>\n entry.path.length === 0 ? { ...entry, message: `${label}: ${entry.message}` } : entry,\n ),\n );\n }\n\n /**\n * Runs the full pipeline: preprocessors, missing/null handling, the structural parse, then\n * checks and transforms in chain order. Synchronous unless an async check runs.\n * @internal Composite schemas call this on their children.\n */\n _run(input: unknown, ctx: RunContext): MaybePromise<Outcome> {\n const { catch: fallback, default: defaultValue, nullable, optional, preprocess } = this.state;\n let value = input;\n\n for (const fn of preprocess) value = fn(value);\n\n if (value === undefined) {\n if (defaultValue) return { issues: [], value: defaultValue() };\n\n if (optional) return { issues: [], value };\n }\n\n if (value === null && nullable) return { issues: [], value };\n\n const outcome = chain(this._parse(value, ctx), (parsed) =>\n parsed.typeOk ? this._runSteps(parsed.value, parsed.issues, ctx, 0) : parsed,\n );\n\n if (!fallback) return outcome;\n\n return chain(outcome, (result) => (result.issues.length === 0 ? result : { issues: [], value: fallback() }));\n }\n\n private _runSteps(value: unknown, issues: Issue[], ctx: RunContext, from: number): MaybePromise<Outcome> {\n const { steps } = this.state;\n let current = value;\n\n for (let index = from; index < steps.length; index++) {\n const step = steps[index]!;\n\n if (step.kind === 'transform') {\n if (issues.length > 0) break;\n\n current = step.run(current);\n continue;\n }\n\n if (step.async && !ctx.async) throw asyncMisuse();\n\n const found = step.run(current, ctx);\n\n if (found instanceof Promise) {\n if (!ctx.async) {\n found.catch(() => {});\n throw asyncMisuse();\n }\n\n const settled = current;\n\n return found.then((late) => this._runSteps(settled, late ? [...issues, ...late] : issues, ctx, index + 1));\n }\n\n if (found) issues = [...issues, ...found];\n }\n\n return { issues, value: current };\n }\n\n /** Structural parse of a value that is neither missing-and-optional nor null-and-nullable. */\n protected _parse(value: unknown, _ctx: RunContext): MaybePromise<ParseValue> {\n return ok(value);\n }\n\n /* -------------------- Checks -------------------- */\n\n /** Adds a synchronous rule. For asynchronous work use `checkAsync()`. */\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 /** Adds an asynchronous rule; the schema then requires `parseAsync()` or `safeParseAsync()`. */\n checkAsync(fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>): this {\n return this._addCheck(fn, true);\n }\n\n private _addCheck(fn: (value: Output, ctx: CheckContext) => MaybePromise<ValidateResult>, async: boolean): this {\n const run = (value: unknown, ctx: RunContext): MaybePromise<Issue[] | null> => {\n const reported: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: ({ path = [], ...rest }) => reported.push({ ...rest, path } as Issue),\n };\n\n return chain(fn(value as Output, checkCtx), (result) => checkIssues(result, reported, ctx.messages));\n };\n\n return this._with({ portable: false, steps: [...this.state.steps, { async, kind: 'check', run }] });\n }\n\n /**\n * Adds a built-in declarative constraint. `meta` returns the constraint's contribution to `definition()`.\n */\n protected _refine<M extends Record<string, unknown>>(\n test: (value: Output) => boolean,\n fail: (value: Output, messages: Messages) => Issue,\n meta?: (current: Partial<M>) => Partial<M>,\n ): this {\n const run = (value: unknown, ctx: RunContext) =>\n test(value as Output) ? null : [fail(value as Output, ctx.messages)];\n\n return this._with({\n meta: meta ? { ...this.state.meta, ...meta(this.state.meta as Partial<M>) } : this.state.meta,\n steps: [...this.state.steps, { async: false, kind: 'check', run }],\n });\n }\n\n /* -------------------- Modifiers -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined> & AcceptsMissing {\n return this._with({ optional: true }) as unknown as Schema<Output | undefined, Input | undefined> & AcceptsMissing;\n }\n\n nullable(): Schema<Output | null, Input | null> {\n return this._with({ nullable: true }) as unknown as Schema<Output | null, Input | null>;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing {\n return this._with({ nullable: true, optional: true }) as unknown as Schema<\n Output | null | undefined,\n Input | null | undefined\n > &\n AcceptsMissing;\n }\n\n /** Rejects `undefined` again: clears `optional()` and `default()`. */\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>> {\n return this._with({ default: undefined, optional: false }) as unknown as Schema<\n Exclude<Output, undefined>,\n Exclude<Input, undefined>\n >;\n }\n\n /** Returns `value` (a fresh copy each time) for `undefined` input without parsing it. A function is a factory. */\n default(value: Output | (() => Output)): this & AcceptsMissing {\n const factory = typeof value === 'function' ? (value as () => Output) : () => materialize(value);\n\n return this._with({ default: factory, portable: false }) as this & AcceptsMissing;\n }\n\n /** Returns `fallback` (a fresh copy each time) whenever validation fails. A function is a factory. */\n catch(fallback: Output | (() => Output)): this & AcceptsMissing {\n const factory = typeof fallback === 'function' ? (fallback as () => Output) : () => materialize(fallback);\n\n return this._with({ catch: factory, portable: false }) as this & AcceptsMissing;\n }\n\n /** Maps the parsed value. Runs in chain order, only when no earlier check failed. */\n transform<Next>(fn: (value: Output) => Next): Schema<Next, Input> {\n const step: Step = { kind: 'transform', run: fn as (value: unknown) => unknown };\n\n return this._with({ portable: false, steps: [...this.state.steps, step] }) as unknown as Schema<Next, Input>;\n }\n\n /** Maps raw input before the type check, e.g. for coercion. */\n preprocess(fn: (value: unknown) => unknown): this {\n return this._with({ portable: false, preprocess: [...this.state.preprocess, fn] });\n }\n\n /** Feeds this schema's output into `next`. */\n pipe<Next extends AnySchema>(next: Next): PipeSchema<this, Next> {\n return new PipeSchema(this, next);\n }\n\n describe(description: string): this {\n return this._with({ description });\n }\n\n /* -------------------- Definitions -------------------- */\n\n /** Returns a frozen declarative descriptor; throws `SpellDefinitionError` when runtime-only behavior is attached. */\n definition(): SchemaDescriptor {\n if (!this.state.portable) {\n throw new SpellDefinitionError(\n 'Schemas with custom checks, transforms, preprocessors, defaults, or catches have no declarative definition.',\n );\n }\n\n return deepFreeze(this._describe());\n }\n\n protected _describe(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'unknown' };\n }\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n const { description, nullable, optional } = this.state;\n\n return {\n ...(description !== undefined && { description }),\n ...(nullable && { isNullable: true as const }),\n ...(optional && { isOptional: true as const }),\n };\n }\n\n /** Copy of this schema with `patch` merged into its state. */\n protected _with(patch: Partial<SchemaState>): this {\n return Object.assign(Object.create(Object.getPrototypeOf(this)) as this, this, {\n state: { ...this.state, ...patch },\n });\n }\n}\n\n/* -------------------- Pipe -------------------- */\n\nexport class PipeSchema<From extends AnySchema, To extends AnySchema> extends Schema<\n InferOutput<To>,\n InferInput<From>\n> {\n readonly from: From;\n readonly to: To;\n\n constructor(from: From, to: To) {\n super();\n this.from = from;\n this.to = to;\n }\n\n override get kind(): SchemaKind {\n return 'pipe';\n }\n\n protected override _parse(value: unknown, ctx: RunContext): MaybePromise<ParseValue> {\n return chain(this.from._run(value, ctx), (first) =>\n first.issues.length > 0\n ? invalid(value, ...first.issues)\n : chain(this.to._run(first.value, ctx), (second) =>\n second.issues.length > 0 ? invalid(first.value, ...second.issues) : ok(second.value),\n ),\n );\n }\n\n protected override _describe(): SchemaDescriptor {\n return { ...this._describeBase(), from: this.from.definition(), kind: 'pipe', to: this.to.definition() };\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { type MaybePromise, type ParseValue, type RunContext } from './_parse';
2
+ import { type Messages } from './messages';
3
+ import { type AcceptsMissing, type AnySchema, type CheckContext, type InferInput, type InferOutput, type Issue, type ParseContext, type ParseResult, type SchemaDescriptor, type SchemaKind, type StandardSchemaV1, schemaInput, schemaOutput, type ValidateResult } from './types';
4
+ type Step = {
5
+ readonly async: boolean;
6
+ readonly kind: 'check';
7
+ readonly run: (value: unknown, ctx: RunContext) => MaybePromise<Issue[] | null>;
8
+ } | {
9
+ readonly kind: 'transform';
10
+ readonly run: (value: unknown) => unknown;
11
+ };
12
+ /** Immutable configuration shared by every schema; each modifier returns a copy with a new state. */
13
+ export type SchemaState = {
14
+ readonly catch?: () => unknown;
15
+ readonly default?: () => unknown;
16
+ readonly description?: string;
17
+ /** Declarative contributions of built-in constraints, read by `definition()`. */
18
+ readonly meta: Readonly<Record<string, unknown>>;
19
+ readonly nullable: boolean;
20
+ readonly optional: boolean;
21
+ /** False once runtime-only behavior is attached; `definition()` then throws. */
22
+ readonly portable: boolean;
23
+ readonly preprocess: readonly ((value: unknown) => unknown)[];
24
+ /** Checks and transforms, run in the order they were chained. */
25
+ readonly steps: readonly Step[];
26
+ };
27
+ export declare class Schema<Output = unknown, Input = Output> implements StandardSchemaV1<Input, Output> {
28
+ readonly [schemaInput]: Input;
29
+ readonly [schemaOutput]: Output;
30
+ protected state: SchemaState;
31
+ get kind(): SchemaKind;
32
+ get description(): string | undefined;
33
+ /** Whether missing (`undefined`) input is accepted: `optional()`, `nullish()`, `default()`, or `catch()`. */
34
+ get isOptional(): boolean;
35
+ get isNullable(): boolean;
36
+ get '~standard'(): StandardSchemaV1.Props<Input, Output>;
37
+ /** Parses synchronously; throws `SpellValidationError` on invalid input and `SpellError` when async checks are present. */
38
+ parse(value: unknown, context?: ParseContext): Output;
39
+ safeParse(value: unknown, context?: ParseContext): ParseResult<Output>;
40
+ parseAsync(value: unknown, context?: ParseContext): Promise<Output>;
41
+ safeParseAsync(value: unknown, context?: ParseContext): Promise<ParseResult<Output>>;
42
+ is(value: unknown): value is Output;
43
+ /** Narrows `value` or throws `SpellValidationError`; `label` prefixes root-level messages. */
44
+ assert(value: unknown, label?: string): asserts value is Output;
45
+ private _runSteps;
46
+ /** Structural parse of a value that is neither missing-and-optional nor null-and-nullable. */
47
+ protected _parse(value: unknown, _ctx: RunContext): MaybePromise<ParseValue>;
48
+ /** Adds a synchronous rule. For asynchronous work use `checkAsync()`. */
49
+ check<F extends (value: Output, ctx: CheckContext) => ValidateResult | Promise<ValidateResult>>(fn: ReturnType<F> extends PromiseLike<unknown> ? never : F): this;
50
+ /** Adds an asynchronous rule; the schema then requires `parseAsync()` or `safeParseAsync()`. */
51
+ checkAsync(fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>): this;
52
+ private _addCheck;
53
+ /**
54
+ * Adds a built-in declarative constraint. `meta` returns the constraint's contribution to `definition()`.
55
+ */
56
+ protected _refine<M extends Record<string, unknown>>(test: (value: Output) => boolean, fail: (value: Output, messages: Messages) => Issue, meta?: (current: Partial<M>) => Partial<M>): this;
57
+ optional(): Schema<Output | undefined, Input | undefined> & AcceptsMissing;
58
+ nullable(): Schema<Output | null, Input | null>;
59
+ nullish(): Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing;
60
+ /** Rejects `undefined` again: clears `optional()` and `default()`. */
61
+ required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>>;
62
+ /** Returns `value` (a fresh copy each time) for `undefined` input without parsing it. A function is a factory. */
63
+ default(value: Output | (() => Output)): this & AcceptsMissing;
64
+ /** Returns `fallback` (a fresh copy each time) whenever validation fails. A function is a factory. */
65
+ catch(fallback: Output | (() => Output)): this & AcceptsMissing;
66
+ /** Maps the parsed value. Runs in chain order, only when no earlier check failed. */
67
+ transform<Next>(fn: (value: Output) => Next): Schema<Next, Input>;
68
+ /** Maps raw input before the type check, e.g. for coercion. */
69
+ preprocess(fn: (value: unknown) => unknown): this;
70
+ /** Feeds this schema's output into `next`. */
71
+ pipe<Next extends AnySchema>(next: Next): PipeSchema<this, Next>;
72
+ describe(description: string): this;
73
+ /** Returns a frozen declarative descriptor; throws `SpellDefinitionError` when runtime-only behavior is attached. */
74
+ definition(): SchemaDescriptor;
75
+ protected _describe(): SchemaDescriptor;
76
+ protected _describeBase(): {
77
+ description?: string;
78
+ isNullable?: true;
79
+ isOptional?: true;
80
+ };
81
+ /** Copy of this schema with `patch` merged into its state. */
82
+ protected _with(patch: Partial<SchemaState>): this;
83
+ }
84
+ export declare class PipeSchema<From extends AnySchema, To extends AnySchema> extends Schema<InferOutput<To>, InferInput<From>> {
85
+ readonly from: From;
86
+ readonly to: To;
87
+ constructor(from: From, to: To);
88
+ get kind(): SchemaKind;
89
+ protected _parse(value: unknown, ctx: RunContext): MaybePromise<ParseValue>;
90
+ protected _describe(): SchemaDescriptor;
91
+ }
92
+ export {};
93
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/dist/schema.js ADDED
@@ -0,0 +1,2 @@
1
+ import{deepFreeze as e,materialize as t}from"./_object.js";import{chain as n,invalid as r,issue as i,ok as a}from"./_parse.js";import{SpellDefinitionError as o,SpellError as s,SpellValidationError as c}from"./errors.js";import{defaultContext as l}from"./messages.js";import{ErrorCode as u}from"./types.js";var d={meta:{},nullable:!1,optional:!1,portable:!0,preprocess:[],steps:[]},f=()=>new s(`Schema contains async checks; use parseAsync() or safeParseAsync().`);function p({issues:e,value:t}){return e.length===0?{data:t,success:!0}:{error:new c(e),success:!1}}function m(e,t,n){return typeof e==`string`?t.push(i(u.custom,e)):e===!1&&t.length===0&&t.push(i(u.custom,n.check.default())),t.length>0?t:null}var h=class{state=d;get kind(){return`unknown`}get description(){return this.state.description}get isOptional(){return this.state.optional||this.state.default!==void 0||this.state.catch!==void 0}get isNullable(){return this.state.nullable}get"~standard"(){return{validate:e=>n(this._run(e,{async:!0,messages:l.messages}),({issues:e,value:t})=>e.length===0?{value:t}:{issues:e.map(({message:e,path:t})=>({message:e,path:t}))}),vendor:`vielzeug`,version:1}}parse(e,t){let n=this.safeParse(e,t);if(n.success)return n.data;throw n.error}safeParse(e,t=l){let n=this._run(e,{async:!1,messages:t.messages});if(n instanceof Promise)throw f();return p(n)}async parseAsync(e,t){let n=await this.safeParseAsync(e,t);if(n.success)return n.data;throw n.error}async safeParseAsync(e,t=l){return p(await this._run(e,{async:!0,messages:t.messages}))}is(e){return this.safeParse(e).success}assert(e,t){let n=this.safeParse(e);if(!n.success)throw t?new c(n.error.issues.map(e=>e.path.length===0?{...e,message:`${t}: ${e.message}`}:e)):n.error}_run(e,t){let{catch:r,default:i,nullable:a,optional:o,preprocess:s}=this.state,c=e;for(let e of s)c=e(c);if(c===void 0){if(i)return{issues:[],value:i()};if(o)return{issues:[],value:c}}if(c===null&&a)return{issues:[],value:c};let l=n(this._parse(c,t),e=>e.typeOk?this._runSteps(e.value,e.issues,t,0):e);return r?n(l,e=>e.issues.length===0?e:{issues:[],value:r()}):l}_runSteps(e,t,n,r){let{steps:i}=this.state,a=e;for(let e=r;e<i.length;e++){let r=i[e];if(r.kind===`transform`){if(t.length>0)break;a=r.run(a);continue}if(r.async&&!n.async)throw f();let o=r.run(a,n);if(o instanceof Promise){if(!n.async)throw o.catch(()=>{}),f();let r=a;return o.then(i=>this._runSteps(r,i?[...t,...i]:t,n,e+1))}o&&(t=[...t,...o])}return{issues:t,value:a}}_parse(e,t){return a(e)}check(e){return this._addCheck(e,!1)}checkAsync(e){return this._addCheck(e,!0)}_addCheck(e,t){let r=(t,r)=>{let i=[];return n(e(t,{addIssue:({path:e=[],...t})=>i.push({...t,path:e})}),e=>m(e,i,r.messages))};return this._with({portable:!1,steps:[...this.state.steps,{async:t,kind:`check`,run:r}]})}_refine(e,t,n){let r=(n,r)=>e(n)?null:[t(n,r.messages)];return this._with({meta:n?{...this.state.meta,...n(this.state.meta)}:this.state.meta,steps:[...this.state.steps,{async:!1,kind:`check`,run:r}]})}optional(){return this._with({optional:!0})}nullable(){return this._with({nullable:!0})}nullish(){return this._with({nullable:!0,optional:!0})}required(){return this._with({default:void 0,optional:!1})}default(e){let n=typeof e==`function`?e:()=>t(e);return this._with({default:n,portable:!1})}catch(e){let n=typeof e==`function`?e:()=>t(e);return this._with({catch:n,portable:!1})}transform(e){let t={kind:`transform`,run:e};return this._with({portable:!1,steps:[...this.state.steps,t]})}preprocess(e){return this._with({portable:!1,preprocess:[...this.state.preprocess,e]})}pipe(e){return new g(this,e)}describe(e){return this._with({description:e})}definition(){if(!this.state.portable)throw new o(`Schemas with custom checks, transforms, preprocessors, defaults, or catches have no declarative definition.`);return e(this._describe())}_describe(){return{...this._describeBase(),kind:`unknown`}}_describeBase(){let{description:e,nullable:t,optional:n}=this.state;return{...e!==void 0&&{description:e},...t&&{isNullable:!0},...n&&{isOptional:!0}}}_with(e){return Object.assign(Object.create(Object.getPrototypeOf(this)),this,{state:{...this.state,...e}})}},g=class extends h{from;to;constructor(e,t){super(),this.from=e,this.to=t}get kind(){return`pipe`}_parse(e,t){return n(this.from._run(e,t),i=>i.issues.length>0?r(e,...i.issues):n(this.to._run(i.value,t),e=>e.issues.length>0?r(i.value,...e.issues):a(e.value)))}_describe(){return{...this._describeBase(),from:this.from.definition(),kind:`pipe`,to:this.to.definition()}}};export{g as PipeSchema,h as Schema};
2
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","names":["initialState","asyncMisuse","SpellError","toResult","issues","value","SpellValidationError","checkIssues","result","reported","issue","ErrorCode","messages","Schema","chain","defaultContext","data","context","outcome","label","entry","fallback","defaultValue","input","fn","preprocess","optional","nullable","ctx","parsed","current","index","from","steps","step","found","settled","late","ok","run","rest","test","fail","meta","factory","materialize","PipeSchema","next","SpellDefinitionError","deepFreeze","description","patch","to","first","invalid","second"],"sources":["../src/schema.ts"],"sourcesContent":["import { deepFreeze, materialize } from './_object';\nimport { chain, invalid, issue, type MaybePromise, type Outcome, ok, type ParseValue, type RunContext } from './_parse';\nimport { SpellDefinitionError, SpellError, SpellValidationError } from './errors';\nimport { defaultContext, type Messages } from './messages';\nimport {\n type AcceptsMissing,\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type InferInput,\n type InferOutput,\n type Issue,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaKind,\n type StandardSchemaV1,\n schemaInput,\n schemaOutput,\n type ValidateResult,\n} from './types';\n\ntype Step =\n | {\n readonly async: boolean;\n readonly kind: 'check';\n readonly run: (value: unknown, ctx: RunContext) => MaybePromise<Issue[] | null>;\n }\n | { readonly kind: 'transform'; readonly run: (value: unknown) => unknown };\n\n/** Immutable configuration shared by every schema; each modifier returns a copy with a new state. */\nexport type SchemaState = {\n readonly catch?: () => unknown;\n readonly default?: () => unknown;\n readonly description?: string;\n /** Declarative contributions of built-in constraints, read by `definition()`. */\n readonly meta: Readonly<Record<string, unknown>>;\n readonly nullable: boolean;\n readonly optional: boolean;\n /** False once runtime-only behavior is attached; `definition()` then throws. */\n readonly portable: boolean;\n readonly preprocess: readonly ((value: unknown) => unknown)[];\n /** Checks and transforms, run in the order they were chained. */\n readonly steps: readonly Step[];\n};\n\nconst initialState: SchemaState = {\n meta: {},\n nullable: false,\n optional: false,\n portable: true,\n preprocess: [],\n steps: [],\n};\n\nconst asyncMisuse = () => new SpellError('Schema contains async checks; use parseAsync() or safeParseAsync().');\n\nfunction toResult<T>({ issues, value }: Outcome): ParseResult<T> {\n return issues.length === 0\n ? { data: value as T, success: true }\n : { error: new SpellValidationError(issues), success: false };\n}\n\nfunction checkIssues(result: ValidateResult, reported: Issue[], messages: Messages): Issue[] | null {\n if (typeof result === 'string') reported.push(issue(ErrorCode.custom, result));\n else if (result === false && reported.length === 0) reported.push(issue(ErrorCode.custom, messages.check.default()));\n\n return reported.length > 0 ? reported : null;\n}\n\nexport class Schema<Output = unknown, Input = Output> implements StandardSchemaV1<Input, Output> {\n declare readonly [schemaInput]: Input;\n declare readonly [schemaOutput]: Output;\n\n protected state: SchemaState = initialState;\n\n get kind(): SchemaKind {\n return 'unknown';\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n /** Whether missing (`undefined`) input is accepted: `optional()`, `nullish()`, `default()`, or `catch()`. */\n get isOptional(): boolean {\n return this.state.optional || this.state.default !== undefined || this.state.catch !== undefined;\n }\n\n get isNullable(): boolean {\n return this.state.nullable;\n }\n\n get '~standard'(): StandardSchemaV1.Props<Input, Output> {\n return {\n validate: (value) =>\n chain(this._run(value, { async: true, messages: defaultContext.messages }), ({ issues, value: data }) =>\n issues.length === 0\n ? { value: data as Output }\n : { issues: issues.map(({ message, path }) => ({ message, path })) },\n ),\n vendor: 'vielzeug',\n version: 1,\n };\n }\n\n /* -------------------- Parsing -------------------- */\n\n /** Parses synchronously; throws `SpellValidationError` on invalid input and `SpellError` when async checks are present. */\n parse(value: unknown, context?: ParseContext): Output {\n const result = this.safeParse(value, context);\n\n if (result.success) return result.data;\n\n throw result.error;\n }\n\n safeParse(value: unknown, context: ParseContext = defaultContext): ParseResult<Output> {\n const outcome = this._run(value, { async: false, messages: context.messages });\n\n if (outcome instanceof Promise) throw asyncMisuse();\n\n return toResult(outcome);\n }\n\n async parseAsync(value: unknown, context?: ParseContext): Promise<Output> {\n const result = await this.safeParseAsync(value, context);\n\n if (result.success) return result.data;\n\n throw result.error;\n }\n\n async safeParseAsync(value: unknown, context: ParseContext = defaultContext): Promise<ParseResult<Output>> {\n return toResult(await this._run(value, { async: true, messages: context.messages }));\n }\n\n is(value: unknown): value is Output {\n return this.safeParse(value).success;\n }\n\n /** Narrows `value` or throws `SpellValidationError`; `label` prefixes root-level messages. */\n assert(value: unknown, label?: string): asserts value is Output {\n const result = this.safeParse(value);\n\n if (result.success) return;\n\n if (!label) throw result.error;\n\n throw new SpellValidationError(\n result.error.issues.map((entry) =>\n entry.path.length === 0 ? { ...entry, message: `${label}: ${entry.message}` } : entry,\n ),\n );\n }\n\n /**\n * Runs the full pipeline: preprocessors, missing/null handling, the structural parse, then\n * checks and transforms in chain order. Synchronous unless an async check runs.\n * @internal Composite schemas call this on their children.\n */\n _run(input: unknown, ctx: RunContext): MaybePromise<Outcome> {\n const { catch: fallback, default: defaultValue, nullable, optional, preprocess } = this.state;\n let value = input;\n\n for (const fn of preprocess) value = fn(value);\n\n if (value === undefined) {\n if (defaultValue) return { issues: [], value: defaultValue() };\n\n if (optional) return { issues: [], value };\n }\n\n if (value === null && nullable) return { issues: [], value };\n\n const outcome = chain(this._parse(value, ctx), (parsed) =>\n parsed.typeOk ? this._runSteps(parsed.value, parsed.issues, ctx, 0) : parsed,\n );\n\n if (!fallback) return outcome;\n\n return chain(outcome, (result) => (result.issues.length === 0 ? result : { issues: [], value: fallback() }));\n }\n\n private _runSteps(value: unknown, issues: Issue[], ctx: RunContext, from: number): MaybePromise<Outcome> {\n const { steps } = this.state;\n let current = value;\n\n for (let index = from; index < steps.length; index++) {\n const step = steps[index]!;\n\n if (step.kind === 'transform') {\n if (issues.length > 0) break;\n\n current = step.run(current);\n continue;\n }\n\n if (step.async && !ctx.async) throw asyncMisuse();\n\n const found = step.run(current, ctx);\n\n if (found instanceof Promise) {\n if (!ctx.async) {\n found.catch(() => {});\n throw asyncMisuse();\n }\n\n const settled = current;\n\n return found.then((late) => this._runSteps(settled, late ? [...issues, ...late] : issues, ctx, index + 1));\n }\n\n if (found) issues = [...issues, ...found];\n }\n\n return { issues, value: current };\n }\n\n /** Structural parse of a value that is neither missing-and-optional nor null-and-nullable. */\n protected _parse(value: unknown, _ctx: RunContext): MaybePromise<ParseValue> {\n return ok(value);\n }\n\n /* -------------------- Checks -------------------- */\n\n /** Adds a synchronous rule. For asynchronous work use `checkAsync()`. */\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 /** Adds an asynchronous rule; the schema then requires `parseAsync()` or `safeParseAsync()`. */\n checkAsync(fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>): this {\n return this._addCheck(fn, true);\n }\n\n private _addCheck(fn: (value: Output, ctx: CheckContext) => MaybePromise<ValidateResult>, async: boolean): this {\n const run = (value: unknown, ctx: RunContext): MaybePromise<Issue[] | null> => {\n const reported: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: ({ path = [], ...rest }) => reported.push({ ...rest, path } as Issue),\n };\n\n return chain(fn(value as Output, checkCtx), (result) => checkIssues(result, reported, ctx.messages));\n };\n\n return this._with({ portable: false, steps: [...this.state.steps, { async, kind: 'check', run }] });\n }\n\n /**\n * Adds a built-in declarative constraint. `meta` returns the constraint's contribution to `definition()`.\n */\n protected _refine<M extends Record<string, unknown>>(\n test: (value: Output) => boolean,\n fail: (value: Output, messages: Messages) => Issue,\n meta?: (current: Partial<M>) => Partial<M>,\n ): this {\n const run = (value: unknown, ctx: RunContext) =>\n test(value as Output) ? null : [fail(value as Output, ctx.messages)];\n\n return this._with({\n meta: meta ? { ...this.state.meta, ...meta(this.state.meta as Partial<M>) } : this.state.meta,\n steps: [...this.state.steps, { async: false, kind: 'check', run }],\n });\n }\n\n /* -------------------- Modifiers -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined> & AcceptsMissing {\n return this._with({ optional: true }) as unknown as Schema<Output | undefined, Input | undefined> & AcceptsMissing;\n }\n\n nullable(): Schema<Output | null, Input | null> {\n return this._with({ nullable: true }) as unknown as Schema<Output | null, Input | null>;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing {\n return this._with({ nullable: true, optional: true }) as unknown as Schema<\n Output | null | undefined,\n Input | null | undefined\n > &\n AcceptsMissing;\n }\n\n /** Rejects `undefined` again: clears `optional()` and `default()`. */\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>> {\n return this._with({ default: undefined, optional: false }) as unknown as Schema<\n Exclude<Output, undefined>,\n Exclude<Input, undefined>\n >;\n }\n\n /** Returns `value` (a fresh copy each time) for `undefined` input without parsing it. A function is a factory. */\n default(value: Output | (() => Output)): this & AcceptsMissing {\n const factory = typeof value === 'function' ? (value as () => Output) : () => materialize(value);\n\n return this._with({ default: factory, portable: false }) as this & AcceptsMissing;\n }\n\n /** Returns `fallback` (a fresh copy each time) whenever validation fails. A function is a factory. */\n catch(fallback: Output | (() => Output)): this & AcceptsMissing {\n const factory = typeof fallback === 'function' ? (fallback as () => Output) : () => materialize(fallback);\n\n return this._with({ catch: factory, portable: false }) as this & AcceptsMissing;\n }\n\n /** Maps the parsed value. Runs in chain order, only when no earlier check failed. */\n transform<Next>(fn: (value: Output) => Next): Schema<Next, Input> {\n const step: Step = { kind: 'transform', run: fn as (value: unknown) => unknown };\n\n return this._with({ portable: false, steps: [...this.state.steps, step] }) as unknown as Schema<Next, Input>;\n }\n\n /** Maps raw input before the type check, e.g. for coercion. */\n preprocess(fn: (value: unknown) => unknown): this {\n return this._with({ portable: false, preprocess: [...this.state.preprocess, fn] });\n }\n\n /** Feeds this schema's output into `next`. */\n pipe<Next extends AnySchema>(next: Next): PipeSchema<this, Next> {\n return new PipeSchema(this, next);\n }\n\n describe(description: string): this {\n return this._with({ description });\n }\n\n /* -------------------- Definitions -------------------- */\n\n /** Returns a frozen declarative descriptor; throws `SpellDefinitionError` when runtime-only behavior is attached. */\n definition(): SchemaDescriptor {\n if (!this.state.portable) {\n throw new SpellDefinitionError(\n 'Schemas with custom checks, transforms, preprocessors, defaults, or catches have no declarative definition.',\n );\n }\n\n return deepFreeze(this._describe());\n }\n\n protected _describe(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'unknown' };\n }\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n const { description, nullable, optional } = this.state;\n\n return {\n ...(description !== undefined && { description }),\n ...(nullable && { isNullable: true as const }),\n ...(optional && { isOptional: true as const }),\n };\n }\n\n /** Copy of this schema with `patch` merged into its state. */\n protected _with(patch: Partial<SchemaState>): this {\n return Object.assign(Object.create(Object.getPrototypeOf(this)) as this, this, {\n state: { ...this.state, ...patch },\n });\n }\n}\n\n/* -------------------- Pipe -------------------- */\n\nexport class PipeSchema<From extends AnySchema, To extends AnySchema> extends Schema<\n InferOutput<To>,\n InferInput<From>\n> {\n readonly from: From;\n readonly to: To;\n\n constructor(from: From, to: To) {\n super();\n this.from = from;\n this.to = to;\n }\n\n override get kind(): SchemaKind {\n return 'pipe';\n }\n\n protected override _parse(value: unknown, ctx: RunContext): MaybePromise<ParseValue> {\n return chain(this.from._run(value, ctx), (first) =>\n first.issues.length > 0\n ? invalid(value, ...first.issues)\n : chain(this.to._run(first.value, ctx), (second) =>\n second.issues.length > 0 ? invalid(first.value, ...second.issues) : ok(second.value),\n ),\n );\n }\n\n protected override _describe(): SchemaDescriptor {\n return { ...this._describeBase(), from: this.from.definition(), kind: 'pipe', to: this.to.definition() };\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("../errors.cjs"),t=require("../types.cjs"),n=require("../core.cjs");var r=class extends n.Schema{itemSchema;get _kind(){return`array`}constructor(e){super(),this.itemSchema=e}_parseItemsSync(t,n){let r=[],i=[];for(let a=0;a<t.length;a++){let o=this.itemSchema._parseFullSync(t[a],n);o.issues.length===0?i.push(o.data):(r.push(...e.prependIssuePath(o.issues,a)),i.push(t[a]))}return{data:i,issues:r}}_parse(n,r){if(!Array.isArray(n))return{data:n,issues:e.fail(t.ErrorCode.invalid_type,r.messages.array.type()),typeOk:!1};let{data:i,issues:a}=this._parseItemsSync(n,r);return{data:i,issues:a,typeOk:!0}}async _parseAsync(n,r){if(!Array.isArray(n))return{data:n,issues:e.fail(t.ErrorCode.invalid_type,r.messages.array.type()),typeOk:!1};let i=await Promise.all(n.map(e=>this.itemSchema._parseFullAsync(e,r))),a=[],o=[];for(let t=0;t<i.length;t++){let r=i[t];r.issues.length===0?o.push(r.data):(a.push(...e.prependIssuePath(r.issues,t)),o.push(n[t]))}return{data:o,issues:a,typeOk:!0}}min(n,r){return this._addConstraint((i,a)=>i.length>=n?null:e.fail(t.ErrorCode.too_small,e.resolveMessage(r??a.messages.array.min,{min:n,value:i}),{min:n}),e=>{let t=e;return{...t,minItems:t.minItems===void 0?n:Math.max(t.minItems,n)}})}max(n,r){return this._addConstraint((i,a)=>i.length<=n?null:e.fail(t.ErrorCode.too_big,e.resolveMessage(r??a.messages.array.max,{max:n,value:i}),{max:n}),e=>{let t=e;return{...t,maxItems:t.maxItems===void 0?n:Math.min(t.maxItems,n)}})}length(n,r){return this._addConstraint((i,a)=>i.length===n?null:e.fail(t.ErrorCode.invalid_length,e.resolveMessage(r??a.messages.array.length,{exact:n,value:i}),{exact:n}),e=>({...e,maxItems:n,minItems:n}))}nonEmpty(n){return this._addConstraint((r,i)=>{let a=r;return a.length>0?null:e.fail(t.ErrorCode.too_small,e.resolveMessage(n??i.messages.array.nonEmpty,{min:1,value:a}),{min:1})})}unique(n,r){let i=typeof n==`function`&&n.length===2,a=i?n:null,o=i?r:typeof n==`function`?n:void 0;return this._addConstraint((n,r)=>{let i=n,s;return s=a?i.every((e,t)=>i.slice(0,t).every(t=>!a(e,t))):new Set(i).size===i.length,s?null:e.fail(t.ErrorCode.invalid_unique,e.resolveMessage(o??r.messages.array.unique,{value:i}),{unique:!0})})}_toDescriptorImpl(){let e=this._annotations;return{...this._describeBase(),...e.maxItems===void 0?{}:{maxItems:e.maxItems},...e.minItems===void 0?{}:{minItems:e.minItems},items:this.itemSchema.definition(),kind:`array`}}};exports.ArraySchema=r;
1
+ const e=require("../_parse.cjs"),t=require("../schema.cjs"),n=require("../types.cjs");var r=class extends t.Schema{itemSchema;constructor(e){super(),this.itemSchema=e}get kind(){return`array`}_parse(t,r){return Array.isArray(t)?e.chain(e.all(t.map(e=>this.itemSchema._run(e,r))),n=>{let r=[];return{issues:r,typeOk:!0,value:n.map((n,i)=>n.issues.length===0?n.value:(r.push(...e.prefixIssues(n.issues,i)),t[i]))}}):e.invalid(t,e.issue(n.ErrorCode.invalid_type,r.messages.array.type()))}min(t,r){return this._refine(e=>e.length>=t,(i,a)=>e.issue(n.ErrorCode.too_small,e.resolveMessage(r??a.array.min,{min:t,value:i}),{min:t}),n=>({minItems:e.atLeast(n.minItems,t)}))}max(t,r){return this._refine(e=>e.length<=t,(i,a)=>e.issue(n.ErrorCode.too_big,e.resolveMessage(r??a.array.max,{max:t,value:i}),{max:t}),n=>({maxItems:e.atMost(n.maxItems,t)}))}length(t,r){return this._refine(e=>e.length===t,(i,a)=>e.issue(n.ErrorCode.invalid_length,e.resolveMessage(r??a.array.length,{exact:t,value:i}),{exact:t}),n=>({maxItems:e.atMost(n.maxItems,t),minItems:e.atLeast(n.minItems,t)}))}nonEmpty(t){return this._refine(e=>e.length>0,(r,i)=>e.issue(n.ErrorCode.too_small,e.resolveMessage(t??i.array.nonEmpty,{value:r}),{min:1}),t=>({minItems:e.atLeast(t.minItems,1)}))}unique(t={}){let{by:r,message:i}=t,a=this._refine(e=>new Set(r?e.map(r):e).size===e.length,(t,r)=>e.issue(n.ErrorCode.invalid_unique,e.resolveMessage(i??r.array.unique,{value:t})),r?void 0:()=>({uniqueItems:!0}));return r?a._with({portable:!1}):a}_describe(){return{...this._describeBase(),...this.state.meta,items:this.itemSchema.definition(),kind:`array`}}};exports.ArraySchema=r;
2
2
  //# sourceMappingURL=array.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"array.cjs","names":["Schema","prependIssuePath","fail","ErrorCode","resolveMessage","require_errors","require_types","require_core","ArraySchema","itemSchema","issues","parsed","i","items","result","ctx","value","settled","item","length","message","ann","current","exact","typed","isCustomEqualsFn","equalsFnOrMessage","equalsFn","resolvedMessage","isUnique","a","b"],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type {\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema } from '../core';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<T extends AnySchema> extends Schema<InferOutput<T>[], InferInput<T>[]> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: InferOutput<T>[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const settled = await Promise.all(value.map((item) => this.itemSchema._parseFullAsync(item, ctx)));\n\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(value[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues, typeOk: true };\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.array.min, { min: length, value: value as unknown[] }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.array.max, { max: length, value: value as unknown[] }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.array.length, { exact, value: value as unknown[] }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as unknown[];\n\n return typed.length > 0\n ? null\n : fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.array.nonEmpty, { min: 1, value: typed }), {\n min: 1,\n });\n });\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{ value: unknown[] }>,\n message?: MessageFn<{ value: unknown[] }>,\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: InferOutput<T>, b: InferOutput<T>) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : undefined;\n\n return this._addConstraint((value, ctx) => {\n const typed = value as InferOutput<T>[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(\n ErrorCode.invalid_unique,\n resolveMessage(resolvedMessage ?? ctx!.messages.array.unique, { value: typed as unknown[] }),\n {\n unique: true,\n },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"array.cjs","names":["Schema","invalid","issue","ErrorCode","chain","all","prefixIssues","resolveMessage","atLeast","atMost","require__parse","require_schema","require_types","ArraySchema","itemSchema","value","item","ctx","issues","results","result","index","length","message","m","current","exact","options","next","by"],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import {\n all,\n atLeast,\n atMost,\n chain,\n invalid,\n issue,\n type MaybePromise,\n type ParseValue,\n prefixIssues,\n type RunContext,\n resolveMessage,\n} from '../_parse';\nimport { Schema } from '../schema';\nimport {\n type AnySchema,\n ErrorCode,\n type InferInput,\n type InferOutput,\n type Issue,\n type MessageFn,\n type SchemaDescriptor,\n type SchemaKind,\n} from '../types';\n\ntype ArrayMeta = { maxItems: number; minItems: number; uniqueItems: true };\n\ntype ItemsMessage<Ctx = object> = MessageFn<Ctx & { value: unknown[] }>;\n\nexport class ArraySchema<T extends AnySchema> extends Schema<InferOutput<T>[], InferInput<T>[]> {\n readonly itemSchema: T;\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n override get kind(): SchemaKind {\n return 'array';\n }\n\n /** Item failures are reported per index; failed items keep their input value. */\n protected override _parse(value: unknown, ctx: RunContext): MaybePromise<ParseValue> {\n if (!Array.isArray(value)) return invalid(value, issue(ErrorCode.invalid_type, ctx.messages.array.type()));\n\n return chain(all(value.map((item) => this.itemSchema._run(item, ctx))), (results) => {\n const issues: Issue[] = [];\n const output = results.map((result, index) => {\n if (result.issues.length === 0) return result.value;\n\n issues.push(...prefixIssues(result.issues, index));\n\n return value[index];\n });\n\n return { issues, typeOk: true, value: output };\n });\n }\n\n min(length: number, message?: ItemsMessage<{ min: number }>): this {\n return this._refine<ArrayMeta>(\n (value) => value.length >= length,\n (value, m) =>\n issue(ErrorCode.too_small, resolveMessage(message ?? m.array.min, { min: length, value }), { min: length }),\n (current) => ({ minItems: atLeast(current.minItems, length) }),\n );\n }\n\n max(length: number, message?: ItemsMessage<{ max: number }>): this {\n return this._refine<ArrayMeta>(\n (value) => value.length <= length,\n (value, m) =>\n issue(ErrorCode.too_big, resolveMessage(message ?? m.array.max, { max: length, value }), { max: length }),\n (current) => ({ maxItems: atMost(current.maxItems, length) }),\n );\n }\n\n length(exact: number, message?: ItemsMessage<{ exact: number }>): this {\n return this._refine<ArrayMeta>(\n (value) => value.length === exact,\n (value, m) =>\n issue(ErrorCode.invalid_length, resolveMessage(message ?? m.array.length, { exact, value }), { exact }),\n (current) => ({ maxItems: atMost(current.maxItems, exact), minItems: atLeast(current.minItems, exact) }),\n );\n }\n\n nonEmpty(message?: ItemsMessage): this {\n return this._refine<ArrayMeta>(\n (value) => value.length > 0,\n (value, m) => issue(ErrorCode.too_small, resolveMessage(message ?? m.array.nonEmpty, { value }), { min: 1 }),\n (current) => ({ minItems: atLeast(current.minItems, 1) }),\n );\n }\n\n /**\n * Requires distinct items under `SameValueZero` (reference equality for objects), or distinct\n * `by(item)` keys. A `by` selector is runtime behavior, so `definition()` then throws.\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique({ by: (item) => item.id })\n */\n unique(options: { by?: (item: InferOutput<T>) => unknown; message?: ItemsMessage } = {}): this {\n const { by, message } = options;\n const next = this._refine<ArrayMeta>(\n (value) => new Set(by ? value.map(by) : value).size === value.length,\n (value, m) => issue(ErrorCode.invalid_unique, resolveMessage(message ?? m.array.unique, { value })),\n by ? undefined : () => ({ uniqueItems: true }),\n );\n\n return by ? next._with({ portable: false }) : next;\n }\n\n protected override _describe(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n ...(this.state.meta as Partial<ArrayMeta>),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n}\n"],"mappings":"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"}
@@ -1,47 +1,37 @@
1
- import type { AnySchema, InferInput, InferOutput, MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';
2
- import { Schema } from '../core';
1
+ import { type MaybePromise, type ParseValue, type RunContext } from '../_parse';
2
+ import { Schema } from '../schema';
3
+ import { type AnySchema, type InferInput, type InferOutput, type MessageFn, type SchemaDescriptor, type SchemaKind } from '../types';
4
+ type ItemsMessage<Ctx = object> = MessageFn<Ctx & {
5
+ value: unknown[];
6
+ }>;
3
7
  export declare class ArraySchema<T extends AnySchema> extends Schema<InferOutput<T>[], InferInput<T>[]> {
4
8
  readonly itemSchema: T;
5
- protected get _kind(): string;
6
9
  constructor(itemSchema: T);
7
- private _parseItemsSync;
8
- protected _parse(value: unknown, ctx: ParseContext): ParseValue;
9
- protected _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue>;
10
- min(length: number, message?: MessageFn<{
10
+ get kind(): SchemaKind;
11
+ /** Item failures are reported per index; failed items keep their input value. */
12
+ protected _parse(value: unknown, ctx: RunContext): MaybePromise<ParseValue>;
13
+ min(length: number, message?: ItemsMessage<{
11
14
  min: number;
12
- value: unknown[];
13
15
  }>): this;
14
- max(length: number, message?: MessageFn<{
16
+ max(length: number, message?: ItemsMessage<{
15
17
  max: number;
16
- value: unknown[];
17
18
  }>): this;
18
- length(exact: number, message?: MessageFn<{
19
+ length(exact: number, message?: ItemsMessage<{
19
20
  exact: number;
20
- value: unknown[];
21
- }>): this;
22
- nonEmpty(message?: MessageFn<{
23
- min: number;
24
- value: unknown[];
25
21
  }>): this;
22
+ nonEmpty(message?: ItemsMessage): this;
26
23
  /**
27
- * Validates that all array elements are unique.
28
- *
29
- * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means
30
- * **referential equality** for objects. Two structurally identical objects such as
31
- * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be
32
- * flagged as duplicates.
33
- *
34
- * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison
35
- * logic (e.g. compare by a specific field, or use deep equality).
24
+ * Requires distinct items under `SameValueZero` (reference equality for objects), or distinct
25
+ * `by(item)` keys. A `by` selector is runtime behavior, so `definition()` then throws.
36
26
  *
37
27
  * @example
38
- * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)
28
+ * s.array(s.object({ id: s.number() })).unique({ by: (item) => item.id })
39
29
  */
40
- unique(equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{
41
- value: unknown[];
42
- }>, message?: MessageFn<{
43
- value: unknown[];
44
- }>): this;
45
- protected _toDescriptorImpl(): SchemaDescriptor;
30
+ unique(options?: {
31
+ by?: (item: InferOutput<T>) => unknown;
32
+ message?: ItemsMessage;
33
+ }): this;
34
+ protected _describe(): SchemaDescriptor;
46
35
  }
36
+ export {};
47
37
  //# sourceMappingURL=array.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/schemas/array.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,WAAW,EAEX,SAAS,EACT,YAAY,EACZ,UAAU,EACV,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAqD,MAAM,EAAE,MAAM,SAAS,CAAC;AASpF,qBAAa,WAAW,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAEvB,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,UAAU,EAAE,CAAC;IAKzB,OAAO,CAAC,eAAe;cAkBJ,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;cAU/C,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAwB5F,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,GAAG,IAAI;IAwBjF,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,GAAG,IAAI;IAwBjF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,GAAG,IAAI;IAerF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,GAAG,IAAI;IAYtE;;;;;;;;;;;;;OAaG;IACH,MAAM,CACJ,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,EACzG,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,GACxC,IAAI;cA+BY,iBAAiB,IAAI,gBAAgB;CAWzD"}
1
+ {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/schemas/array.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,YAAY,EACjB,KAAK,UAAU,EAEf,KAAK,UAAU,EAEhB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,UAAU,EACf,KAAK,WAAW,EAEhB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAChB,MAAM,UAAU,CAAC;AAIlB,KAAK,YAAY,CAAC,GAAG,GAAG,MAAM,IAAI,SAAS,CAAC,GAAG,GAAG;IAAE,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAAC;AAExE,qBAAa,WAAW,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBAEX,UAAU,EAAE,CAAC;IAKzB,IAAa,IAAI,IAAI,UAAU,CAE9B;IAED,iFAAiF;cAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;IAiBpF,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IASlE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IASlE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAStE,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAQtC;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,GAAE;QAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,YAAY,CAAA;KAAO,GAAG,IAAI;cAW3E,SAAS,IAAI,gBAAgB;CAQjD"}
@@ -1,2 +1,2 @@
1
- import{fail as e,prependIssuePath as t,resolveMessage as n}from"../errors.js";import{ErrorCode as r}from"../types.js";import{Schema as i}from"../core.js";var a=class extends i{itemSchema;get _kind(){return`array`}constructor(e){super(),this.itemSchema=e}_parseItemsSync(e,n){let r=[],i=[];for(let a=0;a<e.length;a++){let o=this.itemSchema._parseFullSync(e[a],n);o.issues.length===0?i.push(o.data):(r.push(...t(o.issues,a)),i.push(e[a]))}return{data:i,issues:r}}_parse(t,n){if(!Array.isArray(t))return{data:t,issues:e(r.invalid_type,n.messages.array.type()),typeOk:!1};let{data:i,issues:a}=this._parseItemsSync(t,n);return{data:i,issues:a,typeOk:!0}}async _parseAsync(n,i){if(!Array.isArray(n))return{data:n,issues:e(r.invalid_type,i.messages.array.type()),typeOk:!1};let a=await Promise.all(n.map(e=>this.itemSchema._parseFullAsync(e,i))),o=[],s=[];for(let e=0;e<a.length;e++){let r=a[e];r.issues.length===0?s.push(r.data):(o.push(...t(r.issues,e)),s.push(n[e]))}return{data:s,issues:o,typeOk:!0}}min(t,i){return this._addConstraint((a,o)=>a.length>=t?null:e(r.too_small,n(i??o.messages.array.min,{min:t,value:a}),{min:t}),e=>{let n=e;return{...n,minItems:n.minItems===void 0?t:Math.max(n.minItems,t)}})}max(t,i){return this._addConstraint((a,o)=>a.length<=t?null:e(r.too_big,n(i??o.messages.array.max,{max:t,value:a}),{max:t}),e=>{let n=e;return{...n,maxItems:n.maxItems===void 0?t:Math.min(n.maxItems,t)}})}length(t,i){return this._addConstraint((a,o)=>a.length===t?null:e(r.invalid_length,n(i??o.messages.array.length,{exact:t,value:a}),{exact:t}),e=>({...e,maxItems:t,minItems:t}))}nonEmpty(t){return this._addConstraint((i,a)=>{let o=i;return o.length>0?null:e(r.too_small,n(t??a.messages.array.nonEmpty,{min:1,value:o}),{min:1})})}unique(t,i){let a=typeof t==`function`&&t.length===2,o=a?t:null,s=a?i:typeof t==`function`?t:void 0;return this._addConstraint((t,i)=>{let a=t,c;return c=o?a.every((e,t)=>a.slice(0,t).every(t=>!o(e,t))):new Set(a).size===a.length,c?null:e(r.invalid_unique,n(s??i.messages.array.unique,{value:a}),{unique:!0})})}_toDescriptorImpl(){let e=this._annotations;return{...this._describeBase(),...e.maxItems===void 0?{}:{maxItems:e.maxItems},...e.minItems===void 0?{}:{minItems:e.minItems},items:this.itemSchema.definition(),kind:`array`}}};export{a as ArraySchema};
1
+ import{all as e,atLeast as t,atMost as n,chain as r,invalid as i,issue as a,prefixIssues as o,resolveMessage as s}from"../_parse.js";import{Schema as c}from"../schema.js";import{ErrorCode as l}from"../types.js";var u=class extends c{itemSchema;constructor(e){super(),this.itemSchema=e}get kind(){return`array`}_parse(t,n){return Array.isArray(t)?r(e(t.map(e=>this.itemSchema._run(e,n))),e=>{let n=[];return{issues:n,typeOk:!0,value:e.map((e,r)=>e.issues.length===0?e.value:(n.push(...o(e.issues,r)),t[r]))}}):i(t,a(l.invalid_type,n.messages.array.type()))}min(e,n){return this._refine(t=>t.length>=e,(t,r)=>a(l.too_small,s(n??r.array.min,{min:e,value:t}),{min:e}),n=>({minItems:t(n.minItems,e)}))}max(e,t){return this._refine(t=>t.length<=e,(n,r)=>a(l.too_big,s(t??r.array.max,{max:e,value:n}),{max:e}),t=>({maxItems:n(t.maxItems,e)}))}length(e,r){return this._refine(t=>t.length===e,(t,n)=>a(l.invalid_length,s(r??n.array.length,{exact:e,value:t}),{exact:e}),r=>({maxItems:n(r.maxItems,e),minItems:t(r.minItems,e)}))}nonEmpty(e){return this._refine(e=>e.length>0,(t,n)=>a(l.too_small,s(e??n.array.nonEmpty,{value:t}),{min:1}),e=>({minItems:t(e.minItems,1)}))}unique(e={}){let{by:t,message:n}=e,r=this._refine(e=>new Set(t?e.map(t):e).size===e.length,(e,t)=>a(l.invalid_unique,s(n??t.array.unique,{value:e})),t?void 0:()=>({uniqueItems:!0}));return t?r._with({portable:!1}):r}_describe(){return{...this._describeBase(),...this.state.meta,items:this.itemSchema.definition(),kind:`array`}}};export{u as ArraySchema};
2
2
  //# sourceMappingURL=array.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"array.js","names":["ArraySchema","Schema","itemSchema","issues","parsed","i","items","result","ctx","prependIssuePath","value","fail","ErrorCode","settled","item","length","resolveMessage","message","ann","current","exact","typed","isCustomEqualsFn","equalsFnOrMessage","equalsFn","resolvedMessage","isUnique","a","b"],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type {\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema } from '../core';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<T extends AnySchema> extends Schema<InferOutput<T>[], InferInput<T>[]> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: InferOutput<T>[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const settled = await Promise.all(value.map((item) => this.itemSchema._parseFullAsync(item, ctx)));\n\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(value[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues, typeOk: true };\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.array.min, { min: length, value: value as unknown[] }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.array.max, { max: length, value: value as unknown[] }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.array.length, { exact, value: value as unknown[] }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as unknown[];\n\n return typed.length > 0\n ? null\n : fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.array.nonEmpty, { min: 1, value: typed }), {\n min: 1,\n });\n });\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{ value: unknown[] }>,\n message?: MessageFn<{ value: unknown[] }>,\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: InferOutput<T>, b: InferOutput<T>) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : undefined;\n\n return this._addConstraint((value, ctx) => {\n const typed = value as InferOutput<T>[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(\n ErrorCode.invalid_unique,\n resolveMessage(resolvedMessage ?? ctx!.messages.array.unique, { value: typed as unknown[] }),\n {\n unique: true,\n },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"array.js","names":["ArraySchema","Schema","itemSchema","value","chain","all","item","ctx","issues","results","result","prefixIssues","index","invalid","issue","ErrorCode","length","resolveMessage","message","m","atLeast","current","atMost","exact","options","next","by"],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import {\n all,\n atLeast,\n atMost,\n chain,\n invalid,\n issue,\n type MaybePromise,\n type ParseValue,\n prefixIssues,\n type RunContext,\n resolveMessage,\n} from '../_parse';\nimport { Schema } from '../schema';\nimport {\n type AnySchema,\n ErrorCode,\n type InferInput,\n type InferOutput,\n type Issue,\n type MessageFn,\n type SchemaDescriptor,\n type SchemaKind,\n} from '../types';\n\ntype ArrayMeta = { maxItems: number; minItems: number; uniqueItems: true };\n\ntype ItemsMessage<Ctx = object> = MessageFn<Ctx & { value: unknown[] }>;\n\nexport class ArraySchema<T extends AnySchema> extends Schema<InferOutput<T>[], InferInput<T>[]> {\n readonly itemSchema: T;\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n override get kind(): SchemaKind {\n return 'array';\n }\n\n /** Item failures are reported per index; failed items keep their input value. */\n protected override _parse(value: unknown, ctx: RunContext): MaybePromise<ParseValue> {\n if (!Array.isArray(value)) return invalid(value, issue(ErrorCode.invalid_type, ctx.messages.array.type()));\n\n return chain(all(value.map((item) => this.itemSchema._run(item, ctx))), (results) => {\n const issues: Issue[] = [];\n const output = results.map((result, index) => {\n if (result.issues.length === 0) return result.value;\n\n issues.push(...prefixIssues(result.issues, index));\n\n return value[index];\n });\n\n return { issues, typeOk: true, value: output };\n });\n }\n\n min(length: number, message?: ItemsMessage<{ min: number }>): this {\n return this._refine<ArrayMeta>(\n (value) => value.length >= length,\n (value, m) =>\n issue(ErrorCode.too_small, resolveMessage(message ?? m.array.min, { min: length, value }), { min: length }),\n (current) => ({ minItems: atLeast(current.minItems, length) }),\n );\n }\n\n max(length: number, message?: ItemsMessage<{ max: number }>): this {\n return this._refine<ArrayMeta>(\n (value) => value.length <= length,\n (value, m) =>\n issue(ErrorCode.too_big, resolveMessage(message ?? m.array.max, { max: length, value }), { max: length }),\n (current) => ({ maxItems: atMost(current.maxItems, length) }),\n );\n }\n\n length(exact: number, message?: ItemsMessage<{ exact: number }>): this {\n return this._refine<ArrayMeta>(\n (value) => value.length === exact,\n (value, m) =>\n issue(ErrorCode.invalid_length, resolveMessage(message ?? m.array.length, { exact, value }), { exact }),\n (current) => ({ maxItems: atMost(current.maxItems, exact), minItems: atLeast(current.minItems, exact) }),\n );\n }\n\n nonEmpty(message?: ItemsMessage): this {\n return this._refine<ArrayMeta>(\n (value) => value.length > 0,\n (value, m) => issue(ErrorCode.too_small, resolveMessage(message ?? m.array.nonEmpty, { value }), { min: 1 }),\n (current) => ({ minItems: atLeast(current.minItems, 1) }),\n );\n }\n\n /**\n * Requires distinct items under `SameValueZero` (reference equality for objects), or distinct\n * `by(item)` keys. A `by` selector is runtime behavior, so `definition()` then throws.\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique({ by: (item) => item.id })\n */\n unique(options: { by?: (item: InferOutput<T>) => unknown; message?: ItemsMessage } = {}): this {\n const { by, message } = options;\n const next = this._refine<ArrayMeta>(\n (value) => new Set(by ? value.map(by) : value).size === value.length,\n (value, m) => issue(ErrorCode.invalid_unique, resolveMessage(message ?? m.array.unique, { value })),\n by ? undefined : () => ({ uniqueItems: true }),\n );\n\n return by ? next._with({ portable: false }) : next;\n }\n\n protected override _describe(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n ...(this.state.meta as Partial<ArrayMeta>),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n}\n"],"mappings":"A,mNA6BA,IAAaA,EAAb,cAAsDC,CAA0C,CAC9F,WAEA,YAAY,EAAe,CACzB,MAAM,EACN,KAAK,WAAaC,CACpB,CAEA,IAAa,MAAmB,CAC9B,MAAO,OACT,CAGA,OAA0B,EAAgB,EAA2C,CAGnF,OAFK,MAAM,QAAQC,CAAK,EAEjBC,EAAMC,EAAIF,EAAM,IAAK,GAAS,KAAK,WAAW,KAAKG,EAAMC,CAAG,CAAC,CAAC,EAAI,GAAY,CACnF,IAAMC,EAAkB,CAAC,EASzB,MAAO,CAAE,SAAQ,OAAQ,GAAM,MARhBC,EAAQ,KAAK,EAAQ,IAC9BC,EAAO,OAAO,SAAW,EAAUA,EAAO,OAE9CF,EAAO,KAAK,GAAGG,EAAaD,EAAO,OAAQE,CAAK,CAAC,EAE1CT,EAAMS,GAGuB,CAAO,CAC/C,CAAC,EAbiCC,EAAQV,EAAOW,EAAMC,EAAU,aAAcR,EAAI,SAAS,MAAM,KAAK,CAAC,CAAC,CAc3G,CAEA,IAAI,EAAgB,EAA+C,CACjE,OAAO,KAAK,QACT,GAAUJ,EAAM,QAAUa,GAC1B,EAAO,IACNF,EAAMC,EAAU,UAAWE,EAAeC,GAAWC,EAAE,MAAM,IAAK,CAAE,IAAKH,EAAQ,OAAM,CAAC,EAAG,CAAE,IAAKA,CAAO,CAAC,EAC3G,IAAa,CAAE,SAAUI,EAAQC,EAAQ,SAAUL,CAAM,CAAE,EAC9D,CACF,CAEA,IAAI,EAAgB,EAA+C,CACjE,OAAO,KAAK,QACT,GAAUb,EAAM,QAAUa,GAC1B,EAAO,IACNF,EAAMC,EAAU,QAASE,EAAeC,GAAWC,EAAE,MAAM,IAAK,CAAE,IAAKH,EAAQ,OAAM,CAAC,EAAG,CAAE,IAAKA,CAAO,CAAC,EACzG,IAAa,CAAE,SAAUM,EAAOD,EAAQ,SAAUL,CAAM,CAAE,EAC7D,CACF,CAEA,OAAO,EAAe,EAAiD,CACrE,OAAO,KAAK,QACT,GAAUb,EAAM,SAAWoB,GAC3B,EAAO,IACNT,EAAMC,EAAU,eAAgBE,EAAeC,GAAWC,EAAE,MAAM,OAAQ,CAAE,QAAO,OAAM,CAAC,EAAG,CAAE,OAAM,CAAC,EACvG,IAAa,CAAE,SAAUG,EAAOD,EAAQ,SAAUE,CAAK,EAAG,SAAUH,EAAQC,EAAQ,SAAUE,CAAK,CAAE,EACxG,CACF,CAEA,SAAS,EAA8B,CACrC,OAAO,KAAK,QACT,GAAUpB,EAAM,OAAS,GACzB,EAAO,IAAMW,EAAMC,EAAU,UAAWE,EAAeC,GAAWC,EAAE,MAAM,SAAU,CAAE,OAAM,CAAC,EAAG,CAAE,IAAK,CAAE,CAAC,EAC1G,IAAa,CAAE,SAAUC,EAAQC,EAAQ,SAAU,CAAC,CAAE,EACzD,CACF,CASA,OAAO,EAA8E,CAAC,EAAS,CAC7F,GAAM,CAAE,KAAI,WAAYG,EAClBC,EAAO,KAAK,QACf,GAAU,IAAI,IAAIC,EAAKvB,EAAM,IAAIuB,CAAE,EAAIvB,CAAK,CAAC,CAAC,OAASA,EAAM,QAC7D,EAAO,IAAMW,EAAMC,EAAU,eAAgBE,EAAeC,GAAWC,EAAE,MAAM,OAAQ,CAAE,OAAM,CAAC,CAAC,EAClGO,EAAK,IAAA,QAAmB,CAAE,YAAa,EAAK,EAC9C,EAEA,OAAOA,EAAKD,EAAK,MAAM,CAAE,SAAU,EAAM,CAAC,EAAIA,CAChD,CAEA,WAAiD,CAC/C,MAAO,CACL,GAAG,KAAK,cAAc,EACtB,GAAI,KAAK,MAAM,KACf,MAAO,KAAK,WAAW,WAAW,EAClC,KAAM,OACR,CACF,CACF,E"}
@@ -1,2 +1,2 @@
1
- const e=require("../errors.cjs");require("../_dev.cjs");const t=require("../types.cjs"),n=require("../core.cjs");var r=class r extends n.Schema{get _kind(){return`bigint`}constructor(){super((n,r)=>typeof n==`bigint`?null:e.fail(t.ErrorCode.invalid_type,r.messages.bigint.type()))}min(n,r){return this._addConstraint((i,a)=>{let o=i;return o>=n?null:e.fail(t.ErrorCode.too_small,e.resolveMessage(r??a.messages.bigint.min,{min:n,value:o}),{min:n})})}max(n,r){return this._addConstraint((i,a)=>{let o=i;return o<=n?null:e.fail(t.ErrorCode.too_big,e.resolveMessage(r??a.messages.bigint.max,{max:n,value:o}),{max:n})})}positive(n){return this._addConstraint((r,i)=>{let a=r;return a>0n?null:e.fail(t.ErrorCode.too_small,e.resolveMessage(n??i.messages.bigint.positive,{value:a}),{exclusive:!0,min:0n})})}negative(n){return this._addConstraint((r,i)=>{let a=r;return a<0n?null:e.fail(t.ErrorCode.too_big,e.resolveMessage(n??i.messages.bigint.negative,{value:a}),{exclusive:!0,max:0n})})}nonNegative(n){return this._addConstraint((r,i)=>{let a=r;return a>=0n?null:e.fail(t.ErrorCode.too_small,e.resolveMessage(n??i.messages.bigint.nonNegative,{value:a}),{min:0n})})}nonPositive(n){return this._addConstraint((r,i)=>{let a=r;return a<=0n?null:e.fail(t.ErrorCode.too_big,e.resolveMessage(n??i.messages.bigint.nonPositive,{value:a}),{max:0n})})}multipleOf(n,r){return this._addConstraint((i,a)=>{let o=i;return o%n===0n?null:e.fail(t.ErrorCode.invalid_multiple_of,e.resolveMessage(r??a.messages.bigint.multipleOf,{step:n,value:o}),{step:n})})}_toDescriptorImpl(){return this.state.validators.length,{...this._describeBase(),kind:`bigint`}}static coerce(){return new r().preprocess(e=>{if(typeof e==`bigint`)return e;if(typeof e==`number`){if(!Number.isFinite(e)||!Number.isInteger(e))return e;try{return BigInt(e)}catch{return e}}if(typeof e==`string`){let t=e.trim();if(t.length===0||t.length>1e3)return e;try{return BigInt(t)}catch{return e}}return e})}};exports.BigIntSchema=r;
1
+ const e=require("../_parse.cjs"),t=require("../schema.cjs"),n=require("../types.cjs");var r=class extends t.Schema{get kind(){return`bigint`}_parse(t,r){return typeof t==`bigint`?e.ok(t):e.invalid(t,e.issue(n.ErrorCode.invalid_type,r.messages.bigint.type()))}min(t,r){return this._refine(e=>e>=t,(i,a)=>e.issue(n.ErrorCode.too_small,e.resolveMessage(r??a.bigint.min,{min:t,value:i}),{min:t}),n=>({minimum:e.atLeast(n.minimum,t)}))}max(t,r){return this._refine(e=>e<=t,(i,a)=>e.issue(n.ErrorCode.too_big,e.resolveMessage(r??a.bigint.max,{max:t,value:i}),{max:t}),n=>({maximum:e.atMost(n.maximum,t)}))}positive(t){return this._refine(e=>e>0n,(r,i)=>e.issue(n.ErrorCode.too_small,e.resolveMessage(t??i.bigint.positive,{value:r}),{exclusive:!0,min:0n}),t=>({exclusiveMinimum:e.atLeast(t.exclusiveMinimum,0n)}))}negative(t){return this._refine(e=>e<0n,(r,i)=>e.issue(n.ErrorCode.too_big,e.resolveMessage(t??i.bigint.negative,{value:r}),{exclusive:!0,max:0n}),t=>({exclusiveMaximum:e.atMost(t.exclusiveMaximum,0n)}))}nonNegative(t){return this._refine(e=>e>=0n,(r,i)=>e.issue(n.ErrorCode.too_small,e.resolveMessage(t??i.bigint.nonNegative,{value:r}),{min:0n}),t=>({minimum:e.atLeast(t.minimum,0n)}))}nonPositive(t){return this._refine(e=>e<=0n,(r,i)=>e.issue(n.ErrorCode.too_big,e.resolveMessage(t??i.bigint.nonPositive,{value:r}),{max:0n}),t=>({maximum:e.atMost(t.maximum,0n)}))}multipleOf(t,r){return this._refine(e=>t!==0n&&e%t===0n,(i,a)=>e.issue(n.ErrorCode.invalid_multiple_of,e.resolveMessage(r??a.bigint.multipleOf,{step:t,value:i}),{step:t}),()=>({multipleOf:t}))}_describe(){return{...this._describeBase(),...this.state.meta,kind:`bigint`}}};exports.BigIntSchema=r;
2
2
  //# sourceMappingURL=bigint.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bigint.cjs","names":["Schema","fail","ErrorCode","resolveMessage","require_errors","require_types","require_core","BigIntSchema","value","ctx","typed","minimum","message","maximum","step","trimmed"],"sources":["../../src/schemas/bigint.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { MessageFn, SchemaDescriptor } from '../core';\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\n\nexport class BigIntSchema<Input = bigint> extends Schema<bigint, Input> {\n protected override get _kind(): string {\n return 'bigint';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'bigint' ? null : fail(ErrorCode.invalid_type, ctx!.messages.bigint.type()),\n );\n }\n\n min(minimum: bigint, message?: MessageFn<{ min: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed >= minimum) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.bigint.min, { min: minimum, value: typed }),\n { min: minimum },\n );\n });\n }\n\n max(maximum: bigint, message?: MessageFn<{ max: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed <= maximum) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.bigint.max, { max: maximum, value: typed }),\n { max: maximum },\n );\n });\n }\n\n positive(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed > 0n) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.bigint.positive, { value: typed }), {\n exclusive: true,\n min: 0n,\n });\n });\n }\n\n negative(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed < 0n) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.bigint.negative, { value: typed }), {\n exclusive: true,\n max: 0n,\n });\n });\n }\n\n nonNegative(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed >= 0n) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.bigint.nonNegative, { value: typed }), {\n min: 0n,\n });\n });\n }\n\n nonPositive(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed <= 0n) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.bigint.nonPositive, { value: typed }), {\n max: 0n,\n });\n });\n }\n\n multipleOf(step: bigint, message?: MessageFn<{ step: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed % step === 0n) return null;\n\n return fail(\n ErrorCode.invalid_multiple_of,\n resolveMessage(message ?? ctx!.messages.bigint.multipleOf, { step, value: typed }),\n { step },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n if (this.state.validators.length > 0) {\n warn(\n 'definition(): this bigint schema has constraints (e.g. min(), max(), positive()). ' +\n 'BigInt constraints are not serializable and will not appear in the definition.',\n );\n }\n\n return { ...this._describeBase(), kind: 'bigint' };\n }\n\n static coerce(): BigIntSchema<unknown> {\n return new BigIntSchema().preprocess((value: unknown) => {\n if (typeof value === 'bigint') return value;\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value)) return value;\n\n try {\n return BigInt(value);\n } catch {\n return value;\n }\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Guard against DoS: BigInt() conversion is O(n²) in digit count.\n if (trimmed.length === 0 || trimmed.length > 1000) return value;\n\n try {\n return BigInt(trimmed);\n } catch {\n return value;\n }\n }\n\n return value;\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bigint.cjs","names":["Schema","ok","invalid","issue","ErrorCode","resolveMessage","atLeast","atMost","require__parse","require_schema","require_types","BigIntSchema","value","ctx","minimum","message","m","current","maximum","step"],"sources":["../../src/schemas/bigint.ts"],"sourcesContent":["import {\n atLeast,\n atMost,\n invalid,\n issue,\n type MaybePromise,\n ok,\n type ParseValue,\n type RunContext,\n resolveMessage,\n} from '../_parse';\nimport { Schema } from '../schema';\nimport { ErrorCode, type MessageFn, type SchemaDescriptor, type SchemaKind } from '../types';\n\ntype BigIntMeta = {\n exclusiveMaximum: bigint;\n exclusiveMinimum: bigint;\n maximum: bigint;\n minimum: bigint;\n multipleOf: bigint;\n};\n\ntype ValueMessage = MessageFn<{ value: bigint }>;\n\nexport class BigIntSchema<Input = bigint> extends Schema<bigint, Input> {\n override get kind(): SchemaKind {\n return 'bigint';\n }\n\n protected override _parse(value: unknown, ctx: RunContext): MaybePromise<ParseValue> {\n return typeof value === 'bigint'\n ? ok(value)\n : invalid(value, issue(ErrorCode.invalid_type, ctx.messages.bigint.type()));\n }\n\n min(minimum: bigint, message?: MessageFn<{ min: bigint; value: bigint }>): this {\n return this._refine<BigIntMeta>(\n (value) => value >= minimum,\n (value, m) =>\n issue(ErrorCode.too_small, resolveMessage(message ?? m.bigint.min, { min: minimum, value }), { min: minimum }),\n (current) => ({ minimum: atLeast(current.minimum, minimum) }),\n );\n }\n\n max(maximum: bigint, message?: MessageFn<{ max: bigint; value: bigint }>): this {\n return this._refine<BigIntMeta>(\n (value) => value <= maximum,\n (value, m) =>\n issue(ErrorCode.too_big, resolveMessage(message ?? m.bigint.max, { max: maximum, value }), { max: maximum }),\n (current) => ({ maximum: atMost(current.maximum, maximum) }),\n );\n }\n\n positive(message?: ValueMessage): this {\n return this._refine<BigIntMeta>(\n (value) => value > 0n,\n (value, m) =>\n issue(ErrorCode.too_small, resolveMessage(message ?? m.bigint.positive, { value }), {\n exclusive: true,\n min: 0n,\n }),\n (current) => ({ exclusiveMinimum: atLeast(current.exclusiveMinimum, 0n) }),\n );\n }\n\n negative(message?: ValueMessage): this {\n return this._refine<BigIntMeta>(\n (value) => value < 0n,\n (value, m) =>\n issue(ErrorCode.too_big, resolveMessage(message ?? m.bigint.negative, { value }), { exclusive: true, max: 0n }),\n (current) => ({ exclusiveMaximum: atMost(current.exclusiveMaximum, 0n) }),\n );\n }\n\n nonNegative(message?: ValueMessage): this {\n return this._refine<BigIntMeta>(\n (value) => value >= 0n,\n (value, m) => issue(ErrorCode.too_small, resolveMessage(message ?? m.bigint.nonNegative, { value }), { min: 0n }),\n (current) => ({ minimum: atLeast(current.minimum, 0n) }),\n );\n }\n\n nonPositive(message?: ValueMessage): this {\n return this._refine<BigIntMeta>(\n (value) => value <= 0n,\n (value, m) => issue(ErrorCode.too_big, resolveMessage(message ?? m.bigint.nonPositive, { value }), { max: 0n }),\n (current) => ({ maximum: atMost(current.maximum, 0n) }),\n );\n }\n\n multipleOf(step: bigint, message?: MessageFn<{ step: bigint; value: bigint }>): this {\n return this._refine<BigIntMeta>(\n // A zero step can never divide: fail as an issue like NumberSchema does,\n // instead of letting `value % step` throw RangeError from the check.\n (value) => step !== 0n && value % step === 0n,\n (value, m) =>\n issue(ErrorCode.invalid_multiple_of, resolveMessage(message ?? m.bigint.multipleOf, { step, value }), { step }),\n () => ({ multipleOf: step }),\n );\n }\n\n protected override _describe(): SchemaDescriptor {\n return { ...this._describeBase(), ...(this.state.meta as Partial<BigIntMeta>), kind: 'bigint' };\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,12 @@
1
- import type { MessageFn, SchemaDescriptor } from '../core';
2
- import { Schema } from '../core';
1
+ import { type MaybePromise, type ParseValue, type RunContext } from '../_parse';
2
+ import { Schema } from '../schema';
3
+ import { type MessageFn, type SchemaDescriptor, type SchemaKind } from '../types';
4
+ type ValueMessage = MessageFn<{
5
+ value: bigint;
6
+ }>;
3
7
  export declare class BigIntSchema<Input = bigint> extends Schema<bigint, Input> {
4
- protected get _kind(): string;
5
- constructor();
8
+ get kind(): SchemaKind;
9
+ protected _parse(value: unknown, ctx: RunContext): MaybePromise<ParseValue>;
6
10
  min(minimum: bigint, message?: MessageFn<{
7
11
  min: bigint;
8
12
  value: bigint;
@@ -11,23 +15,15 @@ export declare class BigIntSchema<Input = bigint> extends Schema<bigint, Input>
11
15
  max: bigint;
12
16
  value: bigint;
13
17
  }>): this;
14
- positive(message?: MessageFn<{
15
- value: bigint;
16
- }>): this;
17
- negative(message?: MessageFn<{
18
- value: bigint;
19
- }>): this;
20
- nonNegative(message?: MessageFn<{
21
- value: bigint;
22
- }>): this;
23
- nonPositive(message?: MessageFn<{
24
- value: bigint;
25
- }>): this;
18
+ positive(message?: ValueMessage): this;
19
+ negative(message?: ValueMessage): this;
20
+ nonNegative(message?: ValueMessage): this;
21
+ nonPositive(message?: ValueMessage): this;
26
22
  multipleOf(step: bigint, message?: MessageFn<{
27
23
  step: bigint;
28
24
  value: bigint;
29
25
  }>): this;
30
- protected _toDescriptorImpl(): SchemaDescriptor;
31
- static coerce(): BigIntSchema<unknown>;
26
+ protected _describe(): SchemaDescriptor;
32
27
  }
28
+ export {};
33
29
  //# sourceMappingURL=bigint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bigint.d.ts","sourceRoot":"","sources":["../../src/schemas/bigint.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAmC,MAAM,EAAE,MAAM,SAAS,CAAC;AAElE,qBAAa,YAAY,CAAC,KAAK,GAAG,MAAM,CAAE,SAAQ,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IACrE,cAAuB,KAAK,IAAI,MAAM,CAErC;;IAQD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAc/E,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAc/E,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAatD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAatD,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAYzD,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAYzD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;cAcjE,iBAAiB,IAAI,gBAAgB;IAWxD,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC;CA8BvC"}
1
+ {"version":3,"file":"bigint.d.ts","sourceRoot":"","sources":["../../src/schemas/bigint.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,YAAY,EAEjB,KAAK,UAAU,EACf,KAAK,UAAU,EAEhB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAa,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAU7F,KAAK,YAAY,GAAG,SAAS,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBAAa,YAAY,CAAC,KAAK,GAAG,MAAM,CAAE,SAAQ,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IACrE,IAAa,IAAI,IAAI,UAAU,CAE9B;cAEkB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;IAMpF,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAS/E,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAS/E,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAYtC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAStC,WAAW,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAQzC,WAAW,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAQzC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;cAWjE,SAAS,IAAI,gBAAgB;CAGjD"}