@vielzeug/spell 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -0
- package/dist/_dev.cjs +2 -0
- package/dist/_dev.cjs.map +1 -0
- package/dist/_dev.d.ts +2 -0
- package/dist/_dev.d.ts.map +1 -0
- package/dist/_dev.js +2 -0
- package/dist/_dev.js.map +1 -0
- package/dist/core.cjs +2 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.ts +108 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +2 -0
- package/dist/core.js.map +1 -0
- package/dist/errors.cjs +3 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.ts +53 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +3 -0
- package/dist/errors.js.map +1 -0
- package/dist/formats.cjs +2 -0
- package/dist/formats.cjs.map +1 -0
- package/dist/formats.d.ts +41 -0
- package/dist/formats.d.ts.map +1 -0
- package/dist/formats.js +2 -0
- package/dist/formats.js.map +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/json-schema.cjs +2 -0
- package/dist/json-schema.cjs.map +1 -0
- package/dist/json-schema.d.ts +15 -0
- package/dist/json-schema.d.ts.map +1 -0
- package/dist/json-schema.js +2 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/messages.cjs +2 -0
- package/dist/messages.cjs.map +1 -0
- package/dist/messages.d.ts +228 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +2 -0
- package/dist/messages.js.map +1 -0
- package/dist/s.cjs +2 -0
- package/dist/s.cjs.map +1 -0
- package/dist/s.d.ts +65 -0
- package/dist/s.d.ts.map +1 -0
- package/dist/s.js +2 -0
- package/dist/s.js.map +1 -0
- package/dist/safe-object.cjs +2 -0
- package/dist/safe-object.cjs.map +1 -0
- package/dist/safe-object.d.ts +6 -0
- package/dist/safe-object.d.ts.map +1 -0
- package/dist/safe-object.js +2 -0
- package/dist/safe-object.js.map +1 -0
- package/dist/schemas/array.cjs +2 -0
- package/dist/schemas/array.cjs.map +1 -0
- package/dist/schemas/array.d.ts +49 -0
- package/dist/schemas/array.d.ts.map +1 -0
- package/dist/schemas/array.js +2 -0
- package/dist/schemas/array.js.map +1 -0
- package/dist/schemas/bigint.cjs +2 -0
- package/dist/schemas/bigint.cjs.map +1 -0
- package/dist/schemas/bigint.d.ts +42 -0
- package/dist/schemas/bigint.d.ts.map +1 -0
- package/dist/schemas/bigint.js +2 -0
- package/dist/schemas/bigint.js.map +1 -0
- package/dist/schemas/boolean.cjs +2 -0
- package/dist/schemas/boolean.cjs.map +1 -0
- package/dist/schemas/boolean.d.ts +18 -0
- package/dist/schemas/boolean.d.ts.map +1 -0
- package/dist/schemas/boolean.js +2 -0
- package/dist/schemas/boolean.js.map +1 -0
- package/dist/schemas/date.cjs +2 -0
- package/dist/schemas/date.cjs.map +1 -0
- package/dist/schemas/date.d.ts +25 -0
- package/dist/schemas/date.d.ts.map +1 -0
- package/dist/schemas/date.js +2 -0
- package/dist/schemas/date.js.map +1 -0
- package/dist/schemas/enum.cjs +2 -0
- package/dist/schemas/enum.cjs.map +1 -0
- package/dist/schemas/enum.d.ts +14 -0
- package/dist/schemas/enum.d.ts.map +1 -0
- package/dist/schemas/enum.js +2 -0
- package/dist/schemas/enum.js.map +1 -0
- package/dist/schemas/instanceof.cjs +2 -0
- package/dist/schemas/instanceof.cjs.map +1 -0
- package/dist/schemas/instanceof.d.ts +11 -0
- package/dist/schemas/instanceof.d.ts.map +1 -0
- package/dist/schemas/instanceof.js +2 -0
- package/dist/schemas/instanceof.js.map +1 -0
- package/dist/schemas/intersect.cjs +2 -0
- package/dist/schemas/intersect.cjs.map +1 -0
- package/dist/schemas/intersect.d.ts +16 -0
- package/dist/schemas/intersect.d.ts.map +1 -0
- package/dist/schemas/intersect.js +2 -0
- package/dist/schemas/intersect.js.map +1 -0
- package/dist/schemas/lazy.cjs +2 -0
- package/dist/schemas/lazy.cjs.map +1 -0
- package/dist/schemas/lazy.d.ts +16 -0
- package/dist/schemas/lazy.d.ts.map +1 -0
- package/dist/schemas/lazy.js +2 -0
- package/dist/schemas/lazy.js.map +1 -0
- package/dist/schemas/literal.cjs +2 -0
- package/dist/schemas/literal.cjs.map +1 -0
- package/dist/schemas/literal.d.ts +11 -0
- package/dist/schemas/literal.d.ts.map +1 -0
- package/dist/schemas/literal.js +2 -0
- package/dist/schemas/literal.js.map +1 -0
- package/dist/schemas/map.cjs +2 -0
- package/dist/schemas/map.cjs.map +1 -0
- package/dist/schemas/map.d.ts +29 -0
- package/dist/schemas/map.d.ts.map +1 -0
- package/dist/schemas/map.js +2 -0
- package/dist/schemas/map.js.map +1 -0
- package/dist/schemas/never.cjs +2 -0
- package/dist/schemas/never.cjs.map +1 -0
- package/dist/schemas/never.d.ts +10 -0
- package/dist/schemas/never.d.ts.map +1 -0
- package/dist/schemas/never.js +2 -0
- package/dist/schemas/never.js.map +1 -0
- package/dist/schemas/number.cjs +2 -0
- package/dist/schemas/number.cjs.map +1 -0
- package/dist/schemas/number.d.ts +50 -0
- package/dist/schemas/number.d.ts.map +1 -0
- package/dist/schemas/number.js +2 -0
- package/dist/schemas/number.js.map +1 -0
- package/dist/schemas/object.cjs +2 -0
- package/dist/schemas/object.cjs.map +1 -0
- package/dist/schemas/object.d.ts +95 -0
- package/dist/schemas/object.d.ts.map +1 -0
- package/dist/schemas/object.js +2 -0
- package/dist/schemas/object.js.map +1 -0
- package/dist/schemas/pipe.d.ts +2 -0
- package/dist/schemas/pipe.d.ts.map +1 -0
- package/dist/schemas/raw-or.cjs +2 -0
- package/dist/schemas/raw-or.cjs.map +1 -0
- package/dist/schemas/raw-or.d.ts +17 -0
- package/dist/schemas/raw-or.d.ts.map +1 -0
- package/dist/schemas/raw-or.js +2 -0
- package/dist/schemas/raw-or.js.map +1 -0
- package/dist/schemas/record.cjs +2 -0
- package/dist/schemas/record.cjs.map +1 -0
- package/dist/schemas/record.d.ts +16 -0
- package/dist/schemas/record.d.ts.map +1 -0
- package/dist/schemas/record.js +2 -0
- package/dist/schemas/record.js.map +1 -0
- package/dist/schemas/set.cjs +2 -0
- package/dist/schemas/set.cjs.map +1 -0
- package/dist/schemas/set.d.ts +28 -0
- package/dist/schemas/set.d.ts.map +1 -0
- package/dist/schemas/set.js +2 -0
- package/dist/schemas/set.js.map +1 -0
- package/dist/schemas/string.cjs +2 -0
- package/dist/schemas/string.cjs.map +1 -0
- package/dist/schemas/string.d.ts +155 -0
- package/dist/schemas/string.d.ts.map +1 -0
- package/dist/schemas/string.js +2 -0
- package/dist/schemas/string.js.map +1 -0
- package/dist/schemas/tuple.cjs +2 -0
- package/dist/schemas/tuple.cjs.map +1 -0
- package/dist/schemas/tuple.d.ts +22 -0
- package/dist/schemas/tuple.d.ts.map +1 -0
- package/dist/schemas/tuple.js +2 -0
- package/dist/schemas/tuple.js.map +1 -0
- package/dist/schemas/union.cjs +2 -0
- package/dist/schemas/union.cjs.map +1 -0
- package/dist/schemas/union.d.ts +13 -0
- package/dist/schemas/union.d.ts.map +1 -0
- package/dist/schemas/union.js +2 -0
- package/dist/schemas/union.js.map +1 -0
- package/dist/schemas/variant.cjs +2 -0
- package/dist/schemas/variant.cjs.map +1 -0
- package/dist/schemas/variant.d.ts +26 -0
- package/dist/schemas/variant.d.ts.map +1 -0
- package/dist/schemas/variant.js +2 -0
- package/dist/schemas/variant.js.map +1 -0
- package/dist/spell.cjs +3 -0
- package/dist/spell.cjs.map +1 -0
- package/dist/spell.iife.js +3 -0
- package/dist/spell.iife.js.map +1 -0
- package/dist/spell.js +3 -0
- package/dist/spell.js.map +1 -0
- package/dist/types.cjs +2 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.ts +326 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validators.cjs +2 -0
- package/dist/validators.cjs.map +1 -0
- package/dist/validators.d.ts +20 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +2 -0
- package/dist/validators.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../../src/schemas/lazy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEvF,OAAO,EAAE,MAAM,EAAkC,MAAM,SAAS,CAAC;AAEjE,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,SAAS,CAAC,CAAiB;IAEnC,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC;IAKxC,OAAO,CAAC,QAAQ;cAIG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IAQzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC;cAoBtD,iBAAiB,IAAI,gBAAgB;cAIrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAM9D,WAAW,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,SAAS,GAAG,OAAO;cAOxD,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI;CAQ7D"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{SpellValidationError as e}from"../errors.js";import{Schema as t,_makeCtx as n}from"../core.js";var r=class r extends t{_getter;_resolved;get _kind(){return`lazy`}constructor(e){super(),this._getter=e}_resolve(){return this._resolved??=this._getter()}_parse(e,t){let n=this._resolve()._parseFullSync(e,t);return n.issues.length===0?{data:n.data,issues:[],typeOk:!0}:{data:e,issues:n.issues,typeOk:!0}}async parseAsync(t,r){let i=r??n();return this._withCatchAsync(async()=>{let n=this._prepareInput(t);if(n.skip)return n.value;let r=await this._resolve()._parseFullAsync(n.value,i);if(r.issues.length>0)throw new e(r.issues);let a=await this._runValidatorsAsync(r.data,i);if(a.length>0)throw new e(a);return this._runPostprocessors(r.data)})}_toDescriptorImpl(){return{...this._describeBase(),kind:`lazy`}}_walk(e){return e.lazy?e.lazy(this):super._walk(e)}_equalsImpl(e){return e instanceof r?this._getter===e._getter:!1}_construct(e){let t=new r(this._getter);return t.state=e,t}};export{r as LazySchema};
|
|
2
|
+
//# sourceMappingURL=lazy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.js","names":[],"sources":["../../src/schemas/lazy.ts"],"sourcesContent":["import type { ParseContext, ParseValue, SchemaDescriptor, SchemaState } from '../core';\n\nimport { Schema, SpellValidationError, _makeCtx } from '../core';\n\nexport class LazySchema<T> extends Schema<T> {\n private readonly _getter: () => Schema<T, any>;\n private _resolved?: Schema<T, any>;\n\n protected override get _kind(): string {\n return 'lazy';\n }\n\n constructor(getter: () => Schema<T, any>) {\n super();\n this._getter = getter;\n }\n\n private _resolve(): Schema<T, any> {\n return (this._resolved ??= this._getter());\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const result = this._resolve()._parseFullSync(value, ctx);\n\n if (result.issues.length === 0) return { data: result.data, issues: [], typeOk: true };\n\n return { data: value, issues: result.issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<T> {\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 T;\n\n const result = await this._resolve()._parseFullAsync(prepared.value, c);\n\n if (result.issues.length > 0) throw new SpellValidationError(result.issues);\n\n const validationIssues = await this._runValidatorsAsync(result.data, c);\n\n if (validationIssues.length > 0) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(result.data) as T;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'lazy' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n if (visitor.lazy) return visitor.lazy(this);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n // Lazy schemas are equal only if they reference the same getter function.\n if (!(other instanceof LazySchema)) return false;\n\n return this._getter === other._getter;\n }\n\n protected override _construct(state: SchemaState<any>): this {\n // Do not copy _resolved — each clone re-resolves from the getter on first use.\n const next = new LazySchema(this._getter) as this;\n\n next.state = state as any;\n\n return next;\n }\n}\n"],"mappings":"sGAIA,IAAa,EAAb,MAAa,UAAsB,CAAU,CAC3C,QACA,UAEA,IAAuB,OAAgB,CACrC,MAAO,MACT,CAEA,YAAY,EAA8B,CACxC,MAAM,EACN,KAAK,QAAU,CACjB,CAEA,UAAmC,CACjC,MAAQ,MAAK,YAAc,KAAK,QAAQ,CAC1C,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAS,KAAK,SAAS,CAAC,CAAC,eAAe,EAAO,CAAG,EAIxD,OAFI,EAAO,OAAO,SAAW,EAAU,CAAE,KAAM,EAAO,KAAM,OAAQ,CAAC,EAAG,OAAQ,EAAK,EAE9E,CAAE,KAAM,EAAO,OAAQ,EAAO,OAAQ,OAAQ,EAAK,CAC5D,CAEA,MAAe,WAAW,EAAgB,EAAgC,CACxE,IAAM,EAAI,GAAO,EAAS,EAE1B,OAAO,KAAK,gBAAgB,SAAY,CACtC,IAAM,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,OAAO,EAAS,MAEnC,IAAM,EAAS,MAAM,KAAK,SAAS,CAAC,CAAC,gBAAgB,EAAS,MAAO,CAAC,EAEtE,GAAI,EAAO,OAAO,OAAS,EAAG,MAAM,IAAI,EAAqB,EAAO,MAAM,EAE1E,IAAM,EAAmB,MAAM,KAAK,oBAAoB,EAAO,KAAM,CAAC,EAEtE,GAAI,EAAiB,OAAS,EAAG,MAAM,IAAI,EAAqB,CAAgB,EAEhF,OAAO,KAAK,mBAAmB,EAAO,IAAI,CAC5C,CAAC,CACH,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,MAAO,CACjD,CAEA,MAA4B,EAAsD,CAGhF,OAFI,EAAQ,KAAa,EAAQ,KAAK,IAAI,EAEnC,MAAM,MAAM,CAAO,CAC5B,CAEA,YAA+B,EAA6C,CAI1E,OAFM,aAAiB,EAEhB,KAAK,UAAY,EAAM,QAFa,EAG7C,CAEA,WAA8B,EAA+B,CAE3D,IAAM,EAAO,IAAI,EAAW,KAAK,OAAO,EAIxC,MAFA,GAAK,MAAQ,EAEN,CACT,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types.cjs"),t=require("../messages.cjs"),n=require("../core.cjs");var r=class r extends n.Schema{value;get _kind(){return`literal`}constructor(n){super((r,i)=>r===n?null:[{code:e.ErrorCode.invalid_literal,message:(i?.messages??t._messages()).literal.expected({expected:n}),params:{expected:n},path:[]}]),this.value=n}_toDescriptorImpl(){return{...this._describeBase(),kind:`literal`,value:this.value}}_walk(e){return e.literal?e.literal(this):super._walk(e)}_equalsImpl(e){return e instanceof r?this.value===e.value:!1}};exports.LiteralSchema=r;
|
|
2
|
+
//# sourceMappingURL=literal.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal.cjs","names":[],"sources":["../../src/schemas/literal.ts"],"sourcesContent":["import type { SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\nimport { _messages } from '../messages';\n\nexport class LiteralSchema<T extends string | number | boolean | null | undefined> extends Schema<T> {\n readonly value: T;\n\n protected override get _kind(): string {\n return 'literal';\n }\n\n constructor(value: T) {\n super((val, ctx) =>\n val === value\n ? null\n : [\n {\n code: ErrorCode.invalid_literal,\n message: (ctx?.messages ?? _messages()).literal.expected({ expected: value }),\n params: { expected: value },\n path: [],\n },\n ],\n );\n this.value = value;\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'literal', value: this.value };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n if (visitor.literal) return visitor.literal(this);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof LiteralSchema)) return false;\n\n return this.value === other.value;\n }\n}\n"],"mappings":"sFAKA,IAAa,EAAb,MAAa,UAA8E,EAAA,MAAU,CACnG,MAEA,IAAuB,OAAgB,CACrC,MAAO,SACT,CAEA,YAAY,EAAU,CACpB,OAAO,EAAK,IACV,IAAQ,EACJ,KACA,CACE,CACE,KAAM,EAAA,UAAU,gBAChB,SAAU,GAAK,UAAY,EAAA,UAAU,EAAA,CAAG,QAAQ,SAAS,CAAE,SAAU,CAAM,CAAC,EAC5E,OAAQ,CAAE,SAAU,CAAM,EAC1B,KAAM,CAAC,CACT,CACF,CACN,EACA,KAAK,MAAQ,CACf,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,UAAW,MAAO,KAAK,KAAM,CACvE,CAEA,MAA4B,EAAsD,CAGhF,OAFI,EAAQ,QAAgB,EAAQ,QAAQ,IAAI,EAEzC,MAAM,MAAM,CAAO,CAC5B,CAEA,YAA+B,EAA6C,CAG1E,OAFM,aAAiB,EAEhB,KAAK,QAAU,EAAM,MAFkB,EAGhD,CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SchemaDescriptor } from '../core';
|
|
2
|
+
import { Schema } from '../core';
|
|
3
|
+
export declare class LiteralSchema<T extends string | number | boolean | null | undefined> extends Schema<T> {
|
|
4
|
+
readonly value: T;
|
|
5
|
+
protected get _kind(): string;
|
|
6
|
+
constructor(value: T);
|
|
7
|
+
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
8
|
+
protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
|
|
9
|
+
protected _equalsImpl(other: import('../core').AnySchema): boolean;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=literal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/schemas/literal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAa,MAAM,EAAE,MAAM,SAAS,CAAC;AAG5C,qBAAa,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAClG,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAElB,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,KAAK,EAAE,CAAC;cAgBD,iBAAiB,IAAI,gBAAgB;cAIrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAM9D,WAAW,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,SAAS,GAAG,OAAO;CAK5E"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorCode as e}from"../types.js";import{_messages as t}from"../messages.js";import{Schema as n}from"../core.js";var r=class r extends n{value;get _kind(){return`literal`}constructor(n){super((r,i)=>r===n?null:[{code:e.invalid_literal,message:(i?.messages??t()).literal.expected({expected:n}),params:{expected:n},path:[]}]),this.value=n}_toDescriptorImpl(){return{...this._describeBase(),kind:`literal`,value:this.value}}_walk(e){return e.literal?e.literal(this):super._walk(e)}_equalsImpl(e){return e instanceof r?this.value===e.value:!1}};export{r as LiteralSchema};
|
|
2
|
+
//# sourceMappingURL=literal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal.js","names":[],"sources":["../../src/schemas/literal.ts"],"sourcesContent":["import type { SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\nimport { _messages } from '../messages';\n\nexport class LiteralSchema<T extends string | number | boolean | null | undefined> extends Schema<T> {\n readonly value: T;\n\n protected override get _kind(): string {\n return 'literal';\n }\n\n constructor(value: T) {\n super((val, ctx) =>\n val === value\n ? null\n : [\n {\n code: ErrorCode.invalid_literal,\n message: (ctx?.messages ?? _messages()).literal.expected({ expected: value }),\n params: { expected: value },\n path: [],\n },\n ],\n );\n this.value = value;\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'literal', value: this.value };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n if (visitor.literal) return visitor.literal(this);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof LiteralSchema)) return false;\n\n return this.value === other.value;\n }\n}\n"],"mappings":"uHAKA,IAAa,EAAb,MAAa,UAA8E,CAAU,CACnG,MAEA,IAAuB,OAAgB,CACrC,MAAO,SACT,CAEA,YAAY,EAAU,CACpB,OAAO,EAAK,IACV,IAAQ,EACJ,KACA,CACE,CACE,KAAM,EAAU,gBAChB,SAAU,GAAK,UAAY,EAAU,EAAA,CAAG,QAAQ,SAAS,CAAE,SAAU,CAAM,CAAC,EAC5E,OAAQ,CAAE,SAAU,CAAM,EAC1B,KAAM,CAAC,CACT,CACF,CACN,EACA,KAAK,MAAQ,CACf,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,UAAW,MAAO,KAAK,KAAM,CACvE,CAEA,MAA4B,EAAsD,CAGhF,OAFI,EAAQ,QAAgB,EAAQ,QAAQ,IAAI,EAEzC,MAAM,MAAM,CAAO,CAC5B,CAEA,YAA+B,EAA6C,CAG1E,OAFM,aAAiB,EAEhB,KAAK,QAAU,EAAM,MAFkB,EAGhD,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../messages.cjs"),r=require("../core.cjs");var i=class i extends r.Schema{keySchema;valueSchema;get _kind(){return`map`}constructor(e,t){super(),this.keySchema=e,this.valueSchema=t}_parse(n,r){if(!(n instanceof Map))return{data:n,issues:[{code:e.ErrorCode.invalid_type,message:r.messages.map.type(),path:[]}],typeOk:!1};let i=new Map,a=[],o=0;for(let[e,s]of n){let n=this.keySchema._parseFullSync(e,r),c=this.valueSchema._parseFullSync(s,r);n.issues.length>0&&a.push(...t.prependIssuePath(n.issues,o)),c.issues.length>0&&a.push(...t.prependIssuePath(c.issues,o)),n.issues.length===0&&c.issues.length===0&&i.set(n.data,c.data),o+=1}return{data:i,issues:a,typeOk:!0}}async parseAsync(n,i){let a=i??r._makeCtx();return this._withCatchAsync(async()=>{let r=this._prepareInput(n);if(r.skip)return r.value;let i=r.value;if(!(i instanceof Map))throw new t.SpellValidationError([{code:e.ErrorCode.invalid_type,message:a.messages.map.type(),path:[]}]);let o=[...i],s=await Promise.all(o.map(([e,t])=>Promise.all([this.keySchema._parseFullAsync(e,a),this.valueSchema._parseFullAsync(t,a)]))),c=[],l=new Map;for(let e=0;e<s.length;e++){let[n,r]=s[e];n.issues.length>0&&c.push(...t.prependIssuePath(n.issues,e)),r.issues.length>0&&c.push(...t.prependIssuePath(r.issues,e)),n.issues.length===0&&r.issues.length===0&&l.set(n.data,r.data)}let u=await this._runValidatorsAsync(l,a),d=[...c,...u];if(d.length>0)throw new t.SpellValidationError(d);return this._runPostprocessors(l)})}min(r,i=e=>n._messages().map.min(e)){return this._addConstraint((n,a)=>{let o=n;return o.size>=r?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(i,{min:r,value:o}),{min:r})})}max(r,i=e=>n._messages().map.max(e)){return this._addConstraint((n,a)=>{let o=n;return o.size<=r?null:t.fail(e.ErrorCode.too_big,t.resolveMessage(i,{max:r,value:o}),{max:r})})}size(r,i=e=>n._messages().map.size(e)){return this._addConstraint((n,a)=>{let o=n;return o.size===r?null:t.fail(e.ErrorCode.invalid_length,t.resolveMessage(i,{exact:r,value:o}),{exact:r})})}nonEmpty(r=()=>n._messages().map.nonEmpty()){return this._addConstraint((n,i)=>n.size>0?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(r,{min:1}),{min:1}))}_toDescriptorImpl(){return{...this._describeBase(),key:this.keySchema.toDescriptor(),kind:`map`,value:this.valueSchema.toDescriptor()}}_walk(e){let t=this.keySchema.walk(e),n=this.valueSchema.walk(e);return e.map?e.map(this,t,n):super._walk(e)}_equalsImpl(e){return e instanceof i?this.keySchema.equals(e.keySchema)&&this.valueSchema.equals(e.valueSchema):!1}};exports.MapSchema=i;
|
|
2
|
+
//# sourceMappingURL=map.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.cjs","names":[],"sources":["../../src/schemas/map.ts"],"sourcesContent":["import type { Issue, MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { _messages } from '../messages';\n\nexport class MapSchema<K, V> extends Schema<Map<K, V>> {\n readonly keySchema: Schema<K, any>;\n readonly valueSchema: Schema<V, any>;\n\n protected override get _kind(): string {\n return 'map';\n }\n\n constructor(keySchema: Schema<K, any>, valueSchema: Schema<V, any>) {\n super();\n this.keySchema = keySchema;\n this.valueSchema = valueSchema;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!(value instanceof Map)) {\n return {\n data: value,\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.map.type(), path: [] }],\n typeOk: false,\n };\n }\n\n const out = new Map<K, V>();\n const issues: Issue[] = [];\n let i = 0;\n\n for (const [key, val] of value) {\n const keyResult = this.keySchema._parseFullSync(key, ctx);\n const valResult = this.valueSchema._parseFullSync(val, ctx);\n\n if (keyResult.issues.length > 0) issues.push(...prependIssuePath(keyResult.issues, i));\n\n if (valResult.issues.length > 0) issues.push(...prependIssuePath(valResult.issues, i));\n\n if (keyResult.issues.length === 0 && valResult.issues.length === 0)\n out.set(keyResult.data as K, valResult.data as V);\n\n i += 1;\n }\n\n return { data: out, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<Map<K, V>> {\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 unknown as Map<K, V>;\n\n const raw = prepared.value;\n\n if (!(raw instanceof Map)) {\n throw new SpellValidationError([{ code: ErrorCode.invalid_type, message: c.messages.map.type(), path: [] }]);\n }\n\n const entries = [...raw];\n const settled = await Promise.all(\n entries.map(([key, val]) =>\n Promise.all([this.keySchema._parseFullAsync(key, c), this.valueSchema._parseFullAsync(val, c)]),\n ),\n );\n\n const issues: Issue[] = [];\n const out = new Map<K, V>();\n\n for (let i = 0; i < settled.length; i++) {\n const [keyResult, valResult] = settled[i];\n\n if (keyResult.issues.length > 0) issues.push(...prependIssuePath(keyResult.issues, i));\n\n if (valResult.issues.length > 0) issues.push(...prependIssuePath(valResult.issues, i));\n\n if (keyResult.issues.length === 0 && valResult.issues.length === 0)\n out.set(keyResult.data as K, valResult.data as V);\n }\n\n const validationIssues = await this._runValidatorsAsync(out, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(out) as Map<K, V>;\n });\n }\n\n min(\n size: number,\n message: MessageFn<{ min: number; value: Map<unknown, unknown> }> = (ctx) => _messages().map.min(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n const typed = value as Map<unknown, unknown>;\n\n if (typed.size >= size) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: size, value: typed }), { min: size });\n });\n }\n\n max(\n size: number,\n message: MessageFn<{ max: number; value: Map<unknown, unknown> }> = (ctx) => _messages().map.max(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n const typed = value as Map<unknown, unknown>;\n\n if (typed.size <= size) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { max: size, value: typed }), { max: size });\n });\n }\n\n size(\n exact: number,\n message: MessageFn<{ exact: number; value: Map<unknown, unknown> }> = (ctx) => _messages().map.size(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n const typed = value as Map<unknown, unknown>;\n\n if (typed.size === exact) return null;\n\n return fail(ErrorCode.invalid_length, resolveMessage(message, { exact, value: typed }), { exact });\n });\n }\n\n nonEmpty(message: MessageFn<{ min: number }> = () => _messages().map.nonEmpty()): this {\n return this._addConstraint((value, _ctx) => {\n const typed = value as Map<unknown, unknown>;\n\n if (typed.size > 0) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: 1 }), { min: 1 });\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n key: this.keySchema.toDescriptor(),\n kind: 'map',\n value: this.valueSchema.toDescriptor(),\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const key = this.keySchema.walk(visitor);\n const value = this.valueSchema.walk(visitor);\n\n if (visitor.map) return visitor.map(this, key, value);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof MapSchema)) return false;\n\n return this.keySchema.equals(other.keySchema) && this.valueSchema.equals(other.valueSchema);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';
|
|
2
|
+
import { Schema } from '../core';
|
|
3
|
+
export declare class MapSchema<K, V> extends Schema<Map<K, V>> {
|
|
4
|
+
readonly keySchema: Schema<K, any>;
|
|
5
|
+
readonly valueSchema: Schema<V, any>;
|
|
6
|
+
protected get _kind(): string;
|
|
7
|
+
constructor(keySchema: Schema<K, any>, valueSchema: Schema<V, any>);
|
|
8
|
+
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
9
|
+
parseAsync(value: unknown, ctx?: ParseContext): Promise<Map<K, V>>;
|
|
10
|
+
min(size: number, message?: MessageFn<{
|
|
11
|
+
min: number;
|
|
12
|
+
value: Map<unknown, unknown>;
|
|
13
|
+
}>): this;
|
|
14
|
+
max(size: number, message?: MessageFn<{
|
|
15
|
+
max: number;
|
|
16
|
+
value: Map<unknown, unknown>;
|
|
17
|
+
}>): this;
|
|
18
|
+
size(exact: number, message?: MessageFn<{
|
|
19
|
+
exact: number;
|
|
20
|
+
value: Map<unknown, unknown>;
|
|
21
|
+
}>): this;
|
|
22
|
+
nonEmpty(message?: MessageFn<{
|
|
23
|
+
min: number;
|
|
24
|
+
}>): this;
|
|
25
|
+
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
26
|
+
protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
|
|
27
|
+
protected _equalsImpl(other: import('../core').AnySchema): boolean;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/schemas/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAqD,MAAM,EAAkC,MAAM,SAAS,CAAC;AAGpH,qBAAa,SAAS,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAErC,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC;cAM/C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IA8BzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IA4CjF,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;KAAE,CAAqC,GACpG,IAAI;IAUP,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;KAAE,CAAqC,GACpG,IAAI;IAUP,IAAI,CACF,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;KAAE,CAAsC,GACvG,IAAI;IAUP,QAAQ,CAAC,OAAO,GAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAoC,GAAG,IAAI;cAUnE,iBAAiB,IAAI,gBAAgB;cASrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAS9D,WAAW,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,SAAS,GAAG,OAAO;CAK5E"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorCode as e}from"../types.js";import{SpellValidationError as t,fail as n,prependIssuePath as r,resolveMessage as i}from"../errors.js";import{_messages as a}from"../messages.js";import{Schema as o,_makeCtx as s}from"../core.js";var c=class c extends o{keySchema;valueSchema;get _kind(){return`map`}constructor(e,t){super(),this.keySchema=e,this.valueSchema=t}_parse(t,n){if(!(t instanceof Map))return{data:t,issues:[{code:e.invalid_type,message:n.messages.map.type(),path:[]}],typeOk:!1};let i=new Map,a=[],o=0;for(let[e,s]of t){let t=this.keySchema._parseFullSync(e,n),c=this.valueSchema._parseFullSync(s,n);t.issues.length>0&&a.push(...r(t.issues,o)),c.issues.length>0&&a.push(...r(c.issues,o)),t.issues.length===0&&c.issues.length===0&&i.set(t.data,c.data),o+=1}return{data:i,issues:a,typeOk:!0}}async parseAsync(n,i){let a=i??s();return this._withCatchAsync(async()=>{let i=this._prepareInput(n);if(i.skip)return i.value;let o=i.value;if(!(o instanceof Map))throw new t([{code:e.invalid_type,message:a.messages.map.type(),path:[]}]);let s=[...o],c=await Promise.all(s.map(([e,t])=>Promise.all([this.keySchema._parseFullAsync(e,a),this.valueSchema._parseFullAsync(t,a)]))),l=[],u=new Map;for(let e=0;e<c.length;e++){let[t,n]=c[e];t.issues.length>0&&l.push(...r(t.issues,e)),n.issues.length>0&&l.push(...r(n.issues,e)),t.issues.length===0&&n.issues.length===0&&u.set(t.data,n.data)}let d=await this._runValidatorsAsync(u,a),f=[...l,...d];if(f.length>0)throw new t(f);return this._runPostprocessors(u)})}min(t,r=e=>a().map.min(e)){return this._addConstraint((a,o)=>{let s=a;return s.size>=t?null:n(e.too_small,i(r,{min:t,value:s}),{min:t})})}max(t,r=e=>a().map.max(e)){return this._addConstraint((a,o)=>{let s=a;return s.size<=t?null:n(e.too_big,i(r,{max:t,value:s}),{max:t})})}size(t,r=e=>a().map.size(e)){return this._addConstraint((a,o)=>{let s=a;return s.size===t?null:n(e.invalid_length,i(r,{exact:t,value:s}),{exact:t})})}nonEmpty(t=()=>a().map.nonEmpty()){return this._addConstraint((r,a)=>r.size>0?null:n(e.too_small,i(t,{min:1}),{min:1}))}_toDescriptorImpl(){return{...this._describeBase(),key:this.keySchema.toDescriptor(),kind:`map`,value:this.valueSchema.toDescriptor()}}_walk(e){let t=this.keySchema.walk(e),n=this.valueSchema.walk(e);return e.map?e.map(this,t,n):super._walk(e)}_equalsImpl(e){return e instanceof c?this.keySchema.equals(e.keySchema)&&this.valueSchema.equals(e.valueSchema):!1}};export{c as MapSchema};
|
|
2
|
+
//# sourceMappingURL=map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.js","names":[],"sources":["../../src/schemas/map.ts"],"sourcesContent":["import type { Issue, MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { _messages } from '../messages';\n\nexport class MapSchema<K, V> extends Schema<Map<K, V>> {\n readonly keySchema: Schema<K, any>;\n readonly valueSchema: Schema<V, any>;\n\n protected override get _kind(): string {\n return 'map';\n }\n\n constructor(keySchema: Schema<K, any>, valueSchema: Schema<V, any>) {\n super();\n this.keySchema = keySchema;\n this.valueSchema = valueSchema;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!(value instanceof Map)) {\n return {\n data: value,\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.map.type(), path: [] }],\n typeOk: false,\n };\n }\n\n const out = new Map<K, V>();\n const issues: Issue[] = [];\n let i = 0;\n\n for (const [key, val] of value) {\n const keyResult = this.keySchema._parseFullSync(key, ctx);\n const valResult = this.valueSchema._parseFullSync(val, ctx);\n\n if (keyResult.issues.length > 0) issues.push(...prependIssuePath(keyResult.issues, i));\n\n if (valResult.issues.length > 0) issues.push(...prependIssuePath(valResult.issues, i));\n\n if (keyResult.issues.length === 0 && valResult.issues.length === 0)\n out.set(keyResult.data as K, valResult.data as V);\n\n i += 1;\n }\n\n return { data: out, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<Map<K, V>> {\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 unknown as Map<K, V>;\n\n const raw = prepared.value;\n\n if (!(raw instanceof Map)) {\n throw new SpellValidationError([{ code: ErrorCode.invalid_type, message: c.messages.map.type(), path: [] }]);\n }\n\n const entries = [...raw];\n const settled = await Promise.all(\n entries.map(([key, val]) =>\n Promise.all([this.keySchema._parseFullAsync(key, c), this.valueSchema._parseFullAsync(val, c)]),\n ),\n );\n\n const issues: Issue[] = [];\n const out = new Map<K, V>();\n\n for (let i = 0; i < settled.length; i++) {\n const [keyResult, valResult] = settled[i];\n\n if (keyResult.issues.length > 0) issues.push(...prependIssuePath(keyResult.issues, i));\n\n if (valResult.issues.length > 0) issues.push(...prependIssuePath(valResult.issues, i));\n\n if (keyResult.issues.length === 0 && valResult.issues.length === 0)\n out.set(keyResult.data as K, valResult.data as V);\n }\n\n const validationIssues = await this._runValidatorsAsync(out, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(out) as Map<K, V>;\n });\n }\n\n min(\n size: number,\n message: MessageFn<{ min: number; value: Map<unknown, unknown> }> = (ctx) => _messages().map.min(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n const typed = value as Map<unknown, unknown>;\n\n if (typed.size >= size) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: size, value: typed }), { min: size });\n });\n }\n\n max(\n size: number,\n message: MessageFn<{ max: number; value: Map<unknown, unknown> }> = (ctx) => _messages().map.max(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n const typed = value as Map<unknown, unknown>;\n\n if (typed.size <= size) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { max: size, value: typed }), { max: size });\n });\n }\n\n size(\n exact: number,\n message: MessageFn<{ exact: number; value: Map<unknown, unknown> }> = (ctx) => _messages().map.size(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n const typed = value as Map<unknown, unknown>;\n\n if (typed.size === exact) return null;\n\n return fail(ErrorCode.invalid_length, resolveMessage(message, { exact, value: typed }), { exact });\n });\n }\n\n nonEmpty(message: MessageFn<{ min: number }> = () => _messages().map.nonEmpty()): this {\n return this._addConstraint((value, _ctx) => {\n const typed = value as Map<unknown, unknown>;\n\n if (typed.size > 0) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: 1 }), { min: 1 });\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n key: this.keySchema.toDescriptor(),\n kind: 'map',\n value: this.valueSchema.toDescriptor(),\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const key = this.keySchema.walk(visitor);\n const value = this.valueSchema.walk(visitor);\n\n if (visitor.map) return visitor.map(this, key, value);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof MapSchema)) return false;\n\n return this.keySchema.equals(other.keySchema) && this.valueSchema.equals(other.valueSchema);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types.cjs"),t=require("../messages.cjs"),n=require("../core.cjs");var r=class r extends n.Schema{get _kind(){return`never`}constructor(){super((n,r)=>[{code:e.ErrorCode.invalid_type,message:(r?.messages??t._messages()).never.invalid(),path:[]}])}_toDescriptorImpl(){return{...this._describeBase(),kind:`never`}}_walk(e){return e.never?e.never(this):super._walk(e)}_equalsImpl(e){return e instanceof r}};exports.NeverSchema=r;
|
|
2
|
+
//# sourceMappingURL=never.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never.cjs","names":[],"sources":["../../src/schemas/never.ts"],"sourcesContent":["import type { SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\nimport { _messages } from '../messages';\n\nexport class NeverSchema extends Schema<never> {\n protected override get _kind(): string {\n return 'never';\n }\n\n constructor() {\n super((_value, ctx) => [\n { code: ErrorCode.invalid_type, message: (ctx?.messages ?? _messages()).never.invalid(), path: [] },\n ]);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'never' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n if (visitor.never) return visitor.never(this);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n return other instanceof NeverSchema;\n }\n}\n"],"mappings":"sFAKA,IAAa,EAAb,MAAa,UAAoB,EAAA,MAAc,CAC7C,IAAuB,OAAgB,CACrC,MAAO,OACT,CAEA,aAAc,CACZ,OAAO,EAAQ,IAAQ,CACrB,CAAE,KAAM,EAAA,UAAU,aAAc,SAAU,GAAK,UAAY,EAAA,UAAU,EAAA,CAAG,MAAM,QAAQ,EAAG,KAAM,CAAC,CAAE,CACpG,CAAC,CACH,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,OAAQ,CAClD,CAEA,MAA4B,EAAsD,CAGhF,OAFI,EAAQ,MAAc,EAAQ,MAAM,IAAI,EAErC,MAAM,MAAM,CAAO,CAC5B,CAEA,YAA+B,EAA6C,CAC1E,OAAO,aAAiB,CAC1B,CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SchemaDescriptor } from '../core';
|
|
2
|
+
import { Schema } from '../core';
|
|
3
|
+
export declare class NeverSchema extends Schema<never> {
|
|
4
|
+
protected get _kind(): string;
|
|
5
|
+
constructor();
|
|
6
|
+
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
7
|
+
protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
|
|
8
|
+
protected _equalsImpl(other: import('../core').AnySchema): boolean;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=never.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never.d.ts","sourceRoot":"","sources":["../../src/schemas/never.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAa,MAAM,EAAE,MAAM,SAAS,CAAC;AAG5C,qBAAa,WAAY,SAAQ,MAAM,CAAC,KAAK,CAAC;IAC5C,cAAuB,KAAK,IAAI,MAAM,CAErC;;cAQkB,iBAAiB,IAAI,gBAAgB;cAIrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAM9D,WAAW,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,SAAS,GAAG,OAAO;CAG5E"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorCode as e}from"../types.js";import{_messages as t}from"../messages.js";import{Schema as n}from"../core.js";var r=class r extends n{get _kind(){return`never`}constructor(){super((n,r)=>[{code:e.invalid_type,message:(r?.messages??t()).never.invalid(),path:[]}])}_toDescriptorImpl(){return{...this._describeBase(),kind:`never`}}_walk(e){return e.never?e.never(this):super._walk(e)}_equalsImpl(e){return e instanceof r}};export{r as NeverSchema};
|
|
2
|
+
//# sourceMappingURL=never.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never.js","names":[],"sources":["../../src/schemas/never.ts"],"sourcesContent":["import type { SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\nimport { _messages } from '../messages';\n\nexport class NeverSchema extends Schema<never> {\n protected override get _kind(): string {\n return 'never';\n }\n\n constructor() {\n super((_value, ctx) => [\n { code: ErrorCode.invalid_type, message: (ctx?.messages ?? _messages()).never.invalid(), path: [] },\n ]);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'never' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n if (visitor.never) return visitor.never(this);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n return other instanceof NeverSchema;\n }\n}\n"],"mappings":"uHAKA,IAAa,EAAb,MAAa,UAAoB,CAAc,CAC7C,IAAuB,OAAgB,CACrC,MAAO,OACT,CAEA,aAAc,CACZ,OAAO,EAAQ,IAAQ,CACrB,CAAE,KAAM,EAAU,aAAc,SAAU,GAAK,UAAY,EAAU,EAAA,CAAG,MAAM,QAAQ,EAAG,KAAM,CAAC,CAAE,CACpG,CAAC,CACH,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,OAAQ,CAClD,CAEA,MAA4B,EAAsD,CAGhF,OAFI,EAAQ,MAAc,EAAQ,MAAM,IAAI,EAErC,MAAM,MAAM,CAAO,CAC5B,CAEA,YAA+B,EAA6C,CAC1E,OAAO,aAAiB,CAC1B,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../messages.cjs"),r=require("../core.cjs");var i=class i extends r.Schema{get _kind(){return`number`}constructor(){super((r,i)=>typeof r==`number`&&!Number.isNaN(r)?null:t.fail(e.ErrorCode.invalid_type,(i?.messages??n._messages()).number.type()))}min(r,i=e=>n._messages().number.min(e)){return this._addConstraint((n,a)=>n>=r?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(i,{min:r,value:n}),{min:r}),e=>{let t=e;return{...t,minimum:t.minimum===void 0?r:Math.max(t.minimum,r)}})}max(r,i=e=>n._messages().number.max(e)){return this._addConstraint((n,a)=>n<=r?null:t.fail(e.ErrorCode.too_big,t.resolveMessage(i,{max:r,value:n}),{max:r}),e=>{let t=e;return{...t,maximum:t.maximum===void 0?r:Math.min(t.maximum,r)}})}int(r=()=>n._messages().number.int()){return this._addConstraint((n,i)=>Number.isInteger(n)?null:t.fail(e.ErrorCode.invalid_integer,t.resolveMessage(r,{value:n})),e=>({...e,typeHint:`integer`}))}positive(r=()=>n._messages().number.positive()){return this._addConstraint((n,i)=>n>0?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(r,{value:n}),{exclusive:!0,min:0}),e=>{let t=e;return{...t,exclusiveMinimum:t.exclusiveMinimum===void 0?0:Math.max(t.exclusiveMinimum,0)}})}negative(r=()=>n._messages().number.negative()){return this._addConstraint((n,i)=>n<0?null:t.fail(e.ErrorCode.too_big,t.resolveMessage(r,{value:n}),{exclusive:!0,max:0}),e=>{let t=e;return{...t,exclusiveMaximum:t.exclusiveMaximum===void 0?0:Math.min(t.exclusiveMaximum,0)}})}nonNegative(r=()=>n._messages().number.nonNegative()){return this._addConstraint((n,i)=>n>=0?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(r,{value:n}),{min:0}),e=>{let t=e;return{...t,minimum:t.minimum===void 0?0:Math.max(t.minimum,0)}})}nonPositive(r=()=>n._messages().number.nonPositive()){return this._addConstraint((n,i)=>n<=0?null:t.fail(e.ErrorCode.too_big,t.resolveMessage(r,{value:n}),{max:0}),e=>{let t=e;return{...t,maximum:t.maximum===void 0?0:Math.min(t.maximum,0)}})}multipleOf(r,i=e=>n._messages().number.multipleOf(e)){return this._addConstraint((n,a)=>Math.abs(Math.round(n/r)-n/r)<1e-9?null:t.fail(e.ErrorCode.invalid_multiple_of,t.resolveMessage(i,{step:r,value:n}),{step:r}),e=>({...e,multipleOf:r}))}safe(r=()=>n._messages().number.safe()){return this._addConstraint((n,i)=>Number.isSafeInteger(n)?null:t.fail(e.ErrorCode.invalid_safe,t.resolveMessage(r,{value:n})))}finite(r=()=>n._messages().number.finite()){return this._addConstraint((n,i)=>Number.isFinite(n)?null:t.fail(e.ErrorCode.invalid_finite,t.resolveMessage(r,{value:n})))}coerce(){return i.coerce()}_walk(e){return e.number?e.number(this):super._walk(e)}_toDescriptorImpl(){let e=this._annotations;return{...this._describeBase(),...e.exclusiveMaximum===void 0?{}:{exclusiveMaximum:e.exclusiveMaximum},...e.exclusiveMinimum===void 0?{}:{exclusiveMinimum:e.exclusiveMinimum},...e.maximum===void 0?{}:{maximum:e.maximum},...e.minimum===void 0?{}:{minimum:e.minimum},...e.multipleOf===void 0?{}:{multipleOf:e.multipleOf},...e.typeHint===void 0?{}:{typeHint:e.typeHint},kind:`number`}}_equalsImpl(e){return e instanceof i?this._annotationsEqual(e):!1}static coerce(){return new i().preprocess(e=>{if(typeof e==`number`)return e;if(typeof e==`string`||typeof e==`boolean`){let t=Number(e);return Number.isNaN(t)?e:t}return e})}};exports.NumberSchema=i;
|
|
2
|
+
//# sourceMappingURL=number.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.cjs","names":[],"sources":["../../src/schemas/number.ts"],"sourcesContent":["import type { AnySchema, MessageFn, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\nimport { _messages } from '../messages';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface NumberAnnotations extends Record<string, unknown> {\n exclusiveMaximum?: number;\n exclusiveMinimum?: number;\n maximum?: number;\n minimum?: number;\n multipleOf?: number;\n typeHint?: 'integer';\n}\n\nexport class NumberSchema<Input = number> extends Schema<number, Input> {\n protected override get _kind(): string {\n return 'number';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'number' && !Number.isNaN(value)\n ? null\n : fail(ErrorCode.invalid_type, (ctx?.messages ?? _messages()).number.type()),\n );\n }\n\n min(\n minimum: number,\n message: MessageFn<{ min: number; value: number }> = (ctx) => _messages().number.min(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) >= minimum) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: minimum, value: value as number }), {\n min: minimum,\n });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return {\n ...ann,\n minimum: ann.minimum === undefined ? minimum : Math.max(ann.minimum, minimum),\n };\n },\n );\n }\n\n max(\n maximum: number,\n message: MessageFn<{ max: number; value: number }> = (ctx) => _messages().number.max(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) <= maximum) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { max: maximum, value: value as number }), {\n max: maximum,\n });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return {\n ...ann,\n maximum: ann.maximum === undefined ? maximum : Math.min(ann.maximum, maximum),\n };\n },\n );\n }\n\n int(message: MessageFn<{ value: number }> = () => _messages().number.int()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (Number.isInteger(value as number)) return null;\n\n return fail(ErrorCode.invalid_integer, resolveMessage(message, { value: value as number }));\n },\n (ann) => ({ ...ann, typeHint: 'integer' as const }),\n );\n }\n\n positive(message: MessageFn<{ value: number }> = () => _messages().number.positive()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) > 0) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { value: value as number }), {\n exclusive: true,\n min: 0,\n });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return {\n ...ann,\n exclusiveMinimum: ann.exclusiveMinimum === undefined ? 0 : Math.max(ann.exclusiveMinimum, 0),\n };\n },\n );\n }\n\n negative(message: MessageFn<{ value: number }> = () => _messages().number.negative()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) < 0) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { value: value as number }), {\n exclusive: true,\n max: 0,\n });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return {\n ...ann,\n exclusiveMaximum: ann.exclusiveMaximum === undefined ? 0 : Math.min(ann.exclusiveMaximum, 0),\n };\n },\n );\n }\n\n nonNegative(message: MessageFn<{ value: number }> = () => _messages().number.nonNegative()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) >= 0) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { value: value as number }), { min: 0 });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return { ...ann, minimum: ann.minimum === undefined ? 0 : Math.max(ann.minimum, 0) };\n },\n );\n }\n\n nonPositive(message: MessageFn<{ value: number }> = () => _messages().number.nonPositive()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) <= 0) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { value: value as number }), { max: 0 });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return { ...ann, maximum: ann.maximum === undefined ? 0 : Math.min(ann.maximum, 0) };\n },\n );\n }\n\n multipleOf(\n step: number,\n message: MessageFn<{ step: number; value: number }> = (ctx) => _messages().number.multipleOf(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (Math.abs(Math.round((value as number) / step) - (value as number) / step) < 1e-9) return null;\n\n return fail(ErrorCode.invalid_multiple_of, resolveMessage(message, { step, value: value as number }), { step });\n },\n (ann) => ({ ...ann, multipleOf: step }),\n );\n }\n\n safe(message: MessageFn<{ value: number }> = () => _messages().number.safe()): this {\n return this._addConstraint((value, _ctx) => {\n if (Number.isSafeInteger(value as number)) return null;\n\n return fail(ErrorCode.invalid_safe, resolveMessage(message, { value: value as number }));\n });\n }\n\n finite(message: MessageFn<{ value: number }> = () => _messages().number.finite()): this {\n return this._addConstraint((value, _ctx) => {\n if (Number.isFinite(value as number)) return null;\n\n return fail(ErrorCode.invalid_finite, resolveMessage(message, { value: value as number }));\n });\n }\n\n /**\n * Returns a new schema that coerces the input to a number via `Number(value)` before validation.\n *\n * Equivalent to `s.coerce.number()`.\n */\n coerce(): NumberSchema<unknown> {\n return NumberSchema.coerce();\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n if (visitor.number) return visitor.number(this);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as NumberAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.exclusiveMaximum !== undefined ? { exclusiveMaximum: ann.exclusiveMaximum } : {}),\n ...(ann.exclusiveMinimum !== undefined ? { exclusiveMinimum: ann.exclusiveMinimum } : {}),\n ...(ann.maximum !== undefined ? { maximum: ann.maximum } : {}),\n ...(ann.minimum !== undefined ? { minimum: ann.minimum } : {}),\n ...(ann.multipleOf !== undefined ? { multipleOf: ann.multipleOf } : {}),\n ...(ann.typeHint !== undefined ? { typeHint: ann.typeHint } : {}),\n kind: 'number',\n };\n }\n\n protected override _equalsImpl(other: AnySchema): boolean {\n if (!(other instanceof NumberSchema)) return false;\n\n return this._annotationsEqual(other);\n }\n\n static coerce(): NumberSchema<unknown> {\n return new NumberSchema().preprocess((v: unknown) => {\n if (typeof v === 'number') return v;\n\n if (typeof v === 'string' || typeof v === 'boolean') {\n const n = Number(v);\n\n return Number.isNaN(n) ? v : n;\n }\n\n return v;\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AnySchema, MessageFn, SchemaDescriptor } from '../core';
|
|
2
|
+
import { Schema } from '../core';
|
|
3
|
+
export declare class NumberSchema<Input = number> extends Schema<number, Input> {
|
|
4
|
+
protected get _kind(): string;
|
|
5
|
+
constructor();
|
|
6
|
+
min(minimum: number, message?: MessageFn<{
|
|
7
|
+
min: number;
|
|
8
|
+
value: number;
|
|
9
|
+
}>): this;
|
|
10
|
+
max(maximum: number, message?: MessageFn<{
|
|
11
|
+
max: number;
|
|
12
|
+
value: number;
|
|
13
|
+
}>): this;
|
|
14
|
+
int(message?: MessageFn<{
|
|
15
|
+
value: number;
|
|
16
|
+
}>): this;
|
|
17
|
+
positive(message?: MessageFn<{
|
|
18
|
+
value: number;
|
|
19
|
+
}>): this;
|
|
20
|
+
negative(message?: MessageFn<{
|
|
21
|
+
value: number;
|
|
22
|
+
}>): this;
|
|
23
|
+
nonNegative(message?: MessageFn<{
|
|
24
|
+
value: number;
|
|
25
|
+
}>): this;
|
|
26
|
+
nonPositive(message?: MessageFn<{
|
|
27
|
+
value: number;
|
|
28
|
+
}>): this;
|
|
29
|
+
multipleOf(step: number, message?: MessageFn<{
|
|
30
|
+
step: number;
|
|
31
|
+
value: number;
|
|
32
|
+
}>): this;
|
|
33
|
+
safe(message?: MessageFn<{
|
|
34
|
+
value: number;
|
|
35
|
+
}>): this;
|
|
36
|
+
finite(message?: MessageFn<{
|
|
37
|
+
value: number;
|
|
38
|
+
}>): this;
|
|
39
|
+
/**
|
|
40
|
+
* Returns a new schema that coerces the input to a number via `Number(value)` before validation.
|
|
41
|
+
*
|
|
42
|
+
* Equivalent to `s.coerce.number()`.
|
|
43
|
+
*/
|
|
44
|
+
coerce(): NumberSchema<unknown>;
|
|
45
|
+
protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
|
|
46
|
+
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
47
|
+
protected _equalsImpl(other: AnySchema): boolean;
|
|
48
|
+
static coerce(): NumberSchema<unknown>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=number.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/schemas/number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEtE,OAAO,EAAmC,MAAM,EAAE,MAAM,SAAS,CAAC;AAclE,qBAAa,YAAY,CAAC,KAAK,GAAG,MAAM,CAAE,SAAQ,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IACrE,cAAuB,KAAK,IAAI,MAAM,CAErC;;IAUD,GAAG,CACD,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAwC,GACxF,IAAI;IAoBP,GAAG,CACD,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAwC,GACxF,IAAI;IAoBP,GAAG,CAAC,OAAO,GAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAkC,GAAG,IAAI;IAWjF,QAAQ,CAAC,OAAO,GAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAuC,GAAG,IAAI;IAqB3F,QAAQ,CAAC,OAAO,GAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAuC,GAAG,IAAI;IAqB3F,WAAW,CAAC,OAAO,GAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAA0C,GAAG,IAAI;IAejG,WAAW,CAAC,OAAO,GAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAA0C,GAAG,IAAI;IAejG,UAAU,CACR,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAA+C,GAChG,IAAI;IAWP,IAAI,CAAC,OAAO,GAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAmC,GAAG,IAAI;IAQnF,MAAM,CAAC,OAAO,GAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAqC,GAAG,IAAI;IAQvF;;;;OAIG;IACH,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC;cAIZ,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAM9D,iBAAiB,IAAI,gBAAgB;cAerC,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO;IAMzD,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC;CAavC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorCode as e}from"../types.js";import{fail as t,resolveMessage as n}from"../errors.js";import{_messages as r}from"../messages.js";import{Schema as i}from"../core.js";var a=class a extends i{get _kind(){return`number`}constructor(){super((n,i)=>typeof n==`number`&&!Number.isNaN(n)?null:t(e.invalid_type,(i?.messages??r()).number.type()))}min(i,a=e=>r().number.min(e)){return this._addConstraint((r,o)=>r>=i?null:t(e.too_small,n(a,{min:i,value:r}),{min:i}),e=>{let t=e;return{...t,minimum:t.minimum===void 0?i:Math.max(t.minimum,i)}})}max(i,a=e=>r().number.max(e)){return this._addConstraint((r,o)=>r<=i?null:t(e.too_big,n(a,{max:i,value:r}),{max:i}),e=>{let t=e;return{...t,maximum:t.maximum===void 0?i:Math.min(t.maximum,i)}})}int(i=()=>r().number.int()){return this._addConstraint((r,a)=>Number.isInteger(r)?null:t(e.invalid_integer,n(i,{value:r})),e=>({...e,typeHint:`integer`}))}positive(i=()=>r().number.positive()){return this._addConstraint((r,a)=>r>0?null:t(e.too_small,n(i,{value:r}),{exclusive:!0,min:0}),e=>{let t=e;return{...t,exclusiveMinimum:t.exclusiveMinimum===void 0?0:Math.max(t.exclusiveMinimum,0)}})}negative(i=()=>r().number.negative()){return this._addConstraint((r,a)=>r<0?null:t(e.too_big,n(i,{value:r}),{exclusive:!0,max:0}),e=>{let t=e;return{...t,exclusiveMaximum:t.exclusiveMaximum===void 0?0:Math.min(t.exclusiveMaximum,0)}})}nonNegative(i=()=>r().number.nonNegative()){return this._addConstraint((r,a)=>r>=0?null:t(e.too_small,n(i,{value:r}),{min:0}),e=>{let t=e;return{...t,minimum:t.minimum===void 0?0:Math.max(t.minimum,0)}})}nonPositive(i=()=>r().number.nonPositive()){return this._addConstraint((r,a)=>r<=0?null:t(e.too_big,n(i,{value:r}),{max:0}),e=>{let t=e;return{...t,maximum:t.maximum===void 0?0:Math.min(t.maximum,0)}})}multipleOf(i,a=e=>r().number.multipleOf(e)){return this._addConstraint((r,o)=>Math.abs(Math.round(r/i)-r/i)<1e-9?null:t(e.invalid_multiple_of,n(a,{step:i,value:r}),{step:i}),e=>({...e,multipleOf:i}))}safe(i=()=>r().number.safe()){return this._addConstraint((r,a)=>Number.isSafeInteger(r)?null:t(e.invalid_safe,n(i,{value:r})))}finite(i=()=>r().number.finite()){return this._addConstraint((r,a)=>Number.isFinite(r)?null:t(e.invalid_finite,n(i,{value:r})))}coerce(){return a.coerce()}_walk(e){return e.number?e.number(this):super._walk(e)}_toDescriptorImpl(){let e=this._annotations;return{...this._describeBase(),...e.exclusiveMaximum===void 0?{}:{exclusiveMaximum:e.exclusiveMaximum},...e.exclusiveMinimum===void 0?{}:{exclusiveMinimum:e.exclusiveMinimum},...e.maximum===void 0?{}:{maximum:e.maximum},...e.minimum===void 0?{}:{minimum:e.minimum},...e.multipleOf===void 0?{}:{multipleOf:e.multipleOf},...e.typeHint===void 0?{}:{typeHint:e.typeHint},kind:`number`}}_equalsImpl(e){return e instanceof a?this._annotationsEqual(e):!1}static coerce(){return new a().preprocess(e=>{if(typeof e==`number`)return e;if(typeof e==`string`||typeof e==`boolean`){let t=Number(e);return Number.isNaN(t)?e:t}return e})}};export{a as NumberSchema};
|
|
2
|
+
//# sourceMappingURL=number.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.js","names":[],"sources":["../../src/schemas/number.ts"],"sourcesContent":["import type { AnySchema, MessageFn, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\nimport { _messages } from '../messages';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface NumberAnnotations extends Record<string, unknown> {\n exclusiveMaximum?: number;\n exclusiveMinimum?: number;\n maximum?: number;\n minimum?: number;\n multipleOf?: number;\n typeHint?: 'integer';\n}\n\nexport class NumberSchema<Input = number> extends Schema<number, Input> {\n protected override get _kind(): string {\n return 'number';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'number' && !Number.isNaN(value)\n ? null\n : fail(ErrorCode.invalid_type, (ctx?.messages ?? _messages()).number.type()),\n );\n }\n\n min(\n minimum: number,\n message: MessageFn<{ min: number; value: number }> = (ctx) => _messages().number.min(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) >= minimum) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: minimum, value: value as number }), {\n min: minimum,\n });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return {\n ...ann,\n minimum: ann.minimum === undefined ? minimum : Math.max(ann.minimum, minimum),\n };\n },\n );\n }\n\n max(\n maximum: number,\n message: MessageFn<{ max: number; value: number }> = (ctx) => _messages().number.max(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) <= maximum) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { max: maximum, value: value as number }), {\n max: maximum,\n });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return {\n ...ann,\n maximum: ann.maximum === undefined ? maximum : Math.min(ann.maximum, maximum),\n };\n },\n );\n }\n\n int(message: MessageFn<{ value: number }> = () => _messages().number.int()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (Number.isInteger(value as number)) return null;\n\n return fail(ErrorCode.invalid_integer, resolveMessage(message, { value: value as number }));\n },\n (ann) => ({ ...ann, typeHint: 'integer' as const }),\n );\n }\n\n positive(message: MessageFn<{ value: number }> = () => _messages().number.positive()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) > 0) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { value: value as number }), {\n exclusive: true,\n min: 0,\n });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return {\n ...ann,\n exclusiveMinimum: ann.exclusiveMinimum === undefined ? 0 : Math.max(ann.exclusiveMinimum, 0),\n };\n },\n );\n }\n\n negative(message: MessageFn<{ value: number }> = () => _messages().number.negative()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) < 0) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { value: value as number }), {\n exclusive: true,\n max: 0,\n });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return {\n ...ann,\n exclusiveMaximum: ann.exclusiveMaximum === undefined ? 0 : Math.min(ann.exclusiveMaximum, 0),\n };\n },\n );\n }\n\n nonNegative(message: MessageFn<{ value: number }> = () => _messages().number.nonNegative()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) >= 0) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { value: value as number }), { min: 0 });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return { ...ann, minimum: ann.minimum === undefined ? 0 : Math.max(ann.minimum, 0) };\n },\n );\n }\n\n nonPositive(message: MessageFn<{ value: number }> = () => _messages().number.nonPositive()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as number) <= 0) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { value: value as number }), { max: 0 });\n },\n (current) => {\n const ann = current as NumberAnnotations;\n\n return { ...ann, maximum: ann.maximum === undefined ? 0 : Math.min(ann.maximum, 0) };\n },\n );\n }\n\n multipleOf(\n step: number,\n message: MessageFn<{ step: number; value: number }> = (ctx) => _messages().number.multipleOf(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (Math.abs(Math.round((value as number) / step) - (value as number) / step) < 1e-9) return null;\n\n return fail(ErrorCode.invalid_multiple_of, resolveMessage(message, { step, value: value as number }), { step });\n },\n (ann) => ({ ...ann, multipleOf: step }),\n );\n }\n\n safe(message: MessageFn<{ value: number }> = () => _messages().number.safe()): this {\n return this._addConstraint((value, _ctx) => {\n if (Number.isSafeInteger(value as number)) return null;\n\n return fail(ErrorCode.invalid_safe, resolveMessage(message, { value: value as number }));\n });\n }\n\n finite(message: MessageFn<{ value: number }> = () => _messages().number.finite()): this {\n return this._addConstraint((value, _ctx) => {\n if (Number.isFinite(value as number)) return null;\n\n return fail(ErrorCode.invalid_finite, resolveMessage(message, { value: value as number }));\n });\n }\n\n /**\n * Returns a new schema that coerces the input to a number via `Number(value)` before validation.\n *\n * Equivalent to `s.coerce.number()`.\n */\n coerce(): NumberSchema<unknown> {\n return NumberSchema.coerce();\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n if (visitor.number) return visitor.number(this);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as NumberAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.exclusiveMaximum !== undefined ? { exclusiveMaximum: ann.exclusiveMaximum } : {}),\n ...(ann.exclusiveMinimum !== undefined ? { exclusiveMinimum: ann.exclusiveMinimum } : {}),\n ...(ann.maximum !== undefined ? { maximum: ann.maximum } : {}),\n ...(ann.minimum !== undefined ? { minimum: ann.minimum } : {}),\n ...(ann.multipleOf !== undefined ? { multipleOf: ann.multipleOf } : {}),\n ...(ann.typeHint !== undefined ? { typeHint: ann.typeHint } : {}),\n kind: 'number',\n };\n }\n\n protected override _equalsImpl(other: AnySchema): boolean {\n if (!(other instanceof NumberSchema)) return false;\n\n return this._annotationsEqual(other);\n }\n\n static coerce(): NumberSchema<unknown> {\n return new NumberSchema().preprocess((v: unknown) => {\n if (typeof v === 'number') return v;\n\n if (typeof v === 'string' || typeof v === 'boolean') {\n const n = Number(v);\n\n return Number.isNaN(n) ? v : n;\n }\n\n return v;\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../safe-object.cjs"),r=require("../core.cjs"),i=require("./literal.cjs"),a=require("./union.cjs");var o=class o extends r.Schema{shape;_isRelaxed;get _kind(){return`object`}constructor(e,t=!1){super(),this.shape=e,this._isRelaxed=t}_unknownKeys(e){return Object.keys(e).filter(e=>!Object.hasOwn(this.shape,e))}_strictUnknownKeyIssues(t,n){if(this._isRelaxed)return[];let r=this._unknownKeys(t);return r.length===0?[]:[{code:e.ErrorCode.invalid_keys,message:n.messages.object.invalidKeys({keys:r}),params:{keys:r},path:[]}]}_copyRelaxedUnknownKeys(e,t){if(this._isRelaxed)for(let r of this._unknownKeys(e))n.isUnsafeObjectKey(r)||Object.defineProperty(t,r,{configurable:!0,enumerable:!0,value:e[r],writable:!0})}_guardObjectInput(t,n){return typeof t!=`object`||!t||Array.isArray(t)?{issues:[{code:e.ErrorCode.invalid_type,message:n.messages.object.type(),path:[]}],ok:!1}:{obj:t,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(e,r){let i=this._guardObjectInput(e,r);if(!i.ok)return{data:e,issues:i.issues,typeOk:!1};let{obj:a}=i,{issues:o,output:s}=this._createObjectParseContext(a,r);for(let e of Object.keys(this.shape)){let i=this.shape[e]._parseFullSync(a[e],r);i.issues.length===0?n.defineOwnProperty(s,e,i.data):o.push(...t.prependIssuePath(i.issues,e))}return this._copyRelaxedUnknownKeys(a,s),{data:s,issues:o,typeOk:!0}}async parseAsync(e,i){let a=i??r._makeCtx();return this._withCatchAsync(async()=>{let r=this._prepareInput(e);if(r.skip)return r.value;let i=this._guardObjectInput(r.value,a);if(!i.ok)throw new t.SpellValidationError(i.issues);let{obj:o}=i,{issues:s,output:c}=this._createObjectParseContext(o,a),l=Object.keys(this.shape),u=await Promise.all(l.map(e=>this.shape[e]._parseFullAsync(o[e],a)));for(let e=0;e<l.length;e++){let r=l[e],i=u[e];i.issues.length===0?n.defineOwnProperty(c,r,i.data):s.push(...t.prependIssuePath(i.issues,r))}this._copyRelaxedUnknownKeys(o,c);let d=await this._runValidatorsAsync(c,a),f=[...s,...d];if(f.length>0)throw new t.SpellValidationError(f);return this._runPostprocessors(c)})}partial(...e){let t=e.length>0?new Set(e):null;return this._rebuildWith(n.objectFromEntries(Object.entries(this.shape).map(([e,n])=>[e,t===null||t.has(e)?n.optional():n])),this._isRelaxed)}required(){return this._rebuildWith(n.objectFromEntries(Object.entries(this.shape).map(([e,t])=>[e,t.required()])),this._isRelaxed)}extend(e){return this._rebuildWith(n.objectFromEntries([...Object.entries(this.shape),...Object.entries(e)]),this._isRelaxed)}pick(...e){let t=new Set(e);return this._rebuildWith(n.objectFromEntries(Object.entries(this.shape).filter(([e])=>t.has(e))))}omit(...e){let t=new Set(e);return this._rebuildWith(n.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 r=this.shape[t]._parseFullSync(void 0);r.issues.length===0&&n.defineOwnProperty(e,t,r.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(){return new a.UnionSchema(Object.keys(this.shape).map(e=>new i.LiteralSchema(e)))}_toDescriptorImpl(){let e={};for(let[t,r]of Object.entries(this.shape))n.defineOwnProperty(e,t,r.toDescriptor());return{...this._describeBase(),fields:e,kind:`object`,strict:!this._isRelaxed}}_walk(e){let t=n.objectFromEntries(Object.entries(this.shape).map(([t,n])=>[t,n.walk(e)]));return e.object?e.object(this,t):super._walk(e)}merge(e){return this._rebuildWith(n.objectFromEntries([...Object.entries(this.shape),...Object.entries(e.shape)]),e._isRelaxed)}_equalsImpl(e){if(!(e instanceof o)||this._isRelaxed!==e._isRelaxed)return!1;let t=Object.keys(this.shape);if(t.length!==Object.keys(e.shape).length)return!1;for(let n of t)if(!Object.hasOwn(e.shape,n)||!this.shape[n].equals(e.shape[n]))return!1;return!0}};exports.ObjectSchema=o;
|
|
2
|
+
//# sourceMappingURL=object.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.cjs","names":[],"sources":["../../src/schemas/object.ts"],"sourcesContent":["import type { AnySchema, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx, prependIssuePath } 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]> };\n\nexport class ObjectSchema<T extends ObjectShape> extends Schema<InferObject<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 = shape;\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 Object.defineProperty(output, key, {\n configurable: true,\n enumerable: true,\n value: obj[key],\n writable: true,\n });\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));\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 override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferObject<T>> {\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 unknown as InferObject<T>;\n\n const guarded = this._guardObjectInput(prepared.value, c);\n\n if (!guarded.ok) throw new SpellValidationError(guarded.issues);\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, c);\n\n const keys = Object.keys(this.shape);\n const results = await Promise.all(keys.map((key) => this.shape[key]._parseFullAsync(obj[key], c)));\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 const validationIssues = await this._runValidatorsAsync(output, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(output) as InferObject<T>;\n });\n }\n\n partial(): ObjectSchema<{ [K in keyof T]: Schema<InferOutput<T[K]> | undefined> }>;\n partial<K extends keyof T>(\n ...keys: K[]\n ): ObjectSchema<Omit<T, K> & { [P in K]: Schema<InferOutput<T[P]> | undefined> }>;\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 required(): Schema<InferObject<T>> {\n return this._rebuildWith(\n objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.required()])) as any,\n this._isRelaxed,\n ) as unknown as Schema<InferObject<T>>;\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.toDescriptor());\n }\n\n return { ...this._describeBase(), fields, kind: 'object', strict: !this._isRelaxed };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const fields = objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.walk(visitor)]));\n\n if (visitor.object) return visitor.object(this, fields);\n\n return super._walk(visitor);\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 protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof ObjectSchema)) return false;\n\n if (this._isRelaxed !== other._isRelaxed) return false;\n\n const keys = Object.keys(this.shape);\n\n if (keys.length !== Object.keys(other.shape).length) return false;\n\n for (const k of keys) {\n if (!Object.hasOwn(other.shape, k)) return false;\n\n if (!this.shape[k].equals(other.shape[k])) return false;\n }\n\n return true;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { AnySchema, InferOutput, ParseContext, ParseValue, SchemaDescriptor } from '../core';
|
|
2
|
+
import { Schema } from '../core';
|
|
3
|
+
import { LiteralSchema } from './literal';
|
|
4
|
+
import { UnionSchema } from './union';
|
|
5
|
+
export type ObjectShape = Record<string, AnySchema>;
|
|
6
|
+
export type InferObject<T extends ObjectShape> = {
|
|
7
|
+
[K in keyof T]: InferOutput<T[K]>;
|
|
8
|
+
};
|
|
9
|
+
export declare class ObjectSchema<T extends ObjectShape> extends Schema<InferObject<T>> {
|
|
10
|
+
readonly shape: T;
|
|
11
|
+
private readonly _isRelaxed;
|
|
12
|
+
protected get _kind(): string;
|
|
13
|
+
constructor(shape: T, isRelaxed?: boolean);
|
|
14
|
+
private _unknownKeys;
|
|
15
|
+
private _strictUnknownKeyIssues;
|
|
16
|
+
private _copyRelaxedUnknownKeys;
|
|
17
|
+
private _guardObjectInput;
|
|
18
|
+
private _createObjectParseContext;
|
|
19
|
+
private _rebuildWith;
|
|
20
|
+
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
21
|
+
parseAsync(value: unknown, ctx?: ParseContext): Promise<InferObject<T>>;
|
|
22
|
+
partial(): ObjectSchema<{
|
|
23
|
+
[K in keyof T]: Schema<InferOutput<T[K]> | undefined>;
|
|
24
|
+
}>;
|
|
25
|
+
partial<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K> & {
|
|
26
|
+
[P in K]: Schema<InferOutput<T[P]> | undefined>;
|
|
27
|
+
}>;
|
|
28
|
+
required(): Schema<InferObject<T>>;
|
|
29
|
+
extend<U extends ObjectShape>(extra: U): ObjectSchema<Omit<T, keyof U> & U>;
|
|
30
|
+
pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>>;
|
|
31
|
+
omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>>;
|
|
32
|
+
/**
|
|
33
|
+
* Returns a fully default-filled object by parsing `{}` against this schema.
|
|
34
|
+
* Every required field must have a `.default()` value set; if any required
|
|
35
|
+
* field is missing a default, this method throws a `SpellValidationError`.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* const Config = s.object({ host: s.string().default('localhost'), port: s.number().default(3000) });
|
|
39
|
+
* Config.defaults(); // { host: 'localhost', port: 3000 }
|
|
40
|
+
*/
|
|
41
|
+
defaults(): InferObject<T>;
|
|
42
|
+
/**
|
|
43
|
+
* Returns a partial object containing only the fields that have a default value set.
|
|
44
|
+
* Fields without a `.default()` or `.catch()` are silently omitted rather than throwing.
|
|
45
|
+
*
|
|
46
|
+
* Useful for pre-filling forms where only some fields have defaults.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* const Form = s.object({ name: s.string(), role: s.string().default('viewer') });
|
|
50
|
+
* Form.partialDefaults(); // { role: 'viewer' } — name is omitted
|
|
51
|
+
*/
|
|
52
|
+
partialDefaults(): Partial<InferObject<T>>;
|
|
53
|
+
/**
|
|
54
|
+
* Returns an array of field keys that are **required** (not optional and not nullish).
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* const User = s.object({ id: s.number(), name: s.string().optional() });
|
|
58
|
+
* User.requiredFields(); // ['id']
|
|
59
|
+
*/
|
|
60
|
+
requiredFields(): (keyof T & string)[];
|
|
61
|
+
/**
|
|
62
|
+
* Returns an array of field keys that are **optional** (accept `undefined`).
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* const User = s.object({ id: s.number(), name: s.string().optional() });
|
|
66
|
+
* User.optionalFields(); // ['name']
|
|
67
|
+
*/
|
|
68
|
+
optionalFields(): (keyof T & string)[];
|
|
69
|
+
/**
|
|
70
|
+
* Allow additional unknown properties (relaxed mode).
|
|
71
|
+
* Default is strict mode (rejects unknown keys).
|
|
72
|
+
*
|
|
73
|
+
* Returns `ObjectSchema<T>` so fluent methods like `.pick()`, `.omit()`,
|
|
74
|
+
* `.extend()`, and `.partial()` remain usable after calling `.relaxed()`.
|
|
75
|
+
*/
|
|
76
|
+
relaxed(): ObjectSchema<T>;
|
|
77
|
+
/**
|
|
78
|
+
* Alias for the default strict mode — rejects unknown keys.
|
|
79
|
+
* Useful after calling `.relaxed()` to return a new strict schema.
|
|
80
|
+
*/
|
|
81
|
+
strict(): ObjectSchema<T>;
|
|
82
|
+
/**
|
|
83
|
+
* Returns a union schema of the object's key names as literal schemas.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* const User = s.object({ id: s.number(), name: s.string() });
|
|
87
|
+
* User.keyof(); // UnionSchema — validates 'id' | 'name'
|
|
88
|
+
*/
|
|
89
|
+
keyof(): UnionSchema<readonly [LiteralSchema<keyof T & string>, ...LiteralSchema<keyof T & string>[]]>;
|
|
90
|
+
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
91
|
+
protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
|
|
92
|
+
merge<U extends ObjectShape>(other: ObjectSchema<U>): ObjectSchema<T & U>;
|
|
93
|
+
protected _equalsImpl(other: import('../core').AnySchema): boolean;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/schemas/object.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorCode as e}from"../types.js";import{SpellValidationError as t,prependIssuePath as n}from"../errors.js";import{defineOwnProperty as r,isUnsafeObjectKey as i,objectFromEntries as a}from"../safe-object.js";import{Schema as o,_makeCtx as s}from"../core.js";import{LiteralSchema as c}from"./literal.js";import{UnionSchema as l}from"./union.js";var u=class u extends o{shape;_isRelaxed;get _kind(){return`object`}constructor(e,t=!1){super(),this.shape=e,this._isRelaxed=t}_unknownKeys(e){return Object.keys(e).filter(e=>!Object.hasOwn(this.shape,e))}_strictUnknownKeyIssues(t,n){if(this._isRelaxed)return[];let r=this._unknownKeys(t);return r.length===0?[]:[{code:e.invalid_keys,message:n.messages.object.invalidKeys({keys:r}),params:{keys:r},path:[]}]}_copyRelaxedUnknownKeys(e,t){if(this._isRelaxed)for(let n of this._unknownKeys(e))i(n)||Object.defineProperty(t,n,{configurable:!0,enumerable:!0,value:e[n],writable:!0})}_guardObjectInput(t,n){return typeof t!=`object`||!t||Array.isArray(t)?{issues:[{code:e.invalid_type,message:n.messages.object.type(),path:[]}],ok:!1}:{obj:t,ok:!0}}_createObjectParseContext(e,t){return{issues:[...this._strictUnknownKeyIssues(e,t)],output:{}}}_rebuildWith(e,t=this._isRelaxed){return this._copyStateTo(new u(e,t))}_parse(e,t){let i=this._guardObjectInput(e,t);if(!i.ok)return{data:e,issues:i.issues,typeOk:!1};let{obj:a}=i,{issues:o,output:s}=this._createObjectParseContext(a,t);for(let e of Object.keys(this.shape)){let i=this.shape[e]._parseFullSync(a[e],t);i.issues.length===0?r(s,e,i.data):o.push(...n(i.issues,e))}return this._copyRelaxedUnknownKeys(a,s),{data:s,issues:o,typeOk:!0}}async parseAsync(e,i){let a=i??s();return this._withCatchAsync(async()=>{let i=this._prepareInput(e);if(i.skip)return i.value;let o=this._guardObjectInput(i.value,a);if(!o.ok)throw new t(o.issues);let{obj:s}=o,{issues:c,output:l}=this._createObjectParseContext(s,a),u=Object.keys(this.shape),d=await Promise.all(u.map(e=>this.shape[e]._parseFullAsync(s[e],a)));for(let e=0;e<u.length;e++){let t=u[e],i=d[e];i.issues.length===0?r(l,t,i.data):c.push(...n(i.issues,t))}this._copyRelaxedUnknownKeys(s,l);let f=await this._runValidatorsAsync(l,a),p=[...c,...f];if(p.length>0)throw new t(p);return this._runPostprocessors(l)})}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)}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(){return new l(Object.keys(this.shape).map(e=>new c(e)))}_toDescriptorImpl(){let e={};for(let[t,n]of Object.entries(this.shape))r(e,t,n.toDescriptor());return{...this._describeBase(),fields:e,kind:`object`,strict:!this._isRelaxed}}_walk(e){let t=a(Object.entries(this.shape).map(([t,n])=>[t,n.walk(e)]));return e.object?e.object(this,t):super._walk(e)}merge(e){return this._rebuildWith(a([...Object.entries(this.shape),...Object.entries(e.shape)]),e._isRelaxed)}_equalsImpl(e){if(!(e instanceof u)||this._isRelaxed!==e._isRelaxed)return!1;let t=Object.keys(this.shape);if(t.length!==Object.keys(e.shape).length)return!1;for(let n of t)if(!Object.hasOwn(e.shape,n)||!this.shape[n].equals(e.shape[n]))return!1;return!0}};export{u as ObjectSchema};
|
|
2
|
+
//# sourceMappingURL=object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.js","names":[],"sources":["../../src/schemas/object.ts"],"sourcesContent":["import type { AnySchema, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx, prependIssuePath } 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]> };\n\nexport class ObjectSchema<T extends ObjectShape> extends Schema<InferObject<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 = shape;\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 Object.defineProperty(output, key, {\n configurable: true,\n enumerable: true,\n value: obj[key],\n writable: true,\n });\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));\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 override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferObject<T>> {\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 unknown as InferObject<T>;\n\n const guarded = this._guardObjectInput(prepared.value, c);\n\n if (!guarded.ok) throw new SpellValidationError(guarded.issues);\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, c);\n\n const keys = Object.keys(this.shape);\n const results = await Promise.all(keys.map((key) => this.shape[key]._parseFullAsync(obj[key], c)));\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 const validationIssues = await this._runValidatorsAsync(output, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(output) as InferObject<T>;\n });\n }\n\n partial(): ObjectSchema<{ [K in keyof T]: Schema<InferOutput<T[K]> | undefined> }>;\n partial<K extends keyof T>(\n ...keys: K[]\n ): ObjectSchema<Omit<T, K> & { [P in K]: Schema<InferOutput<T[P]> | undefined> }>;\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 required(): Schema<InferObject<T>> {\n return this._rebuildWith(\n objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.required()])) as any,\n this._isRelaxed,\n ) as unknown as Schema<InferObject<T>>;\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.toDescriptor());\n }\n\n return { ...this._describeBase(), fields, kind: 'object', strict: !this._isRelaxed };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const fields = objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.walk(visitor)]));\n\n if (visitor.object) return visitor.object(this, fields);\n\n return super._walk(visitor);\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 protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof ObjectSchema)) return false;\n\n if (this._isRelaxed !== other._isRelaxed) return false;\n\n const keys = Object.keys(this.shape);\n\n if (keys.length !== Object.keys(other.shape).length) return false;\n\n for (const k of keys) {\n if (!Object.hasOwn(other.shape, k)) return false;\n\n if (!this.shape[k].equals(other.shape[k])) return false;\n }\n\n return true;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipe.d.ts","sourceRoot":"","sources":["../../src/schemas/pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-or.cjs","names":[],"sources":["../../src/schemas/raw-or.ts"],"sourcesContent":["/**\n * Helpers for accepting raw literal values alongside schema instances in\n * sUnion() and sIntersect() arguments.\n *\n * Moved out of literal.ts — this infrastructure belongs to the combinator\n * entry points (s.ts), not to LiteralSchema.\n */\n\nimport type { AnySchema } from '../core';\n\nimport { Schema } from '../core';\nimport { LiteralSchema } from './literal';\n\nexport type LiteralValue = string | number | boolean | null | undefined;\nexport type RawOrSchema = AnySchema | LiteralValue;\nexport type NormalizeItem<T> = T extends AnySchema ? T : T extends LiteralValue ? LiteralSchema<T> : never;\nexport type NormalizeItems<T extends readonly RawOrSchema[]> = { readonly [K in keyof T]: NormalizeItem<T[K]> };\n\nexport function normalizeToSchemas<T extends readonly RawOrSchema[]>(items: T): NormalizeItems<T> {\n return items.map((item) =>\n item instanceof Schema ? item : new LiteralSchema(item as LiteralValue),\n ) as unknown as NormalizeItems<T>;\n}\n"],"mappings":"0DAkBA,SAAgB,EAAqD,EAA6B,CAChG,OAAO,EAAM,IAAK,GAChB,aAAgB,EAAA,OAAS,EAAO,IAAI,EAAA,cAAc,CAAoB,CACxE,CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for accepting raw literal values alongside schema instances in
|
|
3
|
+
* sUnion() and sIntersect() arguments.
|
|
4
|
+
*
|
|
5
|
+
* Moved out of literal.ts — this infrastructure belongs to the combinator
|
|
6
|
+
* entry points (s.ts), not to LiteralSchema.
|
|
7
|
+
*/
|
|
8
|
+
import type { AnySchema } from '../core';
|
|
9
|
+
import { LiteralSchema } from './literal';
|
|
10
|
+
export type LiteralValue = string | number | boolean | null | undefined;
|
|
11
|
+
export type RawOrSchema = AnySchema | LiteralValue;
|
|
12
|
+
export type NormalizeItem<T> = T extends AnySchema ? T : T extends LiteralValue ? LiteralSchema<T> : never;
|
|
13
|
+
export type NormalizeItems<T extends readonly RawOrSchema[]> = {
|
|
14
|
+
readonly [K in keyof T]: NormalizeItem<T[K]>;
|
|
15
|
+
};
|
|
16
|
+
export declare function normalizeToSchemas<T extends readonly RawOrSchema[]>(items: T): NormalizeItems<T>;
|
|
17
|
+
//# sourceMappingURL=raw-or.d.ts.map
|