@vielzeug/spell 26.11.5 → 26.11.6
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.
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/s.cjs +1 -1
- package/dist/s.cjs.map +1 -1
- package/dist/s.js +1 -1
- package/dist/schemas/intersect.cjs +1 -1
- package/dist/schemas/intersect.cjs.map +1 -1
- package/dist/schemas/intersect.js +1 -1
- package/dist/schemas/object.cjs +1 -1
- package/dist/schemas/object.cjs.map +1 -1
- package/dist/schemas/object.js +1 -1
- package/dist/schemas/record.cjs +1 -1
- package/dist/schemas/record.cjs.map +1 -1
- package/dist/schemas/record.js +1 -1
- package/dist/schemas/variant.cjs +1 -1
- package/dist/schemas/variant.cjs.map +1 -1
- package/dist/schemas/variant.js +1 -1
- package/dist/spell.js +11 -22
- package/dist/spell.js.map +1 -1
- package/package.json +8 -8
package/dist/core.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./errors.cjs"),t=require("./
|
|
1
|
+
const e=require("./errors.cjs"),t=require("./messages.cjs"),n=require("./safe-object.cjs"),r=require("./types.cjs");let i=require("@vielzeug/arsenal");function a(e){if(typeof e!=`object`||!e||Object.isFrozen(e))return e;for(let t of Object.values(e))a(t);return Object.freeze(e)}function o(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(e=>o(e));if(e instanceof Date)return new Date(e.getTime());if(e instanceof Map){let t=new Map;for(let[n,r]of e.entries())t.set(o(n),o(r));return t}if(e instanceof Set)return new Set([...e.values()].map(e=>o(e)));if((0,i.isPlainObject)(e)){let t={};for(let[r,i]of Object.entries(e))n.defineOwnProperty(t,r,o(i));return t}return e}function s(){return{hasAsyncChecks:!1,hasRuntimeChecks:!1,isNullable:!1,isOptional:!1,postprocessors:[],preprocessors:[],validators:[]}}function c(e){return{catch:e.catch,defaultValue:e.defaultValue,description:e.description,hasAsyncChecks:e.hasAsyncChecks,hasRuntimeChecks:e.hasRuntimeChecks,isNullable:e.isNullable,isOptional:e.isOptional,postprocessors:[...e.postprocessors],preprocessors:[...e.preprocessors],validators:[...e.validators]}}function l(e){return e?{messages:e}:t.createParseContext()}function u(e,t,n){let i=[...t];return typeof e==`string`?i.push({code:r.ErrorCode.custom,message:e,path:[]}):e===!1&&i.length===0&&i.push({code:r.ErrorCode.custom,message:n.messages.check.default(),path:[]}),i.length?i:null}var d=class{state;_annotations={};_typeValidator=null;get"~standard"(){return{validate:async e=>{let t=await this.safeParseAsync(e);return t.success?{value:t.data}:{issues:t.error.issues.map(({message:e,path:t})=>({message:e,path:t}))}},vendor:`vielzeug`,version:1}}constructor(e){this.state=s(),this._typeValidator=e??null}parse(t,n){if(this.state.hasAsyncChecks)throw new e.SpellValidationError([{code:r.ErrorCode.custom,message:`parse() cannot evaluate async checks. Use parseAsync().`,path:[]}]);let i=n??l();return this._withCatch(()=>{let n=this._prepareInput(t);if(n.skip)return n.value;let r=this._parse(n.value,i),a=r.typeOk?this._runValidatorsSync(r.data,i):[],o=[...r.issues,...a];if(o.length)throw new e.SpellValidationError(o);return this._runPostprocessors(r.data)})}safeParse(t,n){try{return{data:this.parse(t,n),success:!0}}catch(t){if(t instanceof e.SpellValidationError)return{error:t,success:!1};throw t}}async parseAsync(t,n){let r=n??l();return this._withCatchAsync(async()=>{let n=this._prepareInput(t);if(n.skip)return n.value;let i=await this._parseAsync(n.value,r),a=i.typeOk?await this._runValidatorsAsync(i.data,r):[],o=[...i.issues,...a];if(o.length)throw new e.SpellValidationError(o);return this._runPostprocessors(i.data)})}async safeParseAsync(t,n){try{return{data:await this.parseAsync(t,n),success:!0}}catch(t){if(t instanceof e.SpellValidationError)return{error:t,success:!1};throw t}}_parseFullSync(t,n){if(this.state.hasAsyncChecks)throw new e.SpellValidationError([{code:r.ErrorCode.custom,message:`Sync parsing cannot evaluate async checks. Use parseAsync().`,path:[]}]);let i=n??l(),a=this._prepareInput(t);if(a.skip)return{data:a.value,issues:[]};let o=this._parse(a.value,i),s=o.typeOk?this._runValidatorsSync(o.data,i):[],c=[...o.issues,...s];return c.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:o.data,issues:c}:{data:this._runPostprocessors(o.data),issues:[]}}async _parseFullAsync(e,t){let n=t??l(),r=this._prepareInput(e);if(r.skip)return{data:r.value,issues:[]};let i=await this._parseAsync(r.value,n),a=i.typeOk?await this._runValidatorsAsync(i.data,n):[],o=[...i.issues,...a];return o.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:i.data,issues:o}:{data:this._runPostprocessors(i.data),issues:[]}}check(e){return this._addCheck(e,!1)}checkAsync(e){return this._addCheck(e,!0)}_addCheck(e,t){let n=this._addConstraint((t,n)=>{let r=[],i=e(t,{addIssue:e=>r.push({...e,path:e.path??[]})});return i instanceof Promise?i.then(e=>u(e,r,n)):u(i,r,n)});return n.state.hasRuntimeChecks=!0,t&&(n.state.hasAsyncChecks=!0),n}optional(){let e=this._clone();return e.state.isOptional=!0,e}nullable(){let e=this._clone();return e.state.isNullable=!0,e}nullish(){let e=this._clone();return e.state.isOptional=!0,e.state.isNullable=!0,e}required(){let e=this._clone();return e.state.isOptional=!1,e}default(e){let t=this._clone();return t.state.defaultValue=typeof e==`function`?e:()=>o(e),t}catch(e){let t=this._clone();return t.state.catch=typeof e==`function`?e:()=>o(e),t}transform(e){let t=this._clone();return t.state.postprocessors.push(e),t}preprocess(e){let t=this._clone();return t.state.preprocessors.push(e),t}pipe(e){return new f(this,e)}label(e){let t=this._clone();return t.state.description=e,t}definition(){if(this.state.catch||this.state.defaultValue||this.state.postprocessors.length>0||this.state.preprocessors.length>0||this.state.hasRuntimeChecks)throw new e.SpellDefinitionError(`Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.`);return a(this._toDescriptorImpl())}get description(){return this.state.description}get isOptional(){return this.state.isOptional}get isNullable(){return this.state.isNullable}is(e){return this.safeParse(e).success}assert(t,n){let r=this._parseFullSync(t);if(r.issues.length===0)return;let i=n?r.issues.map(e=>({...e,message:e.path.length===0?`${n}: ${e.message}`:e.message})):r.issues;throw new e.SpellValidationError(i)}get kind(){return this._kind}get _kind(){return`unknown`}_describeBase(){return{...this.state.description===void 0?{}:{description:this.state.description},...this.state.isNullable?{isNullable:!0}:{},...this.state.isOptional?{isOptional:!0}:{}}}_addConstraint(e,t){let n=this._clone();return n.state.validators.push(e),t&&(n._annotations=t({...n._annotations})),n}_construct(e){let t=Object.assign(Object.create(Object.getPrototypeOf(this)),this,{state:e});return t._annotations={...this._annotations},t}_clone(){return this._construct(c(this.state))}_copyStateTo(e){return e.state=c(this.state),e}_toDescriptorImpl(){return{...this._describeBase(),kind:`unknown`}}_withCatch(t){if(!this.state.catch)return t();try{return t()}catch(t){if(t instanceof e.SpellValidationError)return this.state.catch();throw t}}async _withCatchAsync(t){if(!this.state.catch)return t();try{return await t()}catch(t){if(t instanceof e.SpellValidationError)return this.state.catch();throw t}}_prepareInput(e){let t=this._runPreprocessors(e),n=t===void 0&&this.state.defaultValue?this.state.defaultValue():t;return this.state.isOptional&&n===void 0||this.state.isNullable&&n===null?{skip:!0,value:n}:{skip:!1,value:n}}_runPreprocessors(e){let t=e;for(let e of this.state.preprocessors)t=e(t);return t}_runPostprocessors(e){let t=e;for(let e of this.state.postprocessors)t=e(t);return t}_runValidatorsSync(t,n){if(this._typeValidator){let i=this._typeValidator(t,n);if(i instanceof Promise)throw new e.SpellValidationError([{code:r.ErrorCode.custom,message:`Type validator returned a Promise. Use parseAsync() for async validation.`,path:[]}]);if(i&&i.length>0)return i}let i=[];for(let a of this.state.validators){let o=a(t,n);if(o instanceof Promise)throw new e.SpellValidationError([{code:r.ErrorCode.custom,message:`Sync parsing received an async check. Use checkAsync() and parseAsync().`,path:[]}]);o&&i.push(...o)}return i}async _runValidatorsAsync(e,t){if(this._typeValidator){let n=await this._typeValidator(e,t);if(n&&n.length>0)return n}let n=[];for(let r of this.state.validators){let i=await r(e,t);i&&n.push(...i)}return n}_parse(e,t){return{data:e,issues:[],typeOk:!0}}_parseAsync(e,t){return Promise.resolve(this._parse(e,t))}},f=class extends d{from;to;get _kind(){return`pipe`}constructor(e,t){super(),this.from=e,this.to=t}_parse(e,t){let n=this.from._parseFullSync(e,t);if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=this.to._parseFullSync(n.data,t);return r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}async _parseAsync(e,t){let n=await this.from._parseFullAsync(e,t);if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=await this.to._parseFullAsync(n.data,t);return r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}_toDescriptorImpl(){return{...this._describeBase(),from:this.from.definition(),kind:`pipe`,to:this.to.definition()}}};exports.ErrorCode=r.ErrorCode,exports.PipeSchema=f,exports.Schema=d,exports.SpellDefinitionError=e.SpellDefinitionError,exports.SpellError=e.SpellError,exports.SpellValidationError=e.SpellValidationError,exports._makeCtx=l,exports.fail=e.fail,exports.joinIssuePath=e.joinIssuePath,exports.prependIssuePath=e.prependIssuePath,exports.resolveMessage=e.resolveMessage;
|
|
2
2
|
//# sourceMappingURL=core.cjs.map
|
package/dist/core.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.cjs","names":["isPlainObject","createParseContext","ErrorCode","SpellValidationError","SpellDefinitionError","require_errors","require_safe_object","require_messages","require_types","_vielzeug_arsenal","deepFreeze","value","child","materializeValue","item","out","key","mapValue","entry","defaultState","cloneState","state","_makeCtx","messages","normalizeValidateResult","issues","ctxIssues","result","ctx","Schema","typeValidator","c","prepared","core","validationIssues","allIssues","error","fn","next","issue","r","async","cloned","defaultValue","fallback","PipeSchema","description","label","validator","mergeAnnotations","target","processed","withDefault","current","preprocess","postprocess","typeResult","validate","_value","from","to","first","second"],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport { SpellDefinitionError, SpellValidationError } from './errors';\nimport { createParseContext } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AcceptsMissing,\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 Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\n schemaInput,\n schemaOutput,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n fail,\n joinIssuePath,\n prependIssuePath,\n resolveMessage,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n} from './errors';\nexport {\n type AcceptsMissing,\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 Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\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/* -------------------- Parse-value return type -------------------- */\n\n/** Parse-value return type for `_parse` implementations. Emitted as part of the public class surface. */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\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> implements StandardSchemaV1<Input, Output> {\n declare readonly [schemaInput]: Input;\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 get '~standard'(): StandardSchemaV1.Props<Input, Output> {\n return {\n validate: async (value) => {\n const result = await this.safeParseAsync(value);\n\n if (result.success) return { value: result.data };\n\n return { issues: result.error.issues.map(({ message, path }) => ({ message, path })) };\n },\n vendor: 'vielzeug',\n version: 1,\n };\n }\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(value: unknown, ctx?: ParseContext): Output {\n 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 core = this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return {\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._parseAsync(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 core = this._parse(prepared.value, c);\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._parseAsync(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(fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>): this {\n return this._addCheck(fn, true);\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> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined>;\n\n cloned.state.isOptional = true;\n\n return cloned as Schema<Output | undefined, Input | undefined> & AcceptsMissing;\n }\n\n nullable(): Schema<Output | null, Input | null> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned as Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned as this & AcceptsMissing;\n }\n\n catch(fallback: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned as this & AcceptsMissing;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input> {\n const next = this._clone() as unknown as Schema<NewOutput, Input>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B extends AnySchema>(next: B): PipeSchema<B, this> {\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(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 get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'unknown';\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 _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'unknown' };\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): ParseValue {\n return { data: _value, issues: [], typeOk: true };\n }\n\n /**\n * Async counterpart of `_parse`. Composites override this to parse their\n * children through `_parseFullAsync`, which keeps async checks reachable at\n * any nesting depth. The default defers to the synchronous `_parse`.\n */\n protected _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n return Promise.resolve(this._parse(value, ctx));\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<To extends AnySchema, From extends AnySchema> extends Schema<\n InferOutput<To>,\n InferInput<From>\n> {\n readonly from: From;\n readonly to: To;\n\n protected override get _kind(): string {\n return 'pipe';\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): ParseValue {\n const first = this.from._parseFullSync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = this.to._parseFullSync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const first = await this.from._parseFullAsync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = await this.to._parseFullAsync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\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":["isPlainObject","createParseContext","ErrorCode","SpellValidationError","SpellDefinitionError","require_errors","require_messages","require_safe_object","require_types","_vielzeug_arsenal","deepFreeze","value","child","materializeValue","item","out","key","mapValue","entry","defaultState","cloneState","state","_makeCtx","messages","normalizeValidateResult","issues","ctxIssues","result","ctx","Schema","typeValidator","c","prepared","core","validationIssues","allIssues","error","fn","next","issue","r","async","cloned","defaultValue","fallback","PipeSchema","description","label","validator","mergeAnnotations","target","processed","withDefault","current","preprocess","postprocess","typeResult","validate","_value","from","to","first","second"],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport { SpellDefinitionError, SpellValidationError } from './errors';\nimport { createParseContext } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AcceptsMissing,\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 Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\n schemaInput,\n schemaOutput,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n fail,\n joinIssuePath,\n prependIssuePath,\n resolveMessage,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n} from './errors';\nexport {\n type AcceptsMissing,\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 Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\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/* -------------------- Parse-value return type -------------------- */\n\n/** Parse-value return type for `_parse` implementations. Emitted as part of the public class surface. */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\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> implements StandardSchemaV1<Input, Output> {\n declare readonly [schemaInput]: Input;\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 get '~standard'(): StandardSchemaV1.Props<Input, Output> {\n return {\n validate: async (value) => {\n const result = await this.safeParseAsync(value);\n\n if (result.success) return { value: result.data };\n\n return { issues: result.error.issues.map(({ message, path }) => ({ message, path })) };\n },\n vendor: 'vielzeug',\n version: 1,\n };\n }\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(value: unknown, ctx?: ParseContext): Output {\n 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 core = this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return {\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._parseAsync(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 core = this._parse(prepared.value, c);\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._parseAsync(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(fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>): this {\n return this._addCheck(fn, true);\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> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined>;\n\n cloned.state.isOptional = true;\n\n return cloned as Schema<Output | undefined, Input | undefined> & AcceptsMissing;\n }\n\n nullable(): Schema<Output | null, Input | null> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned as Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned as this & AcceptsMissing;\n }\n\n catch(fallback: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned as this & AcceptsMissing;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input> {\n const next = this._clone() as unknown as Schema<NewOutput, Input>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B extends AnySchema>(next: B): PipeSchema<B, this> {\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(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 get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'unknown';\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 _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'unknown' };\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): ParseValue {\n return { data: _value, issues: [], typeOk: true };\n }\n\n /**\n * Async counterpart of `_parse`. Composites override this to parse their\n * children through `_parseFullAsync`, which keeps async checks reachable at\n * any nesting depth. The default defers to the synchronous `_parse`.\n */\n protected _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n return Promise.resolve(this._parse(value, ctx));\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<To extends AnySchema, From extends AnySchema> extends Schema<\n InferOutput<To>,\n InferInput<From>\n> {\n readonly from: From;\n readonly to: To;\n\n protected override get _kind(): string {\n return 'pipe';\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): ParseValue {\n const first = this.from._parseFullSync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = this.to._parseFullSync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const first = await this.from._parseFullAsync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = await this.to._parseFullAsync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\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.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{SpellDefinitionError as e,SpellError as t,SpellValidationError as n,fail as r,joinIssuePath as i,prependIssuePath as a,resolveMessage as o}from"./errors.js";import{
|
|
1
|
+
import{SpellDefinitionError as e,SpellError as t,SpellValidationError as n,fail as r,joinIssuePath as i,prependIssuePath as a,resolveMessage as o}from"./errors.js";import{createParseContext as s}from"./messages.js";import{defineOwnProperty as c}from"./safe-object.js";import{ErrorCode as l}from"./types.js";import{isPlainObject as u}from"@vielzeug/arsenal";function d(e){if(typeof e!=`object`||!e||Object.isFrozen(e))return e;for(let t of Object.values(e))d(t);return Object.freeze(e)}function f(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(e=>f(e));if(e instanceof Date)return new Date(e.getTime());if(e instanceof Map){let t=/* @__PURE__ */ new Map;for(let[n,r]of e.entries())t.set(f(n),f(r));return t}if(e instanceof Set)return new Set([...e.values()].map(e=>f(e)));if(u(e)){let t={};for(let[n,r]of Object.entries(e))c(t,n,f(r));return t}return e}function p(){return{hasAsyncChecks:!1,hasRuntimeChecks:!1,isNullable:!1,isOptional:!1,postprocessors:[],preprocessors:[],validators:[]}}function m(e){return{catch:e.catch,defaultValue:e.defaultValue,description:e.description,hasAsyncChecks:e.hasAsyncChecks,hasRuntimeChecks:e.hasRuntimeChecks,isNullable:e.isNullable,isOptional:e.isOptional,postprocessors:[...e.postprocessors],preprocessors:[...e.preprocessors],validators:[...e.validators]}}function h(e){return e?{messages:e}:s()}function g(e,t,n){let r=[...t];return typeof e==`string`?r.push({code:l.custom,message:e,path:[]}):e===!1&&r.length===0&&r.push({code:l.custom,message:n.messages.check.default(),path:[]}),r.length?r:null}var _=class{state;_annotations={};_typeValidator=null;get"~standard"(){return{validate:async e=>{let t=await this.safeParseAsync(e);return t.success?{value:t.data}:{issues:t.error.issues.map(({message:e,path:t})=>({message:e,path:t}))}},vendor:`vielzeug`,version:1}}constructor(e){this.state=p(),this._typeValidator=e??null}parse(e,t){if(this.state.hasAsyncChecks)throw new n([{code:l.custom,message:`parse() cannot evaluate async checks. Use parseAsync().`,path:[]}]);let r=t??h();return this._withCatch(()=>{let t=this._prepareInput(e);if(t.skip)return t.value;let i=this._parse(t.value,r),a=i.typeOk?this._runValidatorsSync(i.data,r):[],o=[...i.issues,...a];if(o.length)throw new n(o);return this._runPostprocessors(i.data)})}safeParse(e,t){try{return{data:this.parse(e,t),success:!0}}catch(e){if(e instanceof n)return{error:e,success:!1};throw e}}async parseAsync(e,t){let r=t??h();return this._withCatchAsync(async()=>{let t=this._prepareInput(e);if(t.skip)return t.value;let i=await this._parseAsync(t.value,r),a=i.typeOk?await this._runValidatorsAsync(i.data,r):[],o=[...i.issues,...a];if(o.length)throw new n(o);return this._runPostprocessors(i.data)})}async safeParseAsync(e,t){try{return{data:await this.parseAsync(e,t),success:!0}}catch(e){if(e instanceof n)return{error:e,success:!1};throw e}}_parseFullSync(e,t){if(this.state.hasAsyncChecks)throw new n([{code:l.custom,message:`Sync parsing cannot evaluate async checks. Use parseAsync().`,path:[]}]);let r=t??h(),i=this._prepareInput(e);if(i.skip)return{data:i.value,issues:[]};let a=this._parse(i.value,r),o=a.typeOk?this._runValidatorsSync(a.data,r):[],s=[...a.issues,...o];return s.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:a.data,issues:s}:{data:this._runPostprocessors(a.data),issues:[]}}async _parseFullAsync(e,t){let n=t??h(),r=this._prepareInput(e);if(r.skip)return{data:r.value,issues:[]};let i=await this._parseAsync(r.value,n),a=i.typeOk?await this._runValidatorsAsync(i.data,n):[],o=[...i.issues,...a];return o.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:i.data,issues:o}:{data:this._runPostprocessors(i.data),issues:[]}}check(e){return this._addCheck(e,!1)}checkAsync(e){return this._addCheck(e,!0)}_addCheck(e,t){let n=this._addConstraint((t,n)=>{let r=[],i=e(t,{addIssue:e=>r.push({...e,path:e.path??[]})});return i instanceof Promise?i.then(e=>g(e,r,n)):g(i,r,n)});return n.state.hasRuntimeChecks=!0,t&&(n.state.hasAsyncChecks=!0),n}optional(){let e=this._clone();return e.state.isOptional=!0,e}nullable(){let e=this._clone();return e.state.isNullable=!0,e}nullish(){let e=this._clone();return e.state.isOptional=!0,e.state.isNullable=!0,e}required(){let e=this._clone();return e.state.isOptional=!1,e}default(e){let t=this._clone();return t.state.defaultValue=typeof e==`function`?e:()=>f(e),t}catch(e){let t=this._clone();return t.state.catch=typeof e==`function`?e:()=>f(e),t}transform(e){let t=this._clone();return t.state.postprocessors.push(e),t}preprocess(e){let t=this._clone();return t.state.preprocessors.push(e),t}pipe(e){return new v(this,e)}label(e){let t=this._clone();return t.state.description=e,t}definition(){if(this.state.catch||this.state.defaultValue||this.state.postprocessors.length>0||this.state.preprocessors.length>0||this.state.hasRuntimeChecks)throw new e(`Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.`);return d(this._toDescriptorImpl())}get description(){return this.state.description}get isOptional(){return this.state.isOptional}get isNullable(){return this.state.isNullable}is(e){return this.safeParse(e).success}assert(e,t){let r=this._parseFullSync(e);if(r.issues.length===0)return;let i=t?r.issues.map(e=>({...e,message:e.path.length===0?`${t}: ${e.message}`:e.message})):r.issues;throw new n(i)}get kind(){return this._kind}get _kind(){return`unknown`}_describeBase(){return{...this.state.description===void 0?{}:{description:this.state.description},...this.state.isNullable?{isNullable:!0}:{},...this.state.isOptional?{isOptional:!0}:{}}}_addConstraint(e,t){let n=this._clone();return n.state.validators.push(e),t&&(n._annotations=t({...n._annotations})),n}_construct(e){let t=Object.assign(Object.create(Object.getPrototypeOf(this)),this,{state:e});return t._annotations={...this._annotations},t}_clone(){return this._construct(m(this.state))}_copyStateTo(e){return e.state=m(this.state),e}_toDescriptorImpl(){return{...this._describeBase(),kind:`unknown`}}_withCatch(e){if(!this.state.catch)return e();try{return e()}catch(e){if(e instanceof n)return this.state.catch();throw e}}async _withCatchAsync(e){if(!this.state.catch)return e();try{return await e()}catch(e){if(e instanceof n)return this.state.catch();throw e}}_prepareInput(e){let t=this._runPreprocessors(e),n=t===void 0&&this.state.defaultValue?this.state.defaultValue():t;return this.state.isOptional&&n===void 0||this.state.isNullable&&n===null?{skip:!0,value:n}:{skip:!1,value:n}}_runPreprocessors(e){let t=e;for(let e of this.state.preprocessors)t=e(t);return t}_runPostprocessors(e){let t=e;for(let e of this.state.postprocessors)t=e(t);return t}_runValidatorsSync(e,t){if(this._typeValidator){let r=this._typeValidator(e,t);if(r instanceof Promise)throw new n([{code:l.custom,message:`Type validator returned a Promise. Use parseAsync() for async validation.`,path:[]}]);if(r&&r.length>0)return r}let r=[];for(let i of this.state.validators){let a=i(e,t);if(a instanceof Promise)throw new n([{code:l.custom,message:`Sync parsing received an async check. Use checkAsync() and parseAsync().`,path:[]}]);a&&r.push(...a)}return r}async _runValidatorsAsync(e,t){if(this._typeValidator){let n=await this._typeValidator(e,t);if(n&&n.length>0)return n}let n=[];for(let r of this.state.validators){let i=await r(e,t);i&&n.push(...i)}return n}_parse(e,t){return{data:e,issues:[],typeOk:!0}}_parseAsync(e,t){return Promise.resolve(this._parse(e,t))}},v=class extends _{from;to;get _kind(){return`pipe`}constructor(e,t){super(),this.from=e,this.to=t}_parse(e,t){let n=this.from._parseFullSync(e,t);if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=this.to._parseFullSync(n.data,t);return r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}async _parseAsync(e,t){let n=await this.from._parseFullAsync(e,t);if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=await this.to._parseFullAsync(n.data,t);return r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}_toDescriptorImpl(){return{...this._describeBase(),from:this.from.definition(),kind:`pipe`,to:this.to.definition()}}};export{l as ErrorCode,v as PipeSchema,_ as Schema,e as SpellDefinitionError,t as SpellError,n as SpellValidationError,h as _makeCtx,r as fail,i as joinIssuePath,a as prependIssuePath,o as resolveMessage};
|
|
2
2
|
//# sourceMappingURL=core.js.map
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./core.cjs"),n=require("./types.cjs"),r=require("./messages.cjs"),i=require("./s.cjs"),a=require("./tolerate.cjs");exports.ErrorCode=n.ErrorCode,exports.Schema=t.Schema,exports.SpellDefinitionError=e.SpellDefinitionError,exports.SpellError=e.SpellError,exports.SpellValidationError=e.SpellValidationError,exports.createParseContext=r.createParseContext,exports.joinIssuePath=e.joinIssuePath,exports.s=i.s,exports.tolerate=a.tolerate;
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SpellDefinitionError as e,SpellError as t,SpellValidationError as n,joinIssuePath as r}from"./errors.js";import{
|
|
1
|
+
import{SpellDefinitionError as e,SpellError as t,SpellValidationError as n,joinIssuePath as r}from"./errors.js";import{Schema as i}from"./core.js";import{ErrorCode as a}from"./types.js";import{createParseContext as o}from"./messages.js";import{s}from"./s.js";import{tolerate as c}from"./tolerate.js";export{a as ErrorCode,i as Schema,e as SpellDefinitionError,t as SpellError,n as SpellValidationError,o as createParseContext,r as joinIssuePath,s,c as tolerate};
|
package/dist/s.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./core.cjs"),t=require("./schemas/array.cjs"),n=require("./schemas/bigint.cjs"),r=require("./schemas/boolean.cjs"),i=require("./schemas/date.cjs"),a=require("./schemas/enum.cjs"),o=require("./schemas/instanceof.cjs"),s=require("./schemas/intersect.cjs"),c=require("./schemas/lazy.cjs"),l=require("./schemas/literal.cjs"),u=require("./schemas/map.cjs"),d=require("./schemas/never.cjs"),f=require("./schemas/number.cjs"),p=require("./schemas/
|
|
1
|
+
const e=require("./core.cjs"),t=require("./schemas/array.cjs"),n=require("./schemas/bigint.cjs"),r=require("./schemas/boolean.cjs"),i=require("./schemas/date.cjs"),a=require("./schemas/enum.cjs"),o=require("./schemas/instanceof.cjs"),s=require("./schemas/intersect.cjs"),c=require("./schemas/lazy.cjs"),l=require("./schemas/literal.cjs"),u=require("./schemas/map.cjs"),d=require("./schemas/never.cjs"),f=require("./schemas/number.cjs"),p=require("./schemas/object.cjs"),m=require("./schemas/raw-or.cjs"),h=require("./schemas/record.cjs"),g=require("./schemas/set.cjs"),_=require("./schemas/string.cjs"),v=require("./schemas/tuple.cjs"),y=require("./schemas/union.cjs"),b=require("./schemas/variant.cjs");var x=e=>new t.ArraySchema(e),S=()=>new n.BigIntSchema,C=()=>new r.BooleanSchema,w=()=>new i.DateSchema,T=e=>new a.EnumSchema(e),E=e=>new o.InstanceOfSchema(e),D=(...e)=>new s.IntersectSchema(m.normalizeToSchemas(e)),O=e=>new c.LazySchema(e),k=e=>new l.LiteralSchema(e),A=(e,t)=>new u.MapSchema(e,t),j=()=>new d.NeverSchema,M=()=>new l.LiteralSchema(null),N=()=>new f.NumberSchema,P=e=>new p.ObjectSchema(e),F=(e,t)=>new h.RecordSchema(e,t),I=e=>new g.SetSchema(e),L=()=>new _.StringSchema,R=e=>new v.TupleSchema(e),z=()=>new l.LiteralSchema(void 0);function B(...e){return new y.UnionSchema(m.normalizeToSchemas(e))}var V={array:x,bigint:S,boolean:C,coerce:{bigint:()=>n.BigIntSchema.coerce(),boolean:()=>r.BooleanSchema.coerce(),date:()=>i.DateSchema.coerce(),number:()=>f.NumberSchema.coerce(),string:()=>_.StringSchema.coerce()},date:w,discriminatedUnion:(e,t)=>new b.VariantSchema(e,t),enum:T,instanceof:E,intersect:D,lazy:O,literal:k,map:A,never:j,null:M,number:N,object:P,record:F,set:I,string:L,tuple:R,undefined:z,union:B,unknown:()=>new e.Schema};exports.s=V;
|
|
2
2
|
//# sourceMappingURL=s.cjs.map
|
package/dist/s.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s.cjs","names":["ArraySchema","BigIntSchema","BooleanSchema","DateSchema","EnumSchema","InstanceOfSchema","IntersectSchema","normalizeToSchemas","LazySchema","LiteralSchema","MapSchema","NeverSchema","NumberSchema","ObjectSchema","RecordSchema","SetSchema","StringSchema","TupleSchema","UnionSchema","Schema","VariantSchema","require_core","require_array","require_bigint","require_boolean","require_date","require_enum","require_instanceof","require_intersect","require_lazy","require_literal","require_map","require_never","require_number","
|
|
1
|
+
{"version":3,"file":"s.cjs","names":["ArraySchema","BigIntSchema","BooleanSchema","DateSchema","EnumSchema","InstanceOfSchema","IntersectSchema","normalizeToSchemas","LazySchema","LiteralSchema","MapSchema","NeverSchema","NumberSchema","ObjectSchema","RecordSchema","SetSchema","StringSchema","TupleSchema","UnionSchema","Schema","VariantSchema","require_core","require_array","require_bigint","require_boolean","require_date","require_enum","require_instanceof","require_intersect","require_lazy","require_literal","require_map","require_never","require_number","require_object","require_raw_or","require_record","require_set","require_string","require_tuple","require_union","require_variant","sArray","schema","sBigint","sBoolean","sDate","sEnum","values","sInstanceof","cls","sIntersect","items","sLazy","getter","sLiteral","value","sMap","keySchema","valueSchema","sNever","sNull","sNumber","sObject","shape","sRecord","sSet","sString","sTuple","sUndefined","sUnion","s","discriminator","map"],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferInput, type InferOutput, 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 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>, InferInput<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, InferInput<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);\n// Schema-only tuples keep their concrete branch types; the second overload normalizes raw\n// literals, where intersecting with AnySchema[] costs nothing.\nfunction sUnion<T extends readonly [AnySchema, AnySchema, ...AnySchema[]]>(...items: T): UnionSchema<T>;\nfunction sUnion<T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]>;\nfunction sUnion(this: unknown, ...items: readonly RawOrSchema[]): UnionSchema<readonly AnySchema[]> {\n return new UnionSchema(normalizeToSchemas(items) as AnySchema[]);\n}\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<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 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":"A,gsBAwBA,IAAM0C,EAA+B,GAA8B,IAAI1C,EAAAA,YAAY2C,CAAM,EACnFC,MAA8B,IAAI3C,EAAAA,aAClC4C,MAAgC,IAAI3C,EAAAA,cACpC4C,MAA0B,IAAI3C,EAAAA,WAC9B4C,EAAqC,GAA6B,IAAI3C,EAAAA,WAAW4C,CAAM,EACvFC,EAAkB,GAA0D,IAAI5C,EAAAA,iBAAiB6C,CAAG,EACpGC,GACJ,GAAGC,IAEH,IAAI9C,EAAAA,gBAAgBC,EAAAA,mBAAmB6C,CAAK,CAA6C,EACrFC,EAA8B,GAClC,IAAI7C,EAAAA,WAAW8C,CAAgE,EAC3EC,EAAoE,GACxE,IAAI9C,EAAAA,cAAc+C,CAAK,EACnBC,GAAkD,EAAc,IACpE,IAAI/C,EAAAA,UAAUgD,EAAWC,CAAW,EAChCC,MAA4B,IAAIjD,EAAAA,YAChCkD,MAAmC,IAAIpD,EAAAA,cAAc,IAAI,EACzDqD,MAA8B,IAAIlD,EAAAA,aAClCmD,EAAkC,GAA8B,IAAIlD,EAAAA,aAAamD,CAAK,EACtFC,GAAqD,EAAc,IACvE,IAAInD,EAAAA,aAAa4C,EAAWC,CAAW,EACnCO,EAA6B,GAA4B,IAAInD,EAAAA,UAAU4B,CAAM,EAC7EwB,MAA8B,IAAInD,EAAAA,aAClCoD,EAAwC,GAA6B,IAAInD,EAAAA,YAAYmC,CAAK,EAC1FiB,MAA6C,IAAI5D,EAAAA,cAAc,IAAA,EAAS,EAO9E,SAAS6D,EAAsB,GAAGlB,EAAkE,CAClG,OAAO,IAAIlC,EAAAA,YAAYX,EAAAA,mBAAmB6C,CAAK,CAAgB,CACjE,CAyBA,IAAamB,EAAI,CACf,MAAO7B,EACP,OAAQE,EACR,QAASC,EACT,OAAQ,CAtBR,WAAqC5C,EAAAA,aAAa,OAAO,EACzD,YAAuCC,EAAAA,cAAc,OAAO,EAC5D,SAAiCC,EAAAA,WAAW,OAAO,EACnD,WAAqCS,EAAAA,aAAa,OAAO,EACzD,WAAqCI,EAAAA,aAAa,OAAO,CAkBjD,EACR,KAAM8B,EACN,oBA5BA,EACA,IACwB,IAAI1B,EAAAA,cAAcoD,EAAeC,CAAG,EA2B5D,KAAM1B,EACN,WAAYE,EACZ,UAAWE,EACX,KAAME,EACN,QAASE,EACT,IAAKE,EACL,MAAOG,EACP,KAAMC,EACN,OAAQC,EACR,OAAQC,EACR,OAAQE,EACR,IAAKC,EACL,OAAQC,EACR,MAAOC,EACP,UAAWC,EACX,MAAOC,EACP,YA/CsC,IAAInD,EAAAA,MAgD5C,E"}
|
package/dist/s.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Schema as e}from"./core.js";import{ArraySchema as t}from"./schemas/array.js";import{BigIntSchema as n}from"./schemas/bigint.js";import{BooleanSchema as r}from"./schemas/boolean.js";import{DateSchema as i}from"./schemas/date.js";import{EnumSchema as a}from"./schemas/enum.js";import{InstanceOfSchema as o}from"./schemas/instanceof.js";import{IntersectSchema as s}from"./schemas/intersect.js";import{LazySchema as c}from"./schemas/lazy.js";import{LiteralSchema as l}from"./schemas/literal.js";import{MapSchema as u}from"./schemas/map.js";import{NeverSchema as d}from"./schemas/never.js";import{NumberSchema as f}from"./schemas/number.js";import{
|
|
1
|
+
import{Schema as e}from"./core.js";import{ArraySchema as t}from"./schemas/array.js";import{BigIntSchema as n}from"./schemas/bigint.js";import{BooleanSchema as r}from"./schemas/boolean.js";import{DateSchema as i}from"./schemas/date.js";import{EnumSchema as a}from"./schemas/enum.js";import{InstanceOfSchema as o}from"./schemas/instanceof.js";import{IntersectSchema as s}from"./schemas/intersect.js";import{LazySchema as c}from"./schemas/lazy.js";import{LiteralSchema as l}from"./schemas/literal.js";import{MapSchema as u}from"./schemas/map.js";import{NeverSchema as d}from"./schemas/never.js";import{NumberSchema as f}from"./schemas/number.js";import{ObjectSchema as p}from"./schemas/object.js";import{normalizeToSchemas as m}from"./schemas/raw-or.js";import{RecordSchema as h}from"./schemas/record.js";import{SetSchema as g}from"./schemas/set.js";import{StringSchema as _}from"./schemas/string.js";import{TupleSchema as v}from"./schemas/tuple.js";import{UnionSchema as y}from"./schemas/union.js";import{VariantSchema as b}from"./schemas/variant.js";var x=e=>new t(e),S=()=>new n,C=()=>new r,w=()=>new i,T=e=>new a(e),E=e=>new o(e),D=(...e)=>new s(m(e)),O=e=>new c(e),k=e=>new l(e),A=(e,t)=>new u(e,t),j=()=>new d,M=()=>new l(null),N=()=>new f,P=e=>new p(e),F=(e,t)=>new h(e,t),I=e=>new g(e),L=()=>new _,R=e=>new v(e),z=()=>new l(void 0);function B(...e){return new y(m(e))}var V={array:x,bigint:S,boolean:C,coerce:{bigint:()=>n.coerce(),boolean:()=>r.coerce(),date:()=>i.coerce(),number:()=>f.coerce(),string:()=>_.coerce()},date:w,discriminatedUnion:(e,t)=>new b(e,t),enum:T,instanceof:E,intersect:D,lazy:O,literal:k,map:A,never:j,null:M,number:N,object:P,record:F,set:I,string:L,tuple:R,undefined:z,union:B,unknown:()=>new e};export{V as s};
|
|
2
2
|
//# sourceMappingURL=s.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../
|
|
1
|
+
const e=require("../core.cjs"),t=require("../safe-object.cjs");let n=require("@vielzeug/arsenal");function r(e,i){if((0,n.isPlainObject)(e)&&(0,n.isPlainObject)(i)){let n=t.cloneRecord(e);for(let[a,o]of Object.entries(i))t.defineOwnProperty(n,a,r(e[a],o));return n}return i}var i=class extends e.Schema{schemas;get _kind(){return`intersect`}constructor(e){super(),this.schemas=Object.freeze([...e])}_parse(e,t){let n={hasOutput:!1,issues:[],output:e};for(let i=0;i<this.schemas.length;i++){let a=this.schemas[i]._parseFullSync(e,t);a.issues.length>0?n.issues.push(...a.issues):n.hasOutput?n.output=r(n.output,a.data):(n.hasOutput=!0,n.output=a.data)}return{data:n.output,issues:n.issues,typeOk:n.issues.length===0}}async _parseAsync(e,t){let n={hasOutput:!1,issues:[],output:e};for(let i=0;i<this.schemas.length;i++){let a=await this.schemas[i]._parseFullAsync(e,t);a.issues.length>0?n.issues.push(...a.issues):n.hasOutput?n.output=r(n.output,a.data):(n.hasOutput=!0,n.output=a.data)}return{data:n.output,issues:n.issues,typeOk:n.issues.length===0}}_toDescriptorImpl(){return{...this._describeBase(),branches:this.schemas.map(e=>e.definition()),kind:`intersect`}}};exports.IntersectSchema=i;
|
|
2
2
|
//# sourceMappingURL=intersect.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intersect.cjs","names":["isPlainObject","cloneRecord","Schema","
|
|
1
|
+
{"version":3,"file":"intersect.cjs","names":["isPlainObject","cloneRecord","Schema","require_core","require_safe_object","_vielzeug_arsenal","deepMerge","target","source","result","key","val","IntersectSchema","schemas","state","value","ctx","s"],"sources":["../../src/schemas/intersect.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport type { AnySchema, InferInput, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { Schema } from '../core';\nimport { cloneRecord, defineOwnProperty } from '../safe-object';\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;\n\n/**\n * Recursively merges `source` into `target`.\n * Plain objects are merged key-by-key; all other values take the `source` value.\n */\nfunction deepMerge(target: unknown, source: unknown): unknown {\n if (isPlainObject(target) && isPlainObject(source)) {\n const result = cloneRecord(target);\n\n for (const [key, val] of Object.entries(source)) {\n defineOwnProperty(result, key, deepMerge(target[key], val));\n }\n\n return result;\n }\n\n return source;\n}\n\n/** All schemas must pass: intersection semantics. */\nexport class IntersectSchema<T extends readonly AnySchema[]> extends Schema<\n UnionToIntersection<InferOutput<T[number]>>,\n UnionToIntersection<InferInput<T[number]>>\n> {\n readonly schemas: T;\n\n protected override get _kind(): string {\n return 'intersect';\n }\n\n constructor(schemas: T) {\n super();\n this.schemas = Object.freeze([...schemas]) as T;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = this.schemas[i]._parseFullSync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = await this.schemas[i]._parseFullAsync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), branches: this.schemas.map((s) => s.definition()), kind: 'intersect' };\n }\n}\n"],"mappings":"A,kGAaA,SAASM,EAAU,EAAiB,EAA0B,CAC5D,IAAA,EAAIN,EAAAA,cAAAA,CAAcO,CAAM,IAAA,EAAKP,EAAAA,cAAAA,CAAcQ,CAAM,EAAG,CAClD,IAAMC,EAASR,EAAAA,YAAYM,CAAM,EAEjC,IAAK,GAAM,CAACG,EAAKC,KAAQ,OAAO,QAAQH,CAAM,EAC5CJ,EAAA,kBAAkBK,EAAQC,EAAKJ,EAAUC,EAAOG,GAAMC,CAAG,CAAC,EAG5D,OAAOF,CACT,CAEA,OAAOD,CACT,CAGA,IAAaI,EAAb,cAAqEV,EAAAA,MAGnE,CACA,QAEA,IAAuB,OAAgB,CACrC,MAAO,WACT,CAEA,YAAY,EAAY,CACtB,MAAM,EACN,KAAK,QAAU,OAAO,OAAO,CAAC,GAAGW,CAAO,CAAC,CAC3C,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAMC,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQC,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAMN,EAAS,KAAK,QAAQ,EAAE,CAAC,eAAeM,EAAOC,CAAG,EAEpDP,EAAO,OAAO,OAAS,EACzBK,EAAM,OAAO,KAAK,GAAGL,EAAO,MAAM,EACxBK,EAAM,UAIhB,EAAM,OAASR,EAAUQ,EAAM,OAAQL,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAASA,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAMK,EAAM,OAAQ,OAAQA,EAAM,OAAQ,OAAQA,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,IAAMA,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQC,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAMN,EAAS,MAAM,KAAK,QAAQ,EAAE,CAAC,gBAAgBM,EAAOC,CAAG,EAE3DP,EAAO,OAAO,OAAS,EACzBK,EAAM,OAAO,KAAK,GAAGL,EAAO,MAAM,EACxBK,EAAM,UAIhB,EAAM,OAASR,EAAUQ,EAAM,OAAQL,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAASA,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAMK,EAAM,OAAQ,OAAQA,EAAM,OAAQ,OAAQA,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,SAAU,KAAK,QAAQ,IAAK,GAAMG,EAAE,WAAW,CAAC,EAAG,KAAM,WAAY,CACzG,CACF,E"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Schema as e}from"../core.js";import{cloneRecord as t,defineOwnProperty as n}from"../safe-object.js";import{isPlainObject as r}from"@vielzeug/arsenal";function i(e,a){if(r(e)&&r(a)){let r=t(e);for(let[t,o]of Object.entries(a))n(r,t,i(e[t],o));return r}return a}var a=class extends e{schemas;get _kind(){return`intersect`}constructor(e){super(),this.schemas=Object.freeze([...e])}_parse(e,t){let n={hasOutput:!1,issues:[],output:e};for(let r=0;r<this.schemas.length;r++){let a=this.schemas[r]._parseFullSync(e,t);a.issues.length>0?n.issues.push(...a.issues):n.hasOutput?n.output=i(n.output,a.data):(n.hasOutput=!0,n.output=a.data)}return{data:n.output,issues:n.issues,typeOk:n.issues.length===0}}async _parseAsync(e,t){let n={hasOutput:!1,issues:[],output:e};for(let r=0;r<this.schemas.length;r++){let a=await this.schemas[r]._parseFullAsync(e,t);a.issues.length>0?n.issues.push(...a.issues):n.hasOutput?n.output=i(n.output,a.data):(n.hasOutput=!0,n.output=a.data)}return{data:n.output,issues:n.issues,typeOk:n.issues.length===0}}_toDescriptorImpl(){return{...this._describeBase(),branches:this.schemas.map(e=>e.definition()),kind:`intersect`}}};export{a as IntersectSchema};
|
|
2
2
|
//# sourceMappingURL=intersect.js.map
|
package/dist/schemas/object.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../errors.cjs"),t=require("../
|
|
1
|
+
const e=require("../errors.cjs"),t=require("../core.cjs"),n=require("../types.cjs"),r=require("../safe-object.cjs"),i=require("./literal.cjs"),a=require("./union.cjs");var o=class o extends t.Schema{shape;_isRelaxed;get _kind(){return`object`}constructor(e,t=!1){super(),this.shape=Object.freeze(r.objectFromEntries(Object.entries(e))),this._isRelaxed=t}_unknownKeys(e){return Object.keys(e).filter(e=>!Object.hasOwn(this.shape,e))}_strictUnknownKeyIssues(e,t){if(this._isRelaxed)return[];let r=this._unknownKeys(e);return r.length===0?[]:[{code:n.ErrorCode.invalid_keys,message:t.messages.object.invalidKeys({keys:r}),params:{keys:r},path:[]}]}_copyRelaxedUnknownKeys(e,t){if(this._isRelaxed)for(let n of this._unknownKeys(e))r.isUnsafeObjectKey(n)||r.defineOwnProperty(t,n,e[n])}_guardObjectInput(e,t){return typeof e!=`object`||!e||Array.isArray(e)?{issues:[{code:n.ErrorCode.invalid_type,message:t.messages.object.type(),path:[]}],ok:!1}:{obj:e,ok:!0}}_createObjectParseContext(e,t){return{issues:[...this._strictUnknownKeyIssues(e,t)],output:{}}}_rebuildWith(e,t=this._isRelaxed){return this._copyStateTo(new o(e,t))}_parse(t,n){let i=this._guardObjectInput(t,n);if(!i.ok)return{data:t,issues:i.issues,typeOk:!1};let{obj:a}=i,{issues:o,output:s}=this._createObjectParseContext(a,n);for(let t of Object.keys(this.shape)){let i=this.shape[t]._parseFullSync(a[t],n);i.issues.length===0?r.defineOwnProperty(s,t,i.data):o.push(...e.prependIssuePath(i.issues,t))}return this._copyRelaxedUnknownKeys(a,s),{data:s,issues:o,typeOk:!0}}async _parseAsync(t,n){let i=this._guardObjectInput(t,n);if(!i.ok)return{data:t,issues:i.issues,typeOk:!1};let{obj:a}=i,{issues:o,output:s}=this._createObjectParseContext(a,n),c=Object.keys(this.shape),l=await Promise.all(c.map(e=>this.shape[e]._parseFullAsync(a[e],n)));for(let t=0;t<c.length;t++){let n=c[t],i=l[t];i.issues.length===0?r.defineOwnProperty(s,n,i.data):o.push(...e.prependIssuePath(i.issues,n))}return this._copyRelaxedUnknownKeys(a,s),{data:s,issues:o,typeOk:!0}}partial(...e){let t=e.length>0?new Set(e):null;return this._rebuildWith(r.objectFromEntries(Object.entries(this.shape).map(([e,n])=>[e,t===null||t.has(e)?n.optional():n])),this._isRelaxed)}optional(){return super.optional()}nullable(){return super.nullable()}nullish(){return super.nullish()}required(){return this._rebuildWith(r.objectFromEntries(Object.entries(this.shape).map(([e,t])=>[e,t.required()])),this._isRelaxed)}extend(e){return this._rebuildWith(r.objectFromEntries([...Object.entries(this.shape),...Object.entries(e)]),this._isRelaxed)}pick(...e){let t=new Set(e);return this._rebuildWith(r.objectFromEntries(Object.entries(this.shape).filter(([e])=>t.has(e))))}omit(...e){let t=new Set(e);return this._rebuildWith(r.objectFromEntries(Object.entries(this.shape).filter(([e])=>!t.has(e))))}defaults(){return this.parse({})}partialDefaults(){let e={};for(let t of Object.keys(this.shape)){let n=this.shape[t]._parseFullSync(void 0);n.issues.length===0&&r.defineOwnProperty(e,t,n.data)}return e}requiredFields(){return Object.keys(this.shape).filter(e=>!this.shape[e].isOptional)}optionalFields(){return Object.keys(this.shape).filter(e=>this.shape[e].isOptional)}relaxed(){return this._rebuildWith(this.shape,!0)}strict(){return this._rebuildWith(this.shape,!1)}keyof(){let e=Object.keys(this.shape).map(e=>new i.LiteralSchema(e));return new a.UnionSchema(e)}_toDescriptorImpl(){let e={};for(let[t,n]of Object.entries(this.shape))r.defineOwnProperty(e,t,n.definition());return{...this._describeBase(),fields:e,kind:`object`,strict:!this._isRelaxed}}merge(e){return this._rebuildWith(r.objectFromEntries([...Object.entries(this.shape),...Object.entries(e.shape)]),e._isRelaxed)}};exports.ObjectSchema=o;
|
|
2
2
|
//# sourceMappingURL=object.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.cjs","names":["Schema","objectFromEntries","ErrorCode","isUnsafeObjectKey","prependIssuePath","LiteralSchema","UnionSchema","require_errors","require_safe_object","require_types","require_core","require_literal","require_union","ObjectSchema","shape","isRelaxed","obj","k","unknownKeys","ctx","key","output","value","guarded","result","issues","keys","results","i","targetKeys","s","extra","keySet","parsed","schemas","fields","schema","other"],"sources":["../../src/schemas/object.ts"],"sourcesContent":["import type {\n AcceptsMissing,\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema } from '../core';\nimport { defineOwnProperty, isUnsafeObjectKey, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { UnionSchema } from './union';\n\nexport type ObjectShape = Record<string, AnySchema>;\nexport type InferObject<T extends ObjectShape> = { [K in keyof T]: InferOutput<T[K]> };\ntype OptionalInputKeys<T extends ObjectShape> = {\n [K in keyof T]: T[K] extends AcceptsMissing ? K : never;\n}[keyof T];\ntype Simplify<T> = { [K in keyof T]: T[K] };\nexport type InferObjectInput<T extends ObjectShape> = Simplify<\n { [K in Exclude<keyof T, OptionalInputKeys<T>>]: InferInput<T[K]> } & {\n [K in OptionalInputKeys<T>]?: InferInput<T[K]>;\n }\n>;\n\nexport class ObjectSchema<T extends ObjectShape> extends Schema<InferObject<T>, InferObjectInput<T>> {\n readonly shape: T;\n private readonly _isRelaxed: boolean;\n\n protected override get _kind(): string {\n return 'object';\n }\n\n constructor(shape: T, isRelaxed = false) {\n super();\n this.shape = Object.freeze(objectFromEntries(Object.entries(shape))) as T;\n this._isRelaxed = isRelaxed;\n }\n\n private _unknownKeys(obj: Record<string, unknown>): string[] {\n return Object.keys(obj).filter((k) => !Object.hasOwn(this.shape, k));\n }\n\n private _strictUnknownKeyIssues(obj: Record<string, unknown>, ctx: ParseContext): Issue[] {\n if (this._isRelaxed) return [];\n\n const unknownKeys = this._unknownKeys(obj);\n\n if (unknownKeys.length === 0) return [];\n\n return [\n {\n code: ErrorCode.invalid_keys,\n message: ctx.messages.object.invalidKeys({ keys: unknownKeys }),\n params: { keys: unknownKeys },\n path: [],\n },\n ];\n }\n\n private _copyRelaxedUnknownKeys(obj: Record<string, unknown>, output: Record<string, unknown>): void {\n if (!this._isRelaxed) return;\n\n for (const key of this._unknownKeys(obj)) {\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(key)) continue;\n\n defineOwnProperty(output, key, obj[key]);\n }\n }\n\n private _guardObjectInput(\n value: unknown,\n ctx: ParseContext,\n ): { obj: Record<string, unknown>; ok: true } | { issues: Issue[]; ok: false } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.object.type(), path: [] }],\n ok: false,\n };\n }\n\n return { obj: value as Record<string, unknown>, ok: true };\n }\n\n private _createObjectParseContext(\n obj: Record<string, unknown>,\n ctx: ParseContext,\n ): {\n issues: Issue[];\n output: Record<string, unknown>;\n } {\n return {\n issues: [...this._strictUnknownKeyIssues(obj, ctx)],\n output: {},\n };\n }\n\n private _rebuildWith<U extends ObjectShape>(shape: U, isRelaxed = this._isRelaxed): ObjectSchema<U> {\n return this._copyStateTo(new ObjectSchema(shape, isRelaxed)) as unknown as ObjectSchema<U>;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n for (const key of Object.keys(this.shape)) {\n const fieldSchema = this.shape[key];\n const result = fieldSchema._parseFullSync(obj[key], ctx);\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n // Failed field keys are intentionally omitted from parsed output so\n // object-level checks can branch on key presence.\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n const keys = Object.keys(this.shape);\n const results = await Promise.all(keys.map((key) => this.shape[key]._parseFullAsync(obj[key], ctx)));\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const result = results[i];\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n partial(): ObjectSchema<{\n [K in keyof T]: Schema<InferOutput<T[K]> | undefined, InferInput<T[K]> | undefined> & AcceptsMissing;\n }>;\n partial<K extends keyof T>(\n ...keys: K[]\n ): ObjectSchema<\n Omit<T, K> & {\n [P in K]: Schema<InferOutput<T[P]> | undefined, InferInput<T[P]> | undefined> & AcceptsMissing;\n }\n >;\n partial<K extends keyof T>(...keys: K[]): ObjectSchema<any> {\n const targetKeys = keys.length > 0 ? new Set(keys as string[]) : null;\n\n return this._rebuildWith(\n objectFromEntries(\n Object.entries(this.shape).map(([k, s]) => [k, targetKeys === null || targetKeys.has(k) ? s.optional() : s]),\n ) as any,\n this._isRelaxed,\n );\n }\n\n override optional(): ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing {\n return super.optional() as ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing;\n }\n\n override nullable(): ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null> {\n return super.nullable() as ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null>;\n }\n\n override nullish(): ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing {\n return super.nullish() as ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing;\n }\n\n override required(): ObjectSchema<T> &\n Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>> {\n return this._rebuildWith(\n objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.required()])) as any,\n this._isRelaxed,\n ) as ObjectSchema<T> & Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>>;\n }\n\n extend<U extends ObjectShape>(extra: U): ObjectSchema<Omit<T, keyof U> & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(extra)]) as any,\n this._isRelaxed,\n );\n }\n\n pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => keySet.has(k))) as any);\n }\n\n omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => !keySet.has(k))) as any);\n }\n\n /**\n * Returns a fully default-filled object by parsing `{}` against this schema.\n * Every required field must have a `.default()` value set; if any required\n * field is missing a default, this method throws a `SpellValidationError`.\n *\n * @example\n * const Config = s.object({ host: s.string().default('localhost'), port: s.number().default(3000) });\n * Config.defaults(); // { host: 'localhost', port: 3000 }\n */\n defaults(): InferObject<T> {\n return this.parse({});\n }\n\n /**\n * Returns a partial object containing only the fields that have a default value set.\n * Fields without a `.default()` or `.catch()` are silently omitted rather than throwing.\n *\n * Useful for pre-filling forms where only some fields have defaults.\n *\n * @example\n * const Form = s.object({ name: s.string(), role: s.string().default('viewer') });\n * Form.partialDefaults(); // { role: 'viewer' }; name is omitted\n */\n partialDefaults(): Partial<InferObject<T>> {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(this.shape)) {\n const parsed = this.shape[key]._parseFullSync(undefined);\n\n if (parsed.issues.length === 0) {\n defineOwnProperty(result, key, parsed.data);\n }\n }\n\n return result as Partial<InferObject<T>>;\n }\n\n /**\n * Returns an array of field keys that are **required** (not optional and not nullish).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.requiredFields(); // ['id']\n */\n requiredFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => !this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Returns an array of field keys that are **optional** (accept `undefined`).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.optionalFields(); // ['name']\n */\n optionalFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Allow additional unknown properties (relaxed mode).\n * Default is strict mode (rejects unknown keys).\n *\n * Returns `ObjectSchema<T>` so fluent methods like `.pick()`, `.omit()`,\n * `.extend()`, and `.partial()` remain usable after calling `.relaxed()`.\n */\n relaxed(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, true);\n }\n\n /**\n * Alias for the default strict mode: rejects unknown keys.\n * Useful after calling `.relaxed()` to return a new strict schema.\n */\n strict(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, false);\n }\n\n /**\n * Returns a union schema of the object's key names as literal schemas.\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string() });\n * User.keyof(); // UnionSchema: validates 'id' | 'name'\n */\n keyof(): UnionSchema<readonly [LiteralSchema<keyof T & string>, ...LiteralSchema<keyof T & string>[]]> {\n const keys = Object.keys(this.shape) as (keyof T & string)[];\n const schemas = keys.map((k) => new LiteralSchema(k)) as unknown as readonly [\n LiteralSchema<keyof T & string>,\n ...LiteralSchema<keyof T & string>[],\n ];\n\n return new UnionSchema(schemas);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const fields: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of Object.entries(this.shape)) {\n defineOwnProperty(fields, key, schema.definition());\n }\n\n return { ...this._describeBase(), fields, kind: 'object', strict: !this._isRelaxed };\n }\n\n merge<U extends ObjectShape>(other: ObjectSchema<U>): ObjectSchema<T & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(other.shape)]) as any,\n other._isRelaxed,\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"object.cjs","names":["Schema","objectFromEntries","ErrorCode","isUnsafeObjectKey","prependIssuePath","LiteralSchema","UnionSchema","require_errors","require_core","require_types","require_safe_object","require_literal","require_union","ObjectSchema","shape","isRelaxed","obj","k","unknownKeys","ctx","key","output","value","guarded","result","issues","keys","results","i","targetKeys","s","extra","keySet","parsed","schemas","fields","schema","other"],"sources":["../../src/schemas/object.ts"],"sourcesContent":["import type {\n AcceptsMissing,\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema } from '../core';\nimport { defineOwnProperty, isUnsafeObjectKey, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { UnionSchema } from './union';\n\nexport type ObjectShape = Record<string, AnySchema>;\nexport type InferObject<T extends ObjectShape> = { [K in keyof T]: InferOutput<T[K]> };\ntype OptionalInputKeys<T extends ObjectShape> = {\n [K in keyof T]: T[K] extends AcceptsMissing ? K : never;\n}[keyof T];\ntype Simplify<T> = { [K in keyof T]: T[K] };\nexport type InferObjectInput<T extends ObjectShape> = Simplify<\n { [K in Exclude<keyof T, OptionalInputKeys<T>>]: InferInput<T[K]> } & {\n [K in OptionalInputKeys<T>]?: InferInput<T[K]>;\n }\n>;\n\nexport class ObjectSchema<T extends ObjectShape> extends Schema<InferObject<T>, InferObjectInput<T>> {\n readonly shape: T;\n private readonly _isRelaxed: boolean;\n\n protected override get _kind(): string {\n return 'object';\n }\n\n constructor(shape: T, isRelaxed = false) {\n super();\n this.shape = Object.freeze(objectFromEntries(Object.entries(shape))) as T;\n this._isRelaxed = isRelaxed;\n }\n\n private _unknownKeys(obj: Record<string, unknown>): string[] {\n return Object.keys(obj).filter((k) => !Object.hasOwn(this.shape, k));\n }\n\n private _strictUnknownKeyIssues(obj: Record<string, unknown>, ctx: ParseContext): Issue[] {\n if (this._isRelaxed) return [];\n\n const unknownKeys = this._unknownKeys(obj);\n\n if (unknownKeys.length === 0) return [];\n\n return [\n {\n code: ErrorCode.invalid_keys,\n message: ctx.messages.object.invalidKeys({ keys: unknownKeys }),\n params: { keys: unknownKeys },\n path: [],\n },\n ];\n }\n\n private _copyRelaxedUnknownKeys(obj: Record<string, unknown>, output: Record<string, unknown>): void {\n if (!this._isRelaxed) return;\n\n for (const key of this._unknownKeys(obj)) {\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(key)) continue;\n\n defineOwnProperty(output, key, obj[key]);\n }\n }\n\n private _guardObjectInput(\n value: unknown,\n ctx: ParseContext,\n ): { obj: Record<string, unknown>; ok: true } | { issues: Issue[]; ok: false } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.object.type(), path: [] }],\n ok: false,\n };\n }\n\n return { obj: value as Record<string, unknown>, ok: true };\n }\n\n private _createObjectParseContext(\n obj: Record<string, unknown>,\n ctx: ParseContext,\n ): {\n issues: Issue[];\n output: Record<string, unknown>;\n } {\n return {\n issues: [...this._strictUnknownKeyIssues(obj, ctx)],\n output: {},\n };\n }\n\n private _rebuildWith<U extends ObjectShape>(shape: U, isRelaxed = this._isRelaxed): ObjectSchema<U> {\n return this._copyStateTo(new ObjectSchema(shape, isRelaxed)) as unknown as ObjectSchema<U>;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n for (const key of Object.keys(this.shape)) {\n const fieldSchema = this.shape[key];\n const result = fieldSchema._parseFullSync(obj[key], ctx);\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n // Failed field keys are intentionally omitted from parsed output so\n // object-level checks can branch on key presence.\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n const keys = Object.keys(this.shape);\n const results = await Promise.all(keys.map((key) => this.shape[key]._parseFullAsync(obj[key], ctx)));\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const result = results[i];\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n partial(): ObjectSchema<{\n [K in keyof T]: Schema<InferOutput<T[K]> | undefined, InferInput<T[K]> | undefined> & AcceptsMissing;\n }>;\n partial<K extends keyof T>(\n ...keys: K[]\n ): ObjectSchema<\n Omit<T, K> & {\n [P in K]: Schema<InferOutput<T[P]> | undefined, InferInput<T[P]> | undefined> & AcceptsMissing;\n }\n >;\n partial<K extends keyof T>(...keys: K[]): ObjectSchema<any> {\n const targetKeys = keys.length > 0 ? new Set(keys as string[]) : null;\n\n return this._rebuildWith(\n objectFromEntries(\n Object.entries(this.shape).map(([k, s]) => [k, targetKeys === null || targetKeys.has(k) ? s.optional() : s]),\n ) as any,\n this._isRelaxed,\n );\n }\n\n override optional(): ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing {\n return super.optional() as ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing;\n }\n\n override nullable(): ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null> {\n return super.nullable() as ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null>;\n }\n\n override nullish(): ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing {\n return super.nullish() as ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing;\n }\n\n override required(): ObjectSchema<T> &\n Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>> {\n return this._rebuildWith(\n objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.required()])) as any,\n this._isRelaxed,\n ) as ObjectSchema<T> & Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>>;\n }\n\n extend<U extends ObjectShape>(extra: U): ObjectSchema<Omit<T, keyof U> & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(extra)]) as any,\n this._isRelaxed,\n );\n }\n\n pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => keySet.has(k))) as any);\n }\n\n omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => !keySet.has(k))) as any);\n }\n\n /**\n * Returns a fully default-filled object by parsing `{}` against this schema.\n * Every required field must have a `.default()` value set; if any required\n * field is missing a default, this method throws a `SpellValidationError`.\n *\n * @example\n * const Config = s.object({ host: s.string().default('localhost'), port: s.number().default(3000) });\n * Config.defaults(); // { host: 'localhost', port: 3000 }\n */\n defaults(): InferObject<T> {\n return this.parse({});\n }\n\n /**\n * Returns a partial object containing only the fields that have a default value set.\n * Fields without a `.default()` or `.catch()` are silently omitted rather than throwing.\n *\n * Useful for pre-filling forms where only some fields have defaults.\n *\n * @example\n * const Form = s.object({ name: s.string(), role: s.string().default('viewer') });\n * Form.partialDefaults(); // { role: 'viewer' }; name is omitted\n */\n partialDefaults(): Partial<InferObject<T>> {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(this.shape)) {\n const parsed = this.shape[key]._parseFullSync(undefined);\n\n if (parsed.issues.length === 0) {\n defineOwnProperty(result, key, parsed.data);\n }\n }\n\n return result as Partial<InferObject<T>>;\n }\n\n /**\n * Returns an array of field keys that are **required** (not optional and not nullish).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.requiredFields(); // ['id']\n */\n requiredFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => !this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Returns an array of field keys that are **optional** (accept `undefined`).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.optionalFields(); // ['name']\n */\n optionalFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Allow additional unknown properties (relaxed mode).\n * Default is strict mode (rejects unknown keys).\n *\n * Returns `ObjectSchema<T>` so fluent methods like `.pick()`, `.omit()`,\n * `.extend()`, and `.partial()` remain usable after calling `.relaxed()`.\n */\n relaxed(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, true);\n }\n\n /**\n * Alias for the default strict mode: rejects unknown keys.\n * Useful after calling `.relaxed()` to return a new strict schema.\n */\n strict(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, false);\n }\n\n /**\n * Returns a union schema of the object's key names as literal schemas.\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string() });\n * User.keyof(); // UnionSchema: validates 'id' | 'name'\n */\n keyof(): UnionSchema<readonly [LiteralSchema<keyof T & string>, ...LiteralSchema<keyof T & string>[]]> {\n const keys = Object.keys(this.shape) as (keyof T & string)[];\n const schemas = keys.map((k) => new LiteralSchema(k)) as unknown as readonly [\n LiteralSchema<keyof T & string>,\n ...LiteralSchema<keyof T & string>[],\n ];\n\n return new UnionSchema(schemas);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const fields: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of Object.entries(this.shape)) {\n defineOwnProperty(fields, key, schema.definition());\n }\n\n return { ...this._describeBase(), fields, kind: 'object', strict: !this._isRelaxed };\n }\n\n merge<U extends ObjectShape>(other: ObjectSchema<U>): ObjectSchema<T & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(other.shape)]) as any,\n other._isRelaxed,\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/schemas/object.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{prependIssuePath as e}from"../errors.js";import{
|
|
1
|
+
import{prependIssuePath as e}from"../errors.js";import{Schema as t}from"../core.js";import{ErrorCode as n}from"../types.js";import{defineOwnProperty as r,isUnsafeObjectKey as i,objectFromEntries as a}from"../safe-object.js";import{LiteralSchema as o}from"./literal.js";import{UnionSchema as s}from"./union.js";var c=class c extends t{shape;_isRelaxed;get _kind(){return`object`}constructor(e,t=!1){super(),this.shape=Object.freeze(a(Object.entries(e))),this._isRelaxed=t}_unknownKeys(e){return Object.keys(e).filter(e=>!Object.hasOwn(this.shape,e))}_strictUnknownKeyIssues(e,t){if(this._isRelaxed)return[];let r=this._unknownKeys(e);return r.length===0?[]:[{code:n.invalid_keys,message:t.messages.object.invalidKeys({keys:r}),params:{keys:r},path:[]}]}_copyRelaxedUnknownKeys(e,t){if(this._isRelaxed)for(let n of this._unknownKeys(e))i(n)||r(t,n,e[n])}_guardObjectInput(e,t){return typeof e!=`object`||!e||Array.isArray(e)?{issues:[{code:n.invalid_type,message:t.messages.object.type(),path:[]}],ok:!1}:{obj:e,ok:!0}}_createObjectParseContext(e,t){return{issues:[...this._strictUnknownKeyIssues(e,t)],output:{}}}_rebuildWith(e,t=this._isRelaxed){return this._copyStateTo(new c(e,t))}_parse(t,n){let i=this._guardObjectInput(t,n);if(!i.ok)return{data:t,issues:i.issues,typeOk:!1};let{obj:a}=i,{issues:o,output:s}=this._createObjectParseContext(a,n);for(let t of Object.keys(this.shape)){let i=this.shape[t]._parseFullSync(a[t],n);i.issues.length===0?r(s,t,i.data):o.push(...e(i.issues,t))}return this._copyRelaxedUnknownKeys(a,s),{data:s,issues:o,typeOk:!0}}async _parseAsync(t,n){let i=this._guardObjectInput(t,n);if(!i.ok)return{data:t,issues:i.issues,typeOk:!1};let{obj:a}=i,{issues:o,output:s}=this._createObjectParseContext(a,n),c=Object.keys(this.shape),l=await Promise.all(c.map(e=>this.shape[e]._parseFullAsync(a[e],n)));for(let t=0;t<c.length;t++){let n=c[t],i=l[t];i.issues.length===0?r(s,n,i.data):o.push(...e(i.issues,n))}return this._copyRelaxedUnknownKeys(a,s),{data:s,issues:o,typeOk:!0}}partial(...e){let t=e.length>0?new Set(e):null;return this._rebuildWith(a(Object.entries(this.shape).map(([e,n])=>[e,t===null||t.has(e)?n.optional():n])),this._isRelaxed)}optional(){return super.optional()}nullable(){return super.nullable()}nullish(){return super.nullish()}required(){return this._rebuildWith(a(Object.entries(this.shape).map(([e,t])=>[e,t.required()])),this._isRelaxed)}extend(e){return this._rebuildWith(a([...Object.entries(this.shape),...Object.entries(e)]),this._isRelaxed)}pick(...e){let t=new Set(e);return this._rebuildWith(a(Object.entries(this.shape).filter(([e])=>t.has(e))))}omit(...e){let t=new Set(e);return this._rebuildWith(a(Object.entries(this.shape).filter(([e])=>!t.has(e))))}defaults(){return this.parse({})}partialDefaults(){let e={};for(let t of Object.keys(this.shape)){let n=this.shape[t]._parseFullSync(void 0);n.issues.length===0&&r(e,t,n.data)}return e}requiredFields(){return Object.keys(this.shape).filter(e=>!this.shape[e].isOptional)}optionalFields(){return Object.keys(this.shape).filter(e=>this.shape[e].isOptional)}relaxed(){return this._rebuildWith(this.shape,!0)}strict(){return this._rebuildWith(this.shape,!1)}keyof(){let e=Object.keys(this.shape).map(e=>new o(e));return new s(e)}_toDescriptorImpl(){let e={};for(let[t,n]of Object.entries(this.shape))r(e,t,n.definition());return{...this._describeBase(),fields:e,kind:`object`,strict:!this._isRelaxed}}merge(e){return this._rebuildWith(a([...Object.entries(this.shape),...Object.entries(e.shape)]),e._isRelaxed)}};export{c as ObjectSchema};
|
|
2
2
|
//# sourceMappingURL=object.js.map
|
package/dist/schemas/record.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../errors.cjs"),t=require("../
|
|
1
|
+
const e=require("../errors.cjs"),t=require("../core.cjs"),n=require("../types.cjs"),r=require("../safe-object.cjs");var i=class extends t.Schema{keySchema;valueSchema;get _kind(){return`record`}constructor(e,t){super(),this.keySchema=e,this.valueSchema=t}_guardRecordInput(e,t){return typeof e!=`object`||!e||Array.isArray(e)?{issues:[{code:n.ErrorCode.invalid_type,message:t.messages.object.type(),path:[]}],ok:!1}:{ok:!0,value:e}}_parseRecordEntries(t,n){let i=[],a={};for(let o of Object.keys(t)){let s=this.keySchema._parseFullSync(o,n);if(s.issues.length>0){i.push(...e.prependIssuePath(s.issues,o));continue}let c=s.data;if(r.isUnsafeObjectKey(c))continue;let l=this.valueSchema._parseFullSync(t[o],n);l.issues.length===0?r.defineOwnProperty(a,c,l.data):i.push(...e.prependIssuePath(l.issues,o))}return{issues:i,output:a}}_parse(e,t){let n=this._guardRecordInput(e,t);if(!n.ok)return{data:e,issues:n.issues,typeOk:!1};let{issues:r,output:i}=this._parseRecordEntries(n.value,t);return{data:i,issues:r,typeOk:!0}}async _parseAsync(t,n){let i=this._guardRecordInput(t,n);if(!i.ok)return{data:t,issues:i.issues,typeOk:!1};let a=i.value,o=Object.keys(a),s=await Promise.all(o.map(e=>Promise.all([this.keySchema._parseFullAsync(e,n),this.valueSchema._parseFullAsync(a[e],n)]))),c=[],l={};for(let t=0;t<o.length;t++){let n=o[t],[i,a]=s[t];if(i.issues.length>0){c.push(...e.prependIssuePath(i.issues,n));continue}let u=i.data;r.isUnsafeObjectKey(u)||(a.issues.length===0?r.defineOwnProperty(l,u,a.data):c.push(...e.prependIssuePath(a.issues,n)))}return{data:l,issues:c,typeOk:!0}}_toDescriptorImpl(){return{...this._describeBase(),key:this.keySchema.definition(),kind:`record`,value:this.valueSchema.definition()}}};exports.RecordSchema=i;
|
|
2
2
|
//# sourceMappingURL=record.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.cjs","names":["Schema","ErrorCode","prependIssuePath","isUnsafeObjectKey","require_errors","
|
|
1
|
+
{"version":3,"file":"record.cjs","names":["Schema","ErrorCode","prependIssuePath","isUnsafeObjectKey","require_errors","require_core","require_types","require_safe_object","RecordSchema","keySchema","valueSchema","value","ctx","issues","output","key","obj","keyResult","parsedKey","valResult","guarded","keys","settled","i"],"sources":["../../src/schemas/record.ts"],"sourcesContent":["import type { AnySchema, InferInput, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema } from '../core';\nimport { defineOwnProperty, isUnsafeObjectKey } from '../safe-object';\n\nexport class RecordSchema<K extends AnySchema, V extends AnySchema> extends Schema<\n Record<InferOutput<K> & string, InferOutput<V>>,\n Record<InferInput<K> & string, InferInput<V>>\n> {\n readonly keySchema: K;\n readonly valueSchema: V;\n\n protected override get _kind(): string {\n return 'record';\n }\n\n constructor(keySchema: K, valueSchema: V) {\n super();\n this.keySchema = keySchema;\n this.valueSchema = valueSchema;\n }\n\n private _guardRecordInput(\n value: unknown,\n ctx: ParseContext,\n ): { ok: true; value: Record<string, unknown> } | { issues: Issue[]; ok: false } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.object.type(), path: [] }],\n ok: false,\n };\n }\n\n return { ok: true, value: value as Record<string, unknown> };\n }\n\n private _parseRecordEntries(\n obj: Record<string, unknown>,\n ctx: ParseContext,\n ): { issues: Issue[]; output: Record<string, unknown> } {\n const issues: Issue[] = [];\n const output: Record<string, unknown> = {};\n\n for (const key of Object.keys(obj)) {\n const keyResult = this.keySchema._parseFullSync(key, ctx);\n\n if (keyResult.issues.length > 0) {\n issues.push(...prependIssuePath(keyResult.issues, key));\n continue;\n }\n\n const parsedKey = keyResult.data as string;\n\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(parsedKey)) continue;\n\n const valResult = this.valueSchema._parseFullSync(obj[key], ctx);\n\n if (valResult.issues.length === 0) {\n defineOwnProperty(output, parsedKey, valResult.data);\n } else {\n issues.push(...prependIssuePath(valResult.issues, key));\n }\n }\n\n return { issues, output };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const guarded = this._guardRecordInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { issues, output } = this._parseRecordEntries(guarded.value, ctx);\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const guarded = this._guardRecordInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const obj = guarded.value;\n const keys = Object.keys(obj);\n const settled = await Promise.all(\n keys.map((key) =>\n Promise.all([this.keySchema._parseFullAsync(key, ctx), this.valueSchema._parseFullAsync(obj[key], ctx)]),\n ),\n );\n\n const issues: Issue[] = [];\n const output: Record<string, unknown> = {};\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const [keyResult, valResult] = settled[i];\n\n if (keyResult.issues.length > 0) {\n issues.push(...prependIssuePath(keyResult.issues, key));\n continue;\n }\n\n const parsedKey = keyResult.data as string;\n\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(parsedKey)) continue;\n\n if (valResult.issues.length === 0) {\n defineOwnProperty(output, parsedKey, valResult.data);\n } else {\n issues.push(...prependIssuePath(valResult.issues, key));\n }\n }\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n key: this.keySchema.definition(),\n kind: 'record',\n value: this.valueSchema.definition(),\n };\n }\n}\n"],"mappings":"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"}
|