@vielzeug/spell 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/core.cjs.map +1 -1
  2. package/dist/core.d.ts +2 -2
  3. package/dist/core.d.ts.map +1 -1
  4. package/dist/core.js.map +1 -1
  5. package/dist/s.cjs.map +1 -1
  6. package/dist/s.d.ts +2 -2
  7. package/dist/s.d.ts.map +1 -1
  8. package/dist/s.js.map +1 -1
  9. package/dist/schemas/array.cjs.map +1 -1
  10. package/dist/schemas/array.d.ts +4 -4
  11. package/dist/schemas/array.d.ts.map +1 -1
  12. package/dist/schemas/array.js.map +1 -1
  13. package/dist/schemas/bigint.cjs.map +1 -1
  14. package/dist/schemas/bigint.d.ts +4 -4
  15. package/dist/schemas/bigint.d.ts.map +1 -1
  16. package/dist/schemas/bigint.js.map +1 -1
  17. package/dist/schemas/boolean.cjs.map +1 -1
  18. package/dist/schemas/boolean.d.ts +4 -4
  19. package/dist/schemas/boolean.d.ts.map +1 -1
  20. package/dist/schemas/boolean.js.map +1 -1
  21. package/dist/schemas/date.cjs.map +1 -1
  22. package/dist/schemas/date.d.ts +4 -4
  23. package/dist/schemas/date.d.ts.map +1 -1
  24. package/dist/schemas/date.js.map +1 -1
  25. package/dist/schemas/enum.cjs.map +1 -1
  26. package/dist/schemas/enum.d.ts +4 -4
  27. package/dist/schemas/enum.d.ts.map +1 -1
  28. package/dist/schemas/enum.js.map +1 -1
  29. package/dist/schemas/instanceof.cjs.map +1 -1
  30. package/dist/schemas/instanceof.d.ts +6 -6
  31. package/dist/schemas/instanceof.d.ts.map +1 -1
  32. package/dist/schemas/instanceof.js.map +1 -1
  33. package/dist/schemas/intersect.cjs.map +1 -1
  34. package/dist/schemas/intersect.d.ts +4 -4
  35. package/dist/schemas/intersect.d.ts.map +1 -1
  36. package/dist/schemas/intersect.js.map +1 -1
  37. package/dist/schemas/lazy.cjs.map +1 -1
  38. package/dist/schemas/lazy.d.ts +4 -4
  39. package/dist/schemas/lazy.d.ts.map +1 -1
  40. package/dist/schemas/lazy.js.map +1 -1
  41. package/dist/schemas/literal.cjs.map +1 -1
  42. package/dist/schemas/literal.d.ts +4 -4
  43. package/dist/schemas/literal.d.ts.map +1 -1
  44. package/dist/schemas/literal.js.map +1 -1
  45. package/dist/schemas/map.cjs.map +1 -1
  46. package/dist/schemas/map.d.ts +4 -4
  47. package/dist/schemas/map.d.ts.map +1 -1
  48. package/dist/schemas/map.js.map +1 -1
  49. package/dist/schemas/never.cjs.map +1 -1
  50. package/dist/schemas/never.d.ts +4 -4
  51. package/dist/schemas/never.d.ts.map +1 -1
  52. package/dist/schemas/never.js.map +1 -1
  53. package/dist/schemas/number.cjs.map +1 -1
  54. package/dist/schemas/number.d.ts +4 -4
  55. package/dist/schemas/number.d.ts.map +1 -1
  56. package/dist/schemas/number.js.map +1 -1
  57. package/dist/schemas/object.cjs +1 -1
  58. package/dist/schemas/object.cjs.map +1 -1
  59. package/dist/schemas/object.d.ts +7 -7
  60. package/dist/schemas/object.d.ts.map +1 -1
  61. package/dist/schemas/object.js +1 -1
  62. package/dist/schemas/object.js.map +1 -1
  63. package/dist/schemas/record.cjs +1 -1
  64. package/dist/schemas/record.cjs.map +1 -1
  65. package/dist/schemas/record.d.ts +4 -4
  66. package/dist/schemas/record.d.ts.map +1 -1
  67. package/dist/schemas/record.js +1 -1
  68. package/dist/schemas/record.js.map +1 -1
  69. package/dist/schemas/set.cjs.map +1 -1
  70. package/dist/schemas/set.d.ts +4 -4
  71. package/dist/schemas/set.d.ts.map +1 -1
  72. package/dist/schemas/set.js.map +1 -1
  73. package/dist/schemas/string.cjs +1 -1
  74. package/dist/schemas/string.cjs.map +1 -1
  75. package/dist/schemas/string.d.ts +4 -12
  76. package/dist/schemas/string.d.ts.map +1 -1
  77. package/dist/schemas/string.js +1 -1
  78. package/dist/schemas/string.js.map +1 -1
  79. package/dist/schemas/tuple.cjs.map +1 -1
  80. package/dist/schemas/tuple.d.ts +5 -5
  81. package/dist/schemas/tuple.d.ts.map +1 -1
  82. package/dist/schemas/tuple.js.map +1 -1
  83. package/dist/schemas/union.cjs.map +1 -1
  84. package/dist/schemas/union.d.ts +4 -4
  85. package/dist/schemas/union.d.ts.map +1 -1
  86. package/dist/schemas/union.js.map +1 -1
  87. package/dist/schemas/variant.cjs.map +1 -1
  88. package/dist/schemas/variant.d.ts +4 -4
  89. package/dist/schemas/variant.d.ts.map +1 -1
  90. package/dist/schemas/variant.js.map +1 -1
  91. package/dist/spell.cjs +1 -1
  92. package/dist/spell.cjs.map +1 -1
  93. package/dist/spell.iife.js +1 -1
  94. package/dist/spell.iife.js.map +1 -1
  95. package/dist/spell.js +1 -1
  96. package/dist/spell.js.map +1 -1
  97. package/package.json +1 -1
  98. package/dist/schemas/pipe.d.ts +0 -2
  99. package/dist/schemas/pipe.d.ts.map +0 -1
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.cjs","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal/guards';\n\nimport { SpellDefinitionError, SpellValidationError } from './errors';\nimport { createParseContext } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type InferSchemaMode,\n type Issue,\n type JsonSchema,\n type MergeSchemaModes,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaMode,\n type SchemaWalker,\n schemaInput,\n schemaMode,\n schemaOutput,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n fail,\n prependIssuePath,\n resolveMessage,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n} from './errors';\nexport {\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type InferSchemaMode,\n type Issue,\n type JsonSchema,\n type MergeSchemaModes,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaMode,\n type SchemaWalker,\n schemaMode,\n type ValidateFn,\n type ValidateResult,\n};\n\nfunction deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n\nfunction materializeValue<T>(value: T): T {\n if (value == null || typeof value !== 'object') return value;\n\n if (Array.isArray(value)) return value.map((item) => materializeValue(item)) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) {\n const out = new Map<unknown, unknown>();\n\n for (const [key, mapValue] of value.entries()) out.set(materializeValue(key), materializeValue(mapValue));\n\n return out as T;\n }\n\n if (value instanceof Set) return new Set([...value.values()].map((item) => materializeValue(item))) as T;\n\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) defineOwnProperty(out, key, materializeValue(entry));\n\n return out as T;\n }\n\n return value;\n}\n\n/* -------------------- Schema State -------------------- */\n\ntype Preprocessor = (value: unknown) => unknown;\ntype Postprocessor = (value: unknown) => unknown;\n\nexport interface SchemaState<Output = unknown> {\n catch?: () => Output;\n defaultValue?: () => Output;\n description?: string;\n hasAsyncChecks: boolean;\n hasRuntimeChecks: boolean;\n isNullable: boolean;\n isOptional: boolean;\n postprocessors: Postprocessor[];\n preprocessors: Preprocessor[];\n validators: ValidateFn[];\n}\n\nfunction defaultState<Output>(): SchemaState<Output> {\n return {\n hasAsyncChecks: false,\n hasRuntimeChecks: false,\n isNullable: false,\n isOptional: false,\n postprocessors: [],\n preprocessors: [],\n validators: [],\n };\n}\n\nfunction cloneState<Output>(state: SchemaState<Output>): SchemaState<Output> {\n return {\n catch: state.catch,\n defaultValue: state.defaultValue,\n description: state.description,\n hasAsyncChecks: state.hasAsyncChecks,\n hasRuntimeChecks: state.hasRuntimeChecks,\n isNullable: state.isNullable,\n isOptional: state.isOptional,\n postprocessors: [...state.postprocessors],\n preprocessors: [...state.preprocessors],\n validators: [...state.validators],\n };\n}\n\n/* -------------------- Internal parse-value return type -------------------- */\n\n/** @internal */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/* -------------------- ParseContext default -------------------- */\n\n/** @internal */\nexport function _makeCtx(messages?: Messages): ParseContext {\n return messages ? { messages } : createParseContext();\n}\n\n/* -------------------- ValidateResult normalizer -------------------- */\n\nfunction normalizeValidateResult(result: ValidateResult, ctxIssues: Issue[], ctx: ParseContext): Issue[] | null {\n const issues = [...ctxIssues];\n\n if (typeof result === 'string') {\n issues.push({ code: ErrorCode.custom, message: result, path: [] });\n } else if (result === false && issues.length === 0) {\n issues.push({ code: ErrorCode.custom, message: ctx.messages.check.default(), path: [] });\n }\n\n return issues.length ? issues : null;\n}\n\n/* -------------------- Base Schema -------------------- */\n\nexport class Schema<Output = unknown, Input = Output, Mode extends SchemaMode = 'sync'> {\n declare readonly [schemaInput]: Input;\n declare readonly [schemaMode]: Mode;\n declare readonly [schemaOutput]: Output;\n\n protected state: SchemaState<Output>;\n\n protected _annotations: Record<string, unknown> = {};\n\n private _typeValidator: ValidateFn | null = null;\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): Output;\n parse(value: unknown, ctx?: ParseContext): Output {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'parse() cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n\n return this._withCatch(() => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'parse() received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): ParseResult<Output>;\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return {\n data: (this.parse as unknown as (value: unknown, ctx?: ParseContext) => Output)(value, ctx),\n success: true,\n };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n async parseAsync(value: unknown, ctx?: ParseContext): Promise<Output> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n async safeParseAsync(value: unknown, ctx?: ParseContext): Promise<ParseResult<Output>> {\n try {\n return { data: await this.parseAsync(value, ctx), success: true };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n /**\n * Internal full parse without throwing. Returns { data, issues }.\n * Used by composite schemas (array, object, union, etc.) to avoid\n * the try/catch + object allocation overhead of safeParse().\n * @internal\n */\n _parseFullSync(value: unknown, ctx?: ParseContext): { data: unknown; issues: Issue[] } {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'Sync parsing cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parse path received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /**\n * Async version of _parseFullSync.\n * @internal\n */\n async _parseFullAsync(value: unknown, ctx?: ParseContext): Promise<{ data: unknown; issues: Issue[] }> {\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /* -------------------- Validators -------------------- */\n\n /**\n * Add a synchronous domain rule. For asynchronous work, use `checkAsync()`;\n * making execution mode explicit prevents unchecked Promise-returning callbacks.\n */\n check<F extends (value: Output, ctx: CheckContext) => ValidateResult | Promise<ValidateResult>>(\n fn: ReturnType<F> extends PromiseLike<unknown> ? never : F,\n ): this {\n return this._addCheck(fn as (value: Output, ctx: CheckContext) => ValidateResult, false);\n }\n\n checkAsync(\n this: Schema<Output, Input, 'sync'>,\n fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>,\n ): Schema<Output, Input, 'async'> {\n return this._addCheck(fn, true) as unknown as Schema<Output, Input, 'async'>;\n }\n\n protected _addCheck(\n fn:\n | ((value: Output, ctx: CheckContext) => ValidateResult)\n | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>),\n async: boolean,\n ): this {\n const validator: ValidateFn = (value, ctx) => {\n const ctxIssues: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: (issue) => ctxIssues.push({ ...issue, path: issue.path ?? [] } as Issue),\n };\n const result = fn(value as Output, checkCtx);\n\n if (result instanceof Promise) {\n return result.then((r) => normalizeValidateResult(r, ctxIssues, ctx!));\n }\n\n return normalizeValidateResult(result, ctxIssues, ctx!);\n };\n\n const next = this._addConstraint(validator);\n\n next.state.hasRuntimeChecks = true;\n\n if (async) next.state.hasAsyncChecks = true;\n\n return next;\n }\n\n /* -------------------- Nullability / Optionality -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined, Mode>;\n\n cloned.state.isOptional = true;\n\n return cloned;\n }\n\n nullable(): Schema<Output | null, Input | null, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null, Mode>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined, Mode>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>, Mode> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>, Mode>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned;\n }\n\n catch(fallback: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input, Mode> {\n const next = this._clone() as unknown as Schema<NewOutput, Input, Mode>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B extends AnySchema>(next: B): PipeSchema<B, this, MergeSchemaModes<Mode | InferSchemaMode<B>>> {\n return new PipeSchema(this, next);\n }\n\n /* -------------------- Introspection -------------------- */\n\n label(description: string): this {\n const cloned = this._clone();\n\n cloned.state.description = description;\n\n return cloned;\n }\n\n definition(): SchemaDescriptor {\n if (\n this.state.catch ||\n this.state.defaultValue ||\n this.state.postprocessors.length > 0 ||\n this.state.preprocessors.length > 0 ||\n this.state.hasRuntimeChecks\n ) {\n throw new SpellDefinitionError(\n 'Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.',\n );\n }\n\n return deepFreeze(this._toDescriptorImpl()) as SchemaDescriptor;\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n get isOptional(): boolean {\n return this.state.isOptional;\n }\n\n get isNullable(): boolean {\n return this.state.isNullable;\n }\n\n is(value: unknown): value is Output {\n return (this.safeParse as unknown as (value: unknown) => ParseResult<Output>)(value).success;\n }\n\n assert(value: unknown, label?: string): asserts value is Output {\n const result = this._parseFullSync(value);\n\n if (result.issues.length === 0) return;\n\n const issues = label\n ? result.issues.map((issue) => ({\n ...issue,\n message: issue.path.length === 0 ? `${label}: ${issue.message}` : issue.message,\n }))\n : result.issues;\n\n throw new SpellValidationError(issues);\n }\n\n walk<R>(visitor: SchemaWalker<R>): R | null {\n return this._walk(visitor);\n }\n\n get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'any';\n }\n\n /* -------------------- Protected helpers -------------------- */\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n return {\n ...(this.state.description !== undefined ? { description: this.state.description } : {}),\n ...(this.state.isNullable ? { isNullable: true as const } : {}),\n ...(this.state.isOptional ? { isOptional: true as const } : {}),\n };\n }\n\n protected _addConstraint(\n validator: ValidateFn,\n mergeAnnotations?: (current: Record<string, unknown>) => Record<string, unknown>,\n ): this {\n const next = this._clone();\n\n next.state.validators.push(validator);\n\n if (mergeAnnotations) {\n next._annotations = mergeAnnotations({ ...next._annotations });\n }\n\n return next;\n }\n\n protected _construct(state: SchemaState<any>): this {\n const next = Object.assign(Object.create(Object.getPrototypeOf(this)), this, { state }) as this;\n\n next._annotations = { ...this._annotations };\n\n return next;\n }\n\n protected _clone(): this {\n return this._construct(cloneState(this.state));\n }\n\n protected _copyStateTo<T extends Schema<any, any>>(target: T): T {\n target.state = cloneState(this.state);\n\n return target;\n }\n\n protected _walk<R>(visitor: SchemaWalker<R>): R | null {\n if (visitor.unknown) return visitor.unknown(this);\n\n return null;\n }\n\n protected _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'any' };\n }\n\n /* -------------------- Private -------------------- */\n\n private _withCatch<T>(fn: () => T): T {\n if (!this.state.catch) return fn();\n\n try {\n return fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected async _withCatchAsync<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.state.catch) return fn();\n\n try {\n return await fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected _prepareInput(value: unknown): { skip: true; value: null | undefined } | { skip: false; value: unknown } {\n const processed = this._runPreprocessors(value);\n const withDefault = processed === undefined && this.state.defaultValue ? this.state.defaultValue() : processed;\n\n if ((this.state.isOptional && withDefault === undefined) || (this.state.isNullable && withDefault === null)) {\n return { skip: true, value: withDefault };\n }\n\n return { skip: false, value: withDefault };\n }\n\n protected _runPreprocessors(value: unknown): unknown {\n let current = value;\n\n for (const preprocess of this.state.preprocessors) current = preprocess(current);\n\n return current;\n }\n\n protected _runPostprocessors(value: unknown): unknown {\n let current = value;\n\n for (const postprocess of this.state.postprocessors) current = postprocess(current);\n\n return current;\n }\n\n private _runValidatorsSync(value: unknown, ctx: ParseContext): Issue[] {\n if (this._typeValidator) {\n const typeResult = this._typeValidator(value, ctx);\n\n if (typeResult instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Type validator returned a Promise. Use parseAsync() for async validation.',\n path: [],\n },\n ]);\n }\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = validate(value, ctx);\n\n if (result instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parsing received an async check. Use checkAsync() and parseAsync().',\n path: [],\n },\n ]);\n }\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected async _runValidatorsAsync(value: unknown, ctx: ParseContext): Promise<Issue[]> {\n if (this._typeValidator) {\n const typeResult = await this._typeValidator(value, ctx);\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = await validate(value, ctx);\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected _parse(_value: unknown, _ctx: ParseContext): MaybePromise<ParseValue> {\n return { data: _value, issues: [], typeOk: true };\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<\n To extends AnySchema,\n From extends AnySchema,\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<To | From>>,\n> extends Schema<InferOutput<To>, InferInput<From>, Mode> {\n readonly from: From;\n readonly to: To;\n\n protected override get _kind(): string {\n return 'pipe';\n }\n\n override checkAsync(\n this: PipeSchema<To, From, 'sync'>,\n fn: (value: InferOutput<To>, ctx: CheckContext) => Promise<ValidateResult>,\n ): PipeSchema<To, From, 'async'> {\n return this._addCheck(fn, true) as unknown as PipeSchema<To, From, 'async'>;\n }\n\n constructor(from: From, to: To) {\n super();\n this.from = from;\n this.to = to;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): MaybePromise<ParseValue> {\n const r1OrPromise = this.from._parseFullSync(value, ctx);\n\n if (r1OrPromise instanceof Promise) {\n return (r1OrPromise as Promise<{ data: unknown; issues: Issue[] }>).then((r1) => {\n if (r1.issues.length > 0) return { data: value, issues: r1.issues, typeOk: false };\n\n return this.to\n ._parseFullAsync(r1.data, ctx)\n .then((r2) =>\n r2.issues.length > 0\n ? { data: r1.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n });\n }\n\n if (r1OrPromise.issues.length > 0) return { data: value, issues: r1OrPromise.issues, typeOk: false };\n\n const r2OrPromise = this.to._parseFullSync(r1OrPromise.data, ctx);\n\n if (r2OrPromise instanceof Promise) {\n return r2OrPromise.then((r2) =>\n r2.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n }\n\n return r2OrPromise.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2OrPromise.issues, typeOk: false }\n : { data: r2OrPromise.data, issues: [], typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<To>> {\n const c = ctx ?? _makeCtx();\n const first = await this.from._parseFullAsync(value, c);\n\n if (first.issues.length > 0) throw new SpellValidationError(first.issues);\n\n const second = await this.to._parseFullAsync(first.data, c);\n\n if (second.issues.length > 0) throw new SpellValidationError(second.issues);\n\n const issues = await this._runValidatorsAsync(second.data, c);\n\n if (issues.length > 0) throw new SpellValidationError(issues);\n\n return this._runPostprocessors(second.data) as InferOutput<To>;\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const fromR = this.from.walk(visitor);\n const toR = this.to.walk(visitor);\n\n if (visitor.pipe) return visitor.pipe(this, fromR, toR);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n from: this.from.definition(),\n kind: 'pipe',\n to: this.to.definition(),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.cjs","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal/guards';\n\nimport { SpellDefinitionError, SpellValidationError } from './errors';\nimport { createParseContext } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type InferSchemaMode,\n type Issue,\n type JsonSchema,\n type MergeSchemaModes,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaMode,\n type SchemaWalker,\n schemaInput,\n schemaMode,\n schemaOutput,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n fail,\n prependIssuePath,\n resolveMessage,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n} from './errors';\nexport {\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type InferSchemaMode,\n type Issue,\n type JsonSchema,\n type MergeSchemaModes,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaMode,\n type SchemaWalker,\n schemaMode,\n type ValidateFn,\n type ValidateResult,\n};\n\nfunction deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n\nfunction materializeValue<T>(value: T): T {\n if (value == null || typeof value !== 'object') return value;\n\n if (Array.isArray(value)) return value.map((item) => materializeValue(item)) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) {\n const out = new Map<unknown, unknown>();\n\n for (const [key, mapValue] of value.entries()) out.set(materializeValue(key), materializeValue(mapValue));\n\n return out as T;\n }\n\n if (value instanceof Set) return new Set([...value.values()].map((item) => materializeValue(item))) as T;\n\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) defineOwnProperty(out, key, materializeValue(entry));\n\n return out as T;\n }\n\n return value;\n}\n\n/* -------------------- Schema State -------------------- */\n\ntype Preprocessor = (value: unknown) => unknown;\ntype Postprocessor = (value: unknown) => unknown;\n\nexport interface SchemaState<Output = unknown> {\n catch?: () => Output;\n defaultValue?: () => Output;\n description?: string;\n hasAsyncChecks: boolean;\n hasRuntimeChecks: boolean;\n isNullable: boolean;\n isOptional: boolean;\n postprocessors: Postprocessor[];\n preprocessors: Preprocessor[];\n validators: ValidateFn[];\n}\n\nfunction defaultState<Output>(): SchemaState<Output> {\n return {\n hasAsyncChecks: false,\n hasRuntimeChecks: false,\n isNullable: false,\n isOptional: false,\n postprocessors: [],\n preprocessors: [],\n validators: [],\n };\n}\n\nfunction cloneState<Output>(state: SchemaState<Output>): SchemaState<Output> {\n return {\n catch: state.catch,\n defaultValue: state.defaultValue,\n description: state.description,\n hasAsyncChecks: state.hasAsyncChecks,\n hasRuntimeChecks: state.hasRuntimeChecks,\n isNullable: state.isNullable,\n isOptional: state.isOptional,\n postprocessors: [...state.postprocessors],\n preprocessors: [...state.preprocessors],\n validators: [...state.validators],\n };\n}\n\n/* -------------------- Internal parse-value return type -------------------- */\n\n/** @internal */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/* -------------------- ParseContext default -------------------- */\n\n/** @internal */\nexport function _makeCtx(messages?: Messages): ParseContext {\n return messages ? { messages } : createParseContext();\n}\n\n/* -------------------- ValidateResult normalizer -------------------- */\n\nfunction normalizeValidateResult(result: ValidateResult, ctxIssues: Issue[], ctx: ParseContext): Issue[] | null {\n const issues = [...ctxIssues];\n\n if (typeof result === 'string') {\n issues.push({ code: ErrorCode.custom, message: result, path: [] });\n } else if (result === false && issues.length === 0) {\n issues.push({ code: ErrorCode.custom, message: ctx.messages.check.default(), path: [] });\n }\n\n return issues.length ? issues : null;\n}\n\n/* -------------------- Base Schema -------------------- */\n\nexport class Schema<Output = unknown, Input = Output, Mode extends SchemaMode = 'sync'> {\n declare readonly [schemaInput]: Input;\n declare readonly [schemaMode]: Mode;\n declare readonly [schemaOutput]: Output;\n\n protected state: SchemaState<Output>;\n\n protected _annotations: Record<string, unknown> = {};\n\n private _typeValidator: ValidateFn | null = null;\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): Output;\n parse(value: unknown, ctx?: ParseContext): Output {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'parse() cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n\n return this._withCatch(() => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'parse() received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): ParseResult<Output>;\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return {\n data: (this.parse as unknown as (value: unknown, ctx?: ParseContext) => Output)(value, ctx),\n success: true,\n };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n async parseAsync(value: unknown, ctx?: ParseContext): Promise<Output> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n async safeParseAsync(value: unknown, ctx?: ParseContext): Promise<ParseResult<Output>> {\n try {\n return { data: await this.parseAsync(value, ctx), success: true };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n /**\n * Internal full parse without throwing. Returns { data, issues }.\n * Used by composite schemas (array, object, union, etc.) to avoid\n * the try/catch + object allocation overhead of safeParse().\n * @internal\n */\n _parseFullSync(value: unknown, ctx?: ParseContext): { data: unknown; issues: Issue[] } {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'Sync parsing cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parse path received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /**\n * Async version of _parseFullSync.\n * @internal\n */\n async _parseFullAsync(value: unknown, ctx?: ParseContext): Promise<{ data: unknown; issues: Issue[] }> {\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /* -------------------- Validators -------------------- */\n\n /**\n * Add a synchronous domain rule. For asynchronous work, use `checkAsync()`;\n * making execution mode explicit prevents unchecked Promise-returning callbacks.\n */\n check<F extends (value: Output, ctx: CheckContext) => ValidateResult | Promise<ValidateResult>>(\n fn: ReturnType<F> extends PromiseLike<unknown> ? never : F,\n ): this {\n return this._addCheck(fn as (value: Output, ctx: CheckContext) => ValidateResult, false);\n }\n\n checkAsync(\n this: Schema<Output, Input, 'sync'>,\n fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>,\n ): Schema<Output, Input, 'async'> {\n return this._addCheck(fn, true) as unknown as Schema<Output, Input, 'async'>;\n }\n\n protected _addCheck(\n fn:\n | ((value: Output, ctx: CheckContext) => ValidateResult)\n | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>),\n async: boolean,\n ): this {\n const validator: ValidateFn = (value, ctx) => {\n const ctxIssues: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: (issue) => ctxIssues.push({ ...issue, path: issue.path ?? [] } as Issue),\n };\n const result = fn(value as Output, checkCtx);\n\n if (result instanceof Promise) {\n return result.then((r) => normalizeValidateResult(r, ctxIssues, ctx!));\n }\n\n return normalizeValidateResult(result, ctxIssues, ctx!);\n };\n\n const next = this._addConstraint(validator);\n\n next.state.hasRuntimeChecks = true;\n\n if (async) next.state.hasAsyncChecks = true;\n\n return next;\n }\n\n /* -------------------- Nullability / Optionality -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined, Mode>;\n\n cloned.state.isOptional = true;\n\n return cloned;\n }\n\n nullable(): Schema<Output | null, Input | null, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null, Mode>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined, Mode>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>, Mode> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>, Mode>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned;\n }\n\n catch(fallback: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input, Mode> {\n const next = this._clone() as unknown as Schema<NewOutput, Input, Mode>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B extends AnySchema>(next: B): PipeSchema<B, this, MergeSchemaModes<Mode | InferSchemaMode<B>>> {\n return new PipeSchema(this, next);\n }\n\n /* -------------------- Introspection -------------------- */\n\n label(description: string): this {\n const cloned = this._clone();\n\n cloned.state.description = description;\n\n return cloned;\n }\n\n definition(): SchemaDescriptor {\n if (\n this.state.catch ||\n this.state.defaultValue ||\n this.state.postprocessors.length > 0 ||\n this.state.preprocessors.length > 0 ||\n this.state.hasRuntimeChecks\n ) {\n throw new SpellDefinitionError(\n 'Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.',\n );\n }\n\n return deepFreeze(this._toDescriptorImpl()) as SchemaDescriptor;\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n get isOptional(): boolean {\n return this.state.isOptional;\n }\n\n get isNullable(): boolean {\n return this.state.isNullable;\n }\n\n is(this: Schema<Output, Input, 'sync'>, value: unknown): value is Output {\n return this.safeParse(value).success;\n }\n\n assert(this: Schema<Output, Input, 'sync'>, value: unknown, label?: string): asserts value is Output {\n const result = this._parseFullSync(value);\n\n if (result.issues.length === 0) return;\n\n const issues = label\n ? result.issues.map((issue) => ({\n ...issue,\n message: issue.path.length === 0 ? `${label}: ${issue.message}` : issue.message,\n }))\n : result.issues;\n\n throw new SpellValidationError(issues);\n }\n\n walk<R>(visitor: SchemaWalker<R>): R | null {\n return this._walk(visitor);\n }\n\n get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'any';\n }\n\n /* -------------------- Protected helpers -------------------- */\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n return {\n ...(this.state.description !== undefined ? { description: this.state.description } : {}),\n ...(this.state.isNullable ? { isNullable: true as const } : {}),\n ...(this.state.isOptional ? { isOptional: true as const } : {}),\n };\n }\n\n protected _addConstraint(\n validator: ValidateFn,\n mergeAnnotations?: (current: Record<string, unknown>) => Record<string, unknown>,\n ): this {\n const next = this._clone();\n\n next.state.validators.push(validator);\n\n if (mergeAnnotations) {\n next._annotations = mergeAnnotations({ ...next._annotations });\n }\n\n return next;\n }\n\n protected _construct(state: SchemaState<any>): this {\n const next = Object.assign(Object.create(Object.getPrototypeOf(this)), this, { state }) as this;\n\n next._annotations = { ...this._annotations };\n\n return next;\n }\n\n protected _clone(): this {\n return this._construct(cloneState(this.state));\n }\n\n protected _copyStateTo<T extends Schema<any, any>>(target: T): T {\n target.state = cloneState(this.state);\n\n return target;\n }\n\n protected _walk<R>(visitor: SchemaWalker<R>): R | null {\n if (visitor.unknown) return visitor.unknown(this);\n\n return null;\n }\n\n protected _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'any' };\n }\n\n /* -------------------- Private -------------------- */\n\n private _withCatch<T>(fn: () => T): T {\n if (!this.state.catch) return fn();\n\n try {\n return fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected async _withCatchAsync<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.state.catch) return fn();\n\n try {\n return await fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected _prepareInput(value: unknown): { skip: true; value: null | undefined } | { skip: false; value: unknown } {\n const processed = this._runPreprocessors(value);\n const withDefault = processed === undefined && this.state.defaultValue ? this.state.defaultValue() : processed;\n\n if ((this.state.isOptional && withDefault === undefined) || (this.state.isNullable && withDefault === null)) {\n return { skip: true, value: withDefault };\n }\n\n return { skip: false, value: withDefault };\n }\n\n protected _runPreprocessors(value: unknown): unknown {\n let current = value;\n\n for (const preprocess of this.state.preprocessors) current = preprocess(current);\n\n return current;\n }\n\n protected _runPostprocessors(value: unknown): unknown {\n let current = value;\n\n for (const postprocess of this.state.postprocessors) current = postprocess(current);\n\n return current;\n }\n\n private _runValidatorsSync(value: unknown, ctx: ParseContext): Issue[] {\n if (this._typeValidator) {\n const typeResult = this._typeValidator(value, ctx);\n\n if (typeResult instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Type validator returned a Promise. Use parseAsync() for async validation.',\n path: [],\n },\n ]);\n }\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = validate(value, ctx);\n\n if (result instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parsing received an async check. Use checkAsync() and parseAsync().',\n path: [],\n },\n ]);\n }\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected async _runValidatorsAsync(value: unknown, ctx: ParseContext): Promise<Issue[]> {\n if (this._typeValidator) {\n const typeResult = await this._typeValidator(value, ctx);\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = await validate(value, ctx);\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected _parse(_value: unknown, _ctx: ParseContext): MaybePromise<ParseValue> {\n return { data: _value, issues: [], typeOk: true };\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<\n To extends AnySchema,\n From extends AnySchema,\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<To | From>>,\n> extends Schema<InferOutput<To>, InferInput<From>, Mode> {\n readonly from: From;\n readonly to: To;\n\n protected override get _kind(): string {\n return 'pipe';\n }\n\n override checkAsync(\n this: PipeSchema<To, From, 'sync'>,\n fn: (value: InferOutput<To>, ctx: CheckContext) => Promise<ValidateResult>,\n ): PipeSchema<To, From, 'async'> {\n return this._addCheck(fn, true) as unknown as PipeSchema<To, From, 'async'>;\n }\n\n constructor(from: From, to: To) {\n super();\n this.from = from;\n this.to = to;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): MaybePromise<ParseValue> {\n const r1OrPromise = this.from._parseFullSync(value, ctx);\n\n if (r1OrPromise instanceof Promise) {\n return (r1OrPromise as Promise<{ data: unknown; issues: Issue[] }>).then((r1) => {\n if (r1.issues.length > 0) return { data: value, issues: r1.issues, typeOk: false };\n\n return this.to\n ._parseFullAsync(r1.data, ctx)\n .then((r2) =>\n r2.issues.length > 0\n ? { data: r1.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n });\n }\n\n if (r1OrPromise.issues.length > 0) return { data: value, issues: r1OrPromise.issues, typeOk: false };\n\n const r2OrPromise = this.to._parseFullSync(r1OrPromise.data, ctx);\n\n if (r2OrPromise instanceof Promise) {\n return r2OrPromise.then((r2) =>\n r2.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n }\n\n return r2OrPromise.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2OrPromise.issues, typeOk: false }\n : { data: r2OrPromise.data, issues: [], typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<To>> {\n const c = ctx ?? _makeCtx();\n const first = await this.from._parseFullAsync(value, c);\n\n if (first.issues.length > 0) throw new SpellValidationError(first.issues);\n\n const second = await this.to._parseFullAsync(first.data, c);\n\n if (second.issues.length > 0) throw new SpellValidationError(second.issues);\n\n const issues = await this._runValidatorsAsync(second.data, c);\n\n if (issues.length > 0) throw new SpellValidationError(issues);\n\n return this._runPostprocessors(second.data) as InferOutput<To>;\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const fromR = this.from.walk(visitor);\n const toR = this.to.walk(visitor);\n\n if (visitor.pipe) return visitor.pipe(this, fromR, toR);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n from: this.from.definition(),\n kind: 'pipe',\n to: this.to.definition(),\n };\n }\n}\n"],"mappings":"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"}
package/dist/core.d.ts CHANGED
@@ -49,8 +49,8 @@ export declare class Schema<Output = unknown, Input = Output, Mode extends Schem
49
49
  get description(): string | undefined;
50
50
  get isOptional(): boolean;
51
51
  get isNullable(): boolean;
52
- is(value: unknown): value is Output;
53
- assert(value: unknown, label?: string): asserts value is Output;
52
+ is(this: Schema<Output, Input, 'sync'>, value: unknown): value is Output;
53
+ assert(this: Schema<Output, Input, 'sync'>, value: unknown, label?: string): asserts value is Output;
54
54
  walk<R>(visitor: SchemaWalker<R>): R | null;
55
55
  get kind(): string;
56
56
  protected get _kind(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal/guards';\n\nimport { SpellDefinitionError, SpellValidationError } from './errors';\nimport { createParseContext } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type InferSchemaMode,\n type Issue,\n type JsonSchema,\n type MergeSchemaModes,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaMode,\n type SchemaWalker,\n schemaInput,\n schemaMode,\n schemaOutput,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n fail,\n prependIssuePath,\n resolveMessage,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n} from './errors';\nexport {\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type InferSchemaMode,\n type Issue,\n type JsonSchema,\n type MergeSchemaModes,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaMode,\n type SchemaWalker,\n schemaMode,\n type ValidateFn,\n type ValidateResult,\n};\n\nfunction deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n\nfunction materializeValue<T>(value: T): T {\n if (value == null || typeof value !== 'object') return value;\n\n if (Array.isArray(value)) return value.map((item) => materializeValue(item)) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) {\n const out = new Map<unknown, unknown>();\n\n for (const [key, mapValue] of value.entries()) out.set(materializeValue(key), materializeValue(mapValue));\n\n return out as T;\n }\n\n if (value instanceof Set) return new Set([...value.values()].map((item) => materializeValue(item))) as T;\n\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) defineOwnProperty(out, key, materializeValue(entry));\n\n return out as T;\n }\n\n return value;\n}\n\n/* -------------------- Schema State -------------------- */\n\ntype Preprocessor = (value: unknown) => unknown;\ntype Postprocessor = (value: unknown) => unknown;\n\nexport interface SchemaState<Output = unknown> {\n catch?: () => Output;\n defaultValue?: () => Output;\n description?: string;\n hasAsyncChecks: boolean;\n hasRuntimeChecks: boolean;\n isNullable: boolean;\n isOptional: boolean;\n postprocessors: Postprocessor[];\n preprocessors: Preprocessor[];\n validators: ValidateFn[];\n}\n\nfunction defaultState<Output>(): SchemaState<Output> {\n return {\n hasAsyncChecks: false,\n hasRuntimeChecks: false,\n isNullable: false,\n isOptional: false,\n postprocessors: [],\n preprocessors: [],\n validators: [],\n };\n}\n\nfunction cloneState<Output>(state: SchemaState<Output>): SchemaState<Output> {\n return {\n catch: state.catch,\n defaultValue: state.defaultValue,\n description: state.description,\n hasAsyncChecks: state.hasAsyncChecks,\n hasRuntimeChecks: state.hasRuntimeChecks,\n isNullable: state.isNullable,\n isOptional: state.isOptional,\n postprocessors: [...state.postprocessors],\n preprocessors: [...state.preprocessors],\n validators: [...state.validators],\n };\n}\n\n/* -------------------- Internal parse-value return type -------------------- */\n\n/** @internal */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/* -------------------- ParseContext default -------------------- */\n\n/** @internal */\nexport function _makeCtx(messages?: Messages): ParseContext {\n return messages ? { messages } : createParseContext();\n}\n\n/* -------------------- ValidateResult normalizer -------------------- */\n\nfunction normalizeValidateResult(result: ValidateResult, ctxIssues: Issue[], ctx: ParseContext): Issue[] | null {\n const issues = [...ctxIssues];\n\n if (typeof result === 'string') {\n issues.push({ code: ErrorCode.custom, message: result, path: [] });\n } else if (result === false && issues.length === 0) {\n issues.push({ code: ErrorCode.custom, message: ctx.messages.check.default(), path: [] });\n }\n\n return issues.length ? issues : null;\n}\n\n/* -------------------- Base Schema -------------------- */\n\nexport class Schema<Output = unknown, Input = Output, Mode extends SchemaMode = 'sync'> {\n declare readonly [schemaInput]: Input;\n declare readonly [schemaMode]: Mode;\n declare readonly [schemaOutput]: Output;\n\n protected state: SchemaState<Output>;\n\n protected _annotations: Record<string, unknown> = {};\n\n private _typeValidator: ValidateFn | null = null;\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): Output;\n parse(value: unknown, ctx?: ParseContext): Output {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'parse() cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n\n return this._withCatch(() => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'parse() received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): ParseResult<Output>;\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return {\n data: (this.parse as unknown as (value: unknown, ctx?: ParseContext) => Output)(value, ctx),\n success: true,\n };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n async parseAsync(value: unknown, ctx?: ParseContext): Promise<Output> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n async safeParseAsync(value: unknown, ctx?: ParseContext): Promise<ParseResult<Output>> {\n try {\n return { data: await this.parseAsync(value, ctx), success: true };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n /**\n * Internal full parse without throwing. Returns { data, issues }.\n * Used by composite schemas (array, object, union, etc.) to avoid\n * the try/catch + object allocation overhead of safeParse().\n * @internal\n */\n _parseFullSync(value: unknown, ctx?: ParseContext): { data: unknown; issues: Issue[] } {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'Sync parsing cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parse path received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /**\n * Async version of _parseFullSync.\n * @internal\n */\n async _parseFullAsync(value: unknown, ctx?: ParseContext): Promise<{ data: unknown; issues: Issue[] }> {\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /* -------------------- Validators -------------------- */\n\n /**\n * Add a synchronous domain rule. For asynchronous work, use `checkAsync()`;\n * making execution mode explicit prevents unchecked Promise-returning callbacks.\n */\n check<F extends (value: Output, ctx: CheckContext) => ValidateResult | Promise<ValidateResult>>(\n fn: ReturnType<F> extends PromiseLike<unknown> ? never : F,\n ): this {\n return this._addCheck(fn as (value: Output, ctx: CheckContext) => ValidateResult, false);\n }\n\n checkAsync(\n this: Schema<Output, Input, 'sync'>,\n fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>,\n ): Schema<Output, Input, 'async'> {\n return this._addCheck(fn, true) as unknown as Schema<Output, Input, 'async'>;\n }\n\n protected _addCheck(\n fn:\n | ((value: Output, ctx: CheckContext) => ValidateResult)\n | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>),\n async: boolean,\n ): this {\n const validator: ValidateFn = (value, ctx) => {\n const ctxIssues: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: (issue) => ctxIssues.push({ ...issue, path: issue.path ?? [] } as Issue),\n };\n const result = fn(value as Output, checkCtx);\n\n if (result instanceof Promise) {\n return result.then((r) => normalizeValidateResult(r, ctxIssues, ctx!));\n }\n\n return normalizeValidateResult(result, ctxIssues, ctx!);\n };\n\n const next = this._addConstraint(validator);\n\n next.state.hasRuntimeChecks = true;\n\n if (async) next.state.hasAsyncChecks = true;\n\n return next;\n }\n\n /* -------------------- Nullability / Optionality -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined, Mode>;\n\n cloned.state.isOptional = true;\n\n return cloned;\n }\n\n nullable(): Schema<Output | null, Input | null, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null, Mode>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined, Mode>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>, Mode> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>, Mode>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned;\n }\n\n catch(fallback: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input, Mode> {\n const next = this._clone() as unknown as Schema<NewOutput, Input, Mode>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B extends AnySchema>(next: B): PipeSchema<B, this, MergeSchemaModes<Mode | InferSchemaMode<B>>> {\n return new PipeSchema(this, next);\n }\n\n /* -------------------- Introspection -------------------- */\n\n label(description: string): this {\n const cloned = this._clone();\n\n cloned.state.description = description;\n\n return cloned;\n }\n\n definition(): SchemaDescriptor {\n if (\n this.state.catch ||\n this.state.defaultValue ||\n this.state.postprocessors.length > 0 ||\n this.state.preprocessors.length > 0 ||\n this.state.hasRuntimeChecks\n ) {\n throw new SpellDefinitionError(\n 'Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.',\n );\n }\n\n return deepFreeze(this._toDescriptorImpl()) as SchemaDescriptor;\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n get isOptional(): boolean {\n return this.state.isOptional;\n }\n\n get isNullable(): boolean {\n return this.state.isNullable;\n }\n\n is(value: unknown): value is Output {\n return (this.safeParse as unknown as (value: unknown) => ParseResult<Output>)(value).success;\n }\n\n assert(value: unknown, label?: string): asserts value is Output {\n const result = this._parseFullSync(value);\n\n if (result.issues.length === 0) return;\n\n const issues = label\n ? result.issues.map((issue) => ({\n ...issue,\n message: issue.path.length === 0 ? `${label}: ${issue.message}` : issue.message,\n }))\n : result.issues;\n\n throw new SpellValidationError(issues);\n }\n\n walk<R>(visitor: SchemaWalker<R>): R | null {\n return this._walk(visitor);\n }\n\n get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'any';\n }\n\n /* -------------------- Protected helpers -------------------- */\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n return {\n ...(this.state.description !== undefined ? { description: this.state.description } : {}),\n ...(this.state.isNullable ? { isNullable: true as const } : {}),\n ...(this.state.isOptional ? { isOptional: true as const } : {}),\n };\n }\n\n protected _addConstraint(\n validator: ValidateFn,\n mergeAnnotations?: (current: Record<string, unknown>) => Record<string, unknown>,\n ): this {\n const next = this._clone();\n\n next.state.validators.push(validator);\n\n if (mergeAnnotations) {\n next._annotations = mergeAnnotations({ ...next._annotations });\n }\n\n return next;\n }\n\n protected _construct(state: SchemaState<any>): this {\n const next = Object.assign(Object.create(Object.getPrototypeOf(this)), this, { state }) as this;\n\n next._annotations = { ...this._annotations };\n\n return next;\n }\n\n protected _clone(): this {\n return this._construct(cloneState(this.state));\n }\n\n protected _copyStateTo<T extends Schema<any, any>>(target: T): T {\n target.state = cloneState(this.state);\n\n return target;\n }\n\n protected _walk<R>(visitor: SchemaWalker<R>): R | null {\n if (visitor.unknown) return visitor.unknown(this);\n\n return null;\n }\n\n protected _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'any' };\n }\n\n /* -------------------- Private -------------------- */\n\n private _withCatch<T>(fn: () => T): T {\n if (!this.state.catch) return fn();\n\n try {\n return fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected async _withCatchAsync<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.state.catch) return fn();\n\n try {\n return await fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected _prepareInput(value: unknown): { skip: true; value: null | undefined } | { skip: false; value: unknown } {\n const processed = this._runPreprocessors(value);\n const withDefault = processed === undefined && this.state.defaultValue ? this.state.defaultValue() : processed;\n\n if ((this.state.isOptional && withDefault === undefined) || (this.state.isNullable && withDefault === null)) {\n return { skip: true, value: withDefault };\n }\n\n return { skip: false, value: withDefault };\n }\n\n protected _runPreprocessors(value: unknown): unknown {\n let current = value;\n\n for (const preprocess of this.state.preprocessors) current = preprocess(current);\n\n return current;\n }\n\n protected _runPostprocessors(value: unknown): unknown {\n let current = value;\n\n for (const postprocess of this.state.postprocessors) current = postprocess(current);\n\n return current;\n }\n\n private _runValidatorsSync(value: unknown, ctx: ParseContext): Issue[] {\n if (this._typeValidator) {\n const typeResult = this._typeValidator(value, ctx);\n\n if (typeResult instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Type validator returned a Promise. Use parseAsync() for async validation.',\n path: [],\n },\n ]);\n }\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = validate(value, ctx);\n\n if (result instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parsing received an async check. Use checkAsync() and parseAsync().',\n path: [],\n },\n ]);\n }\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected async _runValidatorsAsync(value: unknown, ctx: ParseContext): Promise<Issue[]> {\n if (this._typeValidator) {\n const typeResult = await this._typeValidator(value, ctx);\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = await validate(value, ctx);\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected _parse(_value: unknown, _ctx: ParseContext): MaybePromise<ParseValue> {\n return { data: _value, issues: [], typeOk: true };\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<\n To extends AnySchema,\n From extends AnySchema,\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<To | From>>,\n> extends Schema<InferOutput<To>, InferInput<From>, Mode> {\n readonly from: From;\n readonly to: To;\n\n protected override get _kind(): string {\n return 'pipe';\n }\n\n override checkAsync(\n this: PipeSchema<To, From, 'sync'>,\n fn: (value: InferOutput<To>, ctx: CheckContext) => Promise<ValidateResult>,\n ): PipeSchema<To, From, 'async'> {\n return this._addCheck(fn, true) as unknown as PipeSchema<To, From, 'async'>;\n }\n\n constructor(from: From, to: To) {\n super();\n this.from = from;\n this.to = to;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): MaybePromise<ParseValue> {\n const r1OrPromise = this.from._parseFullSync(value, ctx);\n\n if (r1OrPromise instanceof Promise) {\n return (r1OrPromise as Promise<{ data: unknown; issues: Issue[] }>).then((r1) => {\n if (r1.issues.length > 0) return { data: value, issues: r1.issues, typeOk: false };\n\n return this.to\n ._parseFullAsync(r1.data, ctx)\n .then((r2) =>\n r2.issues.length > 0\n ? { data: r1.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n });\n }\n\n if (r1OrPromise.issues.length > 0) return { data: value, issues: r1OrPromise.issues, typeOk: false };\n\n const r2OrPromise = this.to._parseFullSync(r1OrPromise.data, ctx);\n\n if (r2OrPromise instanceof Promise) {\n return r2OrPromise.then((r2) =>\n r2.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n }\n\n return r2OrPromise.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2OrPromise.issues, typeOk: false }\n : { data: r2OrPromise.data, issues: [], typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<To>> {\n const c = ctx ?? _makeCtx();\n const first = await this.from._parseFullAsync(value, c);\n\n if (first.issues.length > 0) throw new SpellValidationError(first.issues);\n\n const second = await this.to._parseFullAsync(first.data, c);\n\n if (second.issues.length > 0) throw new SpellValidationError(second.issues);\n\n const issues = await this._runValidatorsAsync(second.data, c);\n\n if (issues.length > 0) throw new SpellValidationError(issues);\n\n return this._runPostprocessors(second.data) as InferOutput<To>;\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const fromR = this.from.walk(visitor);\n const toR = this.to.walk(visitor);\n\n if (visitor.pipe) return visitor.pipe(this, fromR, toR);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n from: this.from.definition(),\n kind: 'pipe',\n to: this.to.definition(),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.js","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal/guards';\n\nimport { SpellDefinitionError, SpellValidationError } from './errors';\nimport { createParseContext } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type InferSchemaMode,\n type Issue,\n type JsonSchema,\n type MergeSchemaModes,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaMode,\n type SchemaWalker,\n schemaInput,\n schemaMode,\n schemaOutput,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n fail,\n prependIssuePath,\n resolveMessage,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n} from './errors';\nexport {\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type InferSchemaMode,\n type Issue,\n type JsonSchema,\n type MergeSchemaModes,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type SchemaMode,\n type SchemaWalker,\n schemaMode,\n type ValidateFn,\n type ValidateResult,\n};\n\nfunction deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n\nfunction materializeValue<T>(value: T): T {\n if (value == null || typeof value !== 'object') return value;\n\n if (Array.isArray(value)) return value.map((item) => materializeValue(item)) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) {\n const out = new Map<unknown, unknown>();\n\n for (const [key, mapValue] of value.entries()) out.set(materializeValue(key), materializeValue(mapValue));\n\n return out as T;\n }\n\n if (value instanceof Set) return new Set([...value.values()].map((item) => materializeValue(item))) as T;\n\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) defineOwnProperty(out, key, materializeValue(entry));\n\n return out as T;\n }\n\n return value;\n}\n\n/* -------------------- Schema State -------------------- */\n\ntype Preprocessor = (value: unknown) => unknown;\ntype Postprocessor = (value: unknown) => unknown;\n\nexport interface SchemaState<Output = unknown> {\n catch?: () => Output;\n defaultValue?: () => Output;\n description?: string;\n hasAsyncChecks: boolean;\n hasRuntimeChecks: boolean;\n isNullable: boolean;\n isOptional: boolean;\n postprocessors: Postprocessor[];\n preprocessors: Preprocessor[];\n validators: ValidateFn[];\n}\n\nfunction defaultState<Output>(): SchemaState<Output> {\n return {\n hasAsyncChecks: false,\n hasRuntimeChecks: false,\n isNullable: false,\n isOptional: false,\n postprocessors: [],\n preprocessors: [],\n validators: [],\n };\n}\n\nfunction cloneState<Output>(state: SchemaState<Output>): SchemaState<Output> {\n return {\n catch: state.catch,\n defaultValue: state.defaultValue,\n description: state.description,\n hasAsyncChecks: state.hasAsyncChecks,\n hasRuntimeChecks: state.hasRuntimeChecks,\n isNullable: state.isNullable,\n isOptional: state.isOptional,\n postprocessors: [...state.postprocessors],\n preprocessors: [...state.preprocessors],\n validators: [...state.validators],\n };\n}\n\n/* -------------------- Internal parse-value return type -------------------- */\n\n/** @internal */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/* -------------------- ParseContext default -------------------- */\n\n/** @internal */\nexport function _makeCtx(messages?: Messages): ParseContext {\n return messages ? { messages } : createParseContext();\n}\n\n/* -------------------- ValidateResult normalizer -------------------- */\n\nfunction normalizeValidateResult(result: ValidateResult, ctxIssues: Issue[], ctx: ParseContext): Issue[] | null {\n const issues = [...ctxIssues];\n\n if (typeof result === 'string') {\n issues.push({ code: ErrorCode.custom, message: result, path: [] });\n } else if (result === false && issues.length === 0) {\n issues.push({ code: ErrorCode.custom, message: ctx.messages.check.default(), path: [] });\n }\n\n return issues.length ? issues : null;\n}\n\n/* -------------------- Base Schema -------------------- */\n\nexport class Schema<Output = unknown, Input = Output, Mode extends SchemaMode = 'sync'> {\n declare readonly [schemaInput]: Input;\n declare readonly [schemaMode]: Mode;\n declare readonly [schemaOutput]: Output;\n\n protected state: SchemaState<Output>;\n\n protected _annotations: Record<string, unknown> = {};\n\n private _typeValidator: ValidateFn | null = null;\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): Output;\n parse(value: unknown, ctx?: ParseContext): Output {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'parse() cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n\n return this._withCatch(() => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'parse() received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(this: Schema<Output, Input, 'sync'>, value: unknown, ctx?: ParseContext): ParseResult<Output>;\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return {\n data: (this.parse as unknown as (value: unknown, ctx?: ParseContext) => Output)(value, ctx),\n success: true,\n };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n async parseAsync(value: unknown, ctx?: ParseContext): Promise<Output> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n async safeParseAsync(value: unknown, ctx?: ParseContext): Promise<ParseResult<Output>> {\n try {\n return { data: await this.parseAsync(value, ctx), success: true };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n /**\n * Internal full parse without throwing. Returns { data, issues }.\n * Used by composite schemas (array, object, union, etc.) to avoid\n * the try/catch + object allocation overhead of safeParse().\n * @internal\n */\n _parseFullSync(value: unknown, ctx?: ParseContext): { data: unknown; issues: Issue[] } {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'Sync parsing cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const coreOrPromise = this._parse(prepared.value, c);\n\n if (coreOrPromise instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parse path received an async schema. Use parseAsync() instead.',\n path: [],\n },\n ]);\n }\n\n const core = coreOrPromise;\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /**\n * Async version of _parseFullSync.\n * @internal\n */\n async _parseFullAsync(value: unknown, ctx?: ParseContext): Promise<{ data: unknown; issues: Issue[] }> {\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = await this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /* -------------------- Validators -------------------- */\n\n /**\n * Add a synchronous domain rule. For asynchronous work, use `checkAsync()`;\n * making execution mode explicit prevents unchecked Promise-returning callbacks.\n */\n check<F extends (value: Output, ctx: CheckContext) => ValidateResult | Promise<ValidateResult>>(\n fn: ReturnType<F> extends PromiseLike<unknown> ? never : F,\n ): this {\n return this._addCheck(fn as (value: Output, ctx: CheckContext) => ValidateResult, false);\n }\n\n checkAsync(\n this: Schema<Output, Input, 'sync'>,\n fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>,\n ): Schema<Output, Input, 'async'> {\n return this._addCheck(fn, true) as unknown as Schema<Output, Input, 'async'>;\n }\n\n protected _addCheck(\n fn:\n | ((value: Output, ctx: CheckContext) => ValidateResult)\n | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>),\n async: boolean,\n ): this {\n const validator: ValidateFn = (value, ctx) => {\n const ctxIssues: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: (issue) => ctxIssues.push({ ...issue, path: issue.path ?? [] } as Issue),\n };\n const result = fn(value as Output, checkCtx);\n\n if (result instanceof Promise) {\n return result.then((r) => normalizeValidateResult(r, ctxIssues, ctx!));\n }\n\n return normalizeValidateResult(result, ctxIssues, ctx!);\n };\n\n const next = this._addConstraint(validator);\n\n next.state.hasRuntimeChecks = true;\n\n if (async) next.state.hasAsyncChecks = true;\n\n return next;\n }\n\n /* -------------------- Nullability / Optionality -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined, Mode>;\n\n cloned.state.isOptional = true;\n\n return cloned;\n }\n\n nullable(): Schema<Output | null, Input | null, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null, Mode>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined, Mode> {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined, Mode>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>, Mode> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>, Mode>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned;\n }\n\n catch(fallback: Output | (() => Output)): this {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input, Mode> {\n const next = this._clone() as unknown as Schema<NewOutput, Input, Mode>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B extends AnySchema>(next: B): PipeSchema<B, this, MergeSchemaModes<Mode | InferSchemaMode<B>>> {\n return new PipeSchema(this, next);\n }\n\n /* -------------------- Introspection -------------------- */\n\n label(description: string): this {\n const cloned = this._clone();\n\n cloned.state.description = description;\n\n return cloned;\n }\n\n definition(): SchemaDescriptor {\n if (\n this.state.catch ||\n this.state.defaultValue ||\n this.state.postprocessors.length > 0 ||\n this.state.preprocessors.length > 0 ||\n this.state.hasRuntimeChecks\n ) {\n throw new SpellDefinitionError(\n 'Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.',\n );\n }\n\n return deepFreeze(this._toDescriptorImpl()) as SchemaDescriptor;\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n get isOptional(): boolean {\n return this.state.isOptional;\n }\n\n get isNullable(): boolean {\n return this.state.isNullable;\n }\n\n is(this: Schema<Output, Input, 'sync'>, value: unknown): value is Output {\n return this.safeParse(value).success;\n }\n\n assert(this: Schema<Output, Input, 'sync'>, value: unknown, label?: string): asserts value is Output {\n const result = this._parseFullSync(value);\n\n if (result.issues.length === 0) return;\n\n const issues = label\n ? result.issues.map((issue) => ({\n ...issue,\n message: issue.path.length === 0 ? `${label}: ${issue.message}` : issue.message,\n }))\n : result.issues;\n\n throw new SpellValidationError(issues);\n }\n\n walk<R>(visitor: SchemaWalker<R>): R | null {\n return this._walk(visitor);\n }\n\n get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'any';\n }\n\n /* -------------------- Protected helpers -------------------- */\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n return {\n ...(this.state.description !== undefined ? { description: this.state.description } : {}),\n ...(this.state.isNullable ? { isNullable: true as const } : {}),\n ...(this.state.isOptional ? { isOptional: true as const } : {}),\n };\n }\n\n protected _addConstraint(\n validator: ValidateFn,\n mergeAnnotations?: (current: Record<string, unknown>) => Record<string, unknown>,\n ): this {\n const next = this._clone();\n\n next.state.validators.push(validator);\n\n if (mergeAnnotations) {\n next._annotations = mergeAnnotations({ ...next._annotations });\n }\n\n return next;\n }\n\n protected _construct(state: SchemaState<any>): this {\n const next = Object.assign(Object.create(Object.getPrototypeOf(this)), this, { state }) as this;\n\n next._annotations = { ...this._annotations };\n\n return next;\n }\n\n protected _clone(): this {\n return this._construct(cloneState(this.state));\n }\n\n protected _copyStateTo<T extends Schema<any, any>>(target: T): T {\n target.state = cloneState(this.state);\n\n return target;\n }\n\n protected _walk<R>(visitor: SchemaWalker<R>): R | null {\n if (visitor.unknown) return visitor.unknown(this);\n\n return null;\n }\n\n protected _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'any' };\n }\n\n /* -------------------- Private -------------------- */\n\n private _withCatch<T>(fn: () => T): T {\n if (!this.state.catch) return fn();\n\n try {\n return fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected async _withCatchAsync<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.state.catch) return fn();\n\n try {\n return await fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected _prepareInput(value: unknown): { skip: true; value: null | undefined } | { skip: false; value: unknown } {\n const processed = this._runPreprocessors(value);\n const withDefault = processed === undefined && this.state.defaultValue ? this.state.defaultValue() : processed;\n\n if ((this.state.isOptional && withDefault === undefined) || (this.state.isNullable && withDefault === null)) {\n return { skip: true, value: withDefault };\n }\n\n return { skip: false, value: withDefault };\n }\n\n protected _runPreprocessors(value: unknown): unknown {\n let current = value;\n\n for (const preprocess of this.state.preprocessors) current = preprocess(current);\n\n return current;\n }\n\n protected _runPostprocessors(value: unknown): unknown {\n let current = value;\n\n for (const postprocess of this.state.postprocessors) current = postprocess(current);\n\n return current;\n }\n\n private _runValidatorsSync(value: unknown, ctx: ParseContext): Issue[] {\n if (this._typeValidator) {\n const typeResult = this._typeValidator(value, ctx);\n\n if (typeResult instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Type validator returned a Promise. Use parseAsync() for async validation.',\n path: [],\n },\n ]);\n }\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = validate(value, ctx);\n\n if (result instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parsing received an async check. Use checkAsync() and parseAsync().',\n path: [],\n },\n ]);\n }\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected async _runValidatorsAsync(value: unknown, ctx: ParseContext): Promise<Issue[]> {\n if (this._typeValidator) {\n const typeResult = await this._typeValidator(value, ctx);\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = await validate(value, ctx);\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected _parse(_value: unknown, _ctx: ParseContext): MaybePromise<ParseValue> {\n return { data: _value, issues: [], typeOk: true };\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<\n To extends AnySchema,\n From extends AnySchema,\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<To | From>>,\n> extends Schema<InferOutput<To>, InferInput<From>, Mode> {\n readonly from: From;\n readonly to: To;\n\n protected override get _kind(): string {\n return 'pipe';\n }\n\n override checkAsync(\n this: PipeSchema<To, From, 'sync'>,\n fn: (value: InferOutput<To>, ctx: CheckContext) => Promise<ValidateResult>,\n ): PipeSchema<To, From, 'async'> {\n return this._addCheck(fn, true) as unknown as PipeSchema<To, From, 'async'>;\n }\n\n constructor(from: From, to: To) {\n super();\n this.from = from;\n this.to = to;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): MaybePromise<ParseValue> {\n const r1OrPromise = this.from._parseFullSync(value, ctx);\n\n if (r1OrPromise instanceof Promise) {\n return (r1OrPromise as Promise<{ data: unknown; issues: Issue[] }>).then((r1) => {\n if (r1.issues.length > 0) return { data: value, issues: r1.issues, typeOk: false };\n\n return this.to\n ._parseFullAsync(r1.data, ctx)\n .then((r2) =>\n r2.issues.length > 0\n ? { data: r1.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n });\n }\n\n if (r1OrPromise.issues.length > 0) return { data: value, issues: r1OrPromise.issues, typeOk: false };\n\n const r2OrPromise = this.to._parseFullSync(r1OrPromise.data, ctx);\n\n if (r2OrPromise instanceof Promise) {\n return r2OrPromise.then((r2) =>\n r2.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2.issues, typeOk: false }\n : { data: r2.data, issues: [], typeOk: true },\n );\n }\n\n return r2OrPromise.issues.length > 0\n ? { data: r1OrPromise.data, issues: r2OrPromise.issues, typeOk: false }\n : { data: r2OrPromise.data, issues: [], typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<To>> {\n const c = ctx ?? _makeCtx();\n const first = await this.from._parseFullAsync(value, c);\n\n if (first.issues.length > 0) throw new SpellValidationError(first.issues);\n\n const second = await this.to._parseFullAsync(first.data, c);\n\n if (second.issues.length > 0) throw new SpellValidationError(second.issues);\n\n const issues = await this._runValidatorsAsync(second.data, c);\n\n if (issues.length > 0) throw new SpellValidationError(issues);\n\n return this._runPostprocessors(second.data) as InferOutput<To>;\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const fromR = this.from.walk(visitor);\n const toR = this.to.walk(visitor);\n\n if (visitor.pipe) return visitor.pipe(this, fromR, toR);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n from: this.from.definition(),\n kind: 'pipe',\n to: this.to.definition(),\n };\n }\n}\n"],"mappings":"yWAiEA,SAAS,EAAc,EAAa,CAClC,GAAsB,OAAO,GAAU,WAAnC,GAA+C,OAAO,SAAS,CAAK,EAAG,OAAO,EAElF,IAAK,IAAM,KAAS,OAAO,OAAO,CAAgC,EAAG,EAAW,CAAK,EAErF,OAAO,OAAO,OAAO,CAAK,CAC5B,CAEA,SAAS,EAAoB,EAAa,CACxC,GAAqB,OAAO,GAAU,WAAlC,EAA4C,OAAO,EAEvD,GAAI,MAAM,QAAQ,CAAK,EAAG,OAAO,EAAM,IAAK,GAAS,EAAiB,CAAI,CAAC,EAE3E,GAAI,aAAiB,KAAM,OAAO,IAAI,KAAK,EAAM,QAAQ,CAAC,EAE1D,GAAI,aAAiB,IAAK,CACxB,IAAM,EAAM,IAAI,IAEhB,IAAK,GAAM,CAAC,EAAK,KAAa,EAAM,QAAQ,EAAG,EAAI,IAAI,EAAiB,CAAG,EAAG,EAAiB,CAAQ,CAAC,EAExG,OAAO,CACT,CAEA,GAAI,aAAiB,IAAK,OAAO,IAAI,IAAI,CAAC,GAAG,EAAM,OAAO,CAAC,CAAC,CAAC,IAAK,GAAS,EAAiB,CAAI,CAAC,CAAC,EAElG,GAAI,EAAc,CAAK,EAAG,CACxB,IAAM,EAA+B,CAAC,EAEtC,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAK,EAAG,EAAkB,EAAK,EAAK,EAAiB,CAAK,CAAC,EAErG,OAAO,CACT,CAEA,OAAO,CACT,CAoBA,SAAS,GAA4C,CACnD,MAAO,CACL,eAAgB,GAChB,iBAAkB,GAClB,WAAY,GACZ,WAAY,GACZ,eAAgB,CAAC,EACjB,cAAe,CAAC,EAChB,WAAY,CAAC,CACf,CACF,CAEA,SAAS,EAAmB,EAAiD,CAC3E,MAAO,CACL,MAAO,EAAM,MACb,aAAc,EAAM,aACpB,YAAa,EAAM,YACnB,eAAgB,EAAM,eACtB,iBAAkB,EAAM,iBACxB,WAAY,EAAM,WAClB,WAAY,EAAM,WAClB,eAAgB,CAAC,GAAG,EAAM,cAAc,EACxC,cAAe,CAAC,GAAG,EAAM,aAAa,EACtC,WAAY,CAAC,GAAG,EAAM,UAAU,CAClC,CACF,CAYA,SAAgB,EAAS,EAAmC,CAC1D,OAAO,EAAW,CAAE,UAAS,EAAI,EAAmB,CACtD,CAIA,SAAS,EAAwB,EAAwB,EAAoB,EAAmC,CAC9G,IAAM,EAAS,CAAC,GAAG,CAAS,EAQ5B,OANI,OAAO,GAAW,SACpB,EAAO,KAAK,CAAE,KAAM,EAAU,OAAQ,QAAS,EAAQ,KAAM,CAAC,CAAE,CAAC,EACxD,IAAW,IAAS,EAAO,SAAW,GAC/C,EAAO,KAAK,CAAE,KAAM,EAAU,OAAQ,QAAS,EAAI,SAAS,MAAM,QAAQ,EAAG,KAAM,CAAC,CAAE,CAAC,EAGlF,EAAO,OAAS,EAAS,IAClC,CAIA,IAAa,EAAb,KAAwF,CAKtF,MAEA,aAAkD,CAAC,EAEnD,eAA4C,KAE5C,YAAY,EAA4B,CACtC,KAAK,MAAQ,EAAqB,EAClC,KAAK,eAAiB,GAAiB,IACzC,CAKA,MAAM,EAAgB,EAA4B,CAChD,GAAI,KAAK,MAAM,eACb,MAAM,IAAI,EAAqB,CAC7B,CAAE,KAAM,EAAU,OAAQ,QAAS,0DAA2D,KAAM,CAAC,CAAE,CACzG,CAAC,EAGH,IAAM,EAAI,GAAO,EAAS,EAE1B,OAAO,KAAK,eAAiB,CAC3B,IAAM,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,OAAO,EAAS,MAEnC,IAAM,EAAgB,KAAK,OAAO,EAAS,MAAO,CAAC,EAEnD,GAAI,aAAyB,QAC3B,MAAM,IAAI,EAAqB,CAC7B,CACE,KAAM,EAAU,OAChB,QAAS,8DACT,KAAM,CAAC,CACT,CACF,CAAC,EAGH,IAAM,EAAO,EACP,EAAmB,EAAK,OAAS,KAAK,mBAAmB,EAAK,KAAM,CAAC,EAAI,CAAC,EAC1E,EAAY,CAAC,GAAG,EAAK,OAAQ,GAAG,CAAgB,EAEtD,GAAI,EAAU,OAAQ,MAAM,IAAI,EAAqB,CAAS,EAE9D,OAAO,KAAK,mBAAmB,EAAK,IAAI,CAC1C,CAAC,CACH,CAGA,UAAU,EAAgB,EAAyC,CACjE,GAAI,CACF,MAAO,CACL,KAAO,KAAK,MAAoE,EAAO,CAAG,EAC1F,QAAS,EACX,CACF,OAAS,EAAO,CACd,GAAI,aAAiB,EAAsB,MAAO,CAAE,QAAO,QAAS,EAAM,EAE1E,MAAM,CACR,CACF,CAEA,MAAM,WAAW,EAAgB,EAAqC,CACpE,IAAM,EAAI,GAAO,EAAS,EAE1B,OAAO,KAAK,gBAAgB,SAAY,CACtC,IAAM,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,OAAO,EAAS,MAEnC,IAAM,EAAO,MAAM,KAAK,OAAO,EAAS,MAAO,CAAC,EAC1C,EAAmB,EAAK,OAAS,MAAM,KAAK,oBAAoB,EAAK,KAAM,CAAC,EAAI,CAAC,EACjF,EAAY,CAAC,GAAG,EAAK,OAAQ,GAAG,CAAgB,EAEtD,GAAI,EAAU,OAAQ,MAAM,IAAI,EAAqB,CAAS,EAE9D,OAAO,KAAK,mBAAmB,EAAK,IAAI,CAC1C,CAAC,CACH,CAEA,MAAM,eAAe,EAAgB,EAAkD,CACrF,GAAI,CACF,MAAO,CAAE,KAAM,MAAM,KAAK,WAAW,EAAO,CAAG,EAAG,QAAS,EAAK,CAClE,OAAS,EAAO,CACd,GAAI,aAAiB,EAAsB,MAAO,CAAE,QAAO,QAAS,EAAM,EAE1E,MAAM,CACR,CACF,CAQA,eAAe,EAAgB,EAAwD,CACrF,GAAI,KAAK,MAAM,eACb,MAAM,IAAI,EAAqB,CAC7B,CAAE,KAAM,EAAU,OAAQ,QAAS,+DAAgE,KAAM,CAAC,CAAE,CAC9G,CAAC,EAGH,IAAM,EAAI,GAAO,EAAS,EACpB,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,MAAO,CAAE,KAAM,EAAS,MAAO,OAAQ,CAAC,CAAE,EAE7D,IAAM,EAAgB,KAAK,OAAO,EAAS,MAAO,CAAC,EAEnD,GAAI,aAAyB,QAC3B,MAAM,IAAI,EAAqB,CAC7B,CACE,KAAM,EAAU,OAChB,QAAS,sEACT,KAAM,CAAC,CACT,CACF,CAAC,EAGH,IAAM,EAAO,EACP,EAAmB,EAAK,OAAS,KAAK,mBAAmB,EAAK,KAAM,CAAC,EAAI,CAAC,EAC1E,EAAY,CAAC,GAAG,EAAK,OAAQ,GAAG,CAAgB,EAQtD,OANI,EAAU,OAAS,EACjB,KAAK,MAAM,MAAc,CAAE,KAAM,KAAK,MAAM,MAAM,EAAG,OAAQ,CAAC,CAAE,EAE7D,CAAE,KAAM,EAAK,KAAM,OAAQ,CAAU,EAGvC,CAAE,KAAM,KAAK,mBAAmB,EAAK,IAAI,EAAG,OAAQ,CAAC,CAAE,CAChE,CAMA,MAAM,gBAAgB,EAAgB,EAAiE,CACrG,IAAM,EAAI,GAAO,EAAS,EACpB,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,MAAO,CAAE,KAAM,EAAS,MAAO,OAAQ,CAAC,CAAE,EAE7D,IAAM,EAAO,MAAM,KAAK,OAAO,EAAS,MAAO,CAAC,EAC1C,EAAmB,EAAK,OAAS,MAAM,KAAK,oBAAoB,EAAK,KAAM,CAAC,EAAI,CAAC,EACjF,EAAY,CAAC,GAAG,EAAK,OAAQ,GAAG,CAAgB,EAQtD,OANI,EAAU,OAAS,EACjB,KAAK,MAAM,MAAc,CAAE,KAAM,KAAK,MAAM,MAAM,EAAG,OAAQ,CAAC,CAAE,EAE7D,CAAE,KAAM,EAAK,KAAM,OAAQ,CAAU,EAGvC,CAAE,KAAM,KAAK,mBAAmB,EAAK,IAAI,EAAG,OAAQ,CAAC,CAAE,CAChE,CAQA,MACE,EACM,CACN,OAAO,KAAK,UAAU,EAA4D,EAAK,CACzF,CAEA,WAEE,EACgC,CAChC,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,UACE,EAGA,EACM,CAeN,IAAM,EAAO,KAAK,gBAda,EAAO,IAAQ,CAC5C,IAAM,EAAqB,CAAC,EAItB,EAAS,EAAG,EAAiB,CAFjC,SAAW,GAAU,EAAU,KAAK,CAAE,GAAG,EAAO,KAAM,EAAM,MAAQ,CAAC,CAAE,CAAU,CAEhD,CAAQ,EAM3C,OAJI,aAAkB,QACb,EAAO,KAAM,GAAM,EAAwB,EAAG,EAAW,CAAI,CAAC,EAGhE,EAAwB,EAAQ,EAAW,CAAI,CACxD,CAE0C,EAM1C,MAJA,GAAK,MAAM,iBAAmB,GAE1B,IAAO,EAAK,MAAM,eAAiB,IAEhC,CACT,CAIA,UAAgE,CAC9D,IAAM,EAAS,KAAK,OAAO,EAI3B,MAFA,GAAO,MAAM,WAAa,GAEnB,CACT,CAEA,UAAsD,CACpD,IAAM,EAAS,KAAK,OAAO,EAI3B,MAFA,GAAO,MAAM,WAAa,GAEnB,CACT,CAEA,SAA6E,CAC3E,IAAM,EAAS,KAAK,OAAO,EAK3B,MAHA,GAAO,MAAM,WAAa,GAC1B,EAAO,MAAM,WAAa,GAEnB,CACT,CAEA,UAAgF,CAC9E,IAAM,EAAS,KAAK,OAAO,EAI3B,MAFA,GAAO,MAAM,WAAa,GAEnB,CACT,CAIA,QAAQ,EAA6C,CACnD,IAAM,EAAS,KAAK,OAAO,EAK3B,MAHA,GAAO,MAAM,aACX,OAAO,GAAiB,WAAc,MAAsC,EAAiB,CAAY,EAEpG,CACT,CAEA,MAAM,EAAyC,CAC7C,IAAM,EAAS,KAAK,OAAO,EAI3B,MAFA,GAAO,MAAM,MAAQ,OAAO,GAAa,WAAc,MAAkC,EAAiB,CAAQ,EAE3G,CACT,CAEA,UAAqB,EAAkE,CACrF,IAAM,EAAO,KAAK,OAAO,EAIzB,OAFA,EAAK,MAAM,eAAe,KAAK,CAA6B,EAErD,CACT,CAEA,WAAW,EAAuC,CAChD,IAAM,EAAS,KAAK,OAAO,EAI3B,OAFA,EAAO,MAAM,cAAc,KAAK,CAAE,EAE3B,CACT,CAEA,KAA0B,EAA2E,CACnG,OAAO,IAAI,EAAW,KAAM,CAAI,CAClC,CAIA,MAAM,EAA2B,CAC/B,IAAM,EAAS,KAAK,OAAO,EAI3B,MAFA,GAAO,MAAM,YAAc,EAEpB,CACT,CAEA,YAA+B,CAC7B,GACE,KAAK,MAAM,OACX,KAAK,MAAM,cACX,KAAK,MAAM,eAAe,OAAS,GACnC,KAAK,MAAM,cAAc,OAAS,GAClC,KAAK,MAAM,iBAEX,MAAM,IAAI,EACR,sGACF,EAGF,OAAO,EAAW,KAAK,kBAAkB,CAAC,CAC5C,CAEA,IAAI,aAAkC,CACpC,OAAO,KAAK,MAAM,WACpB,CAEA,IAAI,YAAsB,CACxB,OAAO,KAAK,MAAM,UACpB,CAEA,IAAI,YAAsB,CACxB,OAAO,KAAK,MAAM,UACpB,CAEA,GAAwC,EAAiC,CACvE,OAAO,KAAK,UAAU,CAAK,CAAC,CAAC,OAC/B,CAEA,OAA4C,EAAgB,EAAyC,CACnG,IAAM,EAAS,KAAK,eAAe,CAAK,EAExC,GAAI,EAAO,OAAO,SAAW,EAAG,OAEhC,IAAM,EAAS,EACX,EAAO,OAAO,IAAK,IAAW,CAC5B,GAAG,EACH,QAAS,EAAM,KAAK,SAAW,EAAI,GAAG,EAAM,IAAI,EAAM,UAAY,EAAM,OAC1E,EAAE,EACF,EAAO,OAEX,MAAM,IAAI,EAAqB,CAAM,CACvC,CAEA,KAAQ,EAAoC,CAC1C,OAAO,KAAK,MAAM,CAAO,CAC3B,CAEA,IAAI,MAAe,CACjB,OAAO,KAAK,KACd,CAEA,IAAc,OAAgB,CAC5B,MAAO,KACT,CAIA,eAA0F,CACxF,MAAO,CACL,GAAI,KAAK,MAAM,cAAgB,IAAA,GAAsD,CAAC,EAA3C,CAAE,YAAa,KAAK,MAAM,WAAY,EACjF,GAAI,KAAK,MAAM,WAAa,CAAE,WAAY,EAAc,EAAI,CAAC,EAC7D,GAAI,KAAK,MAAM,WAAa,CAAE,WAAY,EAAc,EAAI,CAAC,CAC/D,CACF,CAEA,eACE,EACA,EACM,CACN,IAAM,EAAO,KAAK,OAAO,EAQzB,OANA,EAAK,MAAM,WAAW,KAAK,CAAS,EAEhC,IACF,EAAK,aAAe,EAAiB,CAAE,GAAG,EAAK,YAAa,CAAC,GAGxD,CACT,CAEA,WAAqB,EAA+B,CAClD,IAAM,EAAO,OAAO,OAAO,OAAO,OAAO,OAAO,eAAe,IAAI,CAAC,EAAG,KAAM,CAAE,OAAM,CAAC,EAItF,MAFA,GAAK,aAAe,CAAE,GAAG,KAAK,YAAa,EAEpC,CACT,CAEA,QAAyB,CACvB,OAAO,KAAK,WAAW,EAAW,KAAK,KAAK,CAAC,CAC/C,CAEA,aAAmD,EAAc,CAG/D,MAFA,GAAO,MAAQ,EAAW,KAAK,KAAK,EAE7B,CACT,CAEA,MAAmB,EAAoC,CAGrD,OAFI,EAAQ,QAAgB,EAAQ,QAAQ,IAAI,EAEzC,IACT,CAEA,mBAAgD,CAC9C,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,KAAM,CAChD,CAIA,WAAsB,EAAgB,CACpC,GAAI,CAAC,KAAK,MAAM,MAAO,OAAO,EAAG,EAEjC,GAAI,CACF,OAAO,EAAG,CACZ,OAAS,EAAO,CACd,GAAI,aAAiB,EAAsB,OAAO,KAAK,MAAM,MAAM,EAEnE,MAAM,CACR,CACF,CAEA,MAAgB,gBAAmB,EAAkC,CACnE,GAAI,CAAC,KAAK,MAAM,MAAO,OAAO,EAAG,EAEjC,GAAI,CACF,OAAO,MAAM,EAAG,CAClB,OAAS,EAAO,CACd,GAAI,aAAiB,EAAsB,OAAO,KAAK,MAAM,MAAM,EAEnE,MAAM,CACR,CACF,CAEA,cAAwB,EAA2F,CACjH,IAAM,EAAY,KAAK,kBAAkB,CAAK,EACxC,EAAc,IAAc,IAAA,IAAa,KAAK,MAAM,aAAe,KAAK,MAAM,aAAa,EAAI,EAMrG,OAJK,KAAK,MAAM,YAAc,IAAgB,IAAA,IAAe,KAAK,MAAM,YAAc,IAAgB,KAC7F,CAAE,KAAM,GAAM,MAAO,CAAY,EAGnC,CAAE,KAAM,GAAO,MAAO,CAAY,CAC3C,CAEA,kBAA4B,EAAyB,CACnD,IAAI,EAAU,EAEd,IAAK,IAAM,KAAc,KAAK,MAAM,cAAe,EAAU,EAAW,CAAO,EAE/E,OAAO,CACT,CAEA,mBAA6B,EAAyB,CACpD,IAAI,EAAU,EAEd,IAAK,IAAM,KAAe,KAAK,MAAM,eAAgB,EAAU,EAAY,CAAO,EAElF,OAAO,CACT,CAEA,mBAA2B,EAAgB,EAA4B,CACrE,GAAI,KAAK,eAAgB,CACvB,IAAM,EAAa,KAAK,eAAe,EAAO,CAAG,EAEjD,GAAI,aAAsB,QACxB,MAAM,IAAI,EAAqB,CAC7B,CACE,KAAM,EAAU,OAChB,QAAS,4EACT,KAAM,CAAC,CACT,CACF,CAAC,EAGH,GAAI,GAAc,EAAW,OAAS,EAAG,OAAO,CAClD,CAEA,IAAM,EAAkB,CAAC,EAEzB,IAAK,IAAM,KAAY,KAAK,MAAM,WAAY,CAC5C,IAAM,EAAS,EAAS,EAAO,CAAG,EAElC,GAAI,aAAkB,QACpB,MAAM,IAAI,EAAqB,CAC7B,CACE,KAAM,EAAU,OAChB,QAAS,2EACT,KAAM,CAAC,CACT,CACF,CAAC,EAGC,GAAQ,EAAO,KAAK,GAAG,CAAM,CACnC,CAEA,OAAO,CACT,CAEA,MAAgB,oBAAoB,EAAgB,EAAqC,CACvF,GAAI,KAAK,eAAgB,CACvB,IAAM,EAAa,MAAM,KAAK,eAAe,EAAO,CAAG,EAEvD,GAAI,GAAc,EAAW,OAAS,EAAG,OAAO,CAClD,CAEA,IAAM,EAAkB,CAAC,EAEzB,IAAK,IAAM,KAAY,KAAK,MAAM,WAAY,CAC5C,IAAM,EAAS,MAAM,EAAS,EAAO,CAAG,EAEpC,GAAQ,EAAO,KAAK,GAAG,CAAM,CACnC,CAEA,OAAO,CACT,CAEA,OAAiB,EAAiB,EAA8C,CAC9E,MAAO,CAAE,KAAM,EAAQ,OAAQ,CAAC,EAAG,OAAQ,EAAK,CAClD,CACF,EAIa,EAAb,cAIU,CAAgD,CACxD,KACA,GAEA,IAAuB,OAAgB,CACrC,MAAO,MACT,CAEA,WAEE,EAC+B,CAC/B,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,YAAY,EAAY,EAAQ,CAC9B,MAAM,EACN,KAAK,KAAO,EACZ,KAAK,GAAK,CACZ,CAEA,OAA0B,EAAgB,EAA6C,CACrF,IAAM,EAAc,KAAK,KAAK,eAAe,EAAO,CAAG,EAEvD,GAAI,aAAuB,QACzB,OAAQ,EAA4D,KAAM,GACpE,EAAG,OAAO,OAAS,EAAU,CAAE,KAAM,EAAO,OAAQ,EAAG,OAAQ,OAAQ,EAAM,EAE1E,KAAK,GACT,gBAAgB,EAAG,KAAM,CAAG,CAAC,CAC7B,KAAM,GACL,EAAG,OAAO,OAAS,EACf,CAAE,KAAM,EAAG,KAAM,OAAQ,EAAG,OAAQ,OAAQ,EAAM,EAClD,CAAE,KAAM,EAAG,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,CAChD,CACH,EAGH,GAAI,EAAY,OAAO,OAAS,EAAG,MAAO,CAAE,KAAM,EAAO,OAAQ,EAAY,OAAQ,OAAQ,EAAM,EAEnG,IAAM,EAAc,KAAK,GAAG,eAAe,EAAY,KAAM,CAAG,EAUhE,OARI,aAAuB,QAClB,EAAY,KAAM,GACvB,EAAG,OAAO,OAAS,EACf,CAAE,KAAM,EAAY,KAAM,OAAQ,EAAG,OAAQ,OAAQ,EAAM,EAC3D,CAAE,KAAM,EAAG,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,CAChD,EAGK,EAAY,OAAO,OAAS,EAC/B,CAAE,KAAM,EAAY,KAAM,OAAQ,EAAY,OAAQ,OAAQ,EAAM,EACpE,CAAE,KAAM,EAAY,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,CACzD,CAEA,MAAe,WAAW,EAAgB,EAA8C,CACtF,IAAM,EAAI,GAAO,EAAS,EACpB,EAAQ,MAAM,KAAK,KAAK,gBAAgB,EAAO,CAAC,EAEtD,GAAI,EAAM,OAAO,OAAS,EAAG,MAAM,IAAI,EAAqB,EAAM,MAAM,EAExE,IAAM,EAAS,MAAM,KAAK,GAAG,gBAAgB,EAAM,KAAM,CAAC,EAE1D,GAAI,EAAO,OAAO,OAAS,EAAG,MAAM,IAAI,EAAqB,EAAO,MAAM,EAE1E,IAAM,EAAS,MAAM,KAAK,oBAAoB,EAAO,KAAM,CAAC,EAE5D,GAAI,EAAO,OAAS,EAAG,MAAM,IAAI,EAAqB,CAAM,EAE5D,OAAO,KAAK,mBAAmB,EAAO,IAAI,CAC5C,CAEA,MAA4B,EAAoC,CAC9D,IAAM,EAAQ,KAAK,KAAK,KAAK,CAAO,EAC9B,EAAM,KAAK,GAAG,KAAK,CAAO,EAIhC,OAFI,EAAQ,KAAa,EAAQ,KAAK,KAAM,EAAO,CAAG,EAE/C,MAAM,MAAM,CAAO,CAC5B,CAEA,mBAAyD,CACvD,MAAO,CACL,GAAG,KAAK,cAAc,EACtB,KAAM,KAAK,KAAK,WAAW,EAC3B,KAAM,OACN,GAAI,KAAK,GAAG,WAAW,CACzB,CACF,CACF"}
package/dist/s.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.cjs","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferOutput, type InferSchemaMode, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sAny = (): Schema<any> => new Schema();\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: any[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, unknown, InferSchemaMode<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, unknown, InferSchemaMode<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any, any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n any: sAny,\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"gsBA+EA,IAAa,EAAI,CACf,QAxD8B,IAAI,EAAA,OAyDlC,MAxDmC,GAA8B,IAAI,EAAA,YAAY,CAAM,EAyDvF,WAxDkC,IAAI,EAAA,aAyDtC,YAxDoC,IAAI,EAAA,cAyDxC,OAAQ,CAvBR,WAAqC,EAAA,aAAa,OAAO,EACzD,YAAuC,EAAA,cAAc,OAAO,EAC5D,SAAiC,EAAA,WAAW,OAAO,EACnD,WAAqC,EAAA,aAAa,OAAO,EACzD,WAAqC,EAAA,aAAa,OAAO,CAmBjD,EACR,SAzD8B,IAAI,EAAA,WA0DlC,oBA7BA,EACA,IACwB,IAAI,EAAA,cAAc,EAAe,CAAG,EA4B5D,KA1DyC,GAA6B,IAAI,EAAA,WAAW,CAAM,EA2D3F,WA1DsB,GAAwD,IAAI,EAAA,iBAAiB,CAAG,EA2DtG,WAzDA,GAAG,IAEH,IAAI,EAAA,gBAAgB,EAAA,mBAAmB,CAAK,CAA6C,EAwDzF,KAvDkC,GAClC,IAAI,EAAA,WAAW,CAA8E,EAuD7F,QAtDwE,GACxE,IAAI,EAAA,cAAc,CAAK,EAsDvB,KArDsD,EAAc,IACpE,IAAI,EAAA,UAAU,EAAW,CAAW,EAqDpC,UApDgC,IAAI,EAAA,YAqDpC,SApDuC,IAAI,EAAA,cAAc,IAAI,EAqD7D,WApDkC,IAAI,EAAA,aAqDtC,OApDsC,GAA8B,IAAI,EAAA,aAAa,CAAK,EAqD1F,QApDyD,EAAc,IACvE,IAAI,EAAA,aAAa,EAAW,CAAW,EAoDvC,IAnDiC,GAA4B,IAAI,EAAA,UAAU,CAAM,EAoDjF,WAnDkC,IAAI,EAAA,aAoDtC,MAnD4C,GAA6B,IAAI,EAAA,YAAY,CAAK,EAoD9F,cAnDiD,IAAI,EAAA,cAAc,IAAA,EAAS,EAoD5E,OAlDA,GAAG,IAEH,IAAI,EAAA,YAAY,EAAA,mBAAmB,CAAK,CAA6C,EAiDrF,YAhDsC,IAAI,EAAA,MAiD5C"}
1
+ {"version":3,"file":"s.cjs","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferOutput, type InferSchemaMode, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sAny = (): Schema<unknown> => new Schema();\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, unknown, InferSchemaMode<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, unknown, InferSchemaMode<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any, any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n any: sAny,\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"gsBA+EA,IAAa,EAAI,CACf,QAxDkC,IAAI,EAAA,OAyDtC,MAxDmC,GAA8B,IAAI,EAAA,YAAY,CAAM,EAyDvF,WAxDkC,IAAI,EAAA,aAyDtC,YAxDoC,IAAI,EAAA,cAyDxC,OAAQ,CAvBR,WAAqC,EAAA,aAAa,OAAO,EACzD,YAAuC,EAAA,cAAc,OAAO,EAC5D,SAAiC,EAAA,WAAW,OAAO,EACnD,WAAqC,EAAA,aAAa,OAAO,EACzD,WAAqC,EAAA,aAAa,OAAO,CAmBjD,EACR,SAzD8B,IAAI,EAAA,WA0DlC,oBA7BA,EACA,IACwB,IAAI,EAAA,cAAc,EAAe,CAAG,EA4B5D,KA1DyC,GAA6B,IAAI,EAAA,WAAW,CAAM,EA2D3F,WA1DsB,GAA0D,IAAI,EAAA,iBAAiB,CAAG,EA2DxG,WAzDA,GAAG,IAEH,IAAI,EAAA,gBAAgB,EAAA,mBAAmB,CAAK,CAA6C,EAwDzF,KAvDkC,GAClC,IAAI,EAAA,WAAW,CAA8E,EAuD7F,QAtDwE,GACxE,IAAI,EAAA,cAAc,CAAK,EAsDvB,KArDsD,EAAc,IACpE,IAAI,EAAA,UAAU,EAAW,CAAW,EAqDpC,UApDgC,IAAI,EAAA,YAqDpC,SApDuC,IAAI,EAAA,cAAc,IAAI,EAqD7D,WApDkC,IAAI,EAAA,aAqDtC,OApDsC,GAA8B,IAAI,EAAA,aAAa,CAAK,EAqD1F,QApDyD,EAAc,IACvE,IAAI,EAAA,aAAa,EAAW,CAAW,EAoDvC,IAnDiC,GAA4B,IAAI,EAAA,UAAU,CAAM,EAoDjF,WAnDkC,IAAI,EAAA,aAoDtC,MAnD4C,GAA6B,IAAI,EAAA,YAAY,CAAK,EAoD9F,cAnDiD,IAAI,EAAA,cAAc,IAAA,EAAS,EAoD5E,OAlDA,GAAG,IAEH,IAAI,EAAA,YAAY,EAAA,mBAAmB,CAAK,CAA6C,EAiDrF,YAhDsC,IAAI,EAAA,MAiD5C"}
package/dist/s.d.ts CHANGED
@@ -29,7 +29,7 @@ import { VariantSchema } from './schemas/variant';
29
29
  * type User = Infer<typeof User>;
30
30
  */
31
31
  export declare const s: {
32
- any: () => Schema<any>;
32
+ any: () => Schema<unknown>;
33
33
  array: <T extends AnySchema>(schema: T) => ArraySchema<T>;
34
34
  bigint: () => BigIntSchema;
35
35
  boolean: () => BooleanSchema;
@@ -43,7 +43,7 @@ export declare const s: {
43
43
  date: () => DateSchema;
44
44
  discriminatedUnion: <K extends string, M extends Record<string, ObjectSchema<any, any>>>(discriminator: K, map: M) => VariantSchema<K, M>;
45
45
  enum: <const T extends EnumValues>(values: T) => EnumSchema<T>;
46
- instanceof: <T>(cls: new (...args: any[]) => T) => InstanceOfSchema<T>;
46
+ instanceof: <T>(cls: new (...args: never[]) => T) => InstanceOfSchema<T>;
47
47
  intersect: <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(...items: T) => IntersectSchema<NormalizeItems<T> & readonly AnySchema[]>;
48
48
  lazy: <T extends AnySchema>(getter: () => T) => LazySchema<InferOutput<T>, unknown, InferSchemaMode<T>>;
49
49
  literal: <T extends string | number | boolean | null | undefined>(value: T) => LiteralSchema<T>;
package/dist/s.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.d.ts","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"s.d.ts","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"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"}
package/dist/s.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.js","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferOutput, type InferSchemaMode, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sAny = (): Schema<any> => new Schema();\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: any[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, unknown, InferSchemaMode<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, unknown, InferSchemaMode<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any, any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n any: sAny,\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"yhCA+EA,IAAa,EAAI,CACf,QAxD8B,IAAI,EAyDlC,MAxDmC,GAA8B,IAAI,EAAY,CAAM,EAyDvF,WAxDkC,IAAI,EAyDtC,YAxDoC,IAAI,EAyDxC,OAAQ,CAvBR,WAAqC,EAAa,OAAO,EACzD,YAAuC,EAAc,OAAO,EAC5D,SAAiC,EAAW,OAAO,EACnD,WAAqC,EAAa,OAAO,EACzD,WAAqC,EAAa,OAAO,CAmBjD,EACR,SAzD8B,IAAI,EA0DlC,oBA7BA,EACA,IACwB,IAAI,EAAc,EAAe,CAAG,EA4B5D,KA1DyC,GAA6B,IAAI,EAAW,CAAM,EA2D3F,WA1DsB,GAAwD,IAAI,EAAiB,CAAG,EA2DtG,WAzDA,GAAG,IAEH,IAAI,EAAgB,EAAmB,CAAK,CAA6C,EAwDzF,KAvDkC,GAClC,IAAI,EAAW,CAA8E,EAuD7F,QAtDwE,GACxE,IAAI,EAAc,CAAK,EAsDvB,KArDsD,EAAc,IACpE,IAAI,EAAU,EAAW,CAAW,EAqDpC,UApDgC,IAAI,EAqDpC,SApDuC,IAAI,EAAc,IAAI,EAqD7D,WApDkC,IAAI,EAqDtC,OApDsC,GAA8B,IAAI,EAAa,CAAK,EAqD1F,QApDyD,EAAc,IACvE,IAAI,EAAa,EAAW,CAAW,EAoDvC,IAnDiC,GAA4B,IAAI,EAAU,CAAM,EAoDjF,WAnDkC,IAAI,EAoDtC,MAnD4C,GAA6B,IAAI,EAAY,CAAK,EAoD9F,cAnDiD,IAAI,EAAc,IAAA,EAAS,EAoD5E,OAlDA,GAAG,IAEH,IAAI,EAAY,EAAmB,CAAK,CAA6C,EAiDrF,YAhDsC,IAAI,CAiD5C"}
1
+ {"version":3,"file":"s.js","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferOutput, type InferSchemaMode, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sAny = (): Schema<unknown> => new Schema();\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, unknown, InferSchemaMode<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, unknown, InferSchemaMode<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any, any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n any: sAny,\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"yhCA+EA,IAAa,EAAI,CACf,QAxDkC,IAAI,EAyDtC,MAxDmC,GAA8B,IAAI,EAAY,CAAM,EAyDvF,WAxDkC,IAAI,EAyDtC,YAxDoC,IAAI,EAyDxC,OAAQ,CAvBR,WAAqC,EAAa,OAAO,EACzD,YAAuC,EAAc,OAAO,EAC5D,SAAiC,EAAW,OAAO,EACnD,WAAqC,EAAa,OAAO,EACzD,WAAqC,EAAa,OAAO,CAmBjD,EACR,SAzD8B,IAAI,EA0DlC,oBA7BA,EACA,IACwB,IAAI,EAAc,EAAe,CAAG,EA4B5D,KA1DyC,GAA6B,IAAI,EAAW,CAAM,EA2D3F,WA1DsB,GAA0D,IAAI,EAAiB,CAAG,EA2DxG,WAzDA,GAAG,IAEH,IAAI,EAAgB,EAAmB,CAAK,CAA6C,EAwDzF,KAvDkC,GAClC,IAAI,EAAW,CAA8E,EAuD7F,QAtDwE,GACxE,IAAI,EAAc,CAAK,EAsDvB,KArDsD,EAAc,IACpE,IAAI,EAAU,EAAW,CAAW,EAqDpC,UApDgC,IAAI,EAqDpC,SApDuC,IAAI,EAAc,IAAI,EAqD7D,WApDkC,IAAI,EAqDtC,OApDsC,GAA8B,IAAI,EAAa,CAAK,EAqD1F,QApDyD,EAAc,IACvE,IAAI,EAAa,EAAW,CAAW,EAoDvC,IAnDiC,GAA4B,IAAI,EAAU,CAAM,EAoDjF,WAnDkC,IAAI,EAoDtC,MAnD4C,GAA6B,IAAI,EAAY,CAAK,EAoD9F,cAnDiD,IAAI,EAAc,IAAA,EAAS,EAoD5E,OAlDA,GAAG,IAEH,IAAI,EAAY,EAAmB,CAAK,CAA6C,EAiDrF,YAhDsC,IAAI,CAiD5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"array.cjs","names":[],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type { AnySchema, InferOutput, Issue, MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { _makeCtx, ErrorCode, fail, prependIssuePath, resolveMessage, Schema, SpellValidationError } from '../core';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<\n T extends AnySchema,\n Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<import('../core').InferSchemaMode<T>>,\n> extends Schema<InferOutput<T>[], unknown, Mode> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n override checkAsync(\n this: ArraySchema<T, 'sync'>,\n fn: (value: InferOutput<T>[], ctx: import('../core').CheckContext) => Promise<import('../core').ValidateResult>,\n ): ArraySchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as ArraySchema<T, 'async'>;\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: InferOutput<T>[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<T>[]> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync<InferOutput<T>[]>(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferOutput<T>[];\n\n const raw = prepared.value;\n\n if (!Array.isArray(raw)) {\n throw new SpellValidationError(fail(ErrorCode.invalid_type, c.messages.array.type()));\n }\n\n const settled = await Promise.all(raw.map((item) => this.itemSchema._parseFullAsync(item, c)));\n\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(raw[i] as InferOutput<T>);\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(parsed, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(parsed) as InferOutput<T>[];\n });\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.array.min, { min: length, value: value as unknown[] }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.array.max, { max: length, value: value as unknown[] }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.array.length, { exact, value: value as unknown[] }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as unknown[];\n\n return typed.length > 0\n ? null\n : fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.array.nonEmpty, { min: 1, value: typed }), {\n min: 1,\n });\n });\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{ value: unknown[] }>,\n message?: MessageFn<{ value: unknown[] }>,\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: InferOutput<T>, b: InferOutput<T>) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : undefined;\n\n return this._addConstraint((value, ctx) => {\n const typed = value as InferOutput<T>[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(\n ErrorCode.invalid_unique,\n resolveMessage(resolvedMessage ?? ctx!.messages.array.unique, { value: typed as unknown[] }),\n {\n unique: true,\n },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const item = this.itemSchema.walk(visitor);\n\n if (visitor.array) return visitor.array(this, item);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"array.cjs","names":[],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type {\n AnySchema,\n CheckContext,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateResult,\n} from '../core';\n\nimport { _makeCtx, ErrorCode, fail, prependIssuePath, resolveMessage, Schema, SpellValidationError } from '../core';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<\n T extends AnySchema,\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<T>>,\n> extends Schema<InferOutput<T>[], unknown, Mode> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n override checkAsync(\n this: ArraySchema<T, 'sync'>,\n fn: (value: InferOutput<T>[], ctx: CheckContext) => Promise<ValidateResult>,\n ): ArraySchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as ArraySchema<T, 'async'>;\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: InferOutput<T>[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<T>[]> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync<InferOutput<T>[]>(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferOutput<T>[];\n\n const raw = prepared.value;\n\n if (!Array.isArray(raw)) {\n throw new SpellValidationError(fail(ErrorCode.invalid_type, c.messages.array.type()));\n }\n\n const settled = await Promise.all(raw.map((item) => this.itemSchema._parseFullAsync(item, c)));\n\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(raw[i] as InferOutput<T>);\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(parsed, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(parsed) as InferOutput<T>[];\n });\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.array.min, { min: length, value: value as unknown[] }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.array.max, { max: length, value: value as unknown[] }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.array.length, { exact, value: value as unknown[] }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as unknown[];\n\n return typed.length > 0\n ? null\n : fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.array.nonEmpty, { min: 1, value: typed }), {\n min: 1,\n });\n });\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{ value: unknown[] }>,\n message?: MessageFn<{ value: unknown[] }>,\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: InferOutput<T>, b: InferOutput<T>) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : undefined;\n\n return this._addConstraint((value, ctx) => {\n const typed = value as InferOutput<T>[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(\n ErrorCode.invalid_unique,\n resolveMessage(resolvedMessage ?? ctx!.messages.array.unique, { value: typed as unknown[] }),\n {\n unique: true,\n },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const item = this.itemSchema.walk(visitor);\n\n if (visitor.array) return visitor.array(this, item);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import type { AnySchema, InferOutput, MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';
1
+ import type { AnySchema, CheckContext, InferOutput, InferSchemaMode, MergeSchemaModes, MessageFn, ParseContext, ParseValue, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';
2
2
  import { Schema } from '../core';
3
- export declare class ArraySchema<T extends AnySchema, Mode extends import('../core').SchemaMode = import('../core').MergeSchemaModes<import('../core').InferSchemaMode<T>>> extends Schema<InferOutput<T>[], unknown, Mode> {
3
+ export declare class ArraySchema<T extends AnySchema, Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<T>>> extends Schema<InferOutput<T>[], unknown, Mode> {
4
4
  readonly itemSchema: T;
5
5
  protected get _kind(): string;
6
- checkAsync(this: ArraySchema<T, 'sync'>, fn: (value: InferOutput<T>[], ctx: import('../core').CheckContext) => Promise<import('../core').ValidateResult>): ArraySchema<T, 'async'>;
6
+ checkAsync(this: ArraySchema<T, 'sync'>, fn: (value: InferOutput<T>[], ctx: CheckContext) => Promise<ValidateResult>): ArraySchema<T, 'async'>;
7
7
  constructor(itemSchema: T);
8
8
  private _parseItemsSync;
9
9
  protected _parse(value: unknown, ctx: ParseContext): ParseValue;
@@ -44,6 +44,6 @@ export declare class ArraySchema<T extends AnySchema, Mode extends import('../co
44
44
  value: unknown[];
45
45
  }>): this;
46
46
  protected _toDescriptorImpl(): SchemaDescriptor;
47
- protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
47
+ protected _walk<R>(visitor: SchemaWalker<R>): R | null;
48
48
  }
49
49
  //# 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,EAAE,SAAS,EAAE,WAAW,EAAS,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEpH,OAAO,EAA+D,MAAM,EAAwB,MAAM,SAAS,CAAC;AASpH,qBAAa,WAAW,CACtB,CAAC,SAAS,SAAS,EACnB,IAAI,SAAS,OAAO,SAAS,EAAE,UAAU,GAAG,OAAO,SAAS,EAAE,gBAAgB,CAAC,OAAO,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CACpH,SAAQ,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAEvB,cAAuB,KAAK,IAAI,MAAM,CAErC;IAEQ,UAAU,CACjB,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,EAC5B,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,SAAS,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,SAAS,EAAE,cAAc,CAAC,GAC9G,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC;gBAId,UAAU,EAAE,CAAC;IAKzB,OAAO,CAAC,eAAe;cAkBJ,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IAUzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAuCxF,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;cAYrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;CAOlF"}
1
+ {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/schemas/array.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,eAAe,EAEf,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,OAAO,EAA+D,MAAM,EAAwB,MAAM,SAAS,CAAC;AASpH,qBAAa,WAAW,CACtB,CAAC,SAAS,SAAS,EACnB,IAAI,SAAS,UAAU,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAC9D,SAAQ,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAEvB,cAAuB,KAAK,IAAI,MAAM,CAErC;IAEQ,UAAU,CACjB,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,EAC5B,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,cAAc,CAAC,GAC1E,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC;gBAId,UAAU,EAAE,CAAC;IAKzB,OAAO,CAAC,eAAe;cAkBJ,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IAUzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAuCxF,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;cAYrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;CAOhE"}