@vielzeug/spell 3.1.2 → 26.10.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 +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +24 -24
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +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.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/s.cjs +1 -1
- package/dist/s.cjs.map +1 -1
- package/dist/s.d.ts +7 -4
- package/dist/s.d.ts.map +1 -1
- package/dist/s.js +1 -1
- package/dist/s.js.map +1 -1
- package/dist/schemas/array.cjs +1 -1
- package/dist/schemas/array.cjs.map +1 -1
- package/dist/schemas/array.d.ts +3 -5
- package/dist/schemas/array.d.ts.map +1 -1
- package/dist/schemas/array.js +1 -1
- package/dist/schemas/array.js.map +1 -1
- package/dist/schemas/bigint.cjs +1 -1
- package/dist/schemas/bigint.cjs.map +1 -1
- package/dist/schemas/bigint.d.ts +2 -4
- package/dist/schemas/bigint.d.ts.map +1 -1
- package/dist/schemas/bigint.js +1 -1
- package/dist/schemas/bigint.js.map +1 -1
- package/dist/schemas/boolean.cjs +1 -1
- package/dist/schemas/boolean.cjs.map +1 -1
- package/dist/schemas/boolean.d.ts +2 -4
- package/dist/schemas/boolean.d.ts.map +1 -1
- package/dist/schemas/boolean.js +1 -1
- package/dist/schemas/boolean.js.map +1 -1
- package/dist/schemas/date.cjs +1 -1
- package/dist/schemas/date.cjs.map +1 -1
- package/dist/schemas/date.d.ts +2 -4
- package/dist/schemas/date.d.ts.map +1 -1
- package/dist/schemas/date.js +1 -1
- package/dist/schemas/date.js.map +1 -1
- package/dist/schemas/enum.cjs +1 -1
- package/dist/schemas/enum.cjs.map +1 -1
- package/dist/schemas/enum.d.ts +2 -4
- package/dist/schemas/enum.d.ts.map +1 -1
- package/dist/schemas/enum.js +1 -1
- package/dist/schemas/enum.js.map +1 -1
- package/dist/schemas/instanceof.cjs +1 -1
- package/dist/schemas/instanceof.cjs.map +1 -1
- package/dist/schemas/instanceof.d.ts +2 -4
- package/dist/schemas/instanceof.d.ts.map +1 -1
- package/dist/schemas/instanceof.js +1 -1
- package/dist/schemas/instanceof.js.map +1 -1
- package/dist/schemas/intersect.cjs +1 -1
- package/dist/schemas/intersect.cjs.map +1 -1
- package/dist/schemas/intersect.d.ts +3 -5
- package/dist/schemas/intersect.d.ts.map +1 -1
- package/dist/schemas/intersect.js +1 -1
- package/dist/schemas/intersect.js.map +1 -1
- package/dist/schemas/lazy.cjs +1 -1
- package/dist/schemas/lazy.cjs.map +1 -1
- package/dist/schemas/lazy.d.ts +4 -6
- package/dist/schemas/lazy.d.ts.map +1 -1
- package/dist/schemas/lazy.js +1 -1
- package/dist/schemas/lazy.js.map +1 -1
- package/dist/schemas/literal.cjs +1 -1
- package/dist/schemas/literal.cjs.map +1 -1
- package/dist/schemas/literal.d.ts +2 -4
- package/dist/schemas/literal.d.ts.map +1 -1
- package/dist/schemas/literal.js +1 -1
- package/dist/schemas/literal.js.map +1 -1
- package/dist/schemas/map.cjs +1 -1
- package/dist/schemas/map.cjs.map +1 -1
- package/dist/schemas/map.d.ts +3 -5
- package/dist/schemas/map.d.ts.map +1 -1
- package/dist/schemas/map.js +1 -1
- package/dist/schemas/map.js.map +1 -1
- package/dist/schemas/never.cjs +1 -1
- package/dist/schemas/never.cjs.map +1 -1
- package/dist/schemas/never.d.ts +2 -4
- package/dist/schemas/never.d.ts.map +1 -1
- package/dist/schemas/never.js +1 -1
- package/dist/schemas/never.js.map +1 -1
- package/dist/schemas/number.cjs +1 -1
- package/dist/schemas/number.cjs.map +1 -1
- package/dist/schemas/number.d.ts +2 -4
- package/dist/schemas/number.d.ts.map +1 -1
- package/dist/schemas/number.js +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 +19 -21
- 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 +3 -5
- 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 +1 -1
- package/dist/schemas/set.cjs.map +1 -1
- package/dist/schemas/set.d.ts +3 -5
- package/dist/schemas/set.d.ts.map +1 -1
- package/dist/schemas/set.js +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 +2 -4
- 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 +1 -1
- package/dist/schemas/tuple.cjs.map +1 -1
- package/dist/schemas/tuple.d.ts +4 -6
- package/dist/schemas/tuple.d.ts.map +1 -1
- package/dist/schemas/tuple.js +1 -1
- package/dist/schemas/tuple.js.map +1 -1
- package/dist/schemas/union.cjs +1 -1
- package/dist/schemas/union.cjs.map +1 -1
- package/dist/schemas/union.d.ts +4 -6
- package/dist/schemas/union.d.ts.map +1 -1
- package/dist/schemas/union.js +1 -1
- package/dist/schemas/union.js.map +1 -1
- package/dist/schemas/variant.cjs +1 -1
- package/dist/schemas/variant.cjs.map +1 -1
- package/dist/schemas/variant.d.ts +4 -6
- package/dist/schemas/variant.d.ts.map +1 -1
- package/dist/schemas/variant.js +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/dist/tolerate.cjs +2 -0
- package/dist/tolerate.cjs.map +1 -0
- package/dist/tolerate.d.ts +10 -0
- package/dist/tolerate.d.ts.map +1 -0
- package/dist/tolerate.js +2 -0
- package/dist/tolerate.js.map +1 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.ts +9 -52
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +5 -5
package/dist/schemas/object.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AcceptsMissing, AnySchema,
|
|
1
|
+
import type { AcceptsMissing, AnySchema, InferInput, InferOutput, ParseContext, ParseValue, SchemaDescriptor } from '../core';
|
|
2
2
|
import { Schema } from '../core';
|
|
3
3
|
import { LiteralSchema } from './literal';
|
|
4
4
|
import { UnionSchema } from './union';
|
|
@@ -17,11 +17,10 @@ export type InferObjectInput<T extends ObjectShape> = Simplify<{
|
|
|
17
17
|
} & {
|
|
18
18
|
[K in OptionalInputKeys<T>]?: InferInput<T[K]>;
|
|
19
19
|
}>;
|
|
20
|
-
export declare class ObjectSchema<T extends ObjectShape
|
|
20
|
+
export declare class ObjectSchema<T extends ObjectShape> extends Schema<InferObject<T>, InferObjectInput<T>> {
|
|
21
21
|
readonly shape: T;
|
|
22
22
|
private readonly _isRelaxed;
|
|
23
23
|
protected get _kind(): string;
|
|
24
|
-
checkAsync(this: ObjectSchema<T, 'sync'>, fn: (value: InferObject<T>, ctx: CheckContext) => Promise<ValidateResult>): ObjectSchema<T, 'async'>;
|
|
25
24
|
constructor(shape: T, isRelaxed?: boolean);
|
|
26
25
|
private _unknownKeys;
|
|
27
26
|
private _strictUnknownKeyIssues;
|
|
@@ -30,20 +29,20 @@ export declare class ObjectSchema<T extends ObjectShape, Mode extends SchemaMode
|
|
|
30
29
|
private _createObjectParseContext;
|
|
31
30
|
private _rebuildWith;
|
|
32
31
|
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
33
|
-
|
|
32
|
+
protected _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue>;
|
|
34
33
|
partial(): ObjectSchema<{
|
|
35
|
-
[K in keyof T]: Schema<InferOutput<T[K]> | undefined, InferInput<T[K]> | undefined
|
|
36
|
-
}
|
|
34
|
+
[K in keyof T]: Schema<InferOutput<T[K]> | undefined, InferInput<T[K]> | undefined> & AcceptsMissing;
|
|
35
|
+
}>;
|
|
37
36
|
partial<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K> & {
|
|
38
|
-
[P in K]: Schema<InferOutput<T[P]> | undefined, InferInput<T[P]> | undefined
|
|
39
|
-
}
|
|
40
|
-
optional(): ObjectSchema<T
|
|
41
|
-
nullable(): ObjectSchema<T
|
|
42
|
-
nullish(): ObjectSchema<T
|
|
43
|
-
required(): ObjectSchema<T
|
|
44
|
-
extend<U extends ObjectShape>(extra: U): ObjectSchema<Omit<T, keyof U> & U
|
|
45
|
-
pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K
|
|
46
|
-
omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K
|
|
37
|
+
[P in K]: Schema<InferOutput<T[P]> | undefined, InferInput<T[P]> | undefined> & AcceptsMissing;
|
|
38
|
+
}>;
|
|
39
|
+
optional(): ObjectSchema<T> & Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> & AcceptsMissing;
|
|
40
|
+
nullable(): ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null>;
|
|
41
|
+
nullish(): ObjectSchema<T> & Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> & AcceptsMissing;
|
|
42
|
+
required(): ObjectSchema<T> & Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>>;
|
|
43
|
+
extend<U extends ObjectShape>(extra: U): ObjectSchema<Omit<T, keyof U> & U>;
|
|
44
|
+
pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>>;
|
|
45
|
+
omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>>;
|
|
47
46
|
/**
|
|
48
47
|
* Returns a fully default-filled object by parsing `{}` against this schema.
|
|
49
48
|
* Every required field must have a `.default()` value set; if any required
|
|
@@ -53,7 +52,7 @@ export declare class ObjectSchema<T extends ObjectShape, Mode extends SchemaMode
|
|
|
53
52
|
* const Config = s.object({ host: s.string().default('localhost'), port: s.number().default(3000) });
|
|
54
53
|
* Config.defaults(); // { host: 'localhost', port: 3000 }
|
|
55
54
|
*/
|
|
56
|
-
defaults(
|
|
55
|
+
defaults(): InferObject<T>;
|
|
57
56
|
/**
|
|
58
57
|
* Returns a partial object containing only the fields that have a default value set.
|
|
59
58
|
* Fields without a `.default()` or `.catch()` are silently omitted rather than throwing.
|
|
@@ -64,7 +63,7 @@ export declare class ObjectSchema<T extends ObjectShape, Mode extends SchemaMode
|
|
|
64
63
|
* const Form = s.object({ name: s.string(), role: s.string().default('viewer') });
|
|
65
64
|
* Form.partialDefaults(); // { role: 'viewer' } — name is omitted
|
|
66
65
|
*/
|
|
67
|
-
partialDefaults(
|
|
66
|
+
partialDefaults(): Partial<InferObject<T>>;
|
|
68
67
|
/**
|
|
69
68
|
* Returns an array of field keys that are **required** (not optional and not nullish).
|
|
70
69
|
*
|
|
@@ -88,12 +87,12 @@ export declare class ObjectSchema<T extends ObjectShape, Mode extends SchemaMode
|
|
|
88
87
|
* Returns `ObjectSchema<T>` so fluent methods like `.pick()`, `.omit()`,
|
|
89
88
|
* `.extend()`, and `.partial()` remain usable after calling `.relaxed()`.
|
|
90
89
|
*/
|
|
91
|
-
relaxed(): ObjectSchema<T
|
|
90
|
+
relaxed(): ObjectSchema<T>;
|
|
92
91
|
/**
|
|
93
92
|
* Alias for the default strict mode — rejects unknown keys.
|
|
94
93
|
* Useful after calling `.relaxed()` to return a new strict schema.
|
|
95
94
|
*/
|
|
96
|
-
strict(): ObjectSchema<T
|
|
95
|
+
strict(): ObjectSchema<T>;
|
|
97
96
|
/**
|
|
98
97
|
* Returns a union schema of the object's key names as literal schemas.
|
|
99
98
|
*
|
|
@@ -103,8 +102,7 @@ export declare class ObjectSchema<T extends ObjectShape, Mode extends SchemaMode
|
|
|
103
102
|
*/
|
|
104
103
|
keyof(): UnionSchema<readonly [LiteralSchema<keyof T & string>, ...LiteralSchema<keyof T & string>[]]>;
|
|
105
104
|
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
106
|
-
|
|
107
|
-
merge<U extends ObjectShape, OtherMode extends SchemaMode>(other: ObjectSchema<U, OtherMode>): ObjectSchema<T & U, MergeSchemaModes<Mode | OtherMode>>;
|
|
105
|
+
merge<U extends ObjectShape>(other: ObjectSchema<U>): ObjectSchema<T & U>;
|
|
108
106
|
}
|
|
109
107
|
export {};
|
|
110
108
|
//# sourceMappingURL=object.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/schemas/object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/schemas/object.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas/object.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{prependIssuePath as e}from"../errors.js";import{defineOwnProperty as t,isUnsafeObjectKey as n,objectFromEntries as r}from"../safe-object.js";import{ErrorCode as i}from"../types.js";import{Schema as a}from"../core.js";import{LiteralSchema as o}from"./literal.js";import{UnionSchema as s}from"./union.js";var c=class c extends a{shape;_isRelaxed;get _kind(){return`object`}constructor(e,t=!1){super(),this.shape=Object.freeze(r(Object.entries(e))),this._isRelaxed=t}_unknownKeys(e){return Object.keys(e).filter(e=>!Object.hasOwn(this.shape,e))}_strictUnknownKeyIssues(e,t){if(this._isRelaxed)return[];let n=this._unknownKeys(e);return n.length===0?[]:[{code:i.invalid_keys,message:t.messages.object.invalidKeys({keys:n}),params:{keys:n},path:[]}]}_copyRelaxedUnknownKeys(e,r){if(this._isRelaxed)for(let i of this._unknownKeys(e))n(i)||t(r,i,e[i])}_guardObjectInput(e,t){return typeof e!=`object`||!e||Array.isArray(e)?{issues:[{code:i.invalid_type,message:t.messages.object.type(),path:[]}],ok:!1}:{obj:e,ok:!0}}_createObjectParseContext(e,t){return{issues:[...this._strictUnknownKeyIssues(e,t)],output:{}}}_rebuildWith(e,t=this._isRelaxed){return this._copyStateTo(new c(e,t))}_parse(n,r){let i=this._guardObjectInput(n,r);if(!i.ok)return{data:n,issues:i.issues,typeOk:!1};let{obj:a}=i,{issues:o,output:s}=this._createObjectParseContext(a,r);for(let n of Object.keys(this.shape)){let i=this.shape[n]._parseFullSync(a[n],r);i.issues.length===0?t(s,n,i.data):o.push(...e(i.issues,n))}return this._copyRelaxedUnknownKeys(a,s),{data:s,issues:o,typeOk:!0}}async _parseAsync(n,r){let i=this._guardObjectInput(n,r);if(!i.ok)return{data:n,issues:i.issues,typeOk:!1};let{obj:a}=i,{issues:o,output:s}=this._createObjectParseContext(a,r),c=Object.keys(this.shape),l=await Promise.all(c.map(e=>this.shape[e]._parseFullAsync(a[e],r)));for(let n=0;n<c.length;n++){let r=c[n],i=l[n];i.issues.length===0?t(s,r,i.data):o.push(...e(i.issues,r))}return this._copyRelaxedUnknownKeys(a,s),{data:s,issues:o,typeOk:!0}}partial(...e){let t=e.length>0?new Set(e):null;return this._rebuildWith(r(Object.entries(this.shape).map(([e,n])=>[e,t===null||t.has(e)?n.optional():n])),this._isRelaxed)}optional(){return super.optional()}nullable(){return super.nullable()}nullish(){return super.nullish()}required(){return this._rebuildWith(r(Object.entries(this.shape).map(([e,t])=>[e,t.required()])),this._isRelaxed)}extend(e){return this._rebuildWith(r([...Object.entries(this.shape),...Object.entries(e)]),this._isRelaxed)}pick(...e){let t=new Set(e);return this._rebuildWith(r(Object.entries(this.shape).filter(([e])=>t.has(e))))}omit(...e){let t=new Set(e);return this._rebuildWith(r(Object.entries(this.shape).filter(([e])=>!t.has(e))))}defaults(){return this.parse({})}partialDefaults(){let e={};for(let n of Object.keys(this.shape)){let r=this.shape[n]._parseFullSync(void 0);r.issues.length===0&&t(e,n,r.data)}return e}requiredFields(){return Object.keys(this.shape).filter(e=>!this.shape[e].isOptional)}optionalFields(){return Object.keys(this.shape).filter(e=>this.shape[e].isOptional)}relaxed(){return this._rebuildWith(this.shape,!0)}strict(){return this._rebuildWith(this.shape,!1)}keyof(){let e=Object.keys(this.shape).map(e=>new o(e));return new s(e)}_toDescriptorImpl(){let e={};for(let[n,r]of Object.entries(this.shape))t(e,n,r.definition());return{...this._describeBase(),fields:e,kind:`object`,strict:!this._isRelaxed}}merge(e){return this._rebuildWith(r([...Object.entries(this.shape),...Object.entries(e.shape)]),e._isRelaxed)}};export{c as ObjectSchema};
|
|
2
2
|
//# sourceMappingURL=object.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.js","names":[],"sources":["../../src/schemas/object.ts"],"sourcesContent":["import type {\n AcceptsMissing,\n AnySchema,\n CheckContext,\n InferInput,\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, ErrorCode, prependIssuePath, Schema, SpellValidationError } from '../core';\nimport { defineOwnProperty, isUnsafeObjectKey, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { UnionSchema } from './union';\n\nexport type ObjectShape = Record<string, AnySchema>;\nexport type InferObject<T extends ObjectShape> = { [K in keyof T]: InferOutput<T[K]> };\ntype OptionalInputKeys<T extends ObjectShape> = {\n [K in keyof T]: T[K] extends AcceptsMissing ? K : never;\n}[keyof T];\ntype Simplify<T> = { [K in keyof T]: T[K] };\nexport type InferObjectInput<T extends ObjectShape> = Simplify<\n { [K in Exclude<keyof T, OptionalInputKeys<T>>]: InferInput<T[K]> } & {\n [K in OptionalInputKeys<T>]?: InferInput<T[K]>;\n }\n>;\n\nexport class ObjectSchema<\n T extends ObjectShape,\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<T[keyof T]>>,\n> extends Schema<InferObject<T>, InferObjectInput<T>, Mode> {\n readonly shape: T;\n private readonly _isRelaxed: boolean;\n\n protected override get _kind(): string {\n return 'object';\n }\n\n override checkAsync(\n this: ObjectSchema<T, 'sync'>,\n fn: (value: InferObject<T>, ctx: CheckContext) => Promise<ValidateResult>,\n ): ObjectSchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as ObjectSchema<T, 'async'>;\n }\n\n constructor(shape: T, isRelaxed = false) {\n super();\n this.shape = Object.freeze(objectFromEntries(Object.entries(shape))) as T;\n this._isRelaxed = isRelaxed;\n }\n\n private _unknownKeys(obj: Record<string, unknown>): string[] {\n return Object.keys(obj).filter((k) => !Object.hasOwn(this.shape, k));\n }\n\n private _strictUnknownKeyIssues(obj: Record<string, unknown>, ctx: ParseContext): Issue[] {\n if (this._isRelaxed) return [];\n\n const unknownKeys = this._unknownKeys(obj);\n\n if (unknownKeys.length === 0) return [];\n\n return [\n {\n code: ErrorCode.invalid_keys,\n message: ctx.messages.object.invalidKeys({ keys: unknownKeys }),\n params: { keys: unknownKeys },\n path: [],\n },\n ];\n }\n\n private _copyRelaxedUnknownKeys(obj: Record<string, unknown>, output: Record<string, unknown>): void {\n if (!this._isRelaxed) return;\n\n for (const key of this._unknownKeys(obj)) {\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(key)) continue;\n\n defineOwnProperty(output, key, obj[key]);\n }\n }\n\n private _guardObjectInput(\n value: unknown,\n ctx: ParseContext,\n ): { obj: Record<string, unknown>; ok: true } | { issues: Issue[]; ok: false } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.object.type(), path: [] }],\n ok: false,\n };\n }\n\n return { obj: value as Record<string, unknown>, ok: true };\n }\n\n private _createObjectParseContext(\n obj: Record<string, unknown>,\n ctx: ParseContext,\n ): {\n issues: Issue[];\n output: Record<string, unknown>;\n } {\n return {\n issues: [...this._strictUnknownKeyIssues(obj, ctx)],\n output: {},\n };\n }\n\n private _rebuildWith<U extends ObjectShape, NewMode extends SchemaMode = Mode>(\n shape: U,\n isRelaxed = this._isRelaxed,\n ): ObjectSchema<U, NewMode> {\n return this._copyStateTo(new ObjectSchema(shape, isRelaxed)) as unknown as ObjectSchema<U, NewMode>;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n for (const key of Object.keys(this.shape)) {\n const fieldSchema = this.shape[key];\n const result = fieldSchema._parseFullSync(obj[key], ctx);\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n // Failed field keys are intentionally omitted from parsed output so\n // object-level checks can branch on key presence.\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferObject<T>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferObject<T>;\n\n const guarded = this._guardObjectInput(prepared.value, c);\n\n if (!guarded.ok) throw new SpellValidationError(guarded.issues);\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, c);\n\n const keys = Object.keys(this.shape);\n const results = await Promise.all(keys.map((key) => this.shape[key]._parseFullAsync(obj[key], c)));\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const result = results[i];\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n const validationIssues = await this._runValidatorsAsync(output, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(output) as InferObject<T>;\n });\n }\n\n partial(): ObjectSchema<\n { [K in keyof T]: Schema<InferOutput<T[K]> | undefined, InferInput<T[K]> | undefined, Mode> & AcceptsMissing },\n Mode\n >;\n partial<K extends keyof T>(\n ...keys: K[]\n ): ObjectSchema<\n Omit<T, K> & {\n [P in K]: Schema<InferOutput<T[P]> | undefined, InferInput<T[P]> | undefined, Mode> & AcceptsMissing;\n },\n Mode\n >;\n partial<K extends keyof T>(...keys: K[]): ObjectSchema<any, Mode> {\n const targetKeys = keys.length > 0 ? new Set(keys as string[]) : null;\n\n return this._rebuildWith(\n objectFromEntries(\n Object.entries(this.shape).map(([k, s]) => [k, targetKeys === null || targetKeys.has(k) ? s.optional() : s]),\n ) as any,\n this._isRelaxed,\n );\n }\n\n override optional(): ObjectSchema<T, Mode> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined, Mode> &\n AcceptsMissing {\n return super.optional() as ObjectSchema<T, Mode> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined, Mode> &\n AcceptsMissing;\n }\n\n override nullable(): ObjectSchema<T, Mode> & Schema<InferObject<T> | null, InferObjectInput<T> | null, Mode> {\n return super.nullable() as ObjectSchema<T, Mode> & Schema<InferObject<T> | null, InferObjectInput<T> | null, Mode>;\n }\n\n override nullish(): ObjectSchema<T, Mode> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined, Mode> &\n AcceptsMissing {\n return super.nullish() as ObjectSchema<T, Mode> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined, Mode> &\n AcceptsMissing;\n }\n\n override required(): ObjectSchema<T, Mode> &\n Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>, Mode> {\n return this._rebuildWith(\n objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.required()])) as any,\n this._isRelaxed,\n ) as ObjectSchema<T, Mode> &\n Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>, Mode>;\n }\n\n extend<U extends ObjectShape>(\n extra: U,\n ): ObjectSchema<Omit<T, keyof U> & U, MergeSchemaModes<Mode | InferSchemaMode<U[keyof U]>>> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(extra)]) as any,\n this._isRelaxed,\n );\n }\n\n pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>, Mode> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => keySet.has(k))) as any);\n }\n\n omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>, Mode> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => !keySet.has(k))) as any);\n }\n\n /**\n * Returns a fully default-filled object by parsing `{}` against this schema.\n * Every required field must have a `.default()` value set; if any required\n * field is missing a default, this method throws a `SpellValidationError`.\n *\n * @example\n * const Config = s.object({ host: s.string().default('localhost'), port: s.number().default(3000) });\n * Config.defaults(); // { host: 'localhost', port: 3000 }\n */\n defaults(this: ObjectSchema<T, 'sync'>): InferObject<T> {\n return this.parse({});\n }\n\n /**\n * Returns a partial object containing only the fields that have a default value set.\n * Fields without a `.default()` or `.catch()` are silently omitted rather than throwing.\n *\n * Useful for pre-filling forms where only some fields have defaults.\n *\n * @example\n * const Form = s.object({ name: s.string(), role: s.string().default('viewer') });\n * Form.partialDefaults(); // { role: 'viewer' } — name is omitted\n */\n partialDefaults(this: ObjectSchema<T, 'sync'>): Partial<InferObject<T>> {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(this.shape)) {\n const parsed = this.shape[key]._parseFullSync(undefined);\n\n if (parsed.issues.length === 0) {\n defineOwnProperty(result, key, parsed.data);\n }\n }\n\n return result as Partial<InferObject<T>>;\n }\n\n /**\n * Returns an array of field keys that are **required** (not optional and not nullish).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.requiredFields(); // ['id']\n */\n requiredFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => !this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Returns an array of field keys that are **optional** (accept `undefined`).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.optionalFields(); // ['name']\n */\n optionalFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Allow additional unknown properties (relaxed mode).\n * Default is strict mode (rejects unknown keys).\n *\n * Returns `ObjectSchema<T>` so fluent methods like `.pick()`, `.omit()`,\n * `.extend()`, and `.partial()` remain usable after calling `.relaxed()`.\n */\n relaxed(): ObjectSchema<T, Mode> {\n return this._rebuildWith(this.shape, true);\n }\n\n /**\n * Alias for the default strict mode — rejects unknown keys.\n * Useful after calling `.relaxed()` to return a new strict schema.\n */\n strict(): ObjectSchema<T, Mode> {\n return this._rebuildWith(this.shape, false);\n }\n\n /**\n * Returns a union schema of the object's key names as literal schemas.\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string() });\n * User.keyof(); // UnionSchema — validates 'id' | 'name'\n */\n keyof(): UnionSchema<readonly [LiteralSchema<keyof T & string>, ...LiteralSchema<keyof T & string>[]]> {\n const keys = Object.keys(this.shape) as (keyof T & string)[];\n const schemas = keys.map((k) => new LiteralSchema(k)) as unknown as readonly [\n LiteralSchema<keyof T & string>,\n ...LiteralSchema<keyof T & string>[],\n ];\n\n return new UnionSchema(schemas);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const fields: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of Object.entries(this.shape)) {\n defineOwnProperty(fields, key, schema.definition());\n }\n\n return { ...this._describeBase(), fields, kind: 'object', strict: !this._isRelaxed };\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const fields = objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.walk(visitor)]));\n\n if (visitor.object) return visitor.object(this, fields);\n\n return super._walk(visitor);\n }\n\n merge<U extends ObjectShape, OtherMode extends SchemaMode>(\n other: ObjectSchema<U, OtherMode>,\n ): ObjectSchema<T & U, MergeSchemaModes<Mode | OtherMode>> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(other.shape)]) as any,\n other._isRelaxed,\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"object.js","names":[],"sources":["../../src/schemas/object.ts"],"sourcesContent":["import type {\n AcceptsMissing,\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema } from '../core';\nimport { defineOwnProperty, isUnsafeObjectKey, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { UnionSchema } from './union';\n\nexport type ObjectShape = Record<string, AnySchema>;\nexport type InferObject<T extends ObjectShape> = { [K in keyof T]: InferOutput<T[K]> };\ntype OptionalInputKeys<T extends ObjectShape> = {\n [K in keyof T]: T[K] extends AcceptsMissing ? K : never;\n}[keyof T];\ntype Simplify<T> = { [K in keyof T]: T[K] };\nexport type InferObjectInput<T extends ObjectShape> = Simplify<\n { [K in Exclude<keyof T, OptionalInputKeys<T>>]: InferInput<T[K]> } & {\n [K in OptionalInputKeys<T>]?: InferInput<T[K]>;\n }\n>;\n\nexport class ObjectSchema<T extends ObjectShape> extends Schema<InferObject<T>, InferObjectInput<T>> {\n readonly shape: T;\n private readonly _isRelaxed: boolean;\n\n protected override get _kind(): string {\n return 'object';\n }\n\n constructor(shape: T, isRelaxed = false) {\n super();\n this.shape = Object.freeze(objectFromEntries(Object.entries(shape))) as T;\n this._isRelaxed = isRelaxed;\n }\n\n private _unknownKeys(obj: Record<string, unknown>): string[] {\n return Object.keys(obj).filter((k) => !Object.hasOwn(this.shape, k));\n }\n\n private _strictUnknownKeyIssues(obj: Record<string, unknown>, ctx: ParseContext): Issue[] {\n if (this._isRelaxed) return [];\n\n const unknownKeys = this._unknownKeys(obj);\n\n if (unknownKeys.length === 0) return [];\n\n return [\n {\n code: ErrorCode.invalid_keys,\n message: ctx.messages.object.invalidKeys({ keys: unknownKeys }),\n params: { keys: unknownKeys },\n path: [],\n },\n ];\n }\n\n private _copyRelaxedUnknownKeys(obj: Record<string, unknown>, output: Record<string, unknown>): void {\n if (!this._isRelaxed) return;\n\n for (const key of this._unknownKeys(obj)) {\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(key)) continue;\n\n defineOwnProperty(output, key, obj[key]);\n }\n }\n\n private _guardObjectInput(\n value: unknown,\n ctx: ParseContext,\n ): { obj: Record<string, unknown>; ok: true } | { issues: Issue[]; ok: false } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.object.type(), path: [] }],\n ok: false,\n };\n }\n\n return { obj: value as Record<string, unknown>, ok: true };\n }\n\n private _createObjectParseContext(\n obj: Record<string, unknown>,\n ctx: ParseContext,\n ): {\n issues: Issue[];\n output: Record<string, unknown>;\n } {\n return {\n issues: [...this._strictUnknownKeyIssues(obj, ctx)],\n output: {},\n };\n }\n\n private _rebuildWith<U extends ObjectShape>(shape: U, isRelaxed = this._isRelaxed): ObjectSchema<U> {\n return this._copyStateTo(new ObjectSchema(shape, isRelaxed)) as unknown as ObjectSchema<U>;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n for (const key of Object.keys(this.shape)) {\n const fieldSchema = this.shape[key];\n const result = fieldSchema._parseFullSync(obj[key], ctx);\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n // Failed field keys are intentionally omitted from parsed output so\n // object-level checks can branch on key presence.\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const guarded = this._guardObjectInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { obj } = guarded;\n const { issues, output } = this._createObjectParseContext(obj, ctx);\n\n const keys = Object.keys(this.shape);\n const results = await Promise.all(keys.map((key) => this.shape[key]._parseFullAsync(obj[key], ctx)));\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const result = results[i];\n\n if (result.issues.length === 0) {\n defineOwnProperty(output, key, result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, key));\n }\n }\n\n this._copyRelaxedUnknownKeys(obj, output);\n\n return { data: output, issues, typeOk: true };\n }\n\n partial(): ObjectSchema<{\n [K in keyof T]: Schema<InferOutput<T[K]> | undefined, InferInput<T[K]> | undefined> & AcceptsMissing;\n }>;\n partial<K extends keyof T>(\n ...keys: K[]\n ): ObjectSchema<\n Omit<T, K> & {\n [P in K]: Schema<InferOutput<T[P]> | undefined, InferInput<T[P]> | undefined> & AcceptsMissing;\n }\n >;\n partial<K extends keyof T>(...keys: K[]): ObjectSchema<any> {\n const targetKeys = keys.length > 0 ? new Set(keys as string[]) : null;\n\n return this._rebuildWith(\n objectFromEntries(\n Object.entries(this.shape).map(([k, s]) => [k, targetKeys === null || targetKeys.has(k) ? s.optional() : s]),\n ) as any,\n this._isRelaxed,\n );\n }\n\n override optional(): ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing {\n return super.optional() as ObjectSchema<T> &\n Schema<InferObject<T> | undefined, InferObjectInput<T> | undefined> &\n AcceptsMissing;\n }\n\n override nullable(): ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null> {\n return super.nullable() as ObjectSchema<T> & Schema<InferObject<T> | null, InferObjectInput<T> | null>;\n }\n\n override nullish(): ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing {\n return super.nullish() as ObjectSchema<T> &\n Schema<InferObject<T> | null | undefined, InferObjectInput<T> | null | undefined> &\n AcceptsMissing;\n }\n\n override required(): ObjectSchema<T> &\n Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>> {\n return this._rebuildWith(\n objectFromEntries(Object.entries(this.shape).map(([k, s]) => [k, s.required()])) as any,\n this._isRelaxed,\n ) as ObjectSchema<T> & Schema<Exclude<InferObject<T>, undefined>, Exclude<InferObjectInput<T>, undefined>>;\n }\n\n extend<U extends ObjectShape>(extra: U): ObjectSchema<Omit<T, keyof U> & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(extra)]) as any,\n this._isRelaxed,\n );\n }\n\n pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => keySet.has(k))) as any);\n }\n\n omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>> {\n const keySet = new Set(keys as string[]);\n\n return this._rebuildWith(objectFromEntries(Object.entries(this.shape).filter(([k]) => !keySet.has(k))) as any);\n }\n\n /**\n * Returns a fully default-filled object by parsing `{}` against this schema.\n * Every required field must have a `.default()` value set; if any required\n * field is missing a default, this method throws a `SpellValidationError`.\n *\n * @example\n * const Config = s.object({ host: s.string().default('localhost'), port: s.number().default(3000) });\n * Config.defaults(); // { host: 'localhost', port: 3000 }\n */\n defaults(): InferObject<T> {\n return this.parse({});\n }\n\n /**\n * Returns a partial object containing only the fields that have a default value set.\n * Fields without a `.default()` or `.catch()` are silently omitted rather than throwing.\n *\n * Useful for pre-filling forms where only some fields have defaults.\n *\n * @example\n * const Form = s.object({ name: s.string(), role: s.string().default('viewer') });\n * Form.partialDefaults(); // { role: 'viewer' } — name is omitted\n */\n partialDefaults(): Partial<InferObject<T>> {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(this.shape)) {\n const parsed = this.shape[key]._parseFullSync(undefined);\n\n if (parsed.issues.length === 0) {\n defineOwnProperty(result, key, parsed.data);\n }\n }\n\n return result as Partial<InferObject<T>>;\n }\n\n /**\n * Returns an array of field keys that are **required** (not optional and not nullish).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.requiredFields(); // ['id']\n */\n requiredFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => !this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Returns an array of field keys that are **optional** (accept `undefined`).\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string().optional() });\n * User.optionalFields(); // ['name']\n */\n optionalFields(): (keyof T & string)[] {\n return Object.keys(this.shape).filter((k) => this.shape[k].isOptional) as (keyof T & string)[];\n }\n\n /**\n * Allow additional unknown properties (relaxed mode).\n * Default is strict mode (rejects unknown keys).\n *\n * Returns `ObjectSchema<T>` so fluent methods like `.pick()`, `.omit()`,\n * `.extend()`, and `.partial()` remain usable after calling `.relaxed()`.\n */\n relaxed(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, true);\n }\n\n /**\n * Alias for the default strict mode — rejects unknown keys.\n * Useful after calling `.relaxed()` to return a new strict schema.\n */\n strict(): ObjectSchema<T> {\n return this._rebuildWith(this.shape, false);\n }\n\n /**\n * Returns a union schema of the object's key names as literal schemas.\n *\n * @example\n * const User = s.object({ id: s.number(), name: s.string() });\n * User.keyof(); // UnionSchema — validates 'id' | 'name'\n */\n keyof(): UnionSchema<readonly [LiteralSchema<keyof T & string>, ...LiteralSchema<keyof T & string>[]]> {\n const keys = Object.keys(this.shape) as (keyof T & string)[];\n const schemas = keys.map((k) => new LiteralSchema(k)) as unknown as readonly [\n LiteralSchema<keyof T & string>,\n ...LiteralSchema<keyof T & string>[],\n ];\n\n return new UnionSchema(schemas);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const fields: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of Object.entries(this.shape)) {\n defineOwnProperty(fields, key, schema.definition());\n }\n\n return { ...this._describeBase(), fields, kind: 'object', strict: !this._isRelaxed };\n }\n\n merge<U extends ObjectShape>(other: ObjectSchema<U>): ObjectSchema<T & U> {\n return this._rebuildWith(\n objectFromEntries([...Object.entries(this.shape), ...Object.entries(other.shape)]) as any,\n other._isRelaxed,\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/schemas/record.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../errors.cjs"),t=require("../safe-object.cjs"),n=require("../types.cjs"),r=require("../core.cjs");var i=class extends r.Schema{keySchema;valueSchema;get _kind(){return`record`}
|
|
1
|
+
const e=require("../errors.cjs"),t=require("../safe-object.cjs"),n=require("../types.cjs"),r=require("../core.cjs");var i=class extends r.Schema{keySchema;valueSchema;get _kind(){return`record`}constructor(e,t){super(),this.keySchema=e,this.valueSchema=t}_guardRecordInput(e,t){return typeof e!=`object`||!e||Array.isArray(e)?{issues:[{code:n.ErrorCode.invalid_type,message:t.messages.object.type(),path:[]}],ok:!1}:{ok:!0,value:e}}_parseRecordEntries(n,r){let i=[],a={};for(let o of Object.keys(n)){let s=this.keySchema._parseFullSync(o,r);if(s.issues.length>0){i.push(...e.prependIssuePath(s.issues,o));continue}let c=s.data;if(t.isUnsafeObjectKey(c))continue;let l=this.valueSchema._parseFullSync(n[o],r);l.issues.length===0?t.defineOwnProperty(a,c,l.data):i.push(...e.prependIssuePath(l.issues,o))}return{issues:i,output:a}}_parse(e,t){let n=this._guardRecordInput(e,t);if(!n.ok)return{data:e,issues:n.issues,typeOk:!1};let{issues:r,output:i}=this._parseRecordEntries(n.value,t);return{data:i,issues:r,typeOk:!0}}async _parseAsync(n,r){let i=this._guardRecordInput(n,r);if(!i.ok)return{data:n,issues:i.issues,typeOk:!1};let a=i.value,o=Object.keys(a),s=await Promise.all(o.map(e=>Promise.all([this.keySchema._parseFullAsync(e,r),this.valueSchema._parseFullAsync(a[e],r)]))),c=[],l={};for(let n=0;n<o.length;n++){let r=o[n],[i,a]=s[n];if(i.issues.length>0){c.push(...e.prependIssuePath(i.issues,r));continue}let u=i.data;t.isUnsafeObjectKey(u)||(a.issues.length===0?t.defineOwnProperty(l,u,a.data):c.push(...e.prependIssuePath(a.issues,r)))}return{data:l,issues:c,typeOk:!0}}_toDescriptorImpl(){return{...this._describeBase(),key:this.keySchema.definition(),kind:`record`,value:this.valueSchema.definition()}}};exports.RecordSchema=i;
|
|
2
2
|
//# sourceMappingURL=record.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.cjs","names":[],"sources":["../../src/schemas/record.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"record.cjs","names":[],"sources":["../../src/schemas/record.ts"],"sourcesContent":["import type { AnySchema, InferInput, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema } from '../core';\nimport { defineOwnProperty, isUnsafeObjectKey } from '../safe-object';\n\nexport class RecordSchema<K extends AnySchema, V extends AnySchema> extends Schema<\n Record<InferOutput<K> & string, InferOutput<V>>,\n Record<InferInput<K> & string, InferInput<V>>\n> {\n readonly keySchema: K;\n readonly valueSchema: V;\n\n protected override get _kind(): string {\n return 'record';\n }\n\n constructor(keySchema: K, valueSchema: V) {\n super();\n this.keySchema = keySchema;\n this.valueSchema = valueSchema;\n }\n\n private _guardRecordInput(\n value: unknown,\n ctx: ParseContext,\n ): { ok: true; value: Record<string, unknown> } | { issues: Issue[]; ok: false } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.object.type(), path: [] }],\n ok: false,\n };\n }\n\n return { ok: true, value: value as Record<string, unknown> };\n }\n\n private _parseRecordEntries(\n obj: Record<string, unknown>,\n ctx: ParseContext,\n ): { issues: Issue[]; output: Record<string, unknown> } {\n const issues: Issue[] = [];\n const output: Record<string, unknown> = {};\n\n for (const key of Object.keys(obj)) {\n const keyResult = this.keySchema._parseFullSync(key, ctx);\n\n if (keyResult.issues.length > 0) {\n issues.push(...prependIssuePath(keyResult.issues, key));\n continue;\n }\n\n const parsedKey = keyResult.data as string;\n\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(parsedKey)) continue;\n\n const valResult = this.valueSchema._parseFullSync(obj[key], ctx);\n\n if (valResult.issues.length === 0) {\n defineOwnProperty(output, parsedKey, valResult.data);\n } else {\n issues.push(...prependIssuePath(valResult.issues, key));\n }\n }\n\n return { issues, output };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const guarded = this._guardRecordInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { issues, output } = this._parseRecordEntries(guarded.value, ctx);\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const guarded = this._guardRecordInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const obj = guarded.value;\n const keys = Object.keys(obj);\n const settled = await Promise.all(\n keys.map((key) =>\n Promise.all([this.keySchema._parseFullAsync(key, ctx), this.valueSchema._parseFullAsync(obj[key], ctx)]),\n ),\n );\n\n const issues: Issue[] = [];\n const output: Record<string, unknown> = {};\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const [keyResult, valResult] = settled[i];\n\n if (keyResult.issues.length > 0) {\n issues.push(...prependIssuePath(keyResult.issues, key));\n continue;\n }\n\n const parsedKey = keyResult.data as string;\n\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(parsedKey)) continue;\n\n if (valResult.issues.length === 0) {\n defineOwnProperty(output, parsedKey, valResult.data);\n } else {\n issues.push(...prependIssuePath(valResult.issues, key));\n }\n }\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n key: this.keySchema.definition(),\n kind: 'record',\n value: this.valueSchema.definition(),\n };\n }\n}\n"],"mappings":"oHAKA,IAAa,EAAb,cAA4E,EAAA,MAG1E,CACA,UACA,YAEA,IAAuB,OAAgB,CACrC,MAAO,QACT,CAEA,YAAY,EAAc,EAAgB,CACxC,MAAM,EACN,KAAK,UAAY,EACjB,KAAK,YAAc,CACrB,CAEA,kBACE,EACA,EAC+E,CAQ/E,OAPqB,OAAO,GAAU,WAAlC,GAA8C,MAAM,QAAQ,CAAK,EAC5D,CACL,OAAQ,CAAC,CAAE,KAAM,EAAA,UAAU,aAAc,QAAS,EAAI,SAAS,OAAO,KAAK,EAAG,KAAM,CAAC,CAAE,CAAC,EACxF,GAAI,EACN,EAGK,CAAE,GAAI,GAAa,OAAiC,CAC7D,CAEA,oBACE,EACA,EACsD,CACtD,IAAM,EAAkB,CAAC,EACnB,EAAkC,CAAC,EAEzC,IAAK,IAAM,KAAO,OAAO,KAAK,CAAG,EAAG,CAClC,IAAM,EAAY,KAAK,UAAU,eAAe,EAAK,CAAG,EAExD,GAAI,EAAU,OAAO,OAAS,EAAG,CAC/B,EAAO,KAAK,GAAG,EAAA,iBAAiB,EAAU,OAAQ,CAAG,CAAC,EACtD,QACF,CAEA,IAAM,EAAY,EAAU,KAI5B,GAAI,EAAA,kBAAkB,CAAS,EAAG,SAElC,IAAM,EAAY,KAAK,YAAY,eAAe,EAAI,GAAM,CAAG,EAE3D,EAAU,OAAO,SAAW,EAC9B,EAAA,kBAAkB,EAAQ,EAAW,EAAU,IAAI,EAEnD,EAAO,KAAK,GAAG,EAAA,iBAAiB,EAAU,OAAQ,CAAG,CAAC,CAE1D,CAEA,MAAO,CAAE,SAAQ,QAAO,CAC1B,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAU,KAAK,kBAAkB,EAAO,CAAG,EAEjD,GAAI,CAAC,EAAQ,GAAI,MAAO,CAAE,KAAM,EAAO,OAAQ,EAAQ,OAAQ,OAAQ,EAAM,EAE7E,GAAM,CAAE,SAAQ,UAAW,KAAK,oBAAoB,EAAQ,MAAO,CAAG,EAEtE,MAAO,CAAE,KAAM,EAAQ,SAAQ,OAAQ,EAAK,CAC9C,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,IAAM,EAAU,KAAK,kBAAkB,EAAO,CAAG,EAEjD,GAAI,CAAC,EAAQ,GAAI,MAAO,CAAE,KAAM,EAAO,OAAQ,EAAQ,OAAQ,OAAQ,EAAM,EAE7E,IAAM,EAAM,EAAQ,MACd,EAAO,OAAO,KAAK,CAAG,EACtB,EAAU,MAAM,QAAQ,IAC5B,EAAK,IAAK,GACR,QAAQ,IAAI,CAAC,KAAK,UAAU,gBAAgB,EAAK,CAAG,EAAG,KAAK,YAAY,gBAAgB,EAAI,GAAM,CAAG,CAAC,CAAC,CACzG,CACF,EAEM,EAAkB,CAAC,EACnB,EAAkC,CAAC,EAEzC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAQ,IAAK,CACpC,IAAM,EAAM,EAAK,GACX,CAAC,EAAW,GAAa,EAAQ,GAEvC,GAAI,EAAU,OAAO,OAAS,EAAG,CAC/B,EAAO,KAAK,GAAG,EAAA,iBAAiB,EAAU,OAAQ,CAAG,CAAC,EACtD,QACF,CAEA,IAAM,EAAY,EAAU,KAIxB,EAAA,kBAAkB,CAAS,IAE3B,EAAU,OAAO,SAAW,EAC9B,EAAA,kBAAkB,EAAQ,EAAW,EAAU,IAAI,EAEnD,EAAO,KAAK,GAAG,EAAA,iBAAiB,EAAU,OAAQ,CAAG,CAAC,EAE1D,CAEA,MAAO,CAAE,KAAM,EAAQ,SAAQ,OAAQ,EAAK,CAC9C,CAEA,mBAAyD,CACvD,MAAO,CACL,GAAG,KAAK,cAAc,EACtB,IAAK,KAAK,UAAU,WAAW,EAC/B,KAAM,SACN,MAAO,KAAK,YAAY,WAAW,CACrC,CACF,CACF"}
|
package/dist/schemas/record.d.ts
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import type { AnySchema,
|
|
1
|
+
import type { AnySchema, InferInput, InferOutput, ParseContext, ParseValue, SchemaDescriptor } from '../core';
|
|
2
2
|
import { Schema } from '../core';
|
|
3
|
-
export declare class RecordSchema<K extends AnySchema, V extends AnySchema
|
|
3
|
+
export declare class RecordSchema<K extends AnySchema, V extends AnySchema> extends Schema<Record<InferOutput<K> & string, InferOutput<V>>, Record<InferInput<K> & string, InferInput<V>>> {
|
|
4
4
|
readonly keySchema: K;
|
|
5
5
|
readonly valueSchema: V;
|
|
6
6
|
protected get _kind(): string;
|
|
7
|
-
checkAsync(this: RecordSchema<K, V, 'sync'>, fn: (value: Record<InferOutput<K> & string, InferOutput<V>>, ctx: CheckContext) => Promise<ValidateResult>): RecordSchema<K, V, 'async'>;
|
|
8
7
|
constructor(keySchema: K, valueSchema: V);
|
|
9
8
|
private _guardRecordInput;
|
|
10
9
|
private _parseRecordEntries;
|
|
11
10
|
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
12
|
-
|
|
11
|
+
protected _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue>;
|
|
13
12
|
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
14
|
-
protected _walk<R>(visitor: SchemaWalker<R>): R | null;
|
|
15
13
|
}
|
|
16
14
|
//# sourceMappingURL=record.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/schemas/record.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/schemas/record.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAS,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAErH,OAAO,EAA+B,MAAM,EAAE,MAAM,SAAS,CAAC;AAG9D,qBAAa,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,CAAE,SAAQ,MAAM,CAChF,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAC/C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAC9C;IACC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAExB,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;IAMxC,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,mBAAmB;cAiCR,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;cAU/C,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;cAyCzE,iBAAiB,IAAI,gBAAgB;CAQzD"}
|
package/dist/schemas/record.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{prependIssuePath as e}from"../errors.js";import{defineOwnProperty as t,isUnsafeObjectKey as n}from"../safe-object.js";import{ErrorCode as r}from"../types.js";import{Schema as i}from"../core.js";var a=class extends i{keySchema;valueSchema;get _kind(){return`record`}constructor(e,t){super(),this.keySchema=e,this.valueSchema=t}_guardRecordInput(e,t){return typeof e!=`object`||!e||Array.isArray(e)?{issues:[{code:r.invalid_type,message:t.messages.object.type(),path:[]}],ok:!1}:{ok:!0,value:e}}_parseRecordEntries(r,i){let a=[],o={};for(let s of Object.keys(r)){let c=this.keySchema._parseFullSync(s,i);if(c.issues.length>0){a.push(...e(c.issues,s));continue}let l=c.data;if(n(l))continue;let u=this.valueSchema._parseFullSync(r[s],i);u.issues.length===0?t(o,l,u.data):a.push(...e(u.issues,s))}return{issues:a,output:o}}_parse(e,t){let n=this._guardRecordInput(e,t);if(!n.ok)return{data:e,issues:n.issues,typeOk:!1};let{issues:r,output:i}=this._parseRecordEntries(n.value,t);return{data:i,issues:r,typeOk:!0}}async _parseAsync(r,i){let a=this._guardRecordInput(r,i);if(!a.ok)return{data:r,issues:a.issues,typeOk:!1};let o=a.value,s=Object.keys(o),c=await Promise.all(s.map(e=>Promise.all([this.keySchema._parseFullAsync(e,i),this.valueSchema._parseFullAsync(o[e],i)]))),l=[],u={};for(let r=0;r<s.length;r++){let i=s[r],[a,o]=c[r];if(a.issues.length>0){l.push(...e(a.issues,i));continue}let d=a.data;n(d)||(o.issues.length===0?t(u,d,o.data):l.push(...e(o.issues,i)))}return{data:u,issues:l,typeOk:!0}}_toDescriptorImpl(){return{...this._describeBase(),key:this.keySchema.definition(),kind:`record`,value:this.valueSchema.definition()}}};export{a as RecordSchema};
|
|
2
2
|
//# sourceMappingURL=record.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","names":[],"sources":["../../src/schemas/record.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"record.js","names":[],"sources":["../../src/schemas/record.ts"],"sourcesContent":["import type { AnySchema, InferInput, InferOutput, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema } from '../core';\nimport { defineOwnProperty, isUnsafeObjectKey } from '../safe-object';\n\nexport class RecordSchema<K extends AnySchema, V extends AnySchema> extends Schema<\n Record<InferOutput<K> & string, InferOutput<V>>,\n Record<InferInput<K> & string, InferInput<V>>\n> {\n readonly keySchema: K;\n readonly valueSchema: V;\n\n protected override get _kind(): string {\n return 'record';\n }\n\n constructor(keySchema: K, valueSchema: V) {\n super();\n this.keySchema = keySchema;\n this.valueSchema = valueSchema;\n }\n\n private _guardRecordInput(\n value: unknown,\n ctx: ParseContext,\n ): { ok: true; value: Record<string, unknown> } | { issues: Issue[]; ok: false } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.object.type(), path: [] }],\n ok: false,\n };\n }\n\n return { ok: true, value: value as Record<string, unknown> };\n }\n\n private _parseRecordEntries(\n obj: Record<string, unknown>,\n ctx: ParseContext,\n ): { issues: Issue[]; output: Record<string, unknown> } {\n const issues: Issue[] = [];\n const output: Record<string, unknown> = {};\n\n for (const key of Object.keys(obj)) {\n const keyResult = this.keySchema._parseFullSync(key, ctx);\n\n if (keyResult.issues.length > 0) {\n issues.push(...prependIssuePath(keyResult.issues, key));\n continue;\n }\n\n const parsedKey = keyResult.data as string;\n\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(parsedKey)) continue;\n\n const valResult = this.valueSchema._parseFullSync(obj[key], ctx);\n\n if (valResult.issues.length === 0) {\n defineOwnProperty(output, parsedKey, valResult.data);\n } else {\n issues.push(...prependIssuePath(valResult.issues, key));\n }\n }\n\n return { issues, output };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const guarded = this._guardRecordInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const { issues, output } = this._parseRecordEntries(guarded.value, ctx);\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const guarded = this._guardRecordInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const obj = guarded.value;\n const keys = Object.keys(obj);\n const settled = await Promise.all(\n keys.map((key) =>\n Promise.all([this.keySchema._parseFullAsync(key, ctx), this.valueSchema._parseFullAsync(obj[key], ctx)]),\n ),\n );\n\n const issues: Issue[] = [];\n const output: Record<string, unknown> = {};\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const [keyResult, valResult] = settled[i];\n\n if (keyResult.issues.length > 0) {\n issues.push(...prependIssuePath(keyResult.issues, key));\n continue;\n }\n\n const parsedKey = keyResult.data as string;\n\n // Skip keys that trigger inherited setters (e.g. __proto__) to prevent\n // prototype mutation on the output object.\n if (isUnsafeObjectKey(parsedKey)) continue;\n\n if (valResult.issues.length === 0) {\n defineOwnProperty(output, parsedKey, valResult.data);\n } else {\n issues.push(...prependIssuePath(valResult.issues, key));\n }\n }\n\n return { data: output, issues, typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n key: this.keySchema.definition(),\n kind: 'record',\n value: this.valueSchema.definition(),\n };\n }\n}\n"],"mappings":"yMAKA,IAAa,EAAb,cAA4E,CAG1E,CACA,UACA,YAEA,IAAuB,OAAgB,CACrC,MAAO,QACT,CAEA,YAAY,EAAc,EAAgB,CACxC,MAAM,EACN,KAAK,UAAY,EACjB,KAAK,YAAc,CACrB,CAEA,kBACE,EACA,EAC+E,CAQ/E,OAPqB,OAAO,GAAU,WAAlC,GAA8C,MAAM,QAAQ,CAAK,EAC5D,CACL,OAAQ,CAAC,CAAE,KAAM,EAAU,aAAc,QAAS,EAAI,SAAS,OAAO,KAAK,EAAG,KAAM,CAAC,CAAE,CAAC,EACxF,GAAI,EACN,EAGK,CAAE,GAAI,GAAa,OAAiC,CAC7D,CAEA,oBACE,EACA,EACsD,CACtD,IAAM,EAAkB,CAAC,EACnB,EAAkC,CAAC,EAEzC,IAAK,IAAM,KAAO,OAAO,KAAK,CAAG,EAAG,CAClC,IAAM,EAAY,KAAK,UAAU,eAAe,EAAK,CAAG,EAExD,GAAI,EAAU,OAAO,OAAS,EAAG,CAC/B,EAAO,KAAK,GAAG,EAAiB,EAAU,OAAQ,CAAG,CAAC,EACtD,QACF,CAEA,IAAM,EAAY,EAAU,KAI5B,GAAI,EAAkB,CAAS,EAAG,SAElC,IAAM,EAAY,KAAK,YAAY,eAAe,EAAI,GAAM,CAAG,EAE3D,EAAU,OAAO,SAAW,EAC9B,EAAkB,EAAQ,EAAW,EAAU,IAAI,EAEnD,EAAO,KAAK,GAAG,EAAiB,EAAU,OAAQ,CAAG,CAAC,CAE1D,CAEA,MAAO,CAAE,SAAQ,QAAO,CAC1B,CAEA,OAA0B,EAAgB,EAA+B,CACvE,IAAM,EAAU,KAAK,kBAAkB,EAAO,CAAG,EAEjD,GAAI,CAAC,EAAQ,GAAI,MAAO,CAAE,KAAM,EAAO,OAAQ,EAAQ,OAAQ,OAAQ,EAAM,EAE7E,GAAM,CAAE,SAAQ,UAAW,KAAK,oBAAoB,EAAQ,MAAO,CAAG,EAEtE,MAAO,CAAE,KAAM,EAAQ,SAAQ,OAAQ,EAAK,CAC9C,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,IAAM,EAAU,KAAK,kBAAkB,EAAO,CAAG,EAEjD,GAAI,CAAC,EAAQ,GAAI,MAAO,CAAE,KAAM,EAAO,OAAQ,EAAQ,OAAQ,OAAQ,EAAM,EAE7E,IAAM,EAAM,EAAQ,MACd,EAAO,OAAO,KAAK,CAAG,EACtB,EAAU,MAAM,QAAQ,IAC5B,EAAK,IAAK,GACR,QAAQ,IAAI,CAAC,KAAK,UAAU,gBAAgB,EAAK,CAAG,EAAG,KAAK,YAAY,gBAAgB,EAAI,GAAM,CAAG,CAAC,CAAC,CACzG,CACF,EAEM,EAAkB,CAAC,EACnB,EAAkC,CAAC,EAEzC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAQ,IAAK,CACpC,IAAM,EAAM,EAAK,GACX,CAAC,EAAW,GAAa,EAAQ,GAEvC,GAAI,EAAU,OAAO,OAAS,EAAG,CAC/B,EAAO,KAAK,GAAG,EAAiB,EAAU,OAAQ,CAAG,CAAC,EACtD,QACF,CAEA,IAAM,EAAY,EAAU,KAIxB,EAAkB,CAAS,IAE3B,EAAU,OAAO,SAAW,EAC9B,EAAkB,EAAQ,EAAW,EAAU,IAAI,EAEnD,EAAO,KAAK,GAAG,EAAiB,EAAU,OAAQ,CAAG,CAAC,EAE1D,CAEA,MAAO,CAAE,KAAM,EAAQ,SAAQ,OAAQ,EAAK,CAC9C,CAEA,mBAAyD,CACvD,MAAO,CACL,GAAG,KAAK,cAAc,EACtB,IAAK,KAAK,UAAU,WAAW,EAC/B,KAAM,SACN,MAAO,KAAK,YAAY,WAAW,CACrC,CACF,CACF"}
|
package/dist/schemas/set.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../errors.cjs"),t=require("../types.cjs"),n=require("../core.cjs");var r=class extends n.Schema{itemSchema;get _kind(){return`set`}
|
|
1
|
+
const e=require("../errors.cjs"),t=require("../types.cjs"),n=require("../core.cjs");var r=class extends n.Schema{itemSchema;get _kind(){return`set`}constructor(e){super(),this.itemSchema=e}_parse(n,r){if(!(n instanceof Set))return{data:n,issues:[{code:t.ErrorCode.invalid_type,message:r.messages.set.type(),path:[]}],typeOk:!1};let i=[],a=new Set,o=0;for(let t of n){let n=this.itemSchema._parseFullSync(t,r);n.issues.length===0?a.add(n.data):i.push(...e.prependIssuePath(n.issues,o)),o+=1}return{data:a,issues:i,typeOk:!0}}async _parseAsync(n,r){if(!(n instanceof Set))return{data:n,issues:[{code:t.ErrorCode.invalid_type,message:r.messages.set.type(),path:[]}],typeOk:!1};let i=[...n],a=await Promise.all(i.map(e=>this.itemSchema._parseFullAsync(e,r))),o=[],s=new Set;for(let t=0;t<a.length;t++){let n=a[t];n.issues.length===0?s.add(n.data):o.push(...e.prependIssuePath(n.issues,t))}return{data:s,issues:o,typeOk:!0}}min(n,r){return this._addConstraint((i,a)=>{let o=i;return o.size>=n?null:e.fail(t.ErrorCode.too_small,e.resolveMessage(r??a.messages.set.min,{min:n,value:o}),{min:n})})}max(n,r){return this._addConstraint((i,a)=>{let o=i;return o.size<=n?null:e.fail(t.ErrorCode.too_big,e.resolveMessage(r??a.messages.set.max,{max:n,value:o}),{max:n})})}size(n,r){return this._addConstraint((i,a)=>{let o=i;return o.size===n?null:e.fail(t.ErrorCode.invalid_length,e.resolveMessage(r??a.messages.set.size,{exact:n,value:o}),{exact:n})})}nonEmpty(n){return this._addConstraint((r,i)=>r.size>0?null:e.fail(t.ErrorCode.too_small,e.resolveMessage(n??i.messages.set.nonEmpty,{min:1}),{min:1}))}_toDescriptorImpl(){return{...this._describeBase(),items:this.itemSchema.definition(),kind:`set`}}};exports.SetSchema=r;
|
|
2
2
|
//# sourceMappingURL=set.cjs.map
|
package/dist/schemas/set.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set.cjs","names":[],"sources":["../../src/schemas/set.ts"],"sourcesContent":["import type {\n AnySchema,\n
|
|
1
|
+
{"version":3,"file":"set.cjs","names":[],"sources":["../../src/schemas/set.ts"],"sourcesContent":["import type {\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema } from '../core';\n\nexport class SetSchema<T extends AnySchema> extends Schema<Set<InferOutput<T>>, Set<InferInput<T>>> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'set';\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!(value instanceof Set)) {\n return {\n data: value,\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.set.type(), path: [] }],\n typeOk: false,\n };\n }\n\n const issues: Issue[] = [];\n const parsed = new Set<InferOutput<T>>();\n let i = 0;\n\n for (const item of value) {\n const result = this.itemSchema._parseFullSync(item, ctx);\n\n if (result.issues.length === 0) {\n parsed.add(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n }\n\n i += 1;\n }\n\n return { data: parsed, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n if (!(value instanceof Set)) {\n return {\n data: value,\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.set.type(), path: [] }],\n typeOk: false,\n };\n }\n\n const items = [...value];\n const settled = await Promise.all(items.map((item) => this.itemSchema._parseFullAsync(item, ctx)));\n\n const issues: Issue[] = [];\n const parsed = new Set<InferOutput<T>>();\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.add(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n }\n }\n\n return { data: parsed, issues, typeOk: true };\n }\n\n min(size: number, message?: MessageFn<{ min: number; value: Set<unknown> }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as Set<unknown>;\n\n if (typed.size >= size) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.set.min, { min: size, value: typed }), {\n min: size,\n });\n });\n }\n\n max(size: number, message?: MessageFn<{ max: number; value: Set<unknown> }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as Set<unknown>;\n\n if (typed.size <= size) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.set.max, { max: size, value: typed }), {\n max: size,\n });\n });\n }\n\n size(exact: number, message?: MessageFn<{ exact: number; value: Set<unknown> }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as Set<unknown>;\n\n if (typed.size === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.set.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 Set<unknown>;\n\n if (typed.size > 0) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.set.nonEmpty, { min: 1 }), { min: 1 });\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), items: this.itemSchema.definition(), kind: 'set' };\n }\n}\n"],"mappings":"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"}
|
package/dist/schemas/set.d.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import type { AnySchema,
|
|
1
|
+
import type { AnySchema, InferInput, InferOutput, MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';
|
|
2
2
|
import { Schema } from '../core';
|
|
3
|
-
export declare class SetSchema<T extends AnySchema
|
|
3
|
+
export declare class SetSchema<T extends AnySchema> extends Schema<Set<InferOutput<T>>, Set<InferInput<T>>> {
|
|
4
4
|
readonly itemSchema: T;
|
|
5
5
|
protected get _kind(): string;
|
|
6
|
-
checkAsync(this: SetSchema<T, 'sync'>, fn: (value: Set<InferOutput<T>>, ctx: CheckContext) => Promise<ValidateResult>): SetSchema<T, 'async'>;
|
|
7
6
|
constructor(itemSchema: T);
|
|
8
7
|
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
9
|
-
|
|
8
|
+
protected _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue>;
|
|
10
9
|
min(size: number, message?: MessageFn<{
|
|
11
10
|
min: number;
|
|
12
11
|
value: Set<unknown>;
|
|
@@ -23,6 +22,5 @@ export declare class SetSchema<T extends AnySchema, Mode extends SchemaMode = Me
|
|
|
23
22
|
min: number;
|
|
24
23
|
}>): this;
|
|
25
24
|
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
26
|
-
protected _walk<R>(visitor: SchemaWalker<R>): R | null;
|
|
27
25
|
}
|
|
28
26
|
//# sourceMappingURL=set.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../src/schemas/set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../src/schemas/set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,WAAW,EAEX,SAAS,EACT,YAAY,EACZ,UAAU,EACV,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAqD,MAAM,EAAE,MAAM,SAAS,CAAC;AAEpF,qBAAa,SAAS,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAEvB,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,UAAU,EAAE,CAAC;cAKN,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;cA4B/C,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IA4B5F,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,GAAG,IAAI;IAYlF,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,GAAG,IAAI;IAYlF,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,GAAG,IAAI;IActF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;cAUjC,iBAAiB,IAAI,gBAAgB;CAGzD"}
|
package/dist/schemas/set.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{fail as e,prependIssuePath as t,resolveMessage as n}from"../errors.js";import{ErrorCode as r}from"../types.js";import{Schema as i}from"../core.js";var a=class extends i{itemSchema;get _kind(){return`set`}constructor(e){super(),this.itemSchema=e}_parse(e,n){if(!(e instanceof Set))return{data:e,issues:[{code:r.invalid_type,message:n.messages.set.type(),path:[]}],typeOk:!1};let i=[],a=new Set,o=0;for(let r of e){let e=this.itemSchema._parseFullSync(r,n);e.issues.length===0?a.add(e.data):i.push(...t(e.issues,o)),o+=1}return{data:a,issues:i,typeOk:!0}}async _parseAsync(e,n){if(!(e instanceof Set))return{data:e,issues:[{code:r.invalid_type,message:n.messages.set.type(),path:[]}],typeOk:!1};let i=[...e],a=await Promise.all(i.map(e=>this.itemSchema._parseFullAsync(e,n))),o=[],s=new Set;for(let e=0;e<a.length;e++){let n=a[e];n.issues.length===0?s.add(n.data):o.push(...t(n.issues,e))}return{data:s,issues:o,typeOk:!0}}min(t,i){return this._addConstraint((a,o)=>{let s=a;return s.size>=t?null:e(r.too_small,n(i??o.messages.set.min,{min:t,value:s}),{min:t})})}max(t,i){return this._addConstraint((a,o)=>{let s=a;return s.size<=t?null:e(r.too_big,n(i??o.messages.set.max,{max:t,value:s}),{max:t})})}size(t,i){return this._addConstraint((a,o)=>{let s=a;return s.size===t?null:e(r.invalid_length,n(i??o.messages.set.size,{exact:t,value:s}),{exact:t})})}nonEmpty(t){return this._addConstraint((i,a)=>i.size>0?null:e(r.too_small,n(t??a.messages.set.nonEmpty,{min:1}),{min:1}))}_toDescriptorImpl(){return{...this._describeBase(),items:this.itemSchema.definition(),kind:`set`}}};export{a as SetSchema};
|
|
2
2
|
//# sourceMappingURL=set.js.map
|
package/dist/schemas/set.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set.js","names":[],"sources":["../../src/schemas/set.ts"],"sourcesContent":["import type {\n AnySchema,\n
|
|
1
|
+
{"version":3,"file":"set.js","names":[],"sources":["../../src/schemas/set.ts"],"sourcesContent":["import type {\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema } from '../core';\n\nexport class SetSchema<T extends AnySchema> extends Schema<Set<InferOutput<T>>, Set<InferInput<T>>> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'set';\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!(value instanceof Set)) {\n return {\n data: value,\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.set.type(), path: [] }],\n typeOk: false,\n };\n }\n\n const issues: Issue[] = [];\n const parsed = new Set<InferOutput<T>>();\n let i = 0;\n\n for (const item of value) {\n const result = this.itemSchema._parseFullSync(item, ctx);\n\n if (result.issues.length === 0) {\n parsed.add(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n }\n\n i += 1;\n }\n\n return { data: parsed, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n if (!(value instanceof Set)) {\n return {\n data: value,\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.set.type(), path: [] }],\n typeOk: false,\n };\n }\n\n const items = [...value];\n const settled = await Promise.all(items.map((item) => this.itemSchema._parseFullAsync(item, ctx)));\n\n const issues: Issue[] = [];\n const parsed = new Set<InferOutput<T>>();\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.add(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n }\n }\n\n return { data: parsed, issues, typeOk: true };\n }\n\n min(size: number, message?: MessageFn<{ min: number; value: Set<unknown> }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as Set<unknown>;\n\n if (typed.size >= size) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.set.min, { min: size, value: typed }), {\n min: size,\n });\n });\n }\n\n max(size: number, message?: MessageFn<{ max: number; value: Set<unknown> }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as Set<unknown>;\n\n if (typed.size <= size) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.set.max, { max: size, value: typed }), {\n max: size,\n });\n });\n }\n\n size(exact: number, message?: MessageFn<{ exact: number; value: Set<unknown> }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as Set<unknown>;\n\n if (typed.size === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.set.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 Set<unknown>;\n\n if (typed.size > 0) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.set.nonEmpty, { min: 1 }), { min: 1 });\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), items: this.itemSchema.definition(), kind: 'set' };\n }\n}\n"],"mappings":"0JAaA,IAAa,EAAb,cAAoD,CAAgD,CAClG,WAEA,IAAuB,OAAgB,CACrC,MAAO,KACT,CAEA,YAAY,EAAe,CACzB,MAAM,EACN,KAAK,WAAa,CACpB,CAEA,OAA0B,EAAgB,EAA+B,CACvE,GAAI,EAAE,aAAiB,KACrB,MAAO,CACL,KAAM,EACN,OAAQ,CAAC,CAAE,KAAM,EAAU,aAAc,QAAS,EAAI,SAAS,IAAI,KAAK,EAAG,KAAM,CAAC,CAAE,CAAC,EACrF,OAAQ,EACV,EAGF,IAAM,EAAkB,CAAC,EACnB,EAAS,IAAI,IACf,EAAI,EAER,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAS,KAAK,WAAW,eAAe,EAAM,CAAG,EAEnD,EAAO,OAAO,SAAW,EAC3B,EAAO,IAAI,EAAO,IAAsB,EAExC,EAAO,KAAK,GAAG,EAAiB,EAAO,OAAQ,CAAC,CAAC,EAGnD,GAAK,CACP,CAEA,MAAO,CAAE,KAAM,EAAQ,SAAQ,OAAQ,EAAK,CAC9C,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,GAAI,EAAE,aAAiB,KACrB,MAAO,CACL,KAAM,EACN,OAAQ,CAAC,CAAE,KAAM,EAAU,aAAc,QAAS,EAAI,SAAS,IAAI,KAAK,EAAG,KAAM,CAAC,CAAE,CAAC,EACrF,OAAQ,EACV,EAGF,IAAM,EAAQ,CAAC,GAAG,CAAK,EACjB,EAAU,MAAM,QAAQ,IAAI,EAAM,IAAK,GAAS,KAAK,WAAW,gBAAgB,EAAM,CAAG,CAAC,CAAC,EAE3F,EAAkB,CAAC,EACnB,EAAS,IAAI,IAEnB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CACvC,IAAM,EAAS,EAAQ,GAEnB,EAAO,OAAO,SAAW,EAC3B,EAAO,IAAI,EAAO,IAAsB,EAExC,EAAO,KAAK,GAAG,EAAiB,EAAO,OAAQ,CAAC,CAAC,CAErD,CAEA,MAAO,CAAE,KAAM,EAAQ,SAAQ,OAAQ,EAAK,CAC9C,CAEA,IAAI,EAAc,EAAiE,CACjF,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,EAAM,MAAQ,EAAa,KAExB,EAAK,EAAU,UAAW,EAAe,GAAW,EAAK,SAAS,IAAI,IAAK,CAAE,IAAK,EAAM,MAAO,CAAM,CAAC,EAAG,CAC9G,IAAK,CACP,CAAC,CACH,CAAC,CACH,CAEA,IAAI,EAAc,EAAiE,CACjF,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,EAAM,MAAQ,EAAa,KAExB,EAAK,EAAU,QAAS,EAAe,GAAW,EAAK,SAAS,IAAI,IAAK,CAAE,IAAK,EAAM,MAAO,CAAM,CAAC,EAAG,CAC5G,IAAK,CACP,CAAC,CACH,CAAC,CACH,CAEA,KAAK,EAAe,EAAmE,CACrF,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,EAAM,OAAS,EAAc,KAE1B,EACL,EAAU,eACV,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,EAAK,EAAU,UAAW,EAAe,GAAW,EAAK,SAAS,IAAI,SAAU,CAAE,IAAK,CAAE,CAAC,EAAG,CAAE,IAAK,CAAE,CAAC,CAC/G,CACH,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,MAAO,KAAK,WAAW,WAAW,EAAG,KAAM,KAAM,CACrF,CACF"}
|
package/dist/schemas/string.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../errors.cjs");require("../_dev.cjs");const t=require("../types.cjs"),n=require("../core.cjs"),r=require("../formats.cjs");var i=class i extends n.Schema{get _kind(){return`string`}
|
|
1
|
+
const e=require("../errors.cjs");require("../_dev.cjs");const t=require("../types.cjs"),n=require("../core.cjs"),r=require("../formats.cjs");var i=class i extends n.Schema{get _kind(){return`string`}constructor(){super((n,r)=>typeof n==`string`?null:e.fail(t.ErrorCode.invalid_type,r.messages.string.type()))}min(n,r){return this._addConstraint((i,a)=>i.length>=n?null:e.fail(t.ErrorCode.too_small,e.resolveMessage(r??a.messages.string.min,{min:n,value:i}),{min:n}),e=>{let t=e;return{...t,minLength:t.minLength===void 0?n:Math.max(t.minLength,n)}})}max(n,r){return this._addConstraint((i,a)=>i.length<=n?null:e.fail(t.ErrorCode.too_big,e.resolveMessage(r??a.messages.string.max,{max:n,value:i}),{max:n}),e=>{let t=e;return{...t,maxLength:t.maxLength===void 0?n:Math.min(t.maxLength,n)}})}length(n,r){return this._addConstraint((i,a)=>i.length===n?null:e.fail(t.ErrorCode.invalid_length,e.resolveMessage(r??a.messages.string.length,{exact:n,value:i}),{exact:n}),e=>({...e,maxLength:n,minLength:n}))}nonEmpty(n){return this._addConstraint((r,i)=>r.length>0?null:e.fail(t.ErrorCode.too_small,e.resolveMessage(n??i.messages.string.nonEmpty,{min:1,value:r}),{min:1}),e=>{let t=e;return{...t,minLength:Math.max(t.minLength??0,1)}})}startsWith(n,r){return this._addConstraint((i,a)=>i.startsWith(n)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(r??a.messages.string.startsWith,{prefix:n,value:i}),{prefix:n}))}endsWith(n,r){return this._addConstraint((i,a)=>i.endsWith(n)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(r??a.messages.string.endsWith,{suffix:n,value:i}),{suffix:n}))}includes(n,r){return this._addConstraint((i,a)=>i.includes(n)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(r??a.messages.string.includes,{substr:n,value:i}),{includes:n}))}regex(n,r){let i=new RegExp(n.source,n.flags.replace(/[gy]/g,``));return this._addConstraint((n,a)=>i.test(n)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(r??a.messages.string.regex,{value:n}),{pattern:i.source}),e=>{let t=e;return t.pattern===null?t:t.pattern===void 0?{...t,pattern:i.source}:t.pattern===i.source?t:{...t,pattern:null}})}email(n){return this._addConstraint((i,a)=>r.isEmail(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.email,{value:i}),{format:`email`}),e=>({...e,format:`email`}))}url(n={}){let{message:i,protocols:a=[`http`,`https`]}=n;return this._addConstraint((n,o)=>r.isUrl(n,a)?null:e.fail(t.ErrorCode.invalid_url,e.resolveMessage(i??o.messages.string.url,{value:n}),{format:`url`}),e=>({...e,format:`uri`}))}uuid(n){return this._addConstraint((i,a)=>r.isUuid(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.uuid,{value:i}),{format:`uuid`}),e=>({...e,format:`uuid`}))}isoDate(n){return this._addConstraint((i,a)=>r.isIsoDate(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.date,{value:i}),{format:`iso-date`}),e=>({...e,format:`date`}))}isoDateTime(n){return this._addConstraint((i,a)=>r.isIsoDateTime(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.dateTime,{value:i}),{format:`iso-datetime`}),e=>({...e,format:`date-time`}))}ip(n){return this._addConstraint((i,a)=>r.isIp(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.ip,{value:i}),{format:`ip`}))}cuid(n){return this._addConstraint((i,a)=>r.isCuid(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.cuid,{value:i}),{format:`cuid`}))}cuid2(n){return this._addConstraint((i,a)=>r.isCuid2(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.cuid2,{value:i}),{format:`cuid2`}))}ulid(n){return this._addConstraint((i,a)=>r.isUlid(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.ulid,{value:i}),{format:`ulid`}))}nanoid(n,i){return this._addConstraint((a,o)=>r.isNanoid(a,n)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(i??o.messages.string.nanoid,{value:a}),{format:`nanoid`}))}base64(n){return this._addConstraint((i,a)=>r.isBase64(i)?null:e.fail(t.ErrorCode.invalid_base64,e.resolveMessage(n??a.messages.string.base64,{value:i}),{format:`base64`}),e=>({...e,contentEncoding:`base64`}))}base64url(n){return this._addConstraint((i,a)=>r.isBase64url(i)?null:e.fail(t.ErrorCode.invalid_base64,e.resolveMessage(n??a.messages.string.base64url,{value:i}),{format:`base64url`}))}hex(n){return this._addConstraint((i,a)=>r.isHex(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.hex,{value:i}),{format:`hex`}))}hexColor(n){return this._addConstraint((i,a)=>r.isHexColor(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.hexColor,{value:i}),{format:`hex-color`}))}emoji(n){return this._addConstraint((i,a)=>r.isEmoji(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.emoji,{value:i}),{format:`emoji`}))}jwt(n){return this._addConstraint((i,a)=>r.isJwt(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.jwt,{value:i}),{format:`jwt`}))}time(n){return this._addConstraint((i,a)=>r.isTime(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.time,{value:i}),{format:`time`}))}duration(n){return this._addConstraint((i,a)=>r.isDuration(i)?null:e.fail(t.ErrorCode.invalid_duration,e.resolveMessage(n??a.messages.string.duration,{value:i}),{format:`duration`}),e=>({...e,format:`duration`}))}semver(n){return this._addConstraint((i,a)=>r.isSemver(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.semver,{value:i}),{format:`semver`}))}slug(n){return this._addConstraint((i,a)=>r.isSlug(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.slug,{value:i}),{format:`slug`}))}numeric(n){return this._addConstraint((i,a)=>r.isNumeric(i)?null:e.fail(t.ErrorCode.invalid_string,e.resolveMessage(n??a.messages.string.numeric,{value:i}),{format:`numeric`}))}trim(){return this.preprocess(e=>typeof e==`string`?e.trim():e)}lowercase(){return this.preprocess(e=>typeof e==`string`?e.toLowerCase():e)}uppercase(){return this.preprocess(e=>typeof e==`string`?e.toUpperCase():e)}_toDescriptorImpl(){let e=this._annotations;return{...this._describeBase(),...e.contentEncoding===void 0?{}:{contentEncoding:e.contentEncoding},...e.format===void 0?{}:{format:e.format},...e.maxLength===void 0?{}:{maxLength:e.maxLength},...e.minLength===void 0?{}:{minLength:e.minLength},...e.pattern===void 0?{}:{pattern:e.pattern},kind:`string`}}static coerce(){return new i().preprocess(e=>e==null?e:String(e))}};exports.StringSchema=i;
|
|
2
2
|
//# sourceMappingURL=string.cjs.map
|