@vielzeug/spell 2.1.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +2 -2
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +0 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/s.cjs.map +1 -1
- package/dist/s.d.ts +2 -2
- package/dist/s.d.ts.map +1 -1
- package/dist/s.js.map +1 -1
- package/dist/schemas/array.cjs.map +1 -1
- package/dist/schemas/array.d.ts +4 -4
- package/dist/schemas/array.d.ts.map +1 -1
- package/dist/schemas/array.js.map +1 -1
- package/dist/schemas/bigint.cjs.map +1 -1
- package/dist/schemas/bigint.d.ts +4 -4
- package/dist/schemas/bigint.d.ts.map +1 -1
- package/dist/schemas/bigint.js.map +1 -1
- package/dist/schemas/boolean.cjs.map +1 -1
- package/dist/schemas/boolean.d.ts +4 -4
- package/dist/schemas/boolean.d.ts.map +1 -1
- package/dist/schemas/boolean.js.map +1 -1
- package/dist/schemas/date.cjs.map +1 -1
- package/dist/schemas/date.d.ts +4 -4
- package/dist/schemas/date.d.ts.map +1 -1
- package/dist/schemas/date.js.map +1 -1
- package/dist/schemas/enum.cjs.map +1 -1
- package/dist/schemas/enum.d.ts +4 -4
- package/dist/schemas/enum.d.ts.map +1 -1
- package/dist/schemas/enum.js.map +1 -1
- package/dist/schemas/instanceof.cjs.map +1 -1
- package/dist/schemas/instanceof.d.ts +6 -6
- package/dist/schemas/instanceof.d.ts.map +1 -1
- package/dist/schemas/instanceof.js.map +1 -1
- package/dist/schemas/intersect.cjs.map +1 -1
- package/dist/schemas/intersect.d.ts +4 -4
- package/dist/schemas/intersect.d.ts.map +1 -1
- package/dist/schemas/intersect.js.map +1 -1
- package/dist/schemas/lazy.cjs.map +1 -1
- package/dist/schemas/lazy.d.ts +4 -4
- package/dist/schemas/lazy.d.ts.map +1 -1
- package/dist/schemas/lazy.js.map +1 -1
- package/dist/schemas/literal.cjs.map +1 -1
- package/dist/schemas/literal.d.ts +4 -4
- package/dist/schemas/literal.d.ts.map +1 -1
- package/dist/schemas/literal.js.map +1 -1
- package/dist/schemas/map.cjs.map +1 -1
- package/dist/schemas/map.d.ts +4 -4
- package/dist/schemas/map.d.ts.map +1 -1
- package/dist/schemas/map.js.map +1 -1
- package/dist/schemas/never.cjs.map +1 -1
- package/dist/schemas/never.d.ts +4 -4
- package/dist/schemas/never.d.ts.map +1 -1
- package/dist/schemas/never.js.map +1 -1
- package/dist/schemas/number.cjs.map +1 -1
- package/dist/schemas/number.d.ts +4 -4
- package/dist/schemas/number.d.ts.map +1 -1
- package/dist/schemas/number.js.map +1 -1
- package/dist/schemas/object.cjs +1 -1
- package/dist/schemas/object.cjs.map +1 -1
- package/dist/schemas/object.d.ts +7 -7
- package/dist/schemas/object.d.ts.map +1 -1
- package/dist/schemas/object.js +1 -1
- package/dist/schemas/object.js.map +1 -1
- package/dist/schemas/record.cjs +1 -1
- package/dist/schemas/record.cjs.map +1 -1
- package/dist/schemas/record.d.ts +4 -4
- package/dist/schemas/record.d.ts.map +1 -1
- package/dist/schemas/record.js +1 -1
- package/dist/schemas/record.js.map +1 -1
- package/dist/schemas/set.cjs.map +1 -1
- package/dist/schemas/set.d.ts +4 -4
- package/dist/schemas/set.d.ts.map +1 -1
- package/dist/schemas/set.js.map +1 -1
- package/dist/schemas/string.cjs +1 -1
- package/dist/schemas/string.cjs.map +1 -1
- package/dist/schemas/string.d.ts +4 -12
- package/dist/schemas/string.d.ts.map +1 -1
- package/dist/schemas/string.js +1 -1
- package/dist/schemas/string.js.map +1 -1
- package/dist/schemas/tuple.cjs.map +1 -1
- package/dist/schemas/tuple.d.ts +5 -5
- package/dist/schemas/tuple.d.ts.map +1 -1
- package/dist/schemas/tuple.js.map +1 -1
- package/dist/schemas/union.cjs.map +1 -1
- package/dist/schemas/union.d.ts +4 -4
- package/dist/schemas/union.d.ts.map +1 -1
- package/dist/schemas/union.js.map +1 -1
- package/dist/schemas/variant.cjs.map +1 -1
- package/dist/schemas/variant.d.ts +4 -4
- package/dist/schemas/variant.d.ts.map +1 -1
- package/dist/schemas/variant.js.map +1 -1
- package/dist/spell.cjs +2 -2
- package/dist/spell.cjs.map +1 -1
- package/dist/spell.iife.js +2 -2
- package/dist/spell.iife.js.map +1 -1
- package/dist/spell.js +2 -2
- package/dist/spell.js.map +1 -1
- package/package.json +2 -1
- package/dist/schemas/pipe.d.ts +0 -2
- package/dist/schemas/pipe.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intersect.cjs","names":[],"sources":["../../src/schemas/intersect.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal/guards';\n\nimport type {
|
|
1
|
+
{"version":3,"file":"intersect.cjs","names":[],"sources":["../../src/schemas/intersect.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal/guards';\n\nimport type {\n AnySchema,\n CheckContext,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateResult,\n} from '../core';\n\nimport { _makeCtx, Schema, SpellValidationError } from '../core';\nimport { cloneRecord, defineOwnProperty } from '../safe-object';\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;\n\n/**\n * Recursively merges `source` into `target`.\n * Plain objects are merged key-by-key; all other values take the `source` value.\n */\nfunction deepMerge(target: unknown, source: unknown): unknown {\n if (isPlainObject(target) && isPlainObject(source)) {\n const result = cloneRecord(target);\n\n for (const [key, val] of Object.entries(source)) {\n defineOwnProperty(result, key, deepMerge(target[key], val));\n }\n\n return result;\n }\n\n return source;\n}\n\n/** All schemas must pass — intersection semantics. */\nexport class IntersectSchema<\n T extends readonly AnySchema[],\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<T[number]>>,\n> extends Schema<UnionToIntersection<InferOutput<T[number]>>, unknown, Mode> {\n readonly schemas: T;\n\n protected override get _kind(): string {\n return 'intersect';\n }\n\n override checkAsync(\n this: IntersectSchema<T, 'sync'>,\n fn: (value: UnionToIntersection<InferOutput<T[number]>>, ctx: CheckContext) => Promise<ValidateResult>,\n ): IntersectSchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as IntersectSchema<T, 'async'>;\n }\n\n constructor(schemas: T) {\n super();\n this.schemas = Object.freeze([...schemas]) as T;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = this.schemas[i]._parseFullSync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<UnionToIntersection<InferOutput<T[number]>>> {\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 UnionToIntersection<InferOutput<T[number]>>;\n\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: prepared.value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = await this.schemas[i]._parseFullAsync(prepared.value, c);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n if (state.issues.length > 0) throw new SpellValidationError(state.issues);\n\n const validationIssues = await this._runValidatorsAsync(state.output, c);\n\n if (validationIssues.length) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(state.output) as UnionToIntersection<InferOutput<T[number]>>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), branches: this.schemas.map((s) => s.definition()), kind: 'intersect' };\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const branches = this.schemas.map((s) => s.walk(visitor));\n\n if (visitor.intersect) return visitor.intersect(this, branches);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"oIA0BA,SAAS,EAAU,EAAiB,EAA0B,CAC5D,IAAA,EAAI,EAAA,cAAA,CAAc,CAAM,IAAA,EAAK,EAAA,cAAA,CAAc,CAAM,EAAG,CAClD,IAAM,EAAS,EAAA,YAAY,CAAM,EAEjC,IAAK,GAAM,CAAC,EAAK,KAAQ,OAAO,QAAQ,CAAM,EAC5C,EAAA,kBAAkB,EAAQ,EAAK,EAAU,EAAO,GAAM,CAAG,CAAC,EAG5D,OAAO,CACT,CAEA,OAAO,CACT,CAGA,IAAa,EAAb,cAGU,EAAA,MAAmE,CAC3E,QAEA,IAAuB,OAAgB,CACrC,MAAO,WACT,CAEA,WAEE,EAC6B,CAC7B,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,YAAY,EAAY,CACtB,MAAM,EACN,KAAK,QAAU,OAAO,OAAO,CAAC,GAAG,CAAO,CAAC,CAC3C,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,KAAK,QAAQ,EAAE,CAAC,eAAe,EAAO,CAAG,EAEpD,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAM,EAAM,OAAQ,OAAQ,EAAM,OAAQ,OAAQ,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,MAAe,WAAW,EAAgB,EAA0E,CAClH,IAAM,EAAI,GAAO,EAAA,SAAS,EAE1B,OAAO,KAAK,gBAAgB,SAAY,CACtC,IAAM,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,OAAO,EAAS,MAEnC,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,EAAS,KACnB,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,MAAM,KAAK,QAAQ,EAAE,CAAC,gBAAgB,EAAS,MAAO,CAAC,EAElE,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,GAAI,EAAM,OAAO,OAAS,EAAG,MAAM,IAAI,EAAA,qBAAqB,EAAM,MAAM,EAExE,IAAM,EAAmB,MAAM,KAAK,oBAAoB,EAAM,OAAQ,CAAC,EAEvE,GAAI,EAAiB,OAAQ,MAAM,IAAI,EAAA,qBAAqB,CAAgB,EAE5E,OAAO,KAAK,mBAAmB,EAAM,MAAM,CAC7C,CAAC,CACH,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,SAAU,KAAK,QAAQ,IAAK,GAAM,EAAE,WAAW,CAAC,EAAG,KAAM,WAAY,CACzG,CAEA,MAA4B,EAAoC,CAC9D,IAAM,EAAW,KAAK,QAAQ,IAAK,GAAM,EAAE,KAAK,CAAO,CAAC,EAIxD,OAFI,EAAQ,UAAkB,EAAQ,UAAU,KAAM,CAAQ,EAEvD,MAAM,MAAM,CAAO,CAC5B,CACF"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import type { AnySchema, InferOutput, ParseContext, ParseValue, SchemaDescriptor } from '../core';
|
|
1
|
+
import type { AnySchema, CheckContext, InferOutput, InferSchemaMode, MergeSchemaModes, ParseContext, ParseValue, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';
|
|
2
2
|
import { Schema } from '../core';
|
|
3
3
|
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
4
4
|
/** All schemas must pass — intersection semantics. */
|
|
5
|
-
export declare class IntersectSchema<T extends readonly AnySchema[], Mode extends
|
|
5
|
+
export declare class IntersectSchema<T extends readonly AnySchema[], Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<T[number]>>> extends Schema<UnionToIntersection<InferOutput<T[number]>>, unknown, Mode> {
|
|
6
6
|
readonly schemas: T;
|
|
7
7
|
protected get _kind(): string;
|
|
8
|
-
checkAsync(this: IntersectSchema<T, 'sync'>, fn: (value: UnionToIntersection<InferOutput<T[number]>>, ctx:
|
|
8
|
+
checkAsync(this: IntersectSchema<T, 'sync'>, fn: (value: UnionToIntersection<InferOutput<T[number]>>, ctx: CheckContext) => Promise<ValidateResult>): IntersectSchema<T, 'async'>;
|
|
9
9
|
constructor(schemas: T);
|
|
10
10
|
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
11
11
|
parseAsync(value: unknown, ctx?: ParseContext): Promise<UnionToIntersection<InferOutput<T[number]>>>;
|
|
12
12
|
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
13
|
-
protected _walk<R>(visitor:
|
|
13
|
+
protected _walk<R>(visitor: SchemaWalker<R>): R | null;
|
|
14
14
|
}
|
|
15
15
|
export {};
|
|
16
16
|
//# sourceMappingURL=intersect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intersect.d.ts","sourceRoot":"","sources":["../../src/schemas/intersect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"intersect.d.ts","sourceRoot":"","sources":["../../src/schemas/intersect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,eAAe,EAEf,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAY,MAAM,EAAwB,MAAM,SAAS,CAAC;AAGjE,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;AAoBhH,sDAAsD;AACtD,qBAAa,eAAe,CAC1B,CAAC,SAAS,SAAS,SAAS,EAAE,EAC9B,IAAI,SAAS,UAAU,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CACtE,SAAQ,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC;IAC1E,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAEpB,cAAuB,KAAK,IAAI,MAAM,CAErC;IAEQ,UAAU,CACjB,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,EAChC,EAAE,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,cAAc,CAAC,GACrG,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC;gBAIlB,OAAO,EAAE,CAAC;cAKH,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IAuBzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;cAqChG,iBAAiB,IAAI,gBAAgB;cAIrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;CAOhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intersect.js","names":[],"sources":["../../src/schemas/intersect.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal/guards';\n\nimport type {
|
|
1
|
+
{"version":3,"file":"intersect.js","names":[],"sources":["../../src/schemas/intersect.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal/guards';\n\nimport type {\n AnySchema,\n CheckContext,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateResult,\n} from '../core';\n\nimport { _makeCtx, Schema, SpellValidationError } from '../core';\nimport { cloneRecord, defineOwnProperty } from '../safe-object';\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;\n\n/**\n * Recursively merges `source` into `target`.\n * Plain objects are merged key-by-key; all other values take the `source` value.\n */\nfunction deepMerge(target: unknown, source: unknown): unknown {\n if (isPlainObject(target) && isPlainObject(source)) {\n const result = cloneRecord(target);\n\n for (const [key, val] of Object.entries(source)) {\n defineOwnProperty(result, key, deepMerge(target[key], val));\n }\n\n return result;\n }\n\n return source;\n}\n\n/** All schemas must pass — intersection semantics. */\nexport class IntersectSchema<\n T extends readonly AnySchema[],\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<T[number]>>,\n> extends Schema<UnionToIntersection<InferOutput<T[number]>>, unknown, Mode> {\n readonly schemas: T;\n\n protected override get _kind(): string {\n return 'intersect';\n }\n\n override checkAsync(\n this: IntersectSchema<T, 'sync'>,\n fn: (value: UnionToIntersection<InferOutput<T[number]>>, ctx: CheckContext) => Promise<ValidateResult>,\n ): IntersectSchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as IntersectSchema<T, 'async'>;\n }\n\n constructor(schemas: T) {\n super();\n this.schemas = Object.freeze([...schemas]) as T;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = this.schemas[i]._parseFullSync(value, ctx);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n return { data: state.output, issues: state.issues, typeOk: state.issues.length === 0 };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<UnionToIntersection<InferOutput<T[number]>>> {\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 UnionToIntersection<InferOutput<T[number]>>;\n\n const state: { hasOutput: boolean; issues: Issue[]; output: unknown } = {\n hasOutput: false,\n issues: [],\n output: prepared.value,\n };\n\n for (let i = 0; i < this.schemas.length; i++) {\n const result = await this.schemas[i]._parseFullAsync(prepared.value, c);\n\n if (result.issues.length > 0) {\n state.issues.push(...result.issues);\n } else if (!state.hasOutput) {\n state.hasOutput = true;\n state.output = result.data;\n } else {\n state.output = deepMerge(state.output, result.data);\n }\n }\n\n if (state.issues.length > 0) throw new SpellValidationError(state.issues);\n\n const validationIssues = await this._runValidatorsAsync(state.output, c);\n\n if (validationIssues.length) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(state.output) as UnionToIntersection<InferOutput<T[number]>>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), branches: this.schemas.map((s) => s.definition()), kind: 'intersect' };\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const branches = this.schemas.map((s) => s.walk(visitor));\n\n if (visitor.intersect) return visitor.intersect(this, branches);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"sOA0BA,SAAS,EAAU,EAAiB,EAA0B,CAC5D,GAAI,EAAc,CAAM,GAAK,EAAc,CAAM,EAAG,CAClD,IAAM,EAAS,EAAY,CAAM,EAEjC,IAAK,GAAM,CAAC,EAAK,KAAQ,OAAO,QAAQ,CAAM,EAC5C,EAAkB,EAAQ,EAAK,EAAU,EAAO,GAAM,CAAG,CAAC,EAG5D,OAAO,CACT,CAEA,OAAO,CACT,CAGA,IAAa,EAAb,cAGU,CAAmE,CAC3E,QAEA,IAAuB,OAAgB,CACrC,MAAO,WACT,CAEA,WAEE,EAC6B,CAC7B,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,YAAY,EAAY,CACtB,MAAM,EACN,KAAK,QAAU,OAAO,OAAO,CAAC,GAAG,CAAO,CAAC,CAC3C,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,CACV,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,KAAK,QAAQ,EAAE,CAAC,eAAe,EAAO,CAAG,EAEpD,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,MAAO,CAAE,KAAM,EAAM,OAAQ,OAAQ,EAAM,OAAQ,OAAQ,EAAM,OAAO,SAAW,CAAE,CACvF,CAEA,MAAe,WAAW,EAAgB,EAA0E,CAClH,IAAM,EAAI,GAAO,EAAS,EAE1B,OAAO,KAAK,gBAAgB,SAAY,CACtC,IAAM,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,OAAO,EAAS,MAEnC,IAAM,EAAkE,CACtE,UAAW,GACX,OAAQ,CAAC,EACT,OAAQ,EAAS,KACnB,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,IAAK,CAC5C,IAAM,EAAS,MAAM,KAAK,QAAQ,EAAE,CAAC,gBAAgB,EAAS,MAAO,CAAC,EAElE,EAAO,OAAO,OAAS,EACzB,EAAM,OAAO,KAAK,GAAG,EAAO,MAAM,EACxB,EAAM,UAIhB,EAAM,OAAS,EAAU,EAAM,OAAQ,EAAO,IAAI,GAHlD,EAAM,UAAY,GAClB,EAAM,OAAS,EAAO,KAI1B,CAEA,GAAI,EAAM,OAAO,OAAS,EAAG,MAAM,IAAI,EAAqB,EAAM,MAAM,EAExE,IAAM,EAAmB,MAAM,KAAK,oBAAoB,EAAM,OAAQ,CAAC,EAEvE,GAAI,EAAiB,OAAQ,MAAM,IAAI,EAAqB,CAAgB,EAE5E,OAAO,KAAK,mBAAmB,EAAM,MAAM,CAC7C,CAAC,CACH,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,SAAU,KAAK,QAAQ,IAAK,GAAM,EAAE,WAAW,CAAC,EAAG,KAAM,WAAY,CACzG,CAEA,MAA4B,EAAoC,CAC9D,IAAM,EAAW,KAAK,QAAQ,IAAK,GAAM,EAAE,KAAK,CAAO,CAAC,EAIxD,OAFI,EAAQ,UAAkB,EAAQ,UAAU,KAAM,CAAQ,EAEvD,MAAM,MAAM,CAAO,CAC5B,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.cjs","names":[],"sources":["../../src/schemas/lazy.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"lazy.cjs","names":[],"sources":["../../src/schemas/lazy.ts"],"sourcesContent":["import type {\n CheckContext,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n SchemaMode,\n SchemaState,\n SchemaWalker,\n ValidateResult,\n} from '../core';\n\nimport { _makeCtx, Schema, SpellValidationError } from '../core';\n\nexport class LazySchema<T, Input = T, Mode extends SchemaMode = 'sync'> extends Schema<T, Input, Mode> {\n private readonly _getter: () => Schema<T, Input, Mode>;\n private _resolved?: Schema<T, Input, Mode>;\n\n protected override get _kind(): string {\n return 'lazy';\n }\n\n override checkAsync(\n this: LazySchema<T, Input, 'sync'>,\n fn: (value: T, ctx: CheckContext) => Promise<ValidateResult>,\n ): LazySchema<T, Input, 'async'> {\n return this._addCheck(fn, true) as unknown as LazySchema<T, Input, 'async'>;\n }\n\n constructor(getter: () => Schema<T, Input, Mode>) {\n super();\n this._getter = getter;\n }\n\n private _resolve(): Schema<T, Input, Mode> {\n const resolved = (this._resolved ??= this._getter());\n\n return resolved;\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: SchemaWalker<R>): R | null {\n if (visitor.lazy) return visitor.lazy(this);\n\n return super._walk(visitor);\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":"0DAaA,IAAa,EAAb,MAAa,UAAmE,EAAA,MAAuB,CACrG,QACA,UAEA,IAAuB,OAAgB,CACrC,MAAO,MACT,CAEA,WAEE,EAC+B,CAC/B,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,YAAY,EAAsC,CAChD,MAAM,EACN,KAAK,QAAU,CACjB,CAEA,UAA2C,CAGzC,MAAO,MAFgB,YAAc,KAAK,QAAQ,CAGpD,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,EAAA,SAAS,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,EAAA,qBAAqB,EAAO,MAAM,EAE1E,IAAM,EAAmB,MAAM,KAAK,oBAAoB,EAAO,KAAM,CAAC,EAEtE,GAAI,EAAiB,OAAS,EAAG,MAAM,IAAI,EAAA,qBAAqB,CAAgB,EAEhF,OAAO,KAAK,mBAAmB,EAAO,IAAI,CAC5C,CAAC,CACH,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,MAAO,CACjD,CAEA,MAA4B,EAAoC,CAG9D,OAFI,EAAQ,KAAa,EAAQ,KAAK,IAAI,EAEnC,MAAM,MAAM,CAAO,CAC5B,CAEA,WAA8B,EAA+B,CAE3D,IAAM,EAAO,IAAI,EAAW,KAAK,OAAO,EAIxC,MAFA,GAAK,MAAQ,EAEN,CACT,CACF"}
|
package/dist/schemas/lazy.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import type { ParseContext, ParseValue, SchemaDescriptor, SchemaState } from '../core';
|
|
1
|
+
import type { CheckContext, ParseContext, ParseValue, SchemaDescriptor, SchemaMode, SchemaState, SchemaWalker, ValidateResult } from '../core';
|
|
2
2
|
import { Schema } from '../core';
|
|
3
|
-
export declare class LazySchema<T, Input = T, Mode extends
|
|
3
|
+
export declare class LazySchema<T, Input = T, Mode extends SchemaMode = 'sync'> extends Schema<T, Input, Mode> {
|
|
4
4
|
private readonly _getter;
|
|
5
5
|
private _resolved?;
|
|
6
6
|
protected get _kind(): string;
|
|
7
|
-
checkAsync(this: LazySchema<T, Input, 'sync'>, fn: (value: T, ctx:
|
|
7
|
+
checkAsync(this: LazySchema<T, Input, 'sync'>, fn: (value: T, ctx: CheckContext) => Promise<ValidateResult>): LazySchema<T, Input, 'async'>;
|
|
8
8
|
constructor(getter: () => Schema<T, Input, Mode>);
|
|
9
9
|
private _resolve;
|
|
10
10
|
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
11
11
|
parseAsync(value: unknown, ctx?: ParseContext): Promise<T>;
|
|
12
12
|
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
13
|
-
protected _walk<R>(visitor:
|
|
13
|
+
protected _walk<R>(visitor: SchemaWalker<R>): R | null;
|
|
14
14
|
protected _construct(state: SchemaState<any>): this;
|
|
15
15
|
}
|
|
16
16
|
//# sourceMappingURL=lazy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../../src/schemas/lazy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../../src/schemas/lazy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAY,MAAM,EAAwB,MAAM,SAAS,CAAC;AAEjE,qBAAa,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,SAAS,UAAU,GAAG,MAAM,CAAE,SAAQ,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;IACpG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,SAAS,CAAC,CAAyB;IAE3C,cAAuB,KAAK,IAAI,MAAM,CAErC;IAEQ,UAAU,CACjB,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,EAClC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,cAAc,CAAC,GAC3D,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC;gBAIpB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;IAKhD,OAAO,CAAC,QAAQ;cAMG,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,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAM5C,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI;CAQ7D"}
|
package/dist/schemas/lazy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","names":[],"sources":["../../src/schemas/lazy.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"lazy.js","names":[],"sources":["../../src/schemas/lazy.ts"],"sourcesContent":["import type {\n CheckContext,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n SchemaMode,\n SchemaState,\n SchemaWalker,\n ValidateResult,\n} from '../core';\n\nimport { _makeCtx, Schema, SpellValidationError } from '../core';\n\nexport class LazySchema<T, Input = T, Mode extends SchemaMode = 'sync'> extends Schema<T, Input, Mode> {\n private readonly _getter: () => Schema<T, Input, Mode>;\n private _resolved?: Schema<T, Input, Mode>;\n\n protected override get _kind(): string {\n return 'lazy';\n }\n\n override checkAsync(\n this: LazySchema<T, Input, 'sync'>,\n fn: (value: T, ctx: CheckContext) => Promise<ValidateResult>,\n ): LazySchema<T, Input, 'async'> {\n return this._addCheck(fn, true) as unknown as LazySchema<T, Input, 'async'>;\n }\n\n constructor(getter: () => Schema<T, Input, Mode>) {\n super();\n this._getter = getter;\n }\n\n private _resolve(): Schema<T, Input, Mode> {\n const resolved = (this._resolved ??= this._getter());\n\n return resolved;\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: SchemaWalker<R>): R | null {\n if (visitor.lazy) return visitor.lazy(this);\n\n return super._walk(visitor);\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":"sGAaA,IAAa,EAAb,MAAa,UAAmE,CAAuB,CACrG,QACA,UAEA,IAAuB,OAAgB,CACrC,MAAO,MACT,CAEA,WAEE,EAC+B,CAC/B,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,YAAY,EAAsC,CAChD,MAAM,EACN,KAAK,QAAU,CACjB,CAEA,UAA2C,CAGzC,MAAO,MAFgB,YAAc,KAAK,QAAQ,CAGpD,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,EAAoC,CAG9D,OAFI,EAAQ,KAAa,EAAQ,KAAK,IAAI,EAEnC,MAAM,MAAM,CAAO,CAC5B,CAEA,WAA8B,EAA+B,CAE3D,IAAM,EAAO,IAAI,EAAW,KAAK,OAAO,EAIxC,MAFA,GAAK,MAAQ,EAEN,CACT,CACF"}
|
|
@@ -1 +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';\n\nexport class LiteralSchema<\n T extends string | number | boolean | null | undefined,\n Mode extends
|
|
1
|
+
{"version":3,"file":"literal.cjs","names":[],"sources":["../../src/schemas/literal.ts"],"sourcesContent":["import type { CheckContext, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\n\nexport class LiteralSchema<\n T extends string | number | boolean | null | undefined,\n Mode extends SchemaMode = 'sync',\n> extends Schema<T, T, Mode> {\n readonly value: T;\n\n protected override get _kind(): string {\n return 'literal';\n }\n\n override checkAsync(\n this: LiteralSchema<T, 'sync'>,\n fn: (value: T, ctx: CheckContext) => Promise<ValidateResult>,\n ): LiteralSchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as LiteralSchema<T, 'async'>;\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.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: SchemaWalker<R>): R | null {\n if (visitor.literal) return visitor.literal(this);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"yDAIA,IAAa,EAAb,cAGU,EAAA,MAAmB,CAC3B,MAEA,IAAuB,OAAgB,CACrC,MAAO,SACT,CAEA,WAEE,EAC2B,CAC3B,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,YAAY,EAAU,CACpB,OAAO,EAAK,IACV,IAAQ,EACJ,KACA,CACE,CACE,KAAM,EAAA,UAAU,gBAChB,QAAS,EAAK,SAAS,QAAQ,SAAS,CAAE,SAAU,CAAM,CAAC,EAC3D,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,EAAoC,CAG9D,OAFI,EAAQ,QAAgB,EAAQ,QAAQ,IAAI,EAEzC,MAAM,MAAM,CAAO,CAC5B,CACF"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type { SchemaDescriptor } from '../core';
|
|
1
|
+
import type { CheckContext, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';
|
|
2
2
|
import { Schema } from '../core';
|
|
3
|
-
export declare class LiteralSchema<T extends string | number | boolean | null | undefined, Mode extends
|
|
3
|
+
export declare class LiteralSchema<T extends string | number | boolean | null | undefined, Mode extends SchemaMode = 'sync'> extends Schema<T, T, Mode> {
|
|
4
4
|
readonly value: T;
|
|
5
5
|
protected get _kind(): string;
|
|
6
|
-
checkAsync(this: LiteralSchema<T, 'sync'>, fn: (value: T, ctx:
|
|
6
|
+
checkAsync(this: LiteralSchema<T, 'sync'>, fn: (value: T, ctx: CheckContext) => Promise<ValidateResult>): LiteralSchema<T, 'async'>;
|
|
7
7
|
constructor(value: T);
|
|
8
8
|
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
9
|
-
protected _walk<R>(visitor:
|
|
9
|
+
protected _walk<R>(visitor: SchemaWalker<R>): R | null;
|
|
10
10
|
}
|
|
11
11
|
//# sourceMappingURL=literal.d.ts.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/schemas/literal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAExG,OAAO,EAAa,MAAM,EAAE,MAAM,SAAS,CAAC;AAE5C,qBAAa,aAAa,CACxB,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EACtD,IAAI,SAAS,UAAU,GAAG,MAAM,CAChC,SAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAElB,cAAuB,KAAK,IAAI,MAAM,CAErC;IAEQ,UAAU,CACjB,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,EAC9B,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,cAAc,CAAC,GAC3D,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC;gBAIhB,KAAK,EAAE,CAAC;cAgBD,iBAAiB,IAAI,gBAAgB;cAIrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;CAKhE"}
|
|
@@ -1 +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';\n\nexport class LiteralSchema<\n T extends string | number | boolean | null | undefined,\n Mode extends
|
|
1
|
+
{"version":3,"file":"literal.js","names":[],"sources":["../../src/schemas/literal.ts"],"sourcesContent":["import type { CheckContext, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\n\nexport class LiteralSchema<\n T extends string | number | boolean | null | undefined,\n Mode extends SchemaMode = 'sync',\n> extends Schema<T, T, Mode> {\n readonly value: T;\n\n protected override get _kind(): string {\n return 'literal';\n }\n\n override checkAsync(\n this: LiteralSchema<T, 'sync'>,\n fn: (value: T, ctx: CheckContext) => Promise<ValidateResult>,\n ): LiteralSchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as LiteralSchema<T, 'async'>;\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.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: SchemaWalker<R>): R | null {\n if (visitor.literal) return visitor.literal(this);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"4EAIA,IAAa,EAAb,cAGU,CAAmB,CAC3B,MAEA,IAAuB,OAAgB,CACrC,MAAO,SACT,CAEA,WAEE,EAC2B,CAC3B,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,YAAY,EAAU,CACpB,OAAO,EAAK,IACV,IAAQ,EACJ,KACA,CACE,CACE,KAAM,EAAU,gBAChB,QAAS,EAAK,SAAS,QAAQ,SAAS,CAAE,SAAU,CAAM,CAAC,EAC3D,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,EAAoC,CAG9D,OAFI,EAAQ,QAAgB,EAAQ,QAAQ,IAAI,EAEzC,MAAM,MAAM,CAAO,CAC5B,CACF"}
|
package/dist/schemas/map.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.cjs","names":[],"sources":["../../src/schemas/map.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"map.cjs","names":[],"sources":["../../src/schemas/map.ts"],"sourcesContent":["import type {\n AnySchema,\n CheckContext,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateResult,\n} from '../core';\n\nimport { _makeCtx, ErrorCode, fail, prependIssuePath, resolveMessage, Schema, SpellValidationError } from '../core';\n\nexport class MapSchema<\n K extends AnySchema,\n V extends AnySchema,\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<K | V>>,\n> extends Schema<Map<InferOutput<K>, InferOutput<V>>, unknown, Mode> {\n readonly keySchema: K;\n readonly valueSchema: V;\n\n protected override get _kind(): string {\n return 'map';\n }\n\n override checkAsync(\n this: MapSchema<K, V, 'sync'>,\n fn: (value: Map<InferOutput<K>, InferOutput<V>>, ctx: CheckContext) => Promise<ValidateResult>,\n ): MapSchema<K, V, 'async'> {\n return this._addCheck(fn, true) as unknown as MapSchema<K, V, 'async'>;\n }\n\n constructor(keySchema: K, valueSchema: V) {\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<InferOutput<K>, InferOutput<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 InferOutput<K>, valResult.data as InferOutput<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<InferOutput<K>, InferOutput<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<InferOutput<K>, InferOutput<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<InferOutput<K>, InferOutput<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 InferOutput<K>, valResult.data as InferOutput<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<InferOutput<K>, InferOutput<V>>;\n });\n }\n\n min(size: number, message?: MessageFn<{ min: number; value: Map<unknown, unknown> }>): 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 ?? ctx!.messages.map.min, { min: size, value: typed }), {\n min: size,\n });\n });\n }\n\n max(size: number, message?: MessageFn<{ max: number; value: Map<unknown, unknown> }>): 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 ?? ctx!.messages.map.max, { max: size, value: typed }), {\n max: size,\n });\n });\n }\n\n size(exact: number, message?: MessageFn<{ exact: number; value: Map<unknown, unknown> }>): 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(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.map.size, { exact, value: typed }),\n { exact },\n );\n });\n }\n\n nonEmpty(message?: MessageFn<{ min: number }>): 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 ?? ctx!.messages.map.nonEmpty, { min: 1 }), { min: 1 });\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n key: this.keySchema.definition(),\n kind: 'map',\n value: this.valueSchema.definition(),\n };\n }\n\n protected override _walk<R>(visitor: 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"],"mappings":"oFAkBA,IAAa,EAAb,cAIU,EAAA,MAA2D,CACnE,UACA,YAEA,IAAuB,OAAgB,CACrC,MAAO,KACT,CAEA,WAEE,EAC0B,CAC1B,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,YAAY,EAAc,EAAgB,CACxC,MAAM,EACN,KAAK,UAAY,EACjB,KAAK,YAAc,CACrB,CAEA,OAA0B,EAAgB,EAA+B,CACvE,GAAI,EAAE,aAAiB,KACrB,MAAO,CACL,KAAM,EACN,OAAQ,CAAC,CAAE,KAAM,EAAA,UAAU,aAAc,QAAS,EAAI,SAAS,IAAI,KAAK,EAAG,KAAM,CAAC,CAAE,CAAC,EACrF,OAAQ,EACV,EAGF,IAAM,EAAM,IAAI,IACV,EAAkB,CAAC,EACrB,EAAI,EAER,IAAK,GAAM,CAAC,EAAK,KAAQ,EAAO,CAC9B,IAAM,EAAY,KAAK,UAAU,eAAe,EAAK,CAAG,EAClD,EAAY,KAAK,YAAY,eAAe,EAAK,CAAG,EAEtD,EAAU,OAAO,OAAS,GAAG,EAAO,KAAK,GAAG,EAAA,iBAAiB,EAAU,OAAQ,CAAC,CAAC,EAEjF,EAAU,OAAO,OAAS,GAAG,EAAO,KAAK,GAAG,EAAA,iBAAiB,EAAU,OAAQ,CAAC,CAAC,EAEjF,EAAU,OAAO,SAAW,GAAK,EAAU,OAAO,SAAW,GAC/D,EAAI,IAAI,EAAU,KAAwB,EAAU,IAAsB,EAE5E,GAAK,CACP,CAEA,MAAO,CAAE,KAAM,EAAK,SAAQ,OAAQ,EAAK,CAC3C,CAEA,MAAe,WAAW,EAAgB,EAAkE,CAC1G,IAAM,EAAI,GAAO,EAAA,SAAS,EAE1B,OAAO,KAAK,gBAAgB,SAAY,CACtC,IAAM,EAAW,KAAK,cAAc,CAAK,EAEzC,GAAI,EAAS,KAAM,OAAO,EAAS,MAEnC,IAAM,EAAM,EAAS,MAErB,GAAI,EAAE,aAAe,KACnB,MAAM,IAAI,EAAA,qBAAqB,CAAC,CAAE,KAAM,EAAA,UAAU,aAAc,QAAS,EAAE,SAAS,IAAI,KAAK,EAAG,KAAM,CAAC,CAAE,CAAC,CAAC,EAG7G,IAAM,EAAU,CAAC,GAAG,CAAG,EACjB,EAAU,MAAM,QAAQ,IAC5B,EAAQ,KAAK,CAAC,EAAK,KACjB,QAAQ,IAAI,CAAC,KAAK,UAAU,gBAAgB,EAAK,CAAC,EAAG,KAAK,YAAY,gBAAgB,EAAK,CAAC,CAAC,CAAC,CAChG,CACF,EAEM,EAAkB,CAAC,EACnB,EAAM,IAAI,IAEhB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CACvC,GAAM,CAAC,EAAW,GAAa,EAAQ,GAEnC,EAAU,OAAO,OAAS,GAAG,EAAO,KAAK,GAAG,EAAA,iBAAiB,EAAU,OAAQ,CAAC,CAAC,EAEjF,EAAU,OAAO,OAAS,GAAG,EAAO,KAAK,GAAG,EAAA,iBAAiB,EAAU,OAAQ,CAAC,CAAC,EAEjF,EAAU,OAAO,SAAW,GAAK,EAAU,OAAO,SAAW,GAC/D,EAAI,IAAI,EAAU,KAAwB,EAAU,IAAsB,CAC9E,CAEA,IAAM,EAAmB,MAAM,KAAK,oBAAoB,EAAK,CAAC,EACxD,EAAY,CAAC,GAAG,EAAQ,GAAG,CAAgB,EAEjD,GAAI,EAAU,OAAS,EAAG,MAAM,IAAI,EAAA,qBAAqB,CAAS,EAElE,OAAO,KAAK,mBAAmB,CAAG,CACpC,CAAC,CACH,CAEA,IAAI,EAAc,EAA0E,CAC1F,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,EAAM,MAAQ,EAAa,KAExB,EAAA,KAAK,EAAA,UAAU,UAAW,EAAA,eAAe,GAAW,EAAK,SAAS,IAAI,IAAK,CAAE,IAAK,EAAM,MAAO,CAAM,CAAC,EAAG,CAC9G,IAAK,CACP,CAAC,CACH,CAAC,CACH,CAEA,IAAI,EAAc,EAA0E,CAC1F,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,EAAM,MAAQ,EAAa,KAExB,EAAA,KAAK,EAAA,UAAU,QAAS,EAAA,eAAe,GAAW,EAAK,SAAS,IAAI,IAAK,CAAE,IAAK,EAAM,MAAO,CAAM,CAAC,EAAG,CAC5G,IAAK,CACP,CAAC,CACH,CAAC,CACH,CAEA,KAAK,EAAe,EAA4E,CAC9F,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,EAAM,OAAS,EAAc,KAE1B,EAAA,KACL,EAAA,UAAU,eACV,EAAA,eAAe,GAAW,EAAK,SAAS,IAAI,KAAM,CAAE,QAAO,MAAO,CAAM,CAAC,EACzE,CAAE,OAAM,CACV,CACF,CAAC,CACH,CAEA,SAAS,EAA4C,CACnD,OAAO,KAAK,gBAAgB,EAAO,IAG7B,EAAM,KAAO,EAAU,KAEpB,EAAA,KAAK,EAAA,UAAU,UAAW,EAAA,eAAe,GAAW,EAAK,SAAS,IAAI,SAAU,CAAE,IAAK,CAAE,CAAC,EAAG,CAAE,IAAK,CAAE,CAAC,CAC/G,CACH,CAEA,mBAAyD,CACvD,MAAO,CACL,GAAG,KAAK,cAAc,EACtB,IAAK,KAAK,UAAU,WAAW,EAC/B,KAAM,MACN,MAAO,KAAK,YAAY,WAAW,CACrC,CACF,CAEA,MAA4B,EAAoC,CAC9D,IAAM,EAAM,KAAK,UAAU,KAAK,CAAO,EACjC,EAAQ,KAAK,YAAY,KAAK,CAAO,EAI3C,OAFI,EAAQ,IAAY,EAAQ,IAAI,KAAM,EAAK,CAAK,EAE7C,MAAM,MAAM,CAAO,CAC5B,CACF"}
|
package/dist/schemas/map.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { AnySchema, InferOutput, MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';
|
|
1
|
+
import type { AnySchema, CheckContext, InferOutput, InferSchemaMode, MergeSchemaModes, MessageFn, ParseContext, ParseValue, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';
|
|
2
2
|
import { Schema } from '../core';
|
|
3
|
-
export declare class MapSchema<K extends AnySchema, V extends AnySchema, Mode extends
|
|
3
|
+
export declare class MapSchema<K extends AnySchema, V extends AnySchema, Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<K | V>>> extends Schema<Map<InferOutput<K>, InferOutput<V>>, unknown, Mode> {
|
|
4
4
|
readonly keySchema: K;
|
|
5
5
|
readonly valueSchema: V;
|
|
6
6
|
protected get _kind(): string;
|
|
7
|
-
checkAsync(this: MapSchema<K, V, 'sync'>, fn: (value: Map<InferOutput<K>, InferOutput<V>>, ctx:
|
|
7
|
+
checkAsync(this: MapSchema<K, V, 'sync'>, fn: (value: Map<InferOutput<K>, InferOutput<V>>, ctx: CheckContext) => Promise<ValidateResult>): MapSchema<K, V, 'async'>;
|
|
8
8
|
constructor(keySchema: K, valueSchema: V);
|
|
9
9
|
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
10
10
|
parseAsync(value: unknown, ctx?: ParseContext): Promise<Map<InferOutput<K>, InferOutput<V>>>;
|
|
@@ -24,6 +24,6 @@ export declare class MapSchema<K extends AnySchema, V extends AnySchema, Mode ex
|
|
|
24
24
|
min: number;
|
|
25
25
|
}>): this;
|
|
26
26
|
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
27
|
-
protected _walk<R>(visitor:
|
|
27
|
+
protected _walk<R>(visitor: SchemaWalker<R>): R | null;
|
|
28
28
|
}
|
|
29
29
|
//# sourceMappingURL=map.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/schemas/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/schemas/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,eAAe,EAEf,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,OAAO,EAA+D,MAAM,EAAwB,MAAM,SAAS,CAAC;AAEpH,qBAAa,SAAS,CACpB,CAAC,SAAS,SAAS,EACnB,CAAC,SAAS,SAAS,EACnB,IAAI,SAAS,UAAU,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAClE,SAAQ,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC;IAClE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAExB,cAAuB,KAAK,IAAI,MAAM,CAErC;IAEQ,UAAU,CACjB,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAC7B,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,cAAc,CAAC,GAC7F,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;gBAIf,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;cAMrB,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,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IA4C3G,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,GAAG,IAAI;IAY3F,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,GAAG,IAAI;IAY3F,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,GAAG,IAAI;IAc/F,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;cAUjC,iBAAiB,IAAI,gBAAgB;cASrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;CAQhE"}
|
package/dist/schemas/map.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.js","names":[],"sources":["../../src/schemas/map.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"map.js","names":[],"sources":["../../src/schemas/map.ts"],"sourcesContent":["import type {\n AnySchema,\n CheckContext,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateResult,\n} from '../core';\n\nimport { _makeCtx, ErrorCode, fail, prependIssuePath, resolveMessage, Schema, SpellValidationError } from '../core';\n\nexport class MapSchema<\n K extends AnySchema,\n V extends AnySchema,\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<K | V>>,\n> extends Schema<Map<InferOutput<K>, InferOutput<V>>, unknown, Mode> {\n readonly keySchema: K;\n readonly valueSchema: V;\n\n protected override get _kind(): string {\n return 'map';\n }\n\n override checkAsync(\n this: MapSchema<K, V, 'sync'>,\n fn: (value: Map<InferOutput<K>, InferOutput<V>>, ctx: CheckContext) => Promise<ValidateResult>,\n ): MapSchema<K, V, 'async'> {\n return this._addCheck(fn, true) as unknown as MapSchema<K, V, 'async'>;\n }\n\n constructor(keySchema: K, valueSchema: V) {\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<InferOutput<K>, InferOutput<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 InferOutput<K>, valResult.data as InferOutput<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<InferOutput<K>, InferOutput<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<InferOutput<K>, InferOutput<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<InferOutput<K>, InferOutput<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 InferOutput<K>, valResult.data as InferOutput<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<InferOutput<K>, InferOutput<V>>;\n });\n }\n\n min(size: number, message?: MessageFn<{ min: number; value: Map<unknown, unknown> }>): 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 ?? ctx!.messages.map.min, { min: size, value: typed }), {\n min: size,\n });\n });\n }\n\n max(size: number, message?: MessageFn<{ max: number; value: Map<unknown, unknown> }>): 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 ?? ctx!.messages.map.max, { max: size, value: typed }), {\n max: size,\n });\n });\n }\n\n size(exact: number, message?: MessageFn<{ exact: number; value: Map<unknown, unknown> }>): 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(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.map.size, { exact, value: typed }),\n { exact },\n );\n });\n }\n\n nonEmpty(message?: MessageFn<{ min: number }>): 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 ?? ctx!.messages.map.nonEmpty, { min: 1 }), { min: 1 });\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n key: this.keySchema.definition(),\n kind: 'map',\n value: this.valueSchema.definition(),\n };\n }\n\n protected override _walk<R>(visitor: 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"],"mappings":"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"}
|
|
@@ -1 +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';\n\nexport class NeverSchema<Mode extends
|
|
1
|
+
{"version":3,"file":"never.cjs","names":[],"sources":["../../src/schemas/never.ts"],"sourcesContent":["import type { CheckContext, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\n\nexport class NeverSchema<Mode extends SchemaMode = 'sync'> extends Schema<never, never, Mode> {\n protected override get _kind(): string {\n return 'never';\n }\n\n override checkAsync(\n this: NeverSchema<'sync'>,\n fn: (value: never, ctx: CheckContext) => Promise<ValidateResult>,\n ): NeverSchema<'async'> {\n return this._addCheck(fn, true) as unknown as NeverSchema<'async'>;\n }\n\n constructor() {\n super((_value, ctx) => [{ code: ErrorCode.invalid_type, message: ctx!.messages.never.invalid(), path: [] }]);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'never' };\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n if (visitor.never) return visitor.never(this);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"yDAIA,IAAa,EAAb,cAAmE,EAAA,MAA2B,CAC5F,IAAuB,OAAgB,CACrC,MAAO,OACT,CAEA,WAEE,EACsB,CACtB,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,aAAc,CACZ,OAAO,EAAQ,IAAQ,CAAC,CAAE,KAAM,EAAA,UAAU,aAAc,QAAS,EAAK,SAAS,MAAM,QAAQ,EAAG,KAAM,CAAC,CAAE,CAAC,CAAC,CAC7G,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,OAAQ,CAClD,CAEA,MAA4B,EAAoC,CAG9D,OAFI,EAAQ,MAAc,EAAQ,MAAM,IAAI,EAErC,MAAM,MAAM,CAAO,CAC5B,CACF"}
|
package/dist/schemas/never.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { SchemaDescriptor } from '../core';
|
|
1
|
+
import type { CheckContext, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';
|
|
2
2
|
import { Schema } from '../core';
|
|
3
|
-
export declare class NeverSchema<Mode extends
|
|
3
|
+
export declare class NeverSchema<Mode extends SchemaMode = 'sync'> extends Schema<never, never, Mode> {
|
|
4
4
|
protected get _kind(): string;
|
|
5
|
-
checkAsync(this: NeverSchema<'sync'>, fn: (value: never, ctx:
|
|
5
|
+
checkAsync(this: NeverSchema<'sync'>, fn: (value: never, ctx: CheckContext) => Promise<ValidateResult>): NeverSchema<'async'>;
|
|
6
6
|
constructor();
|
|
7
7
|
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
8
|
-
protected _walk<R>(visitor:
|
|
8
|
+
protected _walk<R>(visitor: SchemaWalker<R>): R | null;
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=never.d.ts.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"never.d.ts","sourceRoot":"","sources":["../../src/schemas/never.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAExG,OAAO,EAAa,MAAM,EAAE,MAAM,SAAS,CAAC;AAE5C,qBAAa,WAAW,CAAC,IAAI,SAAS,UAAU,GAAG,MAAM,CAAE,SAAQ,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;IAC3F,cAAuB,KAAK,IAAI,MAAM,CAErC;IAEQ,UAAU,CACjB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EACzB,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,cAAc,CAAC,GAC/D,WAAW,CAAC,OAAO,CAAC;;cAQJ,iBAAiB,IAAI,gBAAgB;cAIrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;CAKhE"}
|
|
@@ -1 +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';\n\nexport class NeverSchema<Mode extends
|
|
1
|
+
{"version":3,"file":"never.js","names":[],"sources":["../../src/schemas/never.ts"],"sourcesContent":["import type { CheckContext, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\n\nexport class NeverSchema<Mode extends SchemaMode = 'sync'> extends Schema<never, never, Mode> {\n protected override get _kind(): string {\n return 'never';\n }\n\n override checkAsync(\n this: NeverSchema<'sync'>,\n fn: (value: never, ctx: CheckContext) => Promise<ValidateResult>,\n ): NeverSchema<'async'> {\n return this._addCheck(fn, true) as unknown as NeverSchema<'async'>;\n }\n\n constructor() {\n super((_value, ctx) => [{ code: ErrorCode.invalid_type, message: ctx!.messages.never.invalid(), path: [] }]);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'never' };\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n if (visitor.never) return visitor.never(this);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"4EAIA,IAAa,EAAb,cAAmE,CAA2B,CAC5F,IAAuB,OAAgB,CACrC,MAAO,OACT,CAEA,WAEE,EACsB,CACtB,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,aAAc,CACZ,OAAO,EAAQ,IAAQ,CAAC,CAAE,KAAM,EAAU,aAAc,QAAS,EAAK,SAAS,MAAM,QAAQ,EAAG,KAAM,CAAC,CAAE,CAAC,CAAC,CAC7G,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,OAAQ,CAClD,CAEA,MAA4B,EAAoC,CAG9D,OAFI,EAAQ,MAAc,EAAQ,MAAM,IAAI,EAErC,MAAM,MAAM,CAAO,CAC5B,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.cjs","names":[],"sources":["../../src/schemas/number.ts"],"sourcesContent":["import type { MessageFn, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\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, Mode extends import('../core').SchemaMode = 'sync'> extends Schema<\n number,\n Input,\n Mode\n> {\n protected override get _kind(): string {\n return 'number';\n }\n\n override checkAsync(\n this: NumberSchema<Input, 'sync'>,\n fn: (value: number, ctx: import('../core').CheckContext) => Promise<import('../core').ValidateResult>,\n ): NumberSchema<Input, 'async'> {\n return this._addCheck(fn, true) as unknown as NumberSchema<Input, 'async'>;\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'number' && !Number.isNaN(value)\n ? null\n : fail(ErrorCode.invalid_type, ctx!.messages.number.type()),\n );\n }\n\n min(minimum: number, message?: MessageFn<{ min: number; value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) >= minimum) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.min, { min: minimum, value: value as number }),\n {\n min: minimum,\n },\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(maximum: number, message?: MessageFn<{ max: number; value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) <= maximum) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.max, { max: maximum, value: value as number }),\n {\n max: maximum,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (Number.isInteger(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_integer,\n resolveMessage(message ?? ctx!.messages.number.int, { value: value as number }),\n );\n },\n (ann) => ({ ...ann, typeHint: 'integer' as const }),\n );\n }\n\n positive(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) > 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.positive, { value: value as number }),\n {\n exclusive: true,\n min: 0,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) < 0) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.negative, { value: value as number }),\n {\n exclusive: true,\n max: 0,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) >= 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.nonNegative, { value: value as number }),\n { min: 0 },\n );\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) <= 0) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.nonPositive, { value: value as number }),\n { max: 0 },\n );\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(step: number, message?: MessageFn<{ step: number; value: number }>): 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(\n ErrorCode.invalid_multiple_of,\n resolveMessage(message ?? ctx!.messages.number.multipleOf, { step, value: value as number }),\n { step },\n );\n },\n (ann) => ({ ...ann, multipleOf: step }),\n );\n }\n\n safe(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint((value, ctx) => {\n if (Number.isSafeInteger(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_safe,\n resolveMessage(message ?? ctx!.messages.number.safe, { value: value as number }),\n );\n });\n }\n\n finite(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint((value, ctx) => {\n if (Number.isFinite(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_finite,\n resolveMessage(message ?? ctx!.messages.number.finite, { value: value as number }),\n );\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 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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"}
|
|
1
|
+
{"version":3,"file":"number.cjs","names":[],"sources":["../../src/schemas/number.ts"],"sourcesContent":["import type { CheckContext, MessageFn, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';\n\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\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, Mode extends SchemaMode = 'sync'> extends Schema<number, Input, Mode> {\n protected override get _kind(): string {\n return 'number';\n }\n\n override checkAsync(\n this: NumberSchema<Input, 'sync'>,\n fn: (value: number, ctx: CheckContext) => Promise<ValidateResult>,\n ): NumberSchema<Input, 'async'> {\n return this._addCheck(fn, true) as unknown as NumberSchema<Input, 'async'>;\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'number' && !Number.isNaN(value)\n ? null\n : fail(ErrorCode.invalid_type, ctx!.messages.number.type()),\n );\n }\n\n min(minimum: number, message?: MessageFn<{ min: number; value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) >= minimum) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.min, { min: minimum, value: value as number }),\n {\n min: minimum,\n },\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(maximum: number, message?: MessageFn<{ max: number; value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) <= maximum) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.max, { max: maximum, value: value as number }),\n {\n max: maximum,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (Number.isInteger(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_integer,\n resolveMessage(message ?? ctx!.messages.number.int, { value: value as number }),\n );\n },\n (ann) => ({ ...ann, typeHint: 'integer' as const }),\n );\n }\n\n positive(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) > 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.positive, { value: value as number }),\n {\n exclusive: true,\n min: 0,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) < 0) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.negative, { value: value as number }),\n {\n exclusive: true,\n max: 0,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) >= 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.nonNegative, { value: value as number }),\n { min: 0 },\n );\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) <= 0) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.nonPositive, { value: value as number }),\n { max: 0 },\n );\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(step: number, message?: MessageFn<{ step: number; value: number }>): 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(\n ErrorCode.invalid_multiple_of,\n resolveMessage(message ?? ctx!.messages.number.multipleOf, { step, value: value as number }),\n { step },\n );\n },\n (ann) => ({ ...ann, multipleOf: step }),\n );\n }\n\n safe(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint((value, ctx) => {\n if (Number.isSafeInteger(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_safe,\n resolveMessage(message ?? ctx!.messages.number.safe, { value: value as number }),\n );\n });\n }\n\n finite(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint((value, ctx) => {\n if (Number.isFinite(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_finite,\n resolveMessage(message ?? ctx!.messages.number.finite, { value: value as number }),\n );\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: 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 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":"oFAeA,IAAa,EAAb,MAAa,UAAuE,EAAA,MAA4B,CAC9G,IAAuB,OAAgB,CACrC,MAAO,QACT,CAEA,WAEE,EAC8B,CAC9B,OAAO,KAAK,UAAU,EAAI,EAAI,CAChC,CAEA,aAAc,CACZ,OAAO,EAAO,IACZ,OAAO,GAAU,UAAY,CAAC,OAAO,MAAM,CAAK,EAC5C,KACA,EAAA,KAAK,EAAA,UAAU,aAAc,EAAK,SAAS,OAAO,KAAK,CAAC,CAC9D,CACF,CAEA,IAAI,EAAiB,EAA2D,CAC9E,OAAO,KAAK,gBACT,EAAO,IACD,GAAoB,EAAgB,KAElC,EAAA,KACL,EAAA,UAAU,UACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,IAAK,CAAE,IAAK,EAAgB,OAAgB,CAAC,EAC5F,CACE,IAAK,CACP,CACF,EAED,GAAY,CACX,IAAM,EAAM,EAEZ,MAAO,CACL,GAAG,EACH,QAAS,EAAI,UAAY,IAAA,GAAY,EAAU,KAAK,IAAI,EAAI,QAAS,CAAO,CAC9E,CACF,CACF,CACF,CAEA,IAAI,EAAiB,EAA2D,CAC9E,OAAO,KAAK,gBACT,EAAO,IACD,GAAoB,EAAgB,KAElC,EAAA,KACL,EAAA,UAAU,QACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,IAAK,CAAE,IAAK,EAAgB,OAAgB,CAAC,EAC5F,CACE,IAAK,CACP,CACF,EAED,GAAY,CACX,IAAM,EAAM,EAEZ,MAAO,CACL,GAAG,EACH,QAAS,EAAI,UAAY,IAAA,GAAY,EAAU,KAAK,IAAI,EAAI,QAAS,CAAO,CAC9E,CACF,CACF,CACF,CAEA,IAAI,EAA8C,CAChD,OAAO,KAAK,gBACT,EAAO,IACF,OAAO,UAAU,CAAe,EAAU,KAEvC,EAAA,KACL,EAAA,UAAU,gBACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,IAAK,CAAS,OAAgB,CAAC,CAChF,EAED,IAAS,CAAE,GAAG,EAAK,SAAU,SAAmB,EACnD,CACF,CAEA,SAAS,EAA8C,CACrD,OAAO,KAAK,gBACT,EAAO,IACD,EAAmB,EAAU,KAE3B,EAAA,KACL,EAAA,UAAU,UACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,SAAU,CAAS,OAAgB,CAAC,EACnF,CACE,UAAW,GACX,IAAK,CACP,CACF,EAED,GAAY,CACX,IAAM,EAAM,EAEZ,MAAO,CACL,GAAG,EACH,iBAAkB,EAAI,mBAAqB,IAAA,GAAY,EAAI,KAAK,IAAI,EAAI,iBAAkB,CAAC,CAC7F,CACF,CACF,CACF,CAEA,SAAS,EAA8C,CACrD,OAAO,KAAK,gBACT,EAAO,IACD,EAAmB,EAAU,KAE3B,EAAA,KACL,EAAA,UAAU,QACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,SAAU,CAAS,OAAgB,CAAC,EACnF,CACE,UAAW,GACX,IAAK,CACP,CACF,EAED,GAAY,CACX,IAAM,EAAM,EAEZ,MAAO,CACL,GAAG,EACH,iBAAkB,EAAI,mBAAqB,IAAA,GAAY,EAAI,KAAK,IAAI,EAAI,iBAAkB,CAAC,CAC7F,CACF,CACF,CACF,CAEA,YAAY,EAA8C,CACxD,OAAO,KAAK,gBACT,EAAO,IACD,GAAoB,EAAU,KAE5B,EAAA,KACL,EAAA,UAAU,UACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,YAAa,CAAS,OAAgB,CAAC,EACtF,CAAE,IAAK,CAAE,CACX,EAED,GAAY,CACX,IAAM,EAAM,EAEZ,MAAO,CAAE,GAAG,EAAK,QAAS,EAAI,UAAY,IAAA,GAAY,EAAI,KAAK,IAAI,EAAI,QAAS,CAAC,CAAE,CACrF,CACF,CACF,CAEA,YAAY,EAA8C,CACxD,OAAO,KAAK,gBACT,EAAO,IACD,GAAoB,EAAU,KAE5B,EAAA,KACL,EAAA,UAAU,QACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,YAAa,CAAS,OAAgB,CAAC,EACtF,CAAE,IAAK,CAAE,CACX,EAED,GAAY,CACX,IAAM,EAAM,EAEZ,MAAO,CAAE,GAAG,EAAK,QAAS,EAAI,UAAY,IAAA,GAAY,EAAI,KAAK,IAAI,EAAI,QAAS,CAAC,CAAE,CACrF,CACF,CACF,CAEA,WAAW,EAAc,EAA4D,CACnF,OAAO,KAAK,gBACT,EAAO,IACF,KAAK,IAAI,KAAK,MAAO,EAAmB,CAAI,EAAK,EAAmB,CAAI,EAAI,KAAa,KAEtF,EAAA,KACL,EAAA,UAAU,oBACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,WAAY,CAAE,OAAa,OAAgB,CAAC,EAC3F,CAAE,MAAK,CACT,EAED,IAAS,CAAE,GAAG,EAAK,WAAY,CAAK,EACvC,CACF,CAEA,KAAK,EAA8C,CACjD,OAAO,KAAK,gBAAgB,EAAO,IAC7B,OAAO,cAAc,CAAe,EAAU,KAE3C,EAAA,KACL,EAAA,UAAU,aACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,KAAM,CAAS,OAAgB,CAAC,CACjF,CACD,CACH,CAEA,OAAO,EAA8C,CACnD,OAAO,KAAK,gBAAgB,EAAO,IAC7B,OAAO,SAAS,CAAe,EAAU,KAEtC,EAAA,KACL,EAAA,UAAU,eACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,OAAQ,CAAS,OAAgB,CAAC,CACnF,CACD,CACH,CAOA,QAAgC,CAC9B,OAAO,EAAa,OAAO,CAC7B,CAEA,MAA4B,EAAoC,CAG9D,OAFI,EAAQ,OAAe,EAAQ,OAAO,IAAI,EAEvC,MAAM,MAAM,CAAO,CAC5B,CAEA,mBAAyD,CACvD,IAAM,EAAM,KAAK,aAEjB,MAAO,CACL,GAAG,KAAK,cAAc,EACtB,GAAI,EAAI,mBAAqB,IAAA,GAAyD,CAAC,EAA9C,CAAE,iBAAkB,EAAI,gBAAiB,EAClF,GAAI,EAAI,mBAAqB,IAAA,GAAyD,CAAC,EAA9C,CAAE,iBAAkB,EAAI,gBAAiB,EAClF,GAAI,EAAI,UAAY,IAAA,GAAuC,CAAC,EAA5B,CAAE,QAAS,EAAI,OAAQ,EACvD,GAAI,EAAI,UAAY,IAAA,GAAuC,CAAC,EAA5B,CAAE,QAAS,EAAI,OAAQ,EACvD,GAAI,EAAI,aAAe,IAAA,GAA6C,CAAC,EAAlC,CAAE,WAAY,EAAI,UAAW,EAChE,GAAI,EAAI,WAAa,IAAA,GAAyC,CAAC,EAA9B,CAAE,SAAU,EAAI,QAAS,EAC1D,KAAM,QACR,CACF,CAEA,OAAO,QAAgC,CACrC,OAAO,IAAI,EAAa,CAAC,CAAC,WAAY,GAAe,CACnD,GAAI,OAAO,GAAM,SAAU,OAAO,EAElC,GAAI,OAAO,GAAM,UAAY,OAAO,GAAM,UAAW,CACnD,IAAM,EAAI,OAAO,CAAC,EAElB,OAAO,OAAO,MAAM,CAAC,EAAI,EAAI,CAC/B,CAEA,OAAO,CACT,CAAC,CACH,CACF"}
|
package/dist/schemas/number.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { MessageFn, SchemaDescriptor } from '../core';
|
|
1
|
+
import type { CheckContext, MessageFn, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';
|
|
2
2
|
import { Schema } from '../core';
|
|
3
|
-
export declare class NumberSchema<Input = number, Mode extends
|
|
3
|
+
export declare class NumberSchema<Input = number, Mode extends SchemaMode = 'sync'> extends Schema<number, Input, Mode> {
|
|
4
4
|
protected get _kind(): string;
|
|
5
|
-
checkAsync(this: NumberSchema<Input, 'sync'>, fn: (value: number, ctx:
|
|
5
|
+
checkAsync(this: NumberSchema<Input, 'sync'>, fn: (value: number, ctx: CheckContext) => Promise<ValidateResult>): NumberSchema<Input, 'async'>;
|
|
6
6
|
constructor();
|
|
7
7
|
min(minimum: number, message?: MessageFn<{
|
|
8
8
|
min: number;
|
|
@@ -43,7 +43,7 @@ export declare class NumberSchema<Input = number, Mode extends import('../core')
|
|
|
43
43
|
* Equivalent to `s.coerce.number()`.
|
|
44
44
|
*/
|
|
45
45
|
coerce(): NumberSchema<unknown>;
|
|
46
|
-
protected _walk<R>(visitor:
|
|
46
|
+
protected _walk<R>(visitor: SchemaWalker<R>): R | null;
|
|
47
47
|
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
48
48
|
static coerce(): NumberSchema<unknown>;
|
|
49
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/schemas/number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/schemas/number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEnH,OAAO,EAAmC,MAAM,EAAE,MAAM,SAAS,CAAC;AAalE,qBAAa,YAAY,CAAC,KAAK,GAAG,MAAM,EAAE,IAAI,SAAS,UAAU,GAAG,MAAM,CAAE,SAAQ,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;IAC7G,cAAuB,KAAK,IAAI,MAAM,CAErC;IAEQ,UAAU,CACjB,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,EACjC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,cAAc,CAAC,GAChE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;;IAY/B,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAwB/E,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAwB/E,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAcjD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAyBtD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAyBtD,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAmBzD,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAmBzD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAepF,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAWlD,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAWpD;;;;OAIG;IACH,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC;cAIZ,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAM5C,iBAAiB,IAAI,gBAAgB;IAexD,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC;CAavC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","names":[],"sources":["../../src/schemas/number.ts"],"sourcesContent":["import type { MessageFn, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\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, Mode extends import('../core').SchemaMode = 'sync'> extends Schema<\n number,\n Input,\n Mode\n> {\n protected override get _kind(): string {\n return 'number';\n }\n\n override checkAsync(\n this: NumberSchema<Input, 'sync'>,\n fn: (value: number, ctx: import('../core').CheckContext) => Promise<import('../core').ValidateResult>,\n ): NumberSchema<Input, 'async'> {\n return this._addCheck(fn, true) as unknown as NumberSchema<Input, 'async'>;\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'number' && !Number.isNaN(value)\n ? null\n : fail(ErrorCode.invalid_type, ctx!.messages.number.type()),\n );\n }\n\n min(minimum: number, message?: MessageFn<{ min: number; value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) >= minimum) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.min, { min: minimum, value: value as number }),\n {\n min: minimum,\n },\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(maximum: number, message?: MessageFn<{ max: number; value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) <= maximum) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.max, { max: maximum, value: value as number }),\n {\n max: maximum,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (Number.isInteger(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_integer,\n resolveMessage(message ?? ctx!.messages.number.int, { value: value as number }),\n );\n },\n (ann) => ({ ...ann, typeHint: 'integer' as const }),\n );\n }\n\n positive(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) > 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.positive, { value: value as number }),\n {\n exclusive: true,\n min: 0,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) < 0) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.negative, { value: value as number }),\n {\n exclusive: true,\n max: 0,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) >= 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.nonNegative, { value: value as number }),\n { min: 0 },\n );\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) <= 0) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.nonPositive, { value: value as number }),\n { max: 0 },\n );\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(step: number, message?: MessageFn<{ step: number; value: number }>): 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(\n ErrorCode.invalid_multiple_of,\n resolveMessage(message ?? ctx!.messages.number.multipleOf, { step, value: value as number }),\n { step },\n );\n },\n (ann) => ({ ...ann, multipleOf: step }),\n );\n }\n\n safe(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint((value, ctx) => {\n if (Number.isSafeInteger(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_safe,\n resolveMessage(message ?? ctx!.messages.number.safe, { value: value as number }),\n );\n });\n }\n\n finite(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint((value, ctx) => {\n if (Number.isFinite(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_finite,\n resolveMessage(message ?? ctx!.messages.number.finite, { value: value as number }),\n );\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 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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"}
|
|
1
|
+
{"version":3,"file":"number.js","names":[],"sources":["../../src/schemas/number.ts"],"sourcesContent":["import type { CheckContext, MessageFn, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';\n\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\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, Mode extends SchemaMode = 'sync'> extends Schema<number, Input, Mode> {\n protected override get _kind(): string {\n return 'number';\n }\n\n override checkAsync(\n this: NumberSchema<Input, 'sync'>,\n fn: (value: number, ctx: CheckContext) => Promise<ValidateResult>,\n ): NumberSchema<Input, 'async'> {\n return this._addCheck(fn, true) as unknown as NumberSchema<Input, 'async'>;\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'number' && !Number.isNaN(value)\n ? null\n : fail(ErrorCode.invalid_type, ctx!.messages.number.type()),\n );\n }\n\n min(minimum: number, message?: MessageFn<{ min: number; value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) >= minimum) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.min, { min: minimum, value: value as number }),\n {\n min: minimum,\n },\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(maximum: number, message?: MessageFn<{ max: number; value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) <= maximum) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.max, { max: maximum, value: value as number }),\n {\n max: maximum,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (Number.isInteger(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_integer,\n resolveMessage(message ?? ctx!.messages.number.int, { value: value as number }),\n );\n },\n (ann) => ({ ...ann, typeHint: 'integer' as const }),\n );\n }\n\n positive(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) > 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.positive, { value: value as number }),\n {\n exclusive: true,\n min: 0,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) < 0) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.negative, { value: value as number }),\n {\n exclusive: true,\n max: 0,\n },\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) >= 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.number.nonNegative, { value: value as number }),\n { min: 0 },\n );\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 }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as number) <= 0) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.number.nonPositive, { value: value as number }),\n { max: 0 },\n );\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(step: number, message?: MessageFn<{ step: number; value: number }>): 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(\n ErrorCode.invalid_multiple_of,\n resolveMessage(message ?? ctx!.messages.number.multipleOf, { step, value: value as number }),\n { step },\n );\n },\n (ann) => ({ ...ann, multipleOf: step }),\n );\n }\n\n safe(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint((value, ctx) => {\n if (Number.isSafeInteger(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_safe,\n resolveMessage(message ?? ctx!.messages.number.safe, { value: value as number }),\n );\n });\n }\n\n finite(message?: MessageFn<{ value: number }>): this {\n return this._addConstraint((value, ctx) => {\n if (Number.isFinite(value as number)) return null;\n\n return fail(\n ErrorCode.invalid_finite,\n resolveMessage(message ?? ctx!.messages.number.finite, { value: value as number }),\n );\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: 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 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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"}
|