@vielzeug/spell 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -0
- package/dist/_dev.cjs +2 -0
- package/dist/_dev.cjs.map +1 -0
- package/dist/_dev.d.ts +2 -0
- package/dist/_dev.d.ts.map +1 -0
- package/dist/_dev.js +2 -0
- package/dist/_dev.js.map +1 -0
- package/dist/core.cjs +2 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.ts +108 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +2 -0
- package/dist/core.js.map +1 -0
- package/dist/errors.cjs +3 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.ts +53 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +3 -0
- package/dist/errors.js.map +1 -0
- package/dist/formats.cjs +2 -0
- package/dist/formats.cjs.map +1 -0
- package/dist/formats.d.ts +41 -0
- package/dist/formats.d.ts.map +1 -0
- package/dist/formats.js +2 -0
- package/dist/formats.js.map +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/json-schema.cjs +2 -0
- package/dist/json-schema.cjs.map +1 -0
- package/dist/json-schema.d.ts +15 -0
- package/dist/json-schema.d.ts.map +1 -0
- package/dist/json-schema.js +2 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/messages.cjs +2 -0
- package/dist/messages.cjs.map +1 -0
- package/dist/messages.d.ts +228 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +2 -0
- package/dist/messages.js.map +1 -0
- package/dist/s.cjs +2 -0
- package/dist/s.cjs.map +1 -0
- package/dist/s.d.ts +65 -0
- package/dist/s.d.ts.map +1 -0
- package/dist/s.js +2 -0
- package/dist/s.js.map +1 -0
- package/dist/safe-object.cjs +2 -0
- package/dist/safe-object.cjs.map +1 -0
- package/dist/safe-object.d.ts +6 -0
- package/dist/safe-object.d.ts.map +1 -0
- package/dist/safe-object.js +2 -0
- package/dist/safe-object.js.map +1 -0
- package/dist/schemas/array.cjs +2 -0
- package/dist/schemas/array.cjs.map +1 -0
- package/dist/schemas/array.d.ts +49 -0
- package/dist/schemas/array.d.ts.map +1 -0
- package/dist/schemas/array.js +2 -0
- package/dist/schemas/array.js.map +1 -0
- package/dist/schemas/bigint.cjs +2 -0
- package/dist/schemas/bigint.cjs.map +1 -0
- package/dist/schemas/bigint.d.ts +42 -0
- package/dist/schemas/bigint.d.ts.map +1 -0
- package/dist/schemas/bigint.js +2 -0
- package/dist/schemas/bigint.js.map +1 -0
- package/dist/schemas/boolean.cjs +2 -0
- package/dist/schemas/boolean.cjs.map +1 -0
- package/dist/schemas/boolean.d.ts +18 -0
- package/dist/schemas/boolean.d.ts.map +1 -0
- package/dist/schemas/boolean.js +2 -0
- package/dist/schemas/boolean.js.map +1 -0
- package/dist/schemas/date.cjs +2 -0
- package/dist/schemas/date.cjs.map +1 -0
- package/dist/schemas/date.d.ts +25 -0
- package/dist/schemas/date.d.ts.map +1 -0
- package/dist/schemas/date.js +2 -0
- package/dist/schemas/date.js.map +1 -0
- package/dist/schemas/enum.cjs +2 -0
- package/dist/schemas/enum.cjs.map +1 -0
- package/dist/schemas/enum.d.ts +14 -0
- package/dist/schemas/enum.d.ts.map +1 -0
- package/dist/schemas/enum.js +2 -0
- package/dist/schemas/enum.js.map +1 -0
- package/dist/schemas/instanceof.cjs +2 -0
- package/dist/schemas/instanceof.cjs.map +1 -0
- package/dist/schemas/instanceof.d.ts +11 -0
- package/dist/schemas/instanceof.d.ts.map +1 -0
- package/dist/schemas/instanceof.js +2 -0
- package/dist/schemas/instanceof.js.map +1 -0
- package/dist/schemas/intersect.cjs +2 -0
- package/dist/schemas/intersect.cjs.map +1 -0
- package/dist/schemas/intersect.d.ts +16 -0
- package/dist/schemas/intersect.d.ts.map +1 -0
- package/dist/schemas/intersect.js +2 -0
- package/dist/schemas/intersect.js.map +1 -0
- package/dist/schemas/lazy.cjs +2 -0
- package/dist/schemas/lazy.cjs.map +1 -0
- package/dist/schemas/lazy.d.ts +16 -0
- package/dist/schemas/lazy.d.ts.map +1 -0
- package/dist/schemas/lazy.js +2 -0
- package/dist/schemas/lazy.js.map +1 -0
- package/dist/schemas/literal.cjs +2 -0
- package/dist/schemas/literal.cjs.map +1 -0
- package/dist/schemas/literal.d.ts +11 -0
- package/dist/schemas/literal.d.ts.map +1 -0
- package/dist/schemas/literal.js +2 -0
- package/dist/schemas/literal.js.map +1 -0
- package/dist/schemas/map.cjs +2 -0
- package/dist/schemas/map.cjs.map +1 -0
- package/dist/schemas/map.d.ts +29 -0
- package/dist/schemas/map.d.ts.map +1 -0
- package/dist/schemas/map.js +2 -0
- package/dist/schemas/map.js.map +1 -0
- package/dist/schemas/never.cjs +2 -0
- package/dist/schemas/never.cjs.map +1 -0
- package/dist/schemas/never.d.ts +10 -0
- package/dist/schemas/never.d.ts.map +1 -0
- package/dist/schemas/never.js +2 -0
- package/dist/schemas/never.js.map +1 -0
- package/dist/schemas/number.cjs +2 -0
- package/dist/schemas/number.cjs.map +1 -0
- package/dist/schemas/number.d.ts +50 -0
- package/dist/schemas/number.d.ts.map +1 -0
- package/dist/schemas/number.js +2 -0
- package/dist/schemas/number.js.map +1 -0
- package/dist/schemas/object.cjs +2 -0
- package/dist/schemas/object.cjs.map +1 -0
- package/dist/schemas/object.d.ts +95 -0
- package/dist/schemas/object.d.ts.map +1 -0
- package/dist/schemas/object.js +2 -0
- package/dist/schemas/object.js.map +1 -0
- package/dist/schemas/pipe.d.ts +2 -0
- package/dist/schemas/pipe.d.ts.map +1 -0
- package/dist/schemas/raw-or.cjs +2 -0
- package/dist/schemas/raw-or.cjs.map +1 -0
- package/dist/schemas/raw-or.d.ts +17 -0
- package/dist/schemas/raw-or.d.ts.map +1 -0
- package/dist/schemas/raw-or.js +2 -0
- package/dist/schemas/raw-or.js.map +1 -0
- package/dist/schemas/record.cjs +2 -0
- package/dist/schemas/record.cjs.map +1 -0
- package/dist/schemas/record.d.ts +16 -0
- package/dist/schemas/record.d.ts.map +1 -0
- package/dist/schemas/record.js +2 -0
- package/dist/schemas/record.js.map +1 -0
- package/dist/schemas/set.cjs +2 -0
- package/dist/schemas/set.cjs.map +1 -0
- package/dist/schemas/set.d.ts +28 -0
- package/dist/schemas/set.d.ts.map +1 -0
- package/dist/schemas/set.js +2 -0
- package/dist/schemas/set.js.map +1 -0
- package/dist/schemas/string.cjs +2 -0
- package/dist/schemas/string.cjs.map +1 -0
- package/dist/schemas/string.d.ts +155 -0
- package/dist/schemas/string.d.ts.map +1 -0
- package/dist/schemas/string.js +2 -0
- package/dist/schemas/string.js.map +1 -0
- package/dist/schemas/tuple.cjs +2 -0
- package/dist/schemas/tuple.cjs.map +1 -0
- package/dist/schemas/tuple.d.ts +22 -0
- package/dist/schemas/tuple.d.ts.map +1 -0
- package/dist/schemas/tuple.js +2 -0
- package/dist/schemas/tuple.js.map +1 -0
- package/dist/schemas/union.cjs +2 -0
- package/dist/schemas/union.cjs.map +1 -0
- package/dist/schemas/union.d.ts +13 -0
- package/dist/schemas/union.d.ts.map +1 -0
- package/dist/schemas/union.js +2 -0
- package/dist/schemas/union.js.map +1 -0
- package/dist/schemas/variant.cjs +2 -0
- package/dist/schemas/variant.cjs.map +1 -0
- package/dist/schemas/variant.d.ts +26 -0
- package/dist/schemas/variant.d.ts.map +1 -0
- package/dist/schemas/variant.js +2 -0
- package/dist/schemas/variant.js.map +1 -0
- package/dist/spell.cjs +3 -0
- package/dist/spell.cjs.map +1 -0
- package/dist/spell.iife.js +3 -0
- package/dist/spell.iife.js.map +1 -0
- package/dist/spell.js +3 -0
- package/dist/spell.js.map +1 -0
- package/dist/types.cjs +2 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.ts +326 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validators.cjs +2 -0
- package/dist/validators.cjs.map +1 -0
- package/dist/validators.d.ts +20 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +2 -0
- package/dist/validators.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-or.d.ts","sourceRoot":"","sources":["../../src/schemas/raw-or.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AACxE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,YAAY,CAAC;AACnD,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,CAAC,GAAG,CAAC,SAAS,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAC3G,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,SAAS,WAAW,EAAE,IAAI;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AAEhH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,SAAS,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAIhG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-or.js","names":[],"sources":["../../src/schemas/raw-or.ts"],"sourcesContent":["/**\n * Helpers for accepting raw literal values alongside schema instances in\n * sUnion() and sIntersect() arguments.\n *\n * Moved out of literal.ts — this infrastructure belongs to the combinator\n * entry points (s.ts), not to LiteralSchema.\n */\n\nimport type { AnySchema } from '../core';\n\nimport { Schema } from '../core';\nimport { LiteralSchema } from './literal';\n\nexport type LiteralValue = string | number | boolean | null | undefined;\nexport type RawOrSchema = AnySchema | LiteralValue;\nexport type NormalizeItem<T> = T extends AnySchema ? T : T extends LiteralValue ? LiteralSchema<T> : never;\nexport type NormalizeItems<T extends readonly RawOrSchema[]> = { readonly [K in keyof T]: NormalizeItem<T[K]> };\n\nexport function normalizeToSchemas<T extends readonly RawOrSchema[]>(items: T): NormalizeItems<T> {\n return items.map((item) =>\n item instanceof Schema ? item : new LiteralSchema(item as LiteralValue),\n ) as unknown as NormalizeItems<T>;\n}\n"],"mappings":"iFAkBA,SAAgB,EAAqD,EAA6B,CAChG,OAAO,EAAM,IAAK,GAChB,aAAgB,EAAS,EAAO,IAAI,EAAc,CAAoB,CACxE,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../safe-object.cjs");require("../messages.cjs");const r=require("../core.cjs");var i=class i extends r.Schema{keySchema;valueSchema;get _kind(){return`record`}constructor(e,t){super(),this.keySchema=e,this.valueSchema=t}_guardRecordInput(t,n){return typeof t!=`object`||!t||Array.isArray(t)?{issues:[{code:e.ErrorCode.invalid_type,message:n.messages.object.type(),path:[]}],ok:!1}:{ok:!0,value:t}}_parseRecordEntries(e,r){let i=[],a={};for(let o of Object.keys(e)){let s=this.keySchema._parseFullSync(o,r);if(s.issues.length>0){i.push(...t.prependIssuePath(s.issues,o));continue}let c=s.data;if(n.isUnsafeObjectKey(c))continue;let l=this.valueSchema._parseFullSync(e[o],r);l.issues.length===0?Object.defineProperty(a,c,{configurable:!0,enumerable:!0,value:l.data,writable:!0}):i.push(...t.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(e,i){let a=i??r._makeCtx();return this._withCatchAsync(async()=>{let r=this._prepareInput(e);if(r.skip)return r.value;let i=this._guardRecordInput(r.value,a);if(!i.ok)throw new t.SpellValidationError(i.issues);let o=i.value,s=Object.keys(o),c=await Promise.all(s.map(e=>Promise.all([this.keySchema._parseFullAsync(e,a),this.valueSchema._parseFullAsync(o[e],a)]))),l=[],u={};for(let e=0;e<s.length;e++){let r=s[e],[i,a]=c[e];if(i.issues.length>0){l.push(...t.prependIssuePath(i.issues,r));continue}let o=i.data;n.isUnsafeObjectKey(o)||(a.issues.length===0?Object.defineProperty(u,o,{configurable:!0,enumerable:!0,value:a.data,writable:!0}):l.push(...t.prependIssuePath(a.issues,r)))}let d=await this._runValidatorsAsync(u,a),f=[...l,...d];if(f.length>0)throw new t.SpellValidationError(f);return this._runPostprocessors(u)})}_toDescriptorImpl(){return{...this._describeBase(),key:this.keySchema.toDescriptor(),kind:`record`,value:this.valueSchema.toDescriptor()}}_walk(e){let t=this.keySchema.walk(e),n=this.valueSchema.walk(e);return e.record?e.record(this,t,n):super._walk(e)}_equalsImpl(e){return e instanceof i?this.keySchema.equals(e.keySchema)&&this.valueSchema.equals(e.valueSchema):!1}};exports.RecordSchema=i;
|
|
2
|
+
//# sourceMappingURL=record.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.cjs","names":[],"sources":["../../src/schemas/record.ts"],"sourcesContent":["import type { Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { _messages } from '../messages';\nimport { isUnsafeObjectKey } from '../safe-object';\n\nexport class RecordSchema<K extends string, V> extends Schema<Record<K, V>> {\n readonly keySchema: Schema<K, any>;\n readonly valueSchema: Schema<V, any>;\n\n protected override get _kind(): string {\n return 'record';\n }\n\n constructor(keySchema: Schema<K, any>, valueSchema: Schema<V, any>) {\n super();\n this.keySchema = keySchema;\n this.valueSchema = valueSchema;\n }\n\n 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 Object.defineProperty(output, parsedKey, {\n configurable: true,\n enumerable: true,\n value: valResult.data,\n writable: true,\n });\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 override async parseAsync(value: unknown, ctx?: ParseContext): Promise<Record<K, V>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as Record<K, V>;\n\n const guarded = this._guardRecordInput(prepared.value, c);\n\n if (!guarded.ok) throw new SpellValidationError(guarded.issues);\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, c), this.valueSchema._parseFullAsync(obj[key], c)]),\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 Object.defineProperty(output, parsedKey, {\n configurable: true,\n enumerable: true,\n value: valResult.data,\n writable: true,\n });\n } else {\n issues.push(...prependIssuePath(valResult.issues, key));\n }\n }\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 Record<K, V>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n key: this.keySchema.toDescriptor(),\n kind: 'record',\n value: this.valueSchema.toDescriptor(),\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const key = this.keySchema.walk(visitor);\n const value = this.valueSchema.walk(visitor);\n\n if (visitor.record) return visitor.record(this, key, value);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof RecordSchema)) return false;\n\n return this.keySchema.equals(other.keySchema) && this.valueSchema.equals(other.valueSchema);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ParseContext, ParseValue, SchemaDescriptor } from '../core';
|
|
2
|
+
import { Schema } from '../core';
|
|
3
|
+
export declare class RecordSchema<K extends string, V> extends Schema<Record<K, V>> {
|
|
4
|
+
readonly keySchema: Schema<K, any>;
|
|
5
|
+
readonly valueSchema: Schema<V, any>;
|
|
6
|
+
protected get _kind(): string;
|
|
7
|
+
constructor(keySchema: Schema<K, any>, valueSchema: Schema<V, any>);
|
|
8
|
+
private _guardRecordInput;
|
|
9
|
+
private _parseRecordEntries;
|
|
10
|
+
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
11
|
+
parseAsync(value: unknown, ctx?: ParseContext): Promise<Record<K, V>>;
|
|
12
|
+
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
13
|
+
protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
|
|
14
|
+
protected _equalsImpl(other: import('../core').AnySchema): boolean;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/schemas/record.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjF,OAAO,EAA+B,MAAM,EAAkC,MAAM,SAAS,CAAC;AAI9F,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,CAAE,SAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAErC,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC;IAMlE,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,mBAAmB;cAsCR,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IAUzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;cA2DjE,iBAAiB,IAAI,gBAAgB;cASrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAS9D,WAAW,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,SAAS,GAAG,OAAO;CAK5E"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorCode as e}from"../types.js";import{SpellValidationError as t,prependIssuePath as n}from"../errors.js";import{isUnsafeObjectKey as r}from"../safe-object.js";import"../messages.js";import{Schema as i,_makeCtx as a}from"../core.js";var o=class o extends i{keySchema;valueSchema;get _kind(){return`record`}constructor(e,t){super(),this.keySchema=e,this.valueSchema=t}_guardRecordInput(t,n){return typeof t!=`object`||!t||Array.isArray(t)?{issues:[{code:e.invalid_type,message:n.messages.object.type(),path:[]}],ok:!1}:{ok:!0,value:t}}_parseRecordEntries(e,t){let i=[],a={};for(let o of Object.keys(e)){let s=this.keySchema._parseFullSync(o,t);if(s.issues.length>0){i.push(...n(s.issues,o));continue}let c=s.data;if(r(c))continue;let l=this.valueSchema._parseFullSync(e[o],t);l.issues.length===0?Object.defineProperty(a,c,{configurable:!0,enumerable:!0,value:l.data,writable:!0}):i.push(...n(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(e,i){let o=i??a();return this._withCatchAsync(async()=>{let i=this._prepareInput(e);if(i.skip)return i.value;let a=this._guardRecordInput(i.value,o);if(!a.ok)throw new t(a.issues);let s=a.value,c=Object.keys(s),l=await Promise.all(c.map(e=>Promise.all([this.keySchema._parseFullAsync(e,o),this.valueSchema._parseFullAsync(s[e],o)]))),u=[],d={};for(let e=0;e<c.length;e++){let t=c[e],[i,a]=l[e];if(i.issues.length>0){u.push(...n(i.issues,t));continue}let o=i.data;r(o)||(a.issues.length===0?Object.defineProperty(d,o,{configurable:!0,enumerable:!0,value:a.data,writable:!0}):u.push(...n(a.issues,t)))}let f=await this._runValidatorsAsync(d,o),p=[...u,...f];if(p.length>0)throw new t(p);return this._runPostprocessors(d)})}_toDescriptorImpl(){return{...this._describeBase(),key:this.keySchema.toDescriptor(),kind:`record`,value:this.valueSchema.toDescriptor()}}_walk(e){let t=this.keySchema.walk(e),n=this.valueSchema.walk(e);return e.record?e.record(this,t,n):super._walk(e)}_equalsImpl(e){return e instanceof o?this.keySchema.equals(e.keySchema)&&this.valueSchema.equals(e.valueSchema):!1}};export{o as RecordSchema};
|
|
2
|
+
//# sourceMappingURL=record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.js","names":[],"sources":["../../src/schemas/record.ts"],"sourcesContent":["import type { Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { _messages } from '../messages';\nimport { isUnsafeObjectKey } from '../safe-object';\n\nexport class RecordSchema<K extends string, V> extends Schema<Record<K, V>> {\n readonly keySchema: Schema<K, any>;\n readonly valueSchema: Schema<V, any>;\n\n protected override get _kind(): string {\n return 'record';\n }\n\n constructor(keySchema: Schema<K, any>, valueSchema: Schema<V, any>) {\n super();\n this.keySchema = keySchema;\n this.valueSchema = valueSchema;\n }\n\n 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 Object.defineProperty(output, parsedKey, {\n configurable: true,\n enumerable: true,\n value: valResult.data,\n writable: true,\n });\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 override async parseAsync(value: unknown, ctx?: ParseContext): Promise<Record<K, V>> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as Record<K, V>;\n\n const guarded = this._guardRecordInput(prepared.value, c);\n\n if (!guarded.ok) throw new SpellValidationError(guarded.issues);\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, c), this.valueSchema._parseFullAsync(obj[key], c)]),\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 Object.defineProperty(output, parsedKey, {\n configurable: true,\n enumerable: true,\n value: valResult.data,\n writable: true,\n });\n } else {\n issues.push(...prependIssuePath(valResult.issues, key));\n }\n }\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 Record<K, V>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n key: this.keySchema.toDescriptor(),\n kind: 'record',\n value: this.valueSchema.toDescriptor(),\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const key = this.keySchema.walk(visitor);\n const value = this.valueSchema.walk(visitor);\n\n if (visitor.record) return visitor.record(this, key, value);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof RecordSchema)) return false;\n\n return this.keySchema.equals(other.keySchema) && this.valueSchema.equals(other.valueSchema);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../messages.cjs"),r=require("../core.cjs");var i=class i extends r.Schema{itemSchema;get _kind(){return`set`}constructor(e){super(),this.itemSchema=e}_parse(n,r){if(!(n instanceof Set))return{data:n,issues:[{code:e.ErrorCode.invalid_type,message:r.messages.set.type(),path:[]}],typeOk:!1};let i=[],a=new Set,o=0;for(let e of n){let n=this.itemSchema._parseFullSync(e,r);n.issues.length===0?a.add(n.data):i.push(...t.prependIssuePath(n.issues,o)),o+=1}return{data:a,issues:i,typeOk:!0}}async parseAsync(n,i){let a=i??r._makeCtx();return this._withCatchAsync(async()=>{let r=this._prepareInput(n);if(r.skip)return r.value;let i=r.value;if(!(i instanceof Set))throw new t.SpellValidationError([{code:e.ErrorCode.invalid_type,message:a.messages.set.type(),path:[]}]);let o=[...i],s=await Promise.all(o.map(e=>this.itemSchema._parseFullAsync(e,a))),c=[],l=new Set;for(let e=0;e<s.length;e++){let n=s[e];n.issues.length===0?l.add(n.data):c.push(...t.prependIssuePath(n.issues,e))}let u=await this._runValidatorsAsync(l,a),d=[...c,...u];if(d.length>0)throw new t.SpellValidationError(d);return this._runPostprocessors(l)})}min(r,i=e=>n._messages().set.min(e)){return this._addConstraint((n,a)=>{let o=n;return o.size>=r?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(i,{min:r,value:o}),{min:r})})}max(r,i=e=>n._messages().set.max(e)){return this._addConstraint((n,a)=>{let o=n;return o.size<=r?null:t.fail(e.ErrorCode.too_big,t.resolveMessage(i,{max:r,value:o}),{max:r})})}size(r,i=e=>n._messages().set.size(e)){return this._addConstraint((n,a)=>{let o=n;return o.size===r?null:t.fail(e.ErrorCode.invalid_length,t.resolveMessage(i,{exact:r,value:o}),{exact:r})})}nonEmpty(r=()=>n._messages().set.nonEmpty()){return this._addConstraint((n,i)=>n.size>0?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(r,{min:1}),{min:1}))}_toDescriptorImpl(){return{...this._describeBase(),items:this.itemSchema.toDescriptor(),kind:`set`}}_walk(e){let t=this.itemSchema.walk(e);return e.set?e.set(this,t):super._walk(e)}_equalsImpl(e){return e instanceof i?this.itemSchema.equals(e.itemSchema):!1}};exports.SetSchema=i;
|
|
2
|
+
//# sourceMappingURL=set.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.cjs","names":[],"sources":["../../src/schemas/set.ts"],"sourcesContent":["import type { Issue, MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { _messages } from '../messages';\n\nexport class SetSchema<T> extends Schema<Set<T>> {\n readonly itemSchema: Schema<T, any>;\n\n protected override get _kind(): string {\n return 'set';\n }\n\n constructor(itemSchema: Schema<T, any>) {\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<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 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 override async parseAsync(value: unknown, ctx?: ParseContext): Promise<Set<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 Set<T>;\n\n const raw = prepared.value;\n\n if (!(raw instanceof Set)) {\n throw new SpellValidationError([{ code: ErrorCode.invalid_type, message: c.messages.set.type(), path: [] }]);\n }\n\n const items = [...raw];\n const settled = await Promise.all(items.map((item) => this.itemSchema._parseFullAsync(item, c)));\n\n const issues: Issue[] = [];\n const parsed = new Set<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 T);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(parsed, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(parsed) as Set<T>;\n });\n }\n\n min(\n size: number,\n message: MessageFn<{ min: number; value: Set<unknown> }> = (ctx) => _messages().set.min(ctx),\n ): 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, { min: size, value: typed }), { min: size });\n });\n }\n\n max(\n size: number,\n message: MessageFn<{ max: number; value: Set<unknown> }> = (ctx) => _messages().set.max(ctx),\n ): 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, { max: size, value: typed }), { max: size });\n });\n }\n\n size(\n exact: number,\n message: MessageFn<{ exact: number; value: Set<unknown> }> = (ctx) => _messages().set.size(ctx),\n ): 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(ErrorCode.invalid_length, resolveMessage(message, { exact, value: typed }), { exact });\n });\n }\n\n nonEmpty(message: MessageFn<{ min: number }> = () => _messages().set.nonEmpty()): 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, { min: 1 }), { min: 1 });\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), items: this.itemSchema.toDescriptor(), kind: 'set' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const item = this.itemSchema.walk(visitor);\n\n if (visitor.set) return visitor.set(this, item);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof SetSchema)) return false;\n\n return this.itemSchema.equals(other.itemSchema);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';
|
|
2
|
+
import { Schema } from '../core';
|
|
3
|
+
export declare class SetSchema<T> extends Schema<Set<T>> {
|
|
4
|
+
readonly itemSchema: Schema<T, any>;
|
|
5
|
+
protected get _kind(): string;
|
|
6
|
+
constructor(itemSchema: Schema<T, any>);
|
|
7
|
+
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
8
|
+
parseAsync(value: unknown, ctx?: ParseContext): Promise<Set<T>>;
|
|
9
|
+
min(size: number, message?: MessageFn<{
|
|
10
|
+
min: number;
|
|
11
|
+
value: Set<unknown>;
|
|
12
|
+
}>): this;
|
|
13
|
+
max(size: number, message?: MessageFn<{
|
|
14
|
+
max: number;
|
|
15
|
+
value: Set<unknown>;
|
|
16
|
+
}>): this;
|
|
17
|
+
size(exact: number, message?: MessageFn<{
|
|
18
|
+
exact: number;
|
|
19
|
+
value: Set<unknown>;
|
|
20
|
+
}>): this;
|
|
21
|
+
nonEmpty(message?: MessageFn<{
|
|
22
|
+
min: number;
|
|
23
|
+
}>): this;
|
|
24
|
+
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
25
|
+
protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
|
|
26
|
+
protected _equalsImpl(other: import('../core').AnySchema): boolean;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../src/schemas/set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAqD,MAAM,EAAkC,MAAM,SAAS,CAAC;AAGpH,qBAAa,SAAS,CAAC,CAAC,CAAE,SAAQ,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEpC,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,UAAU,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC;cAKnB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IA4BzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAuC9E,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;KAAE,CAAqC,GAC3F,IAAI;IAUP,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;KAAE,CAAqC,GAC3F,IAAI;IAUP,IAAI,CACF,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;KAAE,CAAsC,GAC9F,IAAI;IAUP,QAAQ,CAAC,OAAO,GAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAoC,GAAG,IAAI;cAUnE,iBAAiB,IAAI,gBAAgB;cAIrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAQ9D,WAAW,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,SAAS,GAAG,OAAO;CAK5E"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorCode as e}from"../types.js";import{SpellValidationError as t,fail as n,prependIssuePath as r,resolveMessage as i}from"../errors.js";import{_messages as a}from"../messages.js";import{Schema as o,_makeCtx as s}from"../core.js";var c=class c extends o{itemSchema;get _kind(){return`set`}constructor(e){super(),this.itemSchema=e}_parse(t,n){if(!(t instanceof Set))return{data:t,issues:[{code:e.invalid_type,message:n.messages.set.type(),path:[]}],typeOk:!1};let i=[],a=new Set,o=0;for(let e of t){let t=this.itemSchema._parseFullSync(e,n);t.issues.length===0?a.add(t.data):i.push(...r(t.issues,o)),o+=1}return{data:a,issues:i,typeOk:!0}}async parseAsync(n,i){let a=i??s();return this._withCatchAsync(async()=>{let i=this._prepareInput(n);if(i.skip)return i.value;let o=i.value;if(!(o instanceof Set))throw new t([{code:e.invalid_type,message:a.messages.set.type(),path:[]}]);let s=[...o],c=await Promise.all(s.map(e=>this.itemSchema._parseFullAsync(e,a))),l=[],u=new Set;for(let e=0;e<c.length;e++){let t=c[e];t.issues.length===0?u.add(t.data):l.push(...r(t.issues,e))}let d=await this._runValidatorsAsync(u,a),f=[...l,...d];if(f.length>0)throw new t(f);return this._runPostprocessors(u)})}min(t,r=e=>a().set.min(e)){return this._addConstraint((a,o)=>{let s=a;return s.size>=t?null:n(e.too_small,i(r,{min:t,value:s}),{min:t})})}max(t,r=e=>a().set.max(e)){return this._addConstraint((a,o)=>{let s=a;return s.size<=t?null:n(e.too_big,i(r,{max:t,value:s}),{max:t})})}size(t,r=e=>a().set.size(e)){return this._addConstraint((a,o)=>{let s=a;return s.size===t?null:n(e.invalid_length,i(r,{exact:t,value:s}),{exact:t})})}nonEmpty(t=()=>a().set.nonEmpty()){return this._addConstraint((r,a)=>r.size>0?null:n(e.too_small,i(t,{min:1}),{min:1}))}_toDescriptorImpl(){return{...this._describeBase(),items:this.itemSchema.toDescriptor(),kind:`set`}}_walk(e){let t=this.itemSchema.walk(e);return e.set?e.set(this,t):super._walk(e)}_equalsImpl(e){return e instanceof c?this.itemSchema.equals(e.itemSchema):!1}};export{c as SetSchema};
|
|
2
|
+
//# sourceMappingURL=set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.js","names":[],"sources":["../../src/schemas/set.ts"],"sourcesContent":["import type { Issue, MessageFn, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { _messages } from '../messages';\n\nexport class SetSchema<T> extends Schema<Set<T>> {\n readonly itemSchema: Schema<T, any>;\n\n protected override get _kind(): string {\n return 'set';\n }\n\n constructor(itemSchema: Schema<T, any>) {\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<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 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 override async parseAsync(value: unknown, ctx?: ParseContext): Promise<Set<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 Set<T>;\n\n const raw = prepared.value;\n\n if (!(raw instanceof Set)) {\n throw new SpellValidationError([{ code: ErrorCode.invalid_type, message: c.messages.set.type(), path: [] }]);\n }\n\n const items = [...raw];\n const settled = await Promise.all(items.map((item) => this.itemSchema._parseFullAsync(item, c)));\n\n const issues: Issue[] = [];\n const parsed = new Set<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 T);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(parsed, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(parsed) as Set<T>;\n });\n }\n\n min(\n size: number,\n message: MessageFn<{ min: number; value: Set<unknown> }> = (ctx) => _messages().set.min(ctx),\n ): 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, { min: size, value: typed }), { min: size });\n });\n }\n\n max(\n size: number,\n message: MessageFn<{ max: number; value: Set<unknown> }> = (ctx) => _messages().set.max(ctx),\n ): 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, { max: size, value: typed }), { max: size });\n });\n }\n\n size(\n exact: number,\n message: MessageFn<{ exact: number; value: Set<unknown> }> = (ctx) => _messages().set.size(ctx),\n ): 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(ErrorCode.invalid_length, resolveMessage(message, { exact, value: typed }), { exact });\n });\n }\n\n nonEmpty(message: MessageFn<{ min: number }> = () => _messages().set.nonEmpty()): 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, { min: 1 }), { min: 1 });\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), items: this.itemSchema.toDescriptor(), kind: 'set' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const item = this.itemSchema.walk(visitor);\n\n if (visitor.set) return visitor.set(this, item);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof SetSchema)) return false;\n\n return this.itemSchema.equals(other.itemSchema);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../messages.cjs"),r=require("../core.cjs"),i=require("../formats.cjs");var a=class a extends r.Schema{get _kind(){return`string`}constructor(){super((r,i)=>typeof r==`string`?null:t.fail(e.ErrorCode.invalid_type,(i?.messages??n._messages()).string.type()))}min(r,i=e=>n._messages().string.min(e)){return this._addConstraint((n,a)=>n.length>=r?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(i,{min:r,value:n}),{min:r}),e=>{let t=e;return{...t,minLength:t.minLength===void 0?r:Math.max(t.minLength,r)}})}max(r,i=e=>n._messages().string.max(e)){return this._addConstraint((n,a)=>n.length<=r?null:t.fail(e.ErrorCode.too_big,t.resolveMessage(i,{max:r,value:n}),{max:r}),e=>{let t=e;return{...t,maxLength:t.maxLength===void 0?r:Math.min(t.maxLength,r)}})}length(r,i=e=>n._messages().string.length(e)){return this._addConstraint((n,a)=>n.length===r?null:t.fail(e.ErrorCode.invalid_length,t.resolveMessage(i,{exact:r,value:n}),{exact:r}),e=>({...e,maxLength:r,minLength:r}))}nonempty(e=()=>n._messages().string.nonEmpty()){return this.nonEmpty(e)}nonEmpty(r=()=>n._messages().string.nonEmpty()){return this._addConstraint((n,i)=>n.length>0?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(r,{min:1,value:n}),{min:1}),e=>{let t=e;return{...t,minLength:Math.max(t.minLength??0,1)}})}startsWith(r,i=e=>n._messages().string.startsWith(e)){return this._addConstraint((n,a)=>n.startsWith(r)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(i,{prefix:r,value:n}),{prefix:r}))}endsWith(r,i=e=>n._messages().string.endsWith(e)){return this._addConstraint((n,a)=>n.endsWith(r)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(i,{suffix:r,value:n}),{suffix:r}))}includes(r,i=e=>n._messages().string.includes(e)){return this._addConstraint((n,a)=>n.includes(r)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(i,{substr:r,value:n}),{includes:r}))}regex(r,i=e=>n._messages().string.regex(e)){let a=new RegExp(r.source,r.flags.replace(/[gy]/g,``));return this._addConstraint((n,r)=>a.test(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(i,{value:n}),{pattern:a.source}),e=>{let t=e;return t.pattern===null?t:t.pattern===void 0?{...t,pattern:a.source}:t.pattern===a.source?t:(n._dev("[spell] Multiple .regex() constraints detected on a single string schema. JSON Schema `pattern` cannot represent multiple patterns and will be omitted from toJsonSchema() output."),{...t,pattern:null})})}email(r=()=>n._messages().string.email()){return this._addConstraint((n,a)=>i.isEmail(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`email`}),e=>({...e,format:`email`}))}url(r={}){let{message:a=()=>n._messages().string.url(),protocols:o=[`http`,`https`]}=r;return this._addConstraint((n,r)=>i.isUrl(n,o)?null:t.fail(e.ErrorCode.invalid_url,t.resolveMessage(a,{value:n}),{format:`url`}),e=>({...e,format:`uri`}))}uuid(r=()=>n._messages().string.uuid()){return this._addConstraint((n,a)=>i.isUuid(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`uuid`}),e=>({...e,format:`uuid`}))}isoDate(r=()=>n._messages().string.date()){return this._addConstraint((n,a)=>i.isIsoDate(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`iso-date`}),e=>({...e,format:`date`}))}isoDateTime(r=()=>n._messages().string.dateTime()){return this._addConstraint((n,a)=>i.isIsoDateTime(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`iso-datetime`}),e=>({...e,format:`date-time`}))}ip(r=()=>n._messages().string.ip()){return this._addConstraint((n,a)=>i.isIp(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`ip`}))}cuid(r=()=>n._messages().string.cuid()){return this._addConstraint((n,a)=>i.isCuid(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`cuid`}))}cuid2(r=()=>n._messages().string.cuid2()){return this._addConstraint((n,a)=>i.isCuid2(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`cuid2`}))}ulid(r=()=>n._messages().string.ulid()){return this._addConstraint((n,a)=>i.isUlid(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`ulid`}))}nanoid(r,a=()=>n._messages().string.nanoid()){return this._addConstraint((n,o)=>i.isNanoid(n,r)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(a,{value:n}),{format:`nanoid`}))}base64(r=()=>n._messages().string.base64()){return this._addConstraint((n,a)=>i.isBase64(n)?null:t.fail(e.ErrorCode.invalid_base64,t.resolveMessage(r,{value:n}),{format:`base64`}),e=>({...e,contentEncoding:`base64`}))}base64url(r=()=>n._messages().string.base64url()){return this._addConstraint((n,a)=>i.isBase64url(n)?null:t.fail(e.ErrorCode.invalid_base64,t.resolveMessage(r,{value:n}),{format:`base64url`}))}hex(r=()=>n._messages().string.hex()){return this._addConstraint((n,a)=>i.isHex(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`hex`}))}hexColor(r=()=>n._messages().string.hexColor()){return this._addConstraint((n,a)=>i.isHexColor(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`hex-color`}))}emoji(r=()=>n._messages().string.emoji()){return this._addConstraint((n,a)=>i.isEmoji(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`emoji`}))}jwt(r=()=>n._messages().string.jwt()){return this._addConstraint((n,a)=>i.isJwt(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`jwt`}))}time(r=()=>n._messages().string.time()){return this._addConstraint((n,a)=>i.isTime(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`time`}))}duration(r=()=>n._messages().string.duration()){return this._addConstraint((n,a)=>i.isDuration(n)?null:t.fail(e.ErrorCode.invalid_duration,t.resolveMessage(r,{value:n}),{format:`duration`}),e=>({...e,format:`duration`}))}semver(r=()=>n._messages().string.semver()){return this._addConstraint((n,a)=>i.isSemver(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`semver`}))}slug(r=()=>n._messages().string.slug()){return this._addConstraint((n,a)=>i.isSlug(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`slug`}))}numeric(r=()=>n._messages().string.numeric()){return this._addConstraint((n,a)=>i.isNumeric(n)?null:t.fail(e.ErrorCode.invalid_string,t.resolveMessage(r,{value:n}),{format:`numeric`}))}coerce(){return a.coerce()}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)}_walk(e){return e.string?e.string(this):super._walk(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`}}_equalsImpl(e){return e instanceof a?this._annotationsEqual(e):!1}static coerce(){return new a().preprocess(e=>e==null?e:String(e))}};exports.StringSchema=a;
|
|
2
|
+
//# sourceMappingURL=string.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.cjs","names":[],"sources":["../../src/schemas/string.ts"],"sourcesContent":["import type { AnySchema, MessageFn, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\nimport {\n isBase64,\n isBase64url,\n isCuid,\n isCuid2,\n isDuration,\n isEmail,\n isEmoji,\n isHex,\n isHexColor,\n isIp,\n isIsoDate,\n isIsoDateTime,\n isJwt,\n isNanoid,\n isNumeric,\n isSemver,\n isSlug,\n isTime,\n isUlid,\n isUrl,\n isUuid,\n} from '../formats';\nimport { _messages, _dev } from '../messages';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface StringAnnotations extends Record<string, unknown> {\n contentEncoding?: string;\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string | null;\n}\n\ntype UrlOptions = {\n message?: MessageFn<{ value: string }>;\n protocols?: readonly string[];\n};\n\nexport class StringSchema<Input = string> extends Schema<string, Input> {\n protected override get _kind(): string {\n return 'string';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'string' ? null : fail(ErrorCode.invalid_type, (ctx?.messages ?? _messages()).string.type()),\n );\n }\n\n min(length: number, message: MessageFn<{ min: number; value: string }> = (ctx) => _messages().string.min(ctx)): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length >= length) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: length, value: value as string }), {\n min: length,\n });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n minLength: ann.minLength === undefined ? length : Math.max(ann.minLength, length),\n };\n },\n );\n }\n\n max(length: number, message: MessageFn<{ max: number; value: string }> = (ctx) => _messages().string.max(ctx)): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length <= length) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { max: length, value: value as string }), {\n max: length,\n });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n maxLength: ann.maxLength === undefined ? length : Math.min(ann.maxLength, length),\n };\n },\n );\n }\n\n length(\n exact: number,\n message: MessageFn<{ exact: number; value: string }> = (ctx) => _messages().string.length(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length === exact) return null;\n\n return fail(ErrorCode.invalid_length, resolveMessage(message, { exact, value: value as string }), { exact });\n },\n (ann) => ({ ...ann, maxLength: exact, minLength: exact }),\n );\n }\n\n /**\n * Alias for `.nonEmpty()` — validates that the string is not empty.\n * Provided for discoverability alongside `ArraySchema.nonEmpty()`.\n */\n nonempty(message: MessageFn<{ min: number; value: string }> = () => _messages().string.nonEmpty()): this {\n return this.nonEmpty(message);\n }\n\n nonEmpty(message: MessageFn<{ min: number; value: string }> = () => _messages().string.nonEmpty()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length > 0) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: 1, value: value as string }), { min: 1 });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return { ...ann, minLength: Math.max(ann.minLength ?? 0, 1) };\n },\n );\n }\n\n startsWith(\n prefix: string,\n message: MessageFn<{ prefix: string; value: string }> = (ctx) => _messages().string.startsWith(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n if ((value as string).startsWith(prefix)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { prefix, value: value as string }), { prefix });\n });\n }\n\n endsWith(\n suffix: string,\n message: MessageFn<{ suffix: string; value: string }> = (ctx) => _messages().string.endsWith(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n if ((value as string).endsWith(suffix)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { suffix, value: value as string }), { suffix });\n });\n }\n\n includes(\n substr: string,\n message: MessageFn<{ substr: string; value: string }> = (ctx) => _messages().string.includes(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n if ((value as string).includes(substr)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { substr, value: value as string }), {\n includes: substr,\n });\n });\n }\n\n /**\n * Validates that the string matches the given regular expression.\n *\n * **Security note:** Stateful `/g` and `/y` flags are stripped automatically to prevent\n * `lastIndex`-based bugs. However, caller-supplied patterns with catastrophic backtracking\n * (e.g. `/(a+)+$/`) are a ReDoS risk when validating untrusted input in server-side contexts.\n * Prefer well-tested, bounded patterns for user-facing validation.\n *\n * **`.equals()` note:** `.equals()` only compares descriptor-level annotations, never runtime\n * validator behavior. Chaining more than one `.regex()` collapses the descriptor `pattern` to\n * `null` (ambiguous), so two schemas with *different* pairs of regexes can compare equal even\n * though they accept different strings. This mirrors `.equals()`'s general limitation of\n * ignoring custom `.validate()`/`.refine()` logic — avoid relying on `.equals()` for schemas\n * with more than one `.regex()` constraint.\n */\n regex(pattern: RegExp, message: MessageFn<{ value: string }> = (ctx) => _messages().string.regex(ctx)): this {\n const safePattern = new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, ''));\n\n return this._addConstraint(\n (value, _ctx) => {\n // Caller-supplied regexes still run against untrusted strings; spell can\n // neutralize stateful /g and /y flags but cannot make arbitrary patterns\n // immune to catastrophic backtracking without breaking the API.\n if (safePattern.test(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n pattern: safePattern.source,\n });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n if (ann.pattern === null) return ann; // already ambiguous\n\n if (ann.pattern === undefined) return { ...ann, pattern: safePattern.source };\n\n if (ann.pattern !== safePattern.source) {\n _dev(\n '[spell] Multiple .regex() constraints detected on a single string schema. ' +\n 'JSON Schema `pattern` cannot represent multiple patterns and will be omitted from toJsonSchema() output.',\n );\n\n return { ...ann, pattern: null };\n }\n\n return ann;\n },\n );\n }\n\n email(message: MessageFn<{ value: string }> = () => _messages().string.email()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isEmail(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'email' });\n },\n (ann) => ({ ...ann, format: 'email' }),\n );\n }\n\n url(options: UrlOptions = {}): this {\n const { message = () => _messages().string.url(), protocols = ['http', 'https'] } = options;\n\n return this._addConstraint(\n (value, _ctx) => {\n if (isUrl(value as string, protocols)) return null;\n\n return fail(ErrorCode.invalid_url, resolveMessage(message, { value: value as string }), { format: 'url' });\n },\n (ann) => ({ ...ann, format: 'uri' }),\n );\n }\n\n uuid(message: MessageFn<{ value: string }> = () => _messages().string.uuid()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isUuid(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'uuid' });\n },\n (ann) => ({ ...ann, format: 'uuid' }),\n );\n }\n\n isoDate(message: MessageFn<{ value: string }> = () => _messages().string.date()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isIsoDate(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n format: 'iso-date',\n });\n },\n (ann) => ({ ...ann, format: 'date' }),\n );\n }\n\n isoDateTime(message: MessageFn<{ value: string }> = () => _messages().string.dateTime()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isIsoDateTime(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n format: 'iso-datetime',\n });\n },\n (ann) => ({ ...ann, format: 'date-time' }),\n );\n }\n\n ip(message: MessageFn<{ value: string }> = () => _messages().string.ip()): this {\n return this._addConstraint((value, _ctx) => {\n if (isIp(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'ip' });\n });\n }\n\n cuid(message: MessageFn<{ value: string }> = () => _messages().string.cuid()): this {\n return this._addConstraint((value, _ctx) => {\n if (isCuid(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'cuid' });\n });\n }\n\n cuid2(message: MessageFn<{ value: string }> = () => _messages().string.cuid2()): this {\n return this._addConstraint((value, _ctx) => {\n if (isCuid2(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'cuid2' });\n });\n }\n\n ulid(message: MessageFn<{ value: string }> = () => _messages().string.ulid()): this {\n return this._addConstraint((value, _ctx) => {\n if (isUlid(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'ulid' });\n });\n }\n\n nanoid(length?: number, message: MessageFn<{ value: string }> = () => _messages().string.nanoid()): this {\n return this._addConstraint((value, _ctx) => {\n if (isNanoid(value as string, length)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'nanoid' });\n });\n }\n\n base64(message: MessageFn<{ value: string }> = () => _messages().string.base64()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isBase64(value as string)) return null;\n\n return fail(ErrorCode.invalid_base64, resolveMessage(message, { value: value as string }), {\n format: 'base64',\n });\n },\n (ann) => ({ ...ann, contentEncoding: 'base64' }),\n );\n }\n\n base64url(message: MessageFn<{ value: string }> = () => _messages().string.base64url()): this {\n return this._addConstraint((value, _ctx) => {\n if (isBase64url(value as string)) return null;\n\n return fail(ErrorCode.invalid_base64, resolveMessage(message, { value: value as string }), {\n format: 'base64url',\n });\n });\n }\n\n hex(message: MessageFn<{ value: string }> = () => _messages().string.hex()): this {\n return this._addConstraint((value, _ctx) => {\n if (isHex(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'hex' });\n });\n }\n\n hexColor(message: MessageFn<{ value: string }> = () => _messages().string.hexColor()): this {\n return this._addConstraint((value, _ctx) => {\n if (isHexColor(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n format: 'hex-color',\n });\n });\n }\n\n emoji(message: MessageFn<{ value: string }> = () => _messages().string.emoji()): this {\n return this._addConstraint((value, _ctx) => {\n if (isEmoji(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'emoji' });\n });\n }\n\n jwt(message: MessageFn<{ value: string }> = () => _messages().string.jwt()): this {\n return this._addConstraint((value, _ctx) => {\n if (isJwt(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'jwt' });\n });\n }\n\n time(message: MessageFn<{ value: string }> = () => _messages().string.time()): this {\n return this._addConstraint((value, _ctx) => {\n if (isTime(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'time' });\n });\n }\n\n duration(message: MessageFn<{ value: string }> = () => _messages().string.duration()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isDuration(value as string)) return null;\n\n return fail(ErrorCode.invalid_duration, resolveMessage(message, { value: value as string }), {\n format: 'duration',\n });\n },\n (ann) => ({ ...ann, format: 'duration' }),\n );\n }\n\n semver(message: MessageFn<{ value: string }> = () => _messages().string.semver()): this {\n return this._addConstraint((value, _ctx) => {\n if (isSemver(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'semver' });\n });\n }\n\n slug(message: MessageFn<{ value: string }> = () => _messages().string.slug()): this {\n return this._addConstraint((value, _ctx) => {\n if (isSlug(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'slug' });\n });\n }\n\n numeric(message: MessageFn<{ value: string }> = () => _messages().string.numeric()): this {\n return this._addConstraint((value, _ctx) => {\n if (isNumeric(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'numeric' });\n });\n }\n\n /**\n * Returns a new schema that coerces the input to a string via `String(value)` before validation.\n * `null` and `undefined` are passed through unchanged.\n *\n * Equivalent to `s.coerce.string()`.\n */\n coerce(): StringSchema<unknown> {\n return StringSchema.coerce();\n }\n\n /**\n * **Note:** `trim()` adds a preprocessor. Preprocessors are not serializable —\n * `toDescriptor()` will warn if preprocessors are present.\n */\n trim(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.trim() : v));\n }\n\n /**\n * **Note:** `lowercase()` adds a preprocessor. Preprocessors are not serializable —\n * `toDescriptor()` will warn if preprocessors are present.\n */\n lowercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toLowerCase() : v));\n }\n\n /**\n * **Note:** `uppercase()` adds a preprocessor. Preprocessors are not serializable —\n * `toDescriptor()` will warn if preprocessors are present.\n */\n uppercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toUpperCase() : v));\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n if (visitor.string) return visitor.string(this);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as StringAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.contentEncoding !== undefined ? { contentEncoding: ann.contentEncoding } : {}),\n ...(ann.format !== undefined ? { format: ann.format } : {}),\n ...(ann.maxLength !== undefined ? { maxLength: ann.maxLength } : {}),\n ...(ann.minLength !== undefined ? { minLength: ann.minLength } : {}),\n ...(ann.pattern !== undefined ? { pattern: ann.pattern } : {}),\n kind: 'string',\n };\n }\n\n protected override _equalsImpl(other: AnySchema): boolean {\n if (!(other instanceof StringSchema)) return false;\n\n return this._annotationsEqual(other);\n }\n\n static coerce(): StringSchema<unknown> {\n return new StringSchema().preprocess((v: unknown) => (v == null ? v : String(v)));\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { AnySchema, MessageFn, SchemaDescriptor } from '../core';
|
|
2
|
+
import { Schema } from '../core';
|
|
3
|
+
type UrlOptions = {
|
|
4
|
+
message?: MessageFn<{
|
|
5
|
+
value: string;
|
|
6
|
+
}>;
|
|
7
|
+
protocols?: readonly string[];
|
|
8
|
+
};
|
|
9
|
+
export declare class StringSchema<Input = string> extends Schema<string, Input> {
|
|
10
|
+
protected get _kind(): string;
|
|
11
|
+
constructor();
|
|
12
|
+
min(length: number, message?: MessageFn<{
|
|
13
|
+
min: number;
|
|
14
|
+
value: string;
|
|
15
|
+
}>): this;
|
|
16
|
+
max(length: number, message?: MessageFn<{
|
|
17
|
+
max: number;
|
|
18
|
+
value: string;
|
|
19
|
+
}>): this;
|
|
20
|
+
length(exact: number, message?: MessageFn<{
|
|
21
|
+
exact: number;
|
|
22
|
+
value: string;
|
|
23
|
+
}>): this;
|
|
24
|
+
/**
|
|
25
|
+
* Alias for `.nonEmpty()` — validates that the string is not empty.
|
|
26
|
+
* Provided for discoverability alongside `ArraySchema.nonEmpty()`.
|
|
27
|
+
*/
|
|
28
|
+
nonempty(message?: MessageFn<{
|
|
29
|
+
min: number;
|
|
30
|
+
value: string;
|
|
31
|
+
}>): this;
|
|
32
|
+
nonEmpty(message?: MessageFn<{
|
|
33
|
+
min: number;
|
|
34
|
+
value: string;
|
|
35
|
+
}>): this;
|
|
36
|
+
startsWith(prefix: string, message?: MessageFn<{
|
|
37
|
+
prefix: string;
|
|
38
|
+
value: string;
|
|
39
|
+
}>): this;
|
|
40
|
+
endsWith(suffix: string, message?: MessageFn<{
|
|
41
|
+
suffix: string;
|
|
42
|
+
value: string;
|
|
43
|
+
}>): this;
|
|
44
|
+
includes(substr: string, message?: MessageFn<{
|
|
45
|
+
substr: string;
|
|
46
|
+
value: string;
|
|
47
|
+
}>): this;
|
|
48
|
+
/**
|
|
49
|
+
* Validates that the string matches the given regular expression.
|
|
50
|
+
*
|
|
51
|
+
* **Security note:** Stateful `/g` and `/y` flags are stripped automatically to prevent
|
|
52
|
+
* `lastIndex`-based bugs. However, caller-supplied patterns with catastrophic backtracking
|
|
53
|
+
* (e.g. `/(a+)+$/`) are a ReDoS risk when validating untrusted input in server-side contexts.
|
|
54
|
+
* Prefer well-tested, bounded patterns for user-facing validation.
|
|
55
|
+
*
|
|
56
|
+
* **`.equals()` note:** `.equals()` only compares descriptor-level annotations, never runtime
|
|
57
|
+
* validator behavior. Chaining more than one `.regex()` collapses the descriptor `pattern` to
|
|
58
|
+
* `null` (ambiguous), so two schemas with *different* pairs of regexes can compare equal even
|
|
59
|
+
* though they accept different strings. This mirrors `.equals()`'s general limitation of
|
|
60
|
+
* ignoring custom `.validate()`/`.refine()` logic — avoid relying on `.equals()` for schemas
|
|
61
|
+
* with more than one `.regex()` constraint.
|
|
62
|
+
*/
|
|
63
|
+
regex(pattern: RegExp, message?: MessageFn<{
|
|
64
|
+
value: string;
|
|
65
|
+
}>): this;
|
|
66
|
+
email(message?: MessageFn<{
|
|
67
|
+
value: string;
|
|
68
|
+
}>): this;
|
|
69
|
+
url(options?: UrlOptions): this;
|
|
70
|
+
uuid(message?: MessageFn<{
|
|
71
|
+
value: string;
|
|
72
|
+
}>): this;
|
|
73
|
+
isoDate(message?: MessageFn<{
|
|
74
|
+
value: string;
|
|
75
|
+
}>): this;
|
|
76
|
+
isoDateTime(message?: MessageFn<{
|
|
77
|
+
value: string;
|
|
78
|
+
}>): this;
|
|
79
|
+
ip(message?: MessageFn<{
|
|
80
|
+
value: string;
|
|
81
|
+
}>): this;
|
|
82
|
+
cuid(message?: MessageFn<{
|
|
83
|
+
value: string;
|
|
84
|
+
}>): this;
|
|
85
|
+
cuid2(message?: MessageFn<{
|
|
86
|
+
value: string;
|
|
87
|
+
}>): this;
|
|
88
|
+
ulid(message?: MessageFn<{
|
|
89
|
+
value: string;
|
|
90
|
+
}>): this;
|
|
91
|
+
nanoid(length?: number, message?: MessageFn<{
|
|
92
|
+
value: string;
|
|
93
|
+
}>): this;
|
|
94
|
+
base64(message?: MessageFn<{
|
|
95
|
+
value: string;
|
|
96
|
+
}>): this;
|
|
97
|
+
base64url(message?: MessageFn<{
|
|
98
|
+
value: string;
|
|
99
|
+
}>): this;
|
|
100
|
+
hex(message?: MessageFn<{
|
|
101
|
+
value: string;
|
|
102
|
+
}>): this;
|
|
103
|
+
hexColor(message?: MessageFn<{
|
|
104
|
+
value: string;
|
|
105
|
+
}>): this;
|
|
106
|
+
emoji(message?: MessageFn<{
|
|
107
|
+
value: string;
|
|
108
|
+
}>): this;
|
|
109
|
+
jwt(message?: MessageFn<{
|
|
110
|
+
value: string;
|
|
111
|
+
}>): this;
|
|
112
|
+
time(message?: MessageFn<{
|
|
113
|
+
value: string;
|
|
114
|
+
}>): this;
|
|
115
|
+
duration(message?: MessageFn<{
|
|
116
|
+
value: string;
|
|
117
|
+
}>): this;
|
|
118
|
+
semver(message?: MessageFn<{
|
|
119
|
+
value: string;
|
|
120
|
+
}>): this;
|
|
121
|
+
slug(message?: MessageFn<{
|
|
122
|
+
value: string;
|
|
123
|
+
}>): this;
|
|
124
|
+
numeric(message?: MessageFn<{
|
|
125
|
+
value: string;
|
|
126
|
+
}>): this;
|
|
127
|
+
/**
|
|
128
|
+
* Returns a new schema that coerces the input to a string via `String(value)` before validation.
|
|
129
|
+
* `null` and `undefined` are passed through unchanged.
|
|
130
|
+
*
|
|
131
|
+
* Equivalent to `s.coerce.string()`.
|
|
132
|
+
*/
|
|
133
|
+
coerce(): StringSchema<unknown>;
|
|
134
|
+
/**
|
|
135
|
+
* **Note:** `trim()` adds a preprocessor. Preprocessors are not serializable —
|
|
136
|
+
* `toDescriptor()` will warn if preprocessors are present.
|
|
137
|
+
*/
|
|
138
|
+
trim(): this;
|
|
139
|
+
/**
|
|
140
|
+
* **Note:** `lowercase()` adds a preprocessor. Preprocessors are not serializable —
|
|
141
|
+
* `toDescriptor()` will warn if preprocessors are present.
|
|
142
|
+
*/
|
|
143
|
+
lowercase(): this;
|
|
144
|
+
/**
|
|
145
|
+
* **Note:** `uppercase()` adds a preprocessor. Preprocessors are not serializable —
|
|
146
|
+
* `toDescriptor()` will warn if preprocessors are present.
|
|
147
|
+
*/
|
|
148
|
+
uppercase(): this;
|
|
149
|
+
protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
|
|
150
|
+
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
151
|
+
protected _equalsImpl(other: AnySchema): boolean;
|
|
152
|
+
static coerce(): StringSchema<unknown>;
|
|
153
|
+
}
|
|
154
|
+
export {};
|
|
155
|
+
//# sourceMappingURL=string.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/schemas/string.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorCode as e}from"../types.js";import{fail as t,resolveMessage as n}from"../errors.js";import{_dev as r,_messages as i}from"../messages.js";import{Schema as a}from"../core.js";import{isBase64 as o,isBase64url as s,isCuid as c,isCuid2 as l,isDuration as u,isEmail as d,isEmoji as f,isHex as p,isHexColor as m,isIp as h,isIsoDate as g,isIsoDateTime as _,isJwt as v,isNanoid as y,isNumeric as b,isSemver as x,isSlug as S,isTime as C,isUlid as w,isUrl as T,isUuid as E}from"../formats.js";var D=class D extends a{get _kind(){return`string`}constructor(){super((n,r)=>typeof n==`string`?null:t(e.invalid_type,(r?.messages??i()).string.type()))}min(r,a=e=>i().string.min(e)){return this._addConstraint((i,o)=>i.length>=r?null:t(e.too_small,n(a,{min:r,value:i}),{min:r}),e=>{let t=e;return{...t,minLength:t.minLength===void 0?r:Math.max(t.minLength,r)}})}max(r,a=e=>i().string.max(e)){return this._addConstraint((i,o)=>i.length<=r?null:t(e.too_big,n(a,{max:r,value:i}),{max:r}),e=>{let t=e;return{...t,maxLength:t.maxLength===void 0?r:Math.min(t.maxLength,r)}})}length(r,a=e=>i().string.length(e)){return this._addConstraint((i,o)=>i.length===r?null:t(e.invalid_length,n(a,{exact:r,value:i}),{exact:r}),e=>({...e,maxLength:r,minLength:r}))}nonempty(e=()=>i().string.nonEmpty()){return this.nonEmpty(e)}nonEmpty(r=()=>i().string.nonEmpty()){return this._addConstraint((i,a)=>i.length>0?null:t(e.too_small,n(r,{min:1,value:i}),{min:1}),e=>{let t=e;return{...t,minLength:Math.max(t.minLength??0,1)}})}startsWith(r,a=e=>i().string.startsWith(e)){return this._addConstraint((i,o)=>i.startsWith(r)?null:t(e.invalid_string,n(a,{prefix:r,value:i}),{prefix:r}))}endsWith(r,a=e=>i().string.endsWith(e)){return this._addConstraint((i,o)=>i.endsWith(r)?null:t(e.invalid_string,n(a,{suffix:r,value:i}),{suffix:r}))}includes(r,a=e=>i().string.includes(e)){return this._addConstraint((i,o)=>i.includes(r)?null:t(e.invalid_string,n(a,{substr:r,value:i}),{includes:r}))}regex(a,o=e=>i().string.regex(e)){let s=new RegExp(a.source,a.flags.replace(/[gy]/g,``));return this._addConstraint((r,i)=>s.test(r)?null:t(e.invalid_string,n(o,{value:r}),{pattern:s.source}),e=>{let t=e;return t.pattern===null?t:t.pattern===void 0?{...t,pattern:s.source}:t.pattern===s.source?t:(r("[spell] Multiple .regex() constraints detected on a single string schema. JSON Schema `pattern` cannot represent multiple patterns and will be omitted from toJsonSchema() output."),{...t,pattern:null})})}email(r=()=>i().string.email()){return this._addConstraint((i,a)=>d(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`email`}),e=>({...e,format:`email`}))}url(r={}){let{message:a=()=>i().string.url(),protocols:o=[`http`,`https`]}=r;return this._addConstraint((r,i)=>T(r,o)?null:t(e.invalid_url,n(a,{value:r}),{format:`url`}),e=>({...e,format:`uri`}))}uuid(r=()=>i().string.uuid()){return this._addConstraint((i,a)=>E(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`uuid`}),e=>({...e,format:`uuid`}))}isoDate(r=()=>i().string.date()){return this._addConstraint((i,a)=>g(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`iso-date`}),e=>({...e,format:`date`}))}isoDateTime(r=()=>i().string.dateTime()){return this._addConstraint((i,a)=>_(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`iso-datetime`}),e=>({...e,format:`date-time`}))}ip(r=()=>i().string.ip()){return this._addConstraint((i,a)=>h(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`ip`}))}cuid(r=()=>i().string.cuid()){return this._addConstraint((i,a)=>c(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`cuid`}))}cuid2(r=()=>i().string.cuid2()){return this._addConstraint((i,a)=>l(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`cuid2`}))}ulid(r=()=>i().string.ulid()){return this._addConstraint((i,a)=>w(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`ulid`}))}nanoid(r,a=()=>i().string.nanoid()){return this._addConstraint((i,o)=>y(i,r)?null:t(e.invalid_string,n(a,{value:i}),{format:`nanoid`}))}base64(r=()=>i().string.base64()){return this._addConstraint((i,a)=>o(i)?null:t(e.invalid_base64,n(r,{value:i}),{format:`base64`}),e=>({...e,contentEncoding:`base64`}))}base64url(r=()=>i().string.base64url()){return this._addConstraint((i,a)=>s(i)?null:t(e.invalid_base64,n(r,{value:i}),{format:`base64url`}))}hex(r=()=>i().string.hex()){return this._addConstraint((i,a)=>p(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`hex`}))}hexColor(r=()=>i().string.hexColor()){return this._addConstraint((i,a)=>m(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`hex-color`}))}emoji(r=()=>i().string.emoji()){return this._addConstraint((i,a)=>f(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`emoji`}))}jwt(r=()=>i().string.jwt()){return this._addConstraint((i,a)=>v(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`jwt`}))}time(r=()=>i().string.time()){return this._addConstraint((i,a)=>C(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`time`}))}duration(r=()=>i().string.duration()){return this._addConstraint((i,a)=>u(i)?null:t(e.invalid_duration,n(r,{value:i}),{format:`duration`}),e=>({...e,format:`duration`}))}semver(r=()=>i().string.semver()){return this._addConstraint((i,a)=>x(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`semver`}))}slug(r=()=>i().string.slug()){return this._addConstraint((i,a)=>S(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`slug`}))}numeric(r=()=>i().string.numeric()){return this._addConstraint((i,a)=>b(i)?null:t(e.invalid_string,n(r,{value:i}),{format:`numeric`}))}coerce(){return D.coerce()}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)}_walk(e){return e.string?e.string(this):super._walk(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`}}_equalsImpl(e){return e instanceof D?this._annotationsEqual(e):!1}static coerce(){return new D().preprocess(e=>e==null?e:String(e))}};export{D as StringSchema};
|
|
2
|
+
//# sourceMappingURL=string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.js","names":[],"sources":["../../src/schemas/string.ts"],"sourcesContent":["import type { AnySchema, MessageFn, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\nimport {\n isBase64,\n isBase64url,\n isCuid,\n isCuid2,\n isDuration,\n isEmail,\n isEmoji,\n isHex,\n isHexColor,\n isIp,\n isIsoDate,\n isIsoDateTime,\n isJwt,\n isNanoid,\n isNumeric,\n isSemver,\n isSlug,\n isTime,\n isUlid,\n isUrl,\n isUuid,\n} from '../formats';\nimport { _messages, _dev } from '../messages';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface StringAnnotations extends Record<string, unknown> {\n contentEncoding?: string;\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string | null;\n}\n\ntype UrlOptions = {\n message?: MessageFn<{ value: string }>;\n protocols?: readonly string[];\n};\n\nexport class StringSchema<Input = string> extends Schema<string, Input> {\n protected override get _kind(): string {\n return 'string';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'string' ? null : fail(ErrorCode.invalid_type, (ctx?.messages ?? _messages()).string.type()),\n );\n }\n\n min(length: number, message: MessageFn<{ min: number; value: string }> = (ctx) => _messages().string.min(ctx)): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length >= length) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: length, value: value as string }), {\n min: length,\n });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n minLength: ann.minLength === undefined ? length : Math.max(ann.minLength, length),\n };\n },\n );\n }\n\n max(length: number, message: MessageFn<{ max: number; value: string }> = (ctx) => _messages().string.max(ctx)): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length <= length) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message, { max: length, value: value as string }), {\n max: length,\n });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n maxLength: ann.maxLength === undefined ? length : Math.min(ann.maxLength, length),\n };\n },\n );\n }\n\n length(\n exact: number,\n message: MessageFn<{ exact: number; value: string }> = (ctx) => _messages().string.length(ctx),\n ): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length === exact) return null;\n\n return fail(ErrorCode.invalid_length, resolveMessage(message, { exact, value: value as string }), { exact });\n },\n (ann) => ({ ...ann, maxLength: exact, minLength: exact }),\n );\n }\n\n /**\n * Alias for `.nonEmpty()` — validates that the string is not empty.\n * Provided for discoverability alongside `ArraySchema.nonEmpty()`.\n */\n nonempty(message: MessageFn<{ min: number; value: string }> = () => _messages().string.nonEmpty()): this {\n return this.nonEmpty(message);\n }\n\n nonEmpty(message: MessageFn<{ min: number; value: string }> = () => _messages().string.nonEmpty()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if ((value as string).length > 0) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message, { min: 1, value: value as string }), { min: 1 });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return { ...ann, minLength: Math.max(ann.minLength ?? 0, 1) };\n },\n );\n }\n\n startsWith(\n prefix: string,\n message: MessageFn<{ prefix: string; value: string }> = (ctx) => _messages().string.startsWith(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n if ((value as string).startsWith(prefix)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { prefix, value: value as string }), { prefix });\n });\n }\n\n endsWith(\n suffix: string,\n message: MessageFn<{ suffix: string; value: string }> = (ctx) => _messages().string.endsWith(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n if ((value as string).endsWith(suffix)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { suffix, value: value as string }), { suffix });\n });\n }\n\n includes(\n substr: string,\n message: MessageFn<{ substr: string; value: string }> = (ctx) => _messages().string.includes(ctx),\n ): this {\n return this._addConstraint((value, _ctx) => {\n if ((value as string).includes(substr)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { substr, value: value as string }), {\n includes: substr,\n });\n });\n }\n\n /**\n * Validates that the string matches the given regular expression.\n *\n * **Security note:** Stateful `/g` and `/y` flags are stripped automatically to prevent\n * `lastIndex`-based bugs. However, caller-supplied patterns with catastrophic backtracking\n * (e.g. `/(a+)+$/`) are a ReDoS risk when validating untrusted input in server-side contexts.\n * Prefer well-tested, bounded patterns for user-facing validation.\n *\n * **`.equals()` note:** `.equals()` only compares descriptor-level annotations, never runtime\n * validator behavior. Chaining more than one `.regex()` collapses the descriptor `pattern` to\n * `null` (ambiguous), so two schemas with *different* pairs of regexes can compare equal even\n * though they accept different strings. This mirrors `.equals()`'s general limitation of\n * ignoring custom `.validate()`/`.refine()` logic — avoid relying on `.equals()` for schemas\n * with more than one `.regex()` constraint.\n */\n regex(pattern: RegExp, message: MessageFn<{ value: string }> = (ctx) => _messages().string.regex(ctx)): this {\n const safePattern = new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, ''));\n\n return this._addConstraint(\n (value, _ctx) => {\n // Caller-supplied regexes still run against untrusted strings; spell can\n // neutralize stateful /g and /y flags but cannot make arbitrary patterns\n // immune to catastrophic backtracking without breaking the API.\n if (safePattern.test(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n pattern: safePattern.source,\n });\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n if (ann.pattern === null) return ann; // already ambiguous\n\n if (ann.pattern === undefined) return { ...ann, pattern: safePattern.source };\n\n if (ann.pattern !== safePattern.source) {\n _dev(\n '[spell] Multiple .regex() constraints detected on a single string schema. ' +\n 'JSON Schema `pattern` cannot represent multiple patterns and will be omitted from toJsonSchema() output.',\n );\n\n return { ...ann, pattern: null };\n }\n\n return ann;\n },\n );\n }\n\n email(message: MessageFn<{ value: string }> = () => _messages().string.email()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isEmail(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'email' });\n },\n (ann) => ({ ...ann, format: 'email' }),\n );\n }\n\n url(options: UrlOptions = {}): this {\n const { message = () => _messages().string.url(), protocols = ['http', 'https'] } = options;\n\n return this._addConstraint(\n (value, _ctx) => {\n if (isUrl(value as string, protocols)) return null;\n\n return fail(ErrorCode.invalid_url, resolveMessage(message, { value: value as string }), { format: 'url' });\n },\n (ann) => ({ ...ann, format: 'uri' }),\n );\n }\n\n uuid(message: MessageFn<{ value: string }> = () => _messages().string.uuid()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isUuid(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'uuid' });\n },\n (ann) => ({ ...ann, format: 'uuid' }),\n );\n }\n\n isoDate(message: MessageFn<{ value: string }> = () => _messages().string.date()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isIsoDate(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n format: 'iso-date',\n });\n },\n (ann) => ({ ...ann, format: 'date' }),\n );\n }\n\n isoDateTime(message: MessageFn<{ value: string }> = () => _messages().string.dateTime()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isIsoDateTime(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n format: 'iso-datetime',\n });\n },\n (ann) => ({ ...ann, format: 'date-time' }),\n );\n }\n\n ip(message: MessageFn<{ value: string }> = () => _messages().string.ip()): this {\n return this._addConstraint((value, _ctx) => {\n if (isIp(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'ip' });\n });\n }\n\n cuid(message: MessageFn<{ value: string }> = () => _messages().string.cuid()): this {\n return this._addConstraint((value, _ctx) => {\n if (isCuid(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'cuid' });\n });\n }\n\n cuid2(message: MessageFn<{ value: string }> = () => _messages().string.cuid2()): this {\n return this._addConstraint((value, _ctx) => {\n if (isCuid2(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'cuid2' });\n });\n }\n\n ulid(message: MessageFn<{ value: string }> = () => _messages().string.ulid()): this {\n return this._addConstraint((value, _ctx) => {\n if (isUlid(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'ulid' });\n });\n }\n\n nanoid(length?: number, message: MessageFn<{ value: string }> = () => _messages().string.nanoid()): this {\n return this._addConstraint((value, _ctx) => {\n if (isNanoid(value as string, length)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'nanoid' });\n });\n }\n\n base64(message: MessageFn<{ value: string }> = () => _messages().string.base64()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isBase64(value as string)) return null;\n\n return fail(ErrorCode.invalid_base64, resolveMessage(message, { value: value as string }), {\n format: 'base64',\n });\n },\n (ann) => ({ ...ann, contentEncoding: 'base64' }),\n );\n }\n\n base64url(message: MessageFn<{ value: string }> = () => _messages().string.base64url()): this {\n return this._addConstraint((value, _ctx) => {\n if (isBase64url(value as string)) return null;\n\n return fail(ErrorCode.invalid_base64, resolveMessage(message, { value: value as string }), {\n format: 'base64url',\n });\n });\n }\n\n hex(message: MessageFn<{ value: string }> = () => _messages().string.hex()): this {\n return this._addConstraint((value, _ctx) => {\n if (isHex(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'hex' });\n });\n }\n\n hexColor(message: MessageFn<{ value: string }> = () => _messages().string.hexColor()): this {\n return this._addConstraint((value, _ctx) => {\n if (isHexColor(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), {\n format: 'hex-color',\n });\n });\n }\n\n emoji(message: MessageFn<{ value: string }> = () => _messages().string.emoji()): this {\n return this._addConstraint((value, _ctx) => {\n if (isEmoji(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'emoji' });\n });\n }\n\n jwt(message: MessageFn<{ value: string }> = () => _messages().string.jwt()): this {\n return this._addConstraint((value, _ctx) => {\n if (isJwt(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'jwt' });\n });\n }\n\n time(message: MessageFn<{ value: string }> = () => _messages().string.time()): this {\n return this._addConstraint((value, _ctx) => {\n if (isTime(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'time' });\n });\n }\n\n duration(message: MessageFn<{ value: string }> = () => _messages().string.duration()): this {\n return this._addConstraint(\n (value, _ctx) => {\n if (isDuration(value as string)) return null;\n\n return fail(ErrorCode.invalid_duration, resolveMessage(message, { value: value as string }), {\n format: 'duration',\n });\n },\n (ann) => ({ ...ann, format: 'duration' }),\n );\n }\n\n semver(message: MessageFn<{ value: string }> = () => _messages().string.semver()): this {\n return this._addConstraint((value, _ctx) => {\n if (isSemver(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'semver' });\n });\n }\n\n slug(message: MessageFn<{ value: string }> = () => _messages().string.slug()): this {\n return this._addConstraint((value, _ctx) => {\n if (isSlug(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'slug' });\n });\n }\n\n numeric(message: MessageFn<{ value: string }> = () => _messages().string.numeric()): this {\n return this._addConstraint((value, _ctx) => {\n if (isNumeric(value as string)) return null;\n\n return fail(ErrorCode.invalid_string, resolveMessage(message, { value: value as string }), { format: 'numeric' });\n });\n }\n\n /**\n * Returns a new schema that coerces the input to a string via `String(value)` before validation.\n * `null` and `undefined` are passed through unchanged.\n *\n * Equivalent to `s.coerce.string()`.\n */\n coerce(): StringSchema<unknown> {\n return StringSchema.coerce();\n }\n\n /**\n * **Note:** `trim()` adds a preprocessor. Preprocessors are not serializable —\n * `toDescriptor()` will warn if preprocessors are present.\n */\n trim(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.trim() : v));\n }\n\n /**\n * **Note:** `lowercase()` adds a preprocessor. Preprocessors are not serializable —\n * `toDescriptor()` will warn if preprocessors are present.\n */\n lowercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toLowerCase() : v));\n }\n\n /**\n * **Note:** `uppercase()` adds a preprocessor. Preprocessors are not serializable —\n * `toDescriptor()` will warn if preprocessors are present.\n */\n uppercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toUpperCase() : v));\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n if (visitor.string) return visitor.string(this);\n\n return super._walk(visitor);\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as StringAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.contentEncoding !== undefined ? { contentEncoding: ann.contentEncoding } : {}),\n ...(ann.format !== undefined ? { format: ann.format } : {}),\n ...(ann.maxLength !== undefined ? { maxLength: ann.maxLength } : {}),\n ...(ann.minLength !== undefined ? { minLength: ann.minLength } : {}),\n ...(ann.pattern !== undefined ? { pattern: ann.pattern } : {}),\n kind: 'string',\n };\n }\n\n protected override _equalsImpl(other: AnySchema): boolean {\n if (!(other instanceof StringSchema)) return false;\n\n return this._annotationsEqual(other);\n }\n\n static coerce(): StringSchema<unknown> {\n return new StringSchema().preprocess((v: unknown) => (v == null ? v : String(v)));\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types.cjs"),t=require("../errors.cjs");require("../messages.cjs");const n=require("../core.cjs");var r=class r extends n.Schema{items;restSchema;get _kind(){return`tuple`}constructor(e,t=null){super(),this.items=e,this.restSchema=t}rest(e){return this._copyStateTo(new r(this.items,e))}_guardTupleInput(t,n){return this.restSchema===null&&t.length!==this.items.length?{issues:[{code:e.ErrorCode.invalid_length,message:n.messages.tuple.length({exact:this.items.length}),params:{exact:this.items.length},path:[]}],ok:!1}:this.restSchema!==null&&t.length<this.items.length?{issues:[{code:e.ErrorCode.too_small,message:n.messages.tuple.min({min:this.items.length}),params:{min:this.items.length},path:[]}],ok:!1}:{ok:!0,value:t}}_parse(n,r){if(!Array.isArray(n))return{data:n,issues:[{code:e.ErrorCode.invalid_type,message:r.messages.tuple.type(),path:[]}],typeOk:!1};let i=this._guardTupleInput(n,r);if(!i.ok)return{data:n,issues:i.issues,typeOk:!1};let a=[],o=[],s=i.value;for(let e=0;e<this.items.length;e++){let n=this.items[e]._parseFullSync(s[e],r);n.issues.length===0?o.push(n.data):(a.push(...t.prependIssuePath(n.issues,e)),o.push(s[e]))}if(this.restSchema!==null)for(let e=this.items.length;e<s.length;e++){let n=this.restSchema._parseFullSync(s[e],r);n.issues.length===0?o.push(n.data):(a.push(...t.prependIssuePath(n.issues,e)),o.push(s[e]))}return{data:o,issues:a,typeOk:!0}}async parseAsync(r,i){let a=i??n._makeCtx();return this._withCatchAsync(async()=>{let n=this._prepareInput(r);if(n.skip)return n.value;let i=n.value;if(!Array.isArray(i))throw new t.SpellValidationError([{code:e.ErrorCode.invalid_type,message:a.messages.tuple.type(),path:[]}]);let o=this._guardTupleInput(i,a);if(!o.ok)throw new t.SpellValidationError(o.issues);let s=o.value,c=[],l=[],u=await Promise.all(this.items.map((e,t)=>e._parseFullAsync(s[t],a)));for(let e=0;e<u.length;e++){let n=u[e];n.issues.length===0?l.push(n.data):(c.push(...t.prependIssuePath(n.issues,e)),l.push(s[e]))}let d=this.restSchema;if(d!==null){let e=s.slice(this.items.length),n=await Promise.all(e.map(e=>d._parseFullAsync(e,a)));for(let e=0;e<n.length;e++){let r=n[e],i=this.items.length+e;r.issues.length===0?l.push(r.data):(c.push(...t.prependIssuePath(r.issues,i)),l.push(s[i]))}}let f=await this._runValidatorsAsync(l,a),p=[...c,...f];if(p.length>0)throw new t.SpellValidationError(p);return this._runPostprocessors(l)})}_toDescriptorImpl(){return{...this._describeBase(),items:this.items.map(e=>e.toDescriptor()),kind:`tuple`,rest:this.restSchema===null?null:this.restSchema.toDescriptor()}}_walk(e){let t=this.items.map(t=>t.walk(e)),n=this.restSchema===null?null:this.restSchema.walk(e);return e.tuple?e.tuple(this,t,n):super._walk(e)}_equalsImpl(e){if(!(e instanceof r)||this.items.length!==e.items.length)return!1;for(let t=0;t<this.items.length;t++)if(!this.items[t].equals(e.items[t]))return!1;let t=this.restSchema,n=e.restSchema;return!(t===null!=(n===null)||t!==null&&n!==null&&!t.equals(n))}};exports.TupleSchema=r;
|
|
2
|
+
//# sourceMappingURL=tuple.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tuple.cjs","names":[],"sources":["../../src/schemas/tuple.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, prependIssuePath, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { _messages } from '../messages';\n\nexport type TupleSchemas = readonly [AnySchema, ...AnySchema[]];\nexport type InferTuple<T extends TupleSchemas, R extends AnySchema | null = null> =\n R extends Schema<infer O>\n ? readonly [...{ [K in keyof T]: T[K] extends Schema<infer V> ? V : never }, ...O[]]\n : { readonly [K in keyof T]: T[K] extends Schema<infer V> ? V : never };\n\nexport class TupleSchema<T extends TupleSchemas, R extends AnySchema | null = null> extends Schema<InferTuple<T, R>> {\n readonly items: T;\n readonly restSchema: R;\n\n protected override get _kind(): string {\n return 'tuple';\n }\n\n constructor(items: T, restSchema: R = null as R) {\n super();\n this.items = items;\n this.restSchema = restSchema;\n }\n\n rest<U>(schema: Schema<U>): TupleSchema<T, Schema<U>> {\n return this._copyStateTo(new TupleSchema(this.items, schema));\n }\n\n private _guardTupleInput(\n value: unknown[],\n ctx: ParseContext,\n ): { ok: true; value: unknown[] } | { issues: Issue[]; ok: false } {\n if (this.restSchema === null && value.length !== this.items.length) {\n return {\n issues: [\n {\n code: ErrorCode.invalid_length,\n message: ctx.messages.tuple.length({ exact: this.items.length }),\n params: { exact: this.items.length },\n path: [],\n },\n ],\n ok: false,\n };\n }\n\n if (this.restSchema !== null && value.length < this.items.length) {\n return {\n issues: [\n {\n code: ErrorCode.too_small,\n message: ctx.messages.tuple.min({ min: this.items.length }),\n params: { min: this.items.length },\n path: [],\n },\n ],\n ok: false,\n };\n }\n\n return { ok: true, value };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return {\n data: value,\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.tuple.type(), path: [] }],\n typeOk: false,\n };\n }\n\n const guarded = this._guardTupleInput(value, ctx);\n\n if (!guarded.ok) return { data: value, issues: guarded.issues, typeOk: false };\n\n const issues: Issue[] = [];\n const output: unknown[] = [];\n const tupleValue = guarded.value;\n\n for (let i = 0; i < this.items.length; i++) {\n const result = this.items[i]._parseFullSync(tupleValue[i], ctx);\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n\n if (this.restSchema !== null) {\n for (let i = this.items.length; i < tupleValue.length; i++) {\n const result = this.restSchema._parseFullSync(tupleValue[i], ctx);\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n }\n\n return { data: output, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferTuple<T, R>> {\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 InferTuple<T, R>;\n\n const raw = prepared.value;\n\n if (!Array.isArray(raw)) {\n throw new SpellValidationError([{ code: ErrorCode.invalid_type, message: c.messages.tuple.type(), path: [] }]);\n }\n\n const guarded = this._guardTupleInput(raw, c);\n\n if (!guarded.ok) throw new SpellValidationError(guarded.issues);\n\n const tupleValue = guarded.value;\n const issues: Issue[] = [];\n const output: unknown[] = [];\n\n const fixedResults = await Promise.all(this.items.map((schema, i) => schema._parseFullAsync(tupleValue[i], c)));\n\n for (let i = 0; i < fixedResults.length; i++) {\n const result = fixedResults[i];\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n output.push(tupleValue[i]);\n }\n }\n\n const rest = this.restSchema;\n\n if (rest !== null) {\n const restItems = tupleValue.slice(this.items.length);\n const restResults = await Promise.all(restItems.map((item) => rest._parseFullAsync(item, c)));\n\n for (let i = 0; i < restResults.length; i++) {\n const result = restResults[i];\n const idx = this.items.length + i;\n\n if (result.issues.length === 0) {\n output.push(result.data);\n } else {\n issues.push(...prependIssuePath(result.issues, idx));\n output.push(tupleValue[idx]);\n }\n }\n }\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 InferTuple<T, R>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n items: this.items.map((s) => s.toDescriptor()),\n kind: 'tuple',\n rest: this.restSchema !== null ? this.restSchema.toDescriptor() : null,\n };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const items = this.items.map((s) => s.walk(visitor));\n const rest = this.restSchema !== null ? this.restSchema.walk(visitor) : null;\n\n if (visitor.tuple) return visitor.tuple(this, items, rest);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof TupleSchema)) return false;\n\n if (this.items.length !== other.items.length) return false;\n\n for (let i = 0; i < this.items.length; i++) {\n if (!this.items[i].equals(other.items[i])) return false;\n }\n\n const rs = this.restSchema;\n const ors = other.restSchema;\n\n if ((rs === null) !== (ors === null)) return false;\n\n if (rs !== null && ors !== null && !rs.equals(ors)) return false;\n\n return true;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AnySchema, ParseContext, ParseValue, SchemaDescriptor } from '../core';
|
|
2
|
+
import { Schema } from '../core';
|
|
3
|
+
export type TupleSchemas = readonly [AnySchema, ...AnySchema[]];
|
|
4
|
+
export type InferTuple<T extends TupleSchemas, R extends AnySchema | null = null> = R extends Schema<infer O> ? readonly [...{
|
|
5
|
+
[K in keyof T]: T[K] extends Schema<infer V> ? V : never;
|
|
6
|
+
}, ...O[]] : {
|
|
7
|
+
readonly [K in keyof T]: T[K] extends Schema<infer V> ? V : never;
|
|
8
|
+
};
|
|
9
|
+
export declare class TupleSchema<T extends TupleSchemas, R extends AnySchema | null = null> extends Schema<InferTuple<T, R>> {
|
|
10
|
+
readonly items: T;
|
|
11
|
+
readonly restSchema: R;
|
|
12
|
+
protected get _kind(): string;
|
|
13
|
+
constructor(items: T, restSchema?: R);
|
|
14
|
+
rest<U>(schema: Schema<U>): TupleSchema<T, Schema<U>>;
|
|
15
|
+
private _guardTupleInput;
|
|
16
|
+
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
17
|
+
parseAsync(value: unknown, ctx?: ParseContext): Promise<InferTuple<T, R>>;
|
|
18
|
+
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
19
|
+
protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
|
|
20
|
+
protected _equalsImpl(other: import('../core').AnySchema): boolean;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=tuple.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tuple.d.ts","sourceRoot":"","sources":["../../src/schemas/tuple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAS,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAA+B,MAAM,EAAkC,MAAM,SAAS,CAAC;AAG9F,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;AAChE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,SAAS,GAAG,IAAI,GAAG,IAAI,IAC9E,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GACrB,SAAS,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAAE,EAAE,GAAG,CAAC,EAAE,CAAC,GAClF;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAAE,CAAC;AAE5E,qBAAa,WAAW,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,SAAS,GAAG,IAAI,GAAG,IAAI,CAAE,SAAQ,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClH,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAEvB,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,KAAK,EAAE,CAAC,EAAE,UAAU,GAAE,CAAa;IAM/C,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAIrD,OAAO,CAAC,gBAAgB;cAmCL,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IA4CzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;cA+DrE,iBAAiB,IAAI,gBAAgB;cASrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;cAS9D,WAAW,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,SAAS,GAAG,OAAO;CAkB5E"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorCode as e}from"../types.js";import{SpellValidationError as t,prependIssuePath as n}from"../errors.js";import"../messages.js";import{Schema as r,_makeCtx as i}from"../core.js";var a=class a extends r{items;restSchema;get _kind(){return`tuple`}constructor(e,t=null){super(),this.items=e,this.restSchema=t}rest(e){return this._copyStateTo(new a(this.items,e))}_guardTupleInput(t,n){return this.restSchema===null&&t.length!==this.items.length?{issues:[{code:e.invalid_length,message:n.messages.tuple.length({exact:this.items.length}),params:{exact:this.items.length},path:[]}],ok:!1}:this.restSchema!==null&&t.length<this.items.length?{issues:[{code:e.too_small,message:n.messages.tuple.min({min:this.items.length}),params:{min:this.items.length},path:[]}],ok:!1}:{ok:!0,value:t}}_parse(t,r){if(!Array.isArray(t))return{data:t,issues:[{code:e.invalid_type,message:r.messages.tuple.type(),path:[]}],typeOk:!1};let i=this._guardTupleInput(t,r);if(!i.ok)return{data:t,issues:i.issues,typeOk:!1};let a=[],o=[],s=i.value;for(let e=0;e<this.items.length;e++){let t=this.items[e]._parseFullSync(s[e],r);t.issues.length===0?o.push(t.data):(a.push(...n(t.issues,e)),o.push(s[e]))}if(this.restSchema!==null)for(let e=this.items.length;e<s.length;e++){let t=this.restSchema._parseFullSync(s[e],r);t.issues.length===0?o.push(t.data):(a.push(...n(t.issues,e)),o.push(s[e]))}return{data:o,issues:a,typeOk:!0}}async parseAsync(r,a){let o=a??i();return this._withCatchAsync(async()=>{let i=this._prepareInput(r);if(i.skip)return i.value;let a=i.value;if(!Array.isArray(a))throw new t([{code:e.invalid_type,message:o.messages.tuple.type(),path:[]}]);let s=this._guardTupleInput(a,o);if(!s.ok)throw new t(s.issues);let c=s.value,l=[],u=[],d=await Promise.all(this.items.map((e,t)=>e._parseFullAsync(c[t],o)));for(let e=0;e<d.length;e++){let t=d[e];t.issues.length===0?u.push(t.data):(l.push(...n(t.issues,e)),u.push(c[e]))}let f=this.restSchema;if(f!==null){let e=c.slice(this.items.length),t=await Promise.all(e.map(e=>f._parseFullAsync(e,o)));for(let e=0;e<t.length;e++){let r=t[e],i=this.items.length+e;r.issues.length===0?u.push(r.data):(l.push(...n(r.issues,i)),u.push(c[i]))}}let p=await this._runValidatorsAsync(u,o),m=[...l,...p];if(m.length>0)throw new t(m);return this._runPostprocessors(u)})}_toDescriptorImpl(){return{...this._describeBase(),items:this.items.map(e=>e.toDescriptor()),kind:`tuple`,rest:this.restSchema===null?null:this.restSchema.toDescriptor()}}_walk(e){let t=this.items.map(t=>t.walk(e)),n=this.restSchema===null?null:this.restSchema.walk(e);return e.tuple?e.tuple(this,t,n):super._walk(e)}_equalsImpl(e){if(!(e instanceof a)||this.items.length!==e.items.length)return!1;for(let t=0;t<this.items.length;t++)if(!this.items[t].equals(e.items[t]))return!1;let t=this.restSchema,n=e.restSchema;return!(t===null!=(n===null)||t!==null&&n!==null&&!t.equals(n))}};export{a as TupleSchema};
|
|
2
|
+
//# sourceMappingURL=tuple.js.map
|