@vielzeug/spell 1.1.1 → 1.2.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 +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/messages.cjs +1 -1
- package/dist/messages.cjs.map +1 -1
- package/dist/messages.d.ts +20 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +1 -1
- package/dist/messages.js.map +1 -1
- package/dist/schemas/variant.cjs +1 -1
- package/dist/schemas/variant.cjs.map +1 -1
- package/dist/schemas/variant.d.ts +1 -0
- package/dist/schemas/variant.d.ts.map +1 -1
- package/dist/schemas/variant.js +1 -1
- package/dist/schemas/variant.js.map +1 -1
- package/dist/spell.cjs +1 -1
- package/dist/spell.cjs.map +1 -1
- package/dist/spell.iife.js +1 -1
- package/dist/spell.iife.js.map +1 -1
- package/dist/spell.js +1 -1
- package/dist/spell.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
**Package:** `@vielzeug/spell` · **Category:** Validation
|
|
11
11
|
|
|
12
|
-
**Key exports:** `s`, `SpellValidationError`, `setMessages`, `setLogger`, `resetMessages`, `ErrorCode`, `errorsAt`, `descriptorToJsonSchema`
|
|
12
|
+
**Key exports:** `s`, `SpellValidationError`, `setMessages`, `setLogger`, `resetMessages`, `createParseContext`, `withMessages`, `withLogger`, `ErrorCode`, `errorsAt`, `descriptorToJsonSchema`
|
|
13
13
|
|
|
14
14
|
**When to use:** Zero-dependency schema validation library with strict-by-default objects, async refinements, coercion, flexible schema composition, and full TypeScript inference.
|
|
15
15
|
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types.cjs"),t=require("./errors.cjs"),n=require("./json-schema.cjs"),r=require("./messages.cjs"),i=require("./core.cjs"),a=require("./validators.cjs"),o=require("./formats.cjs"),s=require("./s.cjs");exports.ErrorCode=e.ErrorCode,exports.PipeSchema=i.PipeSchema,exports.Schema=i.Schema,exports.SpellError=t.SpellError,exports.SpellValidationError=t.SpellValidationError,exports.descriptorToJsonSchema=n.descriptorToJsonSchema,exports.errorsAt=t.errorsAt,exports.fail=t.fail,exports.hasMaxLength=a.hasMaxLength,exports.hasMinLength=a.hasMinLength,exports.isArray=a.isArray,exports.isBase64=o.isBase64,exports.isBase64url=o.isBase64url,exports.isBoolean=a.isBoolean,exports.isCuid=o.isCuid,exports.isCuid2=o.isCuid2,exports.isDate=a.isDate,exports.isDuration=o.isDuration,exports.isEmail=o.isEmail,exports.isEmoji=o.isEmoji,exports.isHex=o.isHex,exports.isHexColor=o.isHexColor,exports.isInRange=a.isInRange,exports.isInteger=a.isInteger,exports.isIp=o.isIp,exports.isIsoDate=o.isIsoDate,exports.isIsoDateTime=o.isIsoDateTime,exports.isJwt=o.isJwt,exports.isMultipleOf=a.isMultipleOf,exports.isNanoid=o.isNanoid,exports.isNegative=a.isNegative,exports.isNonNegative=a.isNonNegative,exports.isNullOrUndefined=a.isNullOrUndefined,exports.isNumber=a.isNumber,exports.isNumeric=o.isNumeric,exports.isPositive=a.isPositive,exports.isSemver=o.isSemver,exports.isSlug=o.isSlug,exports.isString=a.isString,exports.isTime=o.isTime,exports.isUlid=o.isUlid,exports.isUrl=o.isUrl,exports.isUuid=o.isUuid,exports.prependIssuePath=t.prependIssuePath,exports.resetMessages=r.resetMessages,exports.s=s.s,exports.schemaToJsonSchema=n.schemaToJsonSchema,exports.setLogger=r.setLogger,exports.setMessages=r.setMessages;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types.cjs"),t=require("./errors.cjs"),n=require("./json-schema.cjs"),r=require("./messages.cjs"),i=require("./core.cjs"),a=require("./validators.cjs"),o=require("./formats.cjs"),s=require("./s.cjs");exports.ErrorCode=e.ErrorCode,exports.PipeSchema=i.PipeSchema,exports.Schema=i.Schema,exports.SpellError=t.SpellError,exports.SpellValidationError=t.SpellValidationError,exports.createParseContext=r.createParseContext,exports.descriptorToJsonSchema=n.descriptorToJsonSchema,exports.errorsAt=t.errorsAt,exports.fail=t.fail,exports.hasMaxLength=a.hasMaxLength,exports.hasMinLength=a.hasMinLength,exports.isArray=a.isArray,exports.isBase64=o.isBase64,exports.isBase64url=o.isBase64url,exports.isBoolean=a.isBoolean,exports.isCuid=o.isCuid,exports.isCuid2=o.isCuid2,exports.isDate=a.isDate,exports.isDuration=o.isDuration,exports.isEmail=o.isEmail,exports.isEmoji=o.isEmoji,exports.isHex=o.isHex,exports.isHexColor=o.isHexColor,exports.isInRange=a.isInRange,exports.isInteger=a.isInteger,exports.isIp=o.isIp,exports.isIsoDate=o.isIsoDate,exports.isIsoDateTime=o.isIsoDateTime,exports.isJwt=o.isJwt,exports.isMultipleOf=a.isMultipleOf,exports.isNanoid=o.isNanoid,exports.isNegative=a.isNegative,exports.isNonNegative=a.isNonNegative,exports.isNullOrUndefined=a.isNullOrUndefined,exports.isNumber=a.isNumber,exports.isNumeric=o.isNumeric,exports.isPositive=a.isPositive,exports.isSemver=o.isSemver,exports.isSlug=o.isSlug,exports.isString=a.isString,exports.isTime=o.isTime,exports.isUlid=o.isUlid,exports.isUrl=o.isUrl,exports.isUuid=o.isUuid,exports.prependIssuePath=t.prependIssuePath,exports.resetMessages=r.resetMessages,exports.s=s.s,exports.schemaToJsonSchema=n.schemaToJsonSchema,exports.setLogger=r.setLogger,exports.setMessages=r.setMessages,exports.withLogger=r.withLogger,exports.withMessages=r.withMessages;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { ErrorCode, PipeSchema, Schema, SpellError, SpellValidationError, errorsAt, fail, type AnySchema, type CheckContext, type FlatError, type FlatErrorFirst, type FormattedErrors, type Infer, type InferInput, type InferOutput, type Issue, type JsonSchema, type MessageFn, type Messages, type ParseContext, type ParseResult, type SchemaDescriptor, type SchemaWalker, type ValidateFn, type ValidateResult, prependIssuePath, } from './core';
|
|
2
|
-
export { resetMessages, setLogger, setMessages, type DeepPartial, type Logger } from './messages';
|
|
2
|
+
export { createParseContext, resetMessages, setLogger, setMessages, withLogger, withMessages, type DeepPartial, type Logger, } from './messages';
|
|
3
3
|
export { descriptorToJsonSchema, schemaToJsonSchema } from './json-schema';
|
|
4
4
|
export { hasMaxLength, hasMinLength, isArray, isBoolean, isDate, isInteger, isMultipleOf, isNegative, isNonNegative, isNullOrUndefined, isNumber, isPositive, isString, isInRange, } from './validators';
|
|
5
5
|
export { isBase64, isBase64url, isCuid, isCuid2, isDuration, isEmail, isEmoji, isHex, isHexColor, isIp, isIsoDate, isIsoDateTime, isJwt, isNanoid, isNumeric, isSemver, isSlug, isTime, isUlid, isUrl, isUuid, } from './formats';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,MAAM,EACN,UAAU,EACV,oBAAoB,EACpB,QAAQ,EACR,IAAI,EACJ,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,gBAAgB,GACjB,MAAM,QAAQ,CAAC;AAEhB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,MAAM,EACN,UAAU,EACV,oBAAoB,EACpB,QAAQ,EACR,IAAI,EACJ,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,gBAAgB,GACjB,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,MAAM,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAE3E,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,SAAS,EACT,MAAM,EACN,SAAS,EACT,YAAY,EACZ,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,KAAK,EACL,UAAU,EACV,IAAI,EACJ,SAAS,EACT,aAAa,EACb,KAAK,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,MAAM,EACN,MAAM,EACN,MAAM,EACN,KAAK,EACL,MAAM,GACP,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ErrorCode as e}from"./types.js";import{SpellError as t,SpellValidationError as n,errorsAt as r,fail as i,prependIssuePath as a}from"./errors.js";import{descriptorToJsonSchema as o,schemaToJsonSchema as s}from"./json-schema.js";import{
|
|
1
|
+
import{ErrorCode as e}from"./types.js";import{SpellError as t,SpellValidationError as n,errorsAt as r,fail as i,prependIssuePath as a}from"./errors.js";import{descriptorToJsonSchema as o,schemaToJsonSchema as s}from"./json-schema.js";import{createParseContext as c,resetMessages as l,setLogger as u,setMessages as d,withLogger as f,withMessages as p}from"./messages.js";import{PipeSchema as m,Schema as h}from"./core.js";import{hasMaxLength as g,hasMinLength as _,isArray as v,isBoolean as y,isDate as b,isInRange as x,isInteger as S,isMultipleOf as C,isNegative as w,isNonNegative as T,isNullOrUndefined as E,isNumber as D,isPositive as O,isString as k}from"./validators.js";import{isBase64 as A,isBase64url as j,isCuid as M,isCuid2 as N,isDuration as P,isEmail as F,isEmoji as I,isHex as L,isHexColor as R,isIp as z,isIsoDate as B,isIsoDateTime as V,isJwt as H,isNanoid as U,isNumeric as W,isSemver as G,isSlug as K,isTime as q,isUlid as J,isUrl as Y,isUuid as X}from"./formats.js";import{s as Z}from"./s.js";export{e as ErrorCode,m as PipeSchema,h as Schema,t as SpellError,n as SpellValidationError,c as createParseContext,o as descriptorToJsonSchema,r as errorsAt,i as fail,g as hasMaxLength,_ as hasMinLength,v as isArray,A as isBase64,j as isBase64url,y as isBoolean,M as isCuid,N as isCuid2,b as isDate,P as isDuration,F as isEmail,I as isEmoji,L as isHex,R as isHexColor,x as isInRange,S as isInteger,z as isIp,B as isIsoDate,V as isIsoDateTime,H as isJwt,C as isMultipleOf,U as isNanoid,w as isNegative,T as isNonNegative,E as isNullOrUndefined,D as isNumber,W as isNumeric,O as isPositive,G as isSemver,K as isSlug,k as isString,q as isTime,J as isUlid,Y as isUrl,X as isUuid,a as prependIssuePath,l as resetMessages,Z as s,s as schemaToJsonSchema,u as setLogger,d as setMessages,f as withLogger,p as withMessages};
|
package/dist/messages.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./safe-object.cjs"),t=require("./_dev.cjs");var n={array:{length:({exact:e})=>`Must have exactly ${e} items`,max:({max:e})=>`Must have at most ${e} items`,min:({min:e})=>`Must have at least ${e} items`,nonEmpty:()=>`Cannot be empty`,type:()=>`Expected array`,unique:()=>`All items must be unique`},bigint:{max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,type:()=>`Expected bigint`},boolean:{type:()=>`Expected boolean`},check:{default:()=>`Invalid value`},date:{max:({max:e})=>`Must be before ${e.toISOString()}`,min:({min:e})=>`Must be after ${e.toISOString()}`,type:()=>`Expected valid date`},enum:{invalid:({values:e})=>`Expected one of: ${e.map(e=>JSON.stringify(e)).join(`, `)}`},instanceof:{type:({className:e})=>`Expected instance of ${e}`},literal:{expected:({expected:e})=>`Expected ${JSON.stringify(e)}`},map:{max:({max:e})=>`Must contain at most ${e} entries`,min:({min:e})=>`Must contain at least ${e} entries`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} entries`,type:()=>`Expected map`},never:{invalid:()=>`Value is not allowed`},number:{finite:()=>`Must be finite`,int:()=>`Must be an integer`,max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,safe:()=>`Must be a safe integer`,type:()=>`Expected number`},object:{invalidKeys:({keys:e})=>`Unrecognized keys: ${e.join(`, `)}`,type:()=>`Expected object`},set:{max:({max:e})=>`Must contain at most ${e} items`,min:({min:e})=>`Must contain at least ${e} items`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} items`,type:()=>`Expected set`},string:{base64:()=>`Invalid base64`,base64url:()=>`Invalid base64url`,cuid:()=>`Invalid CUID`,cuid2:()=>`Invalid CUID2`,date:()=>`Invalid date`,dateTime:()=>`Invalid datetime`,duration:()=>`Invalid ISO 8601 duration`,email:()=>`Invalid email address`,emoji:()=>`Invalid emoji sequence`,endsWith:({suffix:e})=>`Must end with "${e}"`,hex:()=>`Invalid hex`,hexColor:()=>`Invalid hex color`,includes:({substr:e})=>`Must include "${e}"`,ip:()=>`Invalid IP address`,jwt:()=>`Invalid JWT`,length:({exact:e})=>`Must be exactly ${e} characters`,max:({max:e})=>`Must be at most ${e} characters`,min:({min:e})=>`Must be at least ${e} characters`,nanoid:()=>`Invalid NanoID`,nonEmpty:()=>`Cannot be empty`,numeric:()=>`Invalid numeric string`,regex:()=>`Invalid format`,semver:()=>`Invalid semver`,slug:()=>`Invalid slug`,startsWith:({prefix:e})=>`Must start with "${e}"`,time:()=>`Invalid time`,type:()=>`Expected string`,ulid:()=>`Invalid ULID`,url:()=>`Invalid URL`,uuid:()=>`Invalid UUID`},tuple:{length:({exact:e})=>`Expected tuple of length ${e}`,min:({min:e})=>`Expected tuple with at least ${e} items`,type:()=>`Expected array`},union:{invalid:()=>`Does not match any of the expected types`},variant:{invalidDiscriminator:({discriminator:e,expected:t})=>`Invalid discriminator value at "${e}": expected ${t.map(e=>JSON.stringify(e)).join(` | `)}`,type:()=>`Expected object`}},r=n,i=e=>{t.warn(e)};function a(e){i(e)}function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(t,n){let r=e.cloneRecord(t);for(let[t,i]of Object.entries(n)){if(i===void 0)continue;if(e.isUnsafeObjectKey(t)){a(`[spell] Ignoring unsafe message override key "${t}" to prevent prototype mutation.`);continue}let n=r[t];o(n)&&o(i)?e.defineOwnProperty(r,t,s(n,i)):e.defineOwnProperty(r,t,i)}return r}function c(e){r=s(n,e)}function l(e){i=e??(()=>{})}function u(){r=n}function d(){return r}exports._dev=a,exports._messages=d,exports.resetMessages=u,exports.setLogger=l,exports.setMessages=c;
|
|
1
|
+
const e=require("./safe-object.cjs"),t=require("./_dev.cjs");var n={array:{length:({exact:e})=>`Must have exactly ${e} items`,max:({max:e})=>`Must have at most ${e} items`,min:({min:e})=>`Must have at least ${e} items`,nonEmpty:()=>`Cannot be empty`,type:()=>`Expected array`,unique:()=>`All items must be unique`},bigint:{max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,type:()=>`Expected bigint`},boolean:{type:()=>`Expected boolean`},check:{default:()=>`Invalid value`},date:{max:({max:e})=>`Must be before ${e.toISOString()}`,min:({min:e})=>`Must be after ${e.toISOString()}`,type:()=>`Expected valid date`},enum:{invalid:({values:e})=>`Expected one of: ${e.map(e=>JSON.stringify(e)).join(`, `)}`},instanceof:{type:({className:e})=>`Expected instance of ${e}`},literal:{expected:({expected:e})=>`Expected ${JSON.stringify(e)}`},map:{max:({max:e})=>`Must contain at most ${e} entries`,min:({min:e})=>`Must contain at least ${e} entries`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} entries`,type:()=>`Expected map`},never:{invalid:()=>`Value is not allowed`},number:{finite:()=>`Must be finite`,int:()=>`Must be an integer`,max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,safe:()=>`Must be a safe integer`,type:()=>`Expected number`},object:{invalidKeys:({keys:e})=>`Unrecognized keys: ${e.join(`, `)}`,type:()=>`Expected object`},set:{max:({max:e})=>`Must contain at most ${e} items`,min:({min:e})=>`Must contain at least ${e} items`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} items`,type:()=>`Expected set`},string:{base64:()=>`Invalid base64`,base64url:()=>`Invalid base64url`,cuid:()=>`Invalid CUID`,cuid2:()=>`Invalid CUID2`,date:()=>`Invalid date`,dateTime:()=>`Invalid datetime`,duration:()=>`Invalid ISO 8601 duration`,email:()=>`Invalid email address`,emoji:()=>`Invalid emoji sequence`,endsWith:({suffix:e})=>`Must end with "${e}"`,hex:()=>`Invalid hex`,hexColor:()=>`Invalid hex color`,includes:({substr:e})=>`Must include "${e}"`,ip:()=>`Invalid IP address`,jwt:()=>`Invalid JWT`,length:({exact:e})=>`Must be exactly ${e} characters`,max:({max:e})=>`Must be at most ${e} characters`,min:({min:e})=>`Must be at least ${e} characters`,nanoid:()=>`Invalid NanoID`,nonEmpty:()=>`Cannot be empty`,numeric:()=>`Invalid numeric string`,regex:()=>`Invalid format`,semver:()=>`Invalid semver`,slug:()=>`Invalid slug`,startsWith:({prefix:e})=>`Must start with "${e}"`,time:()=>`Invalid time`,type:()=>`Expected string`,ulid:()=>`Invalid ULID`,url:()=>`Invalid URL`,uuid:()=>`Invalid UUID`},tuple:{length:({exact:e})=>`Expected tuple of length ${e}`,min:({min:e})=>`Expected tuple with at least ${e} items`,type:()=>`Expected array`},union:{invalid:()=>`Does not match any of the expected types`},variant:{invalidDiscriminator:({discriminator:e,expected:t})=>`Invalid discriminator value at "${e}": expected ${t.map(e=>JSON.stringify(e)).join(` | `)}`,type:()=>`Expected object`}},r=n,i=e=>{t.warn(e)};function a(e){i(e)}function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(t,n){let r=e.cloneRecord(t);for(let[t,i]of Object.entries(n)){if(i===void 0)continue;if(e.isUnsafeObjectKey(t)){a(`[spell] Ignoring unsafe message override key "${t}" to prevent prototype mutation.`);continue}let n=r[t];o(n)&&o(i)?e.defineOwnProperty(r,t,s(n,i)):e.defineOwnProperty(r,t,i)}return r}function c(e){r=s(n,e)}function l(e){i=e??(()=>{})}function u(){r=n}function d(e){return e===void 0?{messages:r}:{messages:s(r,e)}}function f(e,t){let i=r;r=s(n,e);try{let e=t();return e instanceof Promise?e.finally(()=>{r=i}):(r=i,e)}catch(e){throw r=i,e}}function p(e,t){let n=i;i=e??(()=>{});try{let e=t();return e instanceof Promise?e.finally(()=>{i=n}):(i=n,e)}catch(e){throw i=n,e}}function m(){return r}exports._dev=a,exports._messages=m,exports.createParseContext=d,exports.resetMessages=u,exports.setLogger=l,exports.setMessages=c,exports.withLogger=p,exports.withMessages=f;
|
|
2
2
|
//# sourceMappingURL=messages.cjs.map
|
package/dist/messages.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.cjs","names":[],"sources":["../src/messages.ts"],"sourcesContent":["import { warn as _warnFn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\nlet _activeMessages: Messages = _builtinMessages;\n\n/** A function that receives internal warning messages from spell. */\nexport type Logger = (message: string) => void;\n\nlet _logger: Logger = (msg) => {\n _warnFn(msg);\n};\n\n/** @internal */\nexport function _dev(message: string): void {\n _logger(message);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n _dev(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Override any subset of the default validation messages globally.\n * Merges deeply into the current active messages — call again to update.\n *\n * For locale integration (e.g. with \\@vielzeug/lingua), call this inside\n * your locale-change handler:\n * ```ts\n * i18n.subscribe(() => setMessages(spellMessages[i18n.locale]));\n * ```\n */\nexport function setMessages(messages: DeepPartial<Messages>): void {\n _activeMessages = mergeMessages(_builtinMessages, messages);\n}\n\n/**\n * Override the internal warning logger.\n * Pass `null` to silence all internal warnings.\n */\nexport function setLogger(logger: Logger | null): void {\n _logger = logger ?? (() => {});\n}\n\n/** Reset all messages to the built-in defaults. */\nexport function resetMessages(): void {\n _activeMessages = _builtinMessages;\n}\n\n/** @internal — returns the active (possibly overridden) message set. */\nexport function _messages(): Messages {\n return _activeMessages;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"messages.cjs","names":[],"sources":["../src/messages.ts"],"sourcesContent":["import type { ParseContext } from './types';\n\nimport { warn as _warnFn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\nlet _activeMessages: Messages = _builtinMessages;\n\n/** A function that receives internal warning messages from spell. */\nexport type Logger = (message: string) => void;\n\nlet _logger: Logger = (msg) => {\n _warnFn(msg);\n};\n\n/** @internal */\nexport function _dev(message: string): void {\n _logger(message);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n _dev(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Override any subset of the default validation messages globally.\n * Each call starts from built-ins and applies the provided deep overrides.\n * It does not accumulate previous overrides.\n *\n * For locale integration (e.g. with \\@vielzeug/lingua), call this inside\n * your locale-change handler:\n * ```ts\n * i18n.subscribe(() => setMessages(spellMessages[i18n.locale]));\n * ```\n */\nexport function setMessages(messages: DeepPartial<Messages>): void {\n _activeMessages = mergeMessages(_builtinMessages, messages);\n}\n\n/**\n * Override the internal warning logger.\n * Pass `null` to silence all internal warnings.\n */\nexport function setLogger(logger: Logger | null): void {\n _logger = logger ?? (() => {});\n}\n\n/** Reset all messages to the built-in defaults. */\nexport function resetMessages(): void {\n _activeMessages = _builtinMessages;\n}\n\n/**\n * Creates a parse context with request-scoped message overrides.\n * Does not mutate global message state.\n */\nexport function createParseContext(messages?: DeepPartial<Messages>): ParseContext {\n if (messages === undefined) return { messages: _activeMessages };\n\n return { messages: mergeMessages(_activeMessages, messages) };\n}\n\n/**\n * Runs a callback with temporary global message overrides, then restores the previous state.\n * Supports both sync and async callbacks.\n */\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => T): T;\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => Promise<T>): Promise<T>;\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => T | Promise<T>): T | Promise<T> {\n const previous = _activeMessages;\n\n _activeMessages = mergeMessages(_builtinMessages, messages);\n\n try {\n const result = run();\n\n if (result instanceof Promise) {\n return result.finally(() => {\n _activeMessages = previous;\n });\n }\n\n _activeMessages = previous;\n\n return result;\n } catch (error) {\n _activeMessages = previous;\n throw error;\n }\n}\n\n/**\n * Runs a callback with a temporary logger override, then restores the previous logger.\n * Supports both sync and async callbacks.\n */\nexport function withLogger<T>(logger: Logger | null, run: () => T): T;\nexport function withLogger<T>(logger: Logger | null, run: () => Promise<T>): Promise<T>;\nexport function withLogger<T>(logger: Logger | null, run: () => T | Promise<T>): T | Promise<T> {\n const previous = _logger;\n\n _logger = logger ?? (() => {});\n\n try {\n const result = run();\n\n if (result instanceof Promise) {\n return result.finally(() => {\n _logger = previous;\n });\n }\n\n _logger = previous;\n\n return result;\n } catch (error) {\n _logger = previous;\n throw error;\n }\n}\n\n/** @internal — returns the active (possibly overridden) message set. */\nexport function _messages(): Messages {\n return _activeMessages;\n}\n"],"mappings":"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"}
|
package/dist/messages.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ParseContext } from './types';
|
|
1
2
|
export type Messages = {
|
|
2
3
|
array: {
|
|
3
4
|
length: (ctx: {
|
|
@@ -209,7 +210,8 @@ export type DeepPartial<T> = {
|
|
|
209
210
|
export type Logger = (message: string) => void;
|
|
210
211
|
/**
|
|
211
212
|
* Override any subset of the default validation messages globally.
|
|
212
|
-
*
|
|
213
|
+
* Each call starts from built-ins and applies the provided deep overrides.
|
|
214
|
+
* It does not accumulate previous overrides.
|
|
213
215
|
*
|
|
214
216
|
* For locale integration (e.g. with \@vielzeug/lingua), call this inside
|
|
215
217
|
* your locale-change handler:
|
|
@@ -225,4 +227,21 @@ export declare function setMessages(messages: DeepPartial<Messages>): void;
|
|
|
225
227
|
export declare function setLogger(logger: Logger | null): void;
|
|
226
228
|
/** Reset all messages to the built-in defaults. */
|
|
227
229
|
export declare function resetMessages(): void;
|
|
230
|
+
/**
|
|
231
|
+
* Creates a parse context with request-scoped message overrides.
|
|
232
|
+
* Does not mutate global message state.
|
|
233
|
+
*/
|
|
234
|
+
export declare function createParseContext(messages?: DeepPartial<Messages>): ParseContext;
|
|
235
|
+
/**
|
|
236
|
+
* Runs a callback with temporary global message overrides, then restores the previous state.
|
|
237
|
+
* Supports both sync and async callbacks.
|
|
238
|
+
*/
|
|
239
|
+
export declare function withMessages<T>(messages: DeepPartial<Messages>, run: () => T): T;
|
|
240
|
+
export declare function withMessages<T>(messages: DeepPartial<Messages>, run: () => Promise<T>): Promise<T>;
|
|
241
|
+
/**
|
|
242
|
+
* Runs a callback with a temporary logger override, then restores the previous logger.
|
|
243
|
+
* Supports both sync and async callbacks.
|
|
244
|
+
*/
|
|
245
|
+
export declare function withLogger<T>(logger: Logger | null, run: () => T): T;
|
|
246
|
+
export declare function withLogger<T>(logger: Logger | null, run: () => Promise<T>): Promise<T>;
|
|
228
247
|
//# sourceMappingURL=messages.d.ts.map
|
package/dist/messages.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
|
package/dist/messages.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{cloneRecord as e,defineOwnProperty as t,isUnsafeObjectKey as n}from"./safe-object.js";import{warn as r}from"./_dev.js";var i={array:{length:({exact:e})=>`Must have exactly ${e} items`,max:({max:e})=>`Must have at most ${e} items`,min:({min:e})=>`Must have at least ${e} items`,nonEmpty:()=>`Cannot be empty`,type:()=>`Expected array`,unique:()=>`All items must be unique`},bigint:{max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,type:()=>`Expected bigint`},boolean:{type:()=>`Expected boolean`},check:{default:()=>`Invalid value`},date:{max:({max:e})=>`Must be before ${e.toISOString()}`,min:({min:e})=>`Must be after ${e.toISOString()}`,type:()=>`Expected valid date`},enum:{invalid:({values:e})=>`Expected one of: ${e.map(e=>JSON.stringify(e)).join(`, `)}`},instanceof:{type:({className:e})=>`Expected instance of ${e}`},literal:{expected:({expected:e})=>`Expected ${JSON.stringify(e)}`},map:{max:({max:e})=>`Must contain at most ${e} entries`,min:({min:e})=>`Must contain at least ${e} entries`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} entries`,type:()=>`Expected map`},never:{invalid:()=>`Value is not allowed`},number:{finite:()=>`Must be finite`,int:()=>`Must be an integer`,max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,safe:()=>`Must be a safe integer`,type:()=>`Expected number`},object:{invalidKeys:({keys:e})=>`Unrecognized keys: ${e.join(`, `)}`,type:()=>`Expected object`},set:{max:({max:e})=>`Must contain at most ${e} items`,min:({min:e})=>`Must contain at least ${e} items`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} items`,type:()=>`Expected set`},string:{base64:()=>`Invalid base64`,base64url:()=>`Invalid base64url`,cuid:()=>`Invalid CUID`,cuid2:()=>`Invalid CUID2`,date:()=>`Invalid date`,dateTime:()=>`Invalid datetime`,duration:()=>`Invalid ISO 8601 duration`,email:()=>`Invalid email address`,emoji:()=>`Invalid emoji sequence`,endsWith:({suffix:e})=>`Must end with "${e}"`,hex:()=>`Invalid hex`,hexColor:()=>`Invalid hex color`,includes:({substr:e})=>`Must include "${e}"`,ip:()=>`Invalid IP address`,jwt:()=>`Invalid JWT`,length:({exact:e})=>`Must be exactly ${e} characters`,max:({max:e})=>`Must be at most ${e} characters`,min:({min:e})=>`Must be at least ${e} characters`,nanoid:()=>`Invalid NanoID`,nonEmpty:()=>`Cannot be empty`,numeric:()=>`Invalid numeric string`,regex:()=>`Invalid format`,semver:()=>`Invalid semver`,slug:()=>`Invalid slug`,startsWith:({prefix:e})=>`Must start with "${e}"`,time:()=>`Invalid time`,type:()=>`Expected string`,ulid:()=>`Invalid ULID`,url:()=>`Invalid URL`,uuid:()=>`Invalid UUID`},tuple:{length:({exact:e})=>`Expected tuple of length ${e}`,min:({min:e})=>`Expected tuple with at least ${e} items`,type:()=>`Expected array`},union:{invalid:()=>`Does not match any of the expected types`},variant:{invalidDiscriminator:({discriminator:e,expected:t})=>`Invalid discriminator value at "${e}": expected ${t.map(e=>JSON.stringify(e)).join(` | `)}`,type:()=>`Expected object`}},a=i,o=e=>{r(e)};function s(e){o(e)}function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function l(r,i){let a=e(r);for(let[e,r]of Object.entries(i)){if(r===void 0)continue;if(n(e)){s(`[spell] Ignoring unsafe message override key "${e}" to prevent prototype mutation.`);continue}let i=a[e];c(i)&&c(r)?t(a,e,l(i,r)):t(a,e,r)}return a}function u(e){a=l(i,e)}function d(e){o=e??(()=>{})}function f(){a=i}function p(){return a}export{s as _dev,
|
|
1
|
+
import{cloneRecord as e,defineOwnProperty as t,isUnsafeObjectKey as n}from"./safe-object.js";import{warn as r}from"./_dev.js";var i={array:{length:({exact:e})=>`Must have exactly ${e} items`,max:({max:e})=>`Must have at most ${e} items`,min:({min:e})=>`Must have at least ${e} items`,nonEmpty:()=>`Cannot be empty`,type:()=>`Expected array`,unique:()=>`All items must be unique`},bigint:{max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,type:()=>`Expected bigint`},boolean:{type:()=>`Expected boolean`},check:{default:()=>`Invalid value`},date:{max:({max:e})=>`Must be before ${e.toISOString()}`,min:({min:e})=>`Must be after ${e.toISOString()}`,type:()=>`Expected valid date`},enum:{invalid:({values:e})=>`Expected one of: ${e.map(e=>JSON.stringify(e)).join(`, `)}`},instanceof:{type:({className:e})=>`Expected instance of ${e}`},literal:{expected:({expected:e})=>`Expected ${JSON.stringify(e)}`},map:{max:({max:e})=>`Must contain at most ${e} entries`,min:({min:e})=>`Must contain at least ${e} entries`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} entries`,type:()=>`Expected map`},never:{invalid:()=>`Value is not allowed`},number:{finite:()=>`Must be finite`,int:()=>`Must be an integer`,max:({max:e})=>`Must be at most ${e}`,min:({min:e})=>`Must be at least ${e}`,multipleOf:({step:e})=>`Must be a multiple of ${e}`,negative:()=>`Must be negative`,nonNegative:()=>`Must be non-negative`,nonPositive:()=>`Must be non-positive`,positive:()=>`Must be positive`,safe:()=>`Must be a safe integer`,type:()=>`Expected number`},object:{invalidKeys:({keys:e})=>`Unrecognized keys: ${e.join(`, `)}`,type:()=>`Expected object`},set:{max:({max:e})=>`Must contain at most ${e} items`,min:({min:e})=>`Must contain at least ${e} items`,nonEmpty:()=>`Cannot be empty`,size:({exact:e})=>`Must contain exactly ${e} items`,type:()=>`Expected set`},string:{base64:()=>`Invalid base64`,base64url:()=>`Invalid base64url`,cuid:()=>`Invalid CUID`,cuid2:()=>`Invalid CUID2`,date:()=>`Invalid date`,dateTime:()=>`Invalid datetime`,duration:()=>`Invalid ISO 8601 duration`,email:()=>`Invalid email address`,emoji:()=>`Invalid emoji sequence`,endsWith:({suffix:e})=>`Must end with "${e}"`,hex:()=>`Invalid hex`,hexColor:()=>`Invalid hex color`,includes:({substr:e})=>`Must include "${e}"`,ip:()=>`Invalid IP address`,jwt:()=>`Invalid JWT`,length:({exact:e})=>`Must be exactly ${e} characters`,max:({max:e})=>`Must be at most ${e} characters`,min:({min:e})=>`Must be at least ${e} characters`,nanoid:()=>`Invalid NanoID`,nonEmpty:()=>`Cannot be empty`,numeric:()=>`Invalid numeric string`,regex:()=>`Invalid format`,semver:()=>`Invalid semver`,slug:()=>`Invalid slug`,startsWith:({prefix:e})=>`Must start with "${e}"`,time:()=>`Invalid time`,type:()=>`Expected string`,ulid:()=>`Invalid ULID`,url:()=>`Invalid URL`,uuid:()=>`Invalid UUID`},tuple:{length:({exact:e})=>`Expected tuple of length ${e}`,min:({min:e})=>`Expected tuple with at least ${e} items`,type:()=>`Expected array`},union:{invalid:()=>`Does not match any of the expected types`},variant:{invalidDiscriminator:({discriminator:e,expected:t})=>`Invalid discriminator value at "${e}": expected ${t.map(e=>JSON.stringify(e)).join(` | `)}`,type:()=>`Expected object`}},a=i,o=e=>{r(e)};function s(e){o(e)}function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function l(r,i){let a=e(r);for(let[e,r]of Object.entries(i)){if(r===void 0)continue;if(n(e)){s(`[spell] Ignoring unsafe message override key "${e}" to prevent prototype mutation.`);continue}let i=a[e];c(i)&&c(r)?t(a,e,l(i,r)):t(a,e,r)}return a}function u(e){a=l(i,e)}function d(e){o=e??(()=>{})}function f(){a=i}function p(e){return e===void 0?{messages:a}:{messages:l(a,e)}}function m(e,t){let n=a;a=l(i,e);try{let e=t();return e instanceof Promise?e.finally(()=>{a=n}):(a=n,e)}catch(e){throw a=n,e}}function h(e,t){let n=o;o=e??(()=>{});try{let e=t();return e instanceof Promise?e.finally(()=>{o=n}):(o=n,e)}catch(e){throw o=n,e}}function g(){return a}export{s as _dev,g as _messages,p as createParseContext,f as resetMessages,d as setLogger,u as setMessages,h as withLogger,m as withMessages};
|
|
2
2
|
//# sourceMappingURL=messages.js.map
|
package/dist/messages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","names":[],"sources":["../src/messages.ts"],"sourcesContent":["import { warn as _warnFn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\nlet _activeMessages: Messages = _builtinMessages;\n\n/** A function that receives internal warning messages from spell. */\nexport type Logger = (message: string) => void;\n\nlet _logger: Logger = (msg) => {\n _warnFn(msg);\n};\n\n/** @internal */\nexport function _dev(message: string): void {\n _logger(message);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n _dev(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Override any subset of the default validation messages globally.\n * Merges deeply into the current active messages — call again to update.\n *\n * For locale integration (e.g. with \\@vielzeug/lingua), call this inside\n * your locale-change handler:\n * ```ts\n * i18n.subscribe(() => setMessages(spellMessages[i18n.locale]));\n * ```\n */\nexport function setMessages(messages: DeepPartial<Messages>): void {\n _activeMessages = mergeMessages(_builtinMessages, messages);\n}\n\n/**\n * Override the internal warning logger.\n * Pass `null` to silence all internal warnings.\n */\nexport function setLogger(logger: Logger | null): void {\n _logger = logger ?? (() => {});\n}\n\n/** Reset all messages to the built-in defaults. */\nexport function resetMessages(): void {\n _activeMessages = _builtinMessages;\n}\n\n/** @internal — returns the active (possibly overridden) message set. */\nexport function _messages(): Messages {\n return _activeMessages;\n}\n"],"mappings":"8HA8HA,IAAM,EAA6B,CACjC,MAAO,CACL,QAAS,CAAE,WAAY,qBAAqB,EAAM,QAClD,KAAM,CAAE,SAAU,qBAAqB,EAAI,QAC3C,KAAM,CAAE,SAAU,sBAAsB,EAAI,QAC5C,aAAgB,kBAChB,SAAY,iBACZ,WAAc,0BAChB,EACA,OAAQ,CACN,KAAM,CAAE,SAAU,mBAAmB,IACrC,KAAM,CAAE,SAAU,oBAAoB,IACtC,YAAa,CAAE,UAAW,yBAAyB,IACnD,aAAgB,mBAChB,gBAAmB,uBACnB,gBAAmB,uBACnB,aAAgB,mBAChB,SAAY,iBACd,EACA,QAAS,CACP,SAAY,kBACd,EACA,MAAO,CACL,YAAe,eACjB,EACA,KAAM,CACJ,KAAM,CAAE,SAAU,kBAAkB,EAAI,YAAY,IACpD,KAAM,CAAE,SAAU,iBAAiB,EAAI,YAAY,IACnD,SAAY,qBACd,EACA,KAAM,CACJ,SAAU,CAAE,YAAa,oBAAoB,EAAO,IAAK,GAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC7F,EACA,WAAY,CACV,MAAO,CAAE,eAAgB,wBAAwB,GACnD,EACA,QAAS,CACP,UAAW,CAAE,cAAe,YAAY,KAAK,UAAU,CAAQ,GACjE,EACA,IAAK,CACH,KAAM,CAAE,SAAU,wBAAwB,EAAI,UAC9C,KAAM,CAAE,SAAU,yBAAyB,EAAI,UAC/C,aAAgB,kBAChB,MAAO,CAAE,WAAY,wBAAwB,EAAM,UACnD,SAAY,cACd,EACA,MAAO,CACL,YAAe,sBACjB,EACA,OAAQ,CACN,WAAc,iBACd,QAAW,qBACX,KAAM,CAAE,SAAU,mBAAmB,IACrC,KAAM,CAAE,SAAU,oBAAoB,IACtC,YAAa,CAAE,UAAW,yBAAyB,IACnD,aAAgB,mBAChB,gBAAmB,uBACnB,gBAAmB,uBACnB,aAAgB,mBAChB,SAAY,yBACZ,SAAY,iBACd,EACA,OAAQ,CACN,aAAc,CAAE,UAAW,sBAAsB,EAAK,KAAK,IAAI,IAC/D,SAAY,iBACd,EACA,IAAK,CACH,KAAM,CAAE,SAAU,wBAAwB,EAAI,QAC9C,KAAM,CAAE,SAAU,yBAAyB,EAAI,QAC/C,aAAgB,kBAChB,MAAO,CAAE,WAAY,wBAAwB,EAAM,QACnD,SAAY,cACd,EACA,OAAQ,CACN,WAAc,iBACd,cAAiB,oBACjB,SAAY,eACZ,UAAa,gBACb,SAAY,eACZ,aAAgB,mBAChB,aAAgB,4BAChB,UAAa,wBACb,UAAa,yBACb,UAAW,CAAE,YAAa,kBAAkB,EAAO,GACnD,QAAW,cACX,aAAgB,oBAChB,UAAW,CAAE,YAAa,iBAAiB,EAAO,GAClD,OAAU,qBACV,QAAW,cACX,QAAS,CAAE,WAAY,mBAAmB,EAAM,aAChD,KAAM,CAAE,SAAU,mBAAmB,EAAI,aACzC,KAAM,CAAE,SAAU,oBAAoB,EAAI,aAC1C,WAAc,iBACd,aAAgB,kBAChB,YAAe,yBACf,UAAa,iBACb,WAAc,iBACd,SAAY,eACZ,YAAa,CAAE,YAAa,oBAAoB,EAAO,GACvD,SAAY,eACZ,SAAY,kBACZ,SAAY,eACZ,QAAW,cACX,SAAY,cACd,EACA,MAAO,CACL,QAAS,CAAE,WAAY,4BAA4B,IACnD,KAAM,CAAE,SAAU,gCAAgC,EAAI,QACtD,SAAY,gBACd,EACA,MAAO,CACL,YAAe,0CACjB,EACA,QAAS,CACP,sBAAuB,CAAE,gBAAe,cACtC,mCAAmC,EAAc,cAAc,EAAS,IAAK,GAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAClH,SAAY,iBACd,CACF,EAEI,EAA4B,EAK5B,EAAmB,GAAQ,CAC7B,EAAQ,CAAG,CACb,EAGA,SAAgB,EAAK,EAAuB,CAC1C,EAAQ,CAAO,CACjB,CAEA,SAAS,EAAS,EAAkD,CAClE,OAAyB,OAAO,GAAU,YAAnC,GAA+C,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAEA,SAAS,EAAiD,EAAS,EAA0B,CAC3F,IAAM,EAAM,EAAY,CAAI,EAE5B,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAK,EAAG,CAChD,GAAI,IAAU,IAAA,GAAW,SAEzB,GAAI,EAAkB,CAAG,EAAG,CAC1B,EAAK,iDAAiD,EAAI,iCAAiC,EAC3F,QACF,CAEA,IAAM,EAAY,EAAI,GAElB,EAAS,CAAS,GAAK,EAAS,CAAK,EACvC,EAAkB,EAAK,EAAK,EAAc,EAAW,CAAsC,CAAC,EAE5F,EAAkB,EAAK,EAAK,CAAK,CAErC,CAEA,OAAO,CACT,CAYA,SAAgB,EAAY,EAAuC,CACjE,EAAkB,EAAc,EAAkB,CAAQ,CAC5D,CAMA,SAAgB,EAAU,EAA6B,CACrD,EAAU,QAAiB,CAAC,EAC9B,CAGA,SAAgB,GAAsB,CACpC,EAAkB,CACpB,CAGA,SAAgB,GAAsB,CACpC,OAAO,CACT"}
|
|
1
|
+
{"version":3,"file":"messages.js","names":[],"sources":["../src/messages.ts"],"sourcesContent":["import type { ParseContext } from './types';\n\nimport { warn as _warnFn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\nlet _activeMessages: Messages = _builtinMessages;\n\n/** A function that receives internal warning messages from spell. */\nexport type Logger = (message: string) => void;\n\nlet _logger: Logger = (msg) => {\n _warnFn(msg);\n};\n\n/** @internal */\nexport function _dev(message: string): void {\n _logger(message);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n _dev(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Override any subset of the default validation messages globally.\n * Each call starts from built-ins and applies the provided deep overrides.\n * It does not accumulate previous overrides.\n *\n * For locale integration (e.g. with \\@vielzeug/lingua), call this inside\n * your locale-change handler:\n * ```ts\n * i18n.subscribe(() => setMessages(spellMessages[i18n.locale]));\n * ```\n */\nexport function setMessages(messages: DeepPartial<Messages>): void {\n _activeMessages = mergeMessages(_builtinMessages, messages);\n}\n\n/**\n * Override the internal warning logger.\n * Pass `null` to silence all internal warnings.\n */\nexport function setLogger(logger: Logger | null): void {\n _logger = logger ?? (() => {});\n}\n\n/** Reset all messages to the built-in defaults. */\nexport function resetMessages(): void {\n _activeMessages = _builtinMessages;\n}\n\n/**\n * Creates a parse context with request-scoped message overrides.\n * Does not mutate global message state.\n */\nexport function createParseContext(messages?: DeepPartial<Messages>): ParseContext {\n if (messages === undefined) return { messages: _activeMessages };\n\n return { messages: mergeMessages(_activeMessages, messages) };\n}\n\n/**\n * Runs a callback with temporary global message overrides, then restores the previous state.\n * Supports both sync and async callbacks.\n */\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => T): T;\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => Promise<T>): Promise<T>;\nexport function withMessages<T>(messages: DeepPartial<Messages>, run: () => T | Promise<T>): T | Promise<T> {\n const previous = _activeMessages;\n\n _activeMessages = mergeMessages(_builtinMessages, messages);\n\n try {\n const result = run();\n\n if (result instanceof Promise) {\n return result.finally(() => {\n _activeMessages = previous;\n });\n }\n\n _activeMessages = previous;\n\n return result;\n } catch (error) {\n _activeMessages = previous;\n throw error;\n }\n}\n\n/**\n * Runs a callback with a temporary logger override, then restores the previous logger.\n * Supports both sync and async callbacks.\n */\nexport function withLogger<T>(logger: Logger | null, run: () => T): T;\nexport function withLogger<T>(logger: Logger | null, run: () => Promise<T>): Promise<T>;\nexport function withLogger<T>(logger: Logger | null, run: () => T | Promise<T>): T | Promise<T> {\n const previous = _logger;\n\n _logger = logger ?? (() => {});\n\n try {\n const result = run();\n\n if (result instanceof Promise) {\n return result.finally(() => {\n _logger = previous;\n });\n }\n\n _logger = previous;\n\n return result;\n } catch (error) {\n _logger = previous;\n throw error;\n }\n}\n\n/** @internal — returns the active (possibly overridden) message set. */\nexport function _messages(): Messages {\n return _activeMessages;\n}\n"],"mappings":"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"}
|
package/dist/schemas/variant.cjs
CHANGED
|
@@ -1,2 +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"),i=require("./literal.cjs");require("./object.cjs");var a=class a extends r.Schema{_map;_discriminator;get _kind(){return`variant`}constructor(e,n){let r=new Map;for(let[a,o]of Object.entries(n)){let n=new i.LiteralSchema(a),s=o.shape[e];if(s&&!s.equals(n))throw new t.SpellError(`s.variant(): branch "${a}" defines a conflicting discriminator schema for "${e}".`);let c={[e]:n};r.set(a,s?o:o.extend(c))}super(),this._discriminator=e,this._map=r}get discriminator(){return this._discriminator}get variantMap(){return this._map}_resolveVariant(t,n){if(typeof t!=`object`||!t||Array.isArray(t))return{issues:[{code:e.ErrorCode.invalid_type,message:n.messages.variant.type(),path:[]}]};let r=t,i=r[this._discriminator],a=this._map.get(i);if(!a){let t=[...this._map.keys()];return{issues:[{code:e.ErrorCode.invalid_variant,message:n.messages.variant.invalidDiscriminator({discriminator:this._discriminator,expected:t}),params:{discriminator:this._discriminator,expected:t},path:[]}]}}return{matched:a,obj:r}}_parse(e,t){let n=this._resolveVariant(e,t);if(`issues`in n)return{data:e,issues:n.issues,typeOk:!1};let r=n.matched._parseFullSync(e,t);return r.issues.length===0?{data:r.data,issues:[],typeOk:!0}:{data:e,issues:r.issues,typeOk:!0}}_toDescriptorImpl(){let e={};for(let[t,r]of this._map.entries())n.defineOwnProperty(e,t,r.toDescriptor());return{...this._describeBase(),branches:e,discriminator:this._discriminator,kind:`variant`}}_walk(e){let t=n.objectFromEntries([...this._map.entries()].map(([t,n])=>[t,n.walk(e)]));return e.variant?e.variant(this,t):super._walk(e)}_equalsImpl(e){if(!(e instanceof a)||this._discriminator!==e._discriminator||this._map.size!==e._map.size)return!1;for(let[t,n]of this._map){let r=e._map.get(t);if(!r||!n.equals(r))return!1}return!0}};exports.VariantSchema=a;
|
|
1
|
+
const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../safe-object.cjs");require("../messages.cjs");const r=require("../core.cjs"),i=require("./literal.cjs");require("./object.cjs");var a=class a extends r.Schema{_map;_discriminator;get _kind(){return`variant`}constructor(e,n){let r=new Map;for(let[a,o]of Object.entries(n)){let n=new i.LiteralSchema(a),s=o.shape[e];if(s&&!s.equals(n))throw new t.SpellError(`s.variant(): branch "${a}" defines a conflicting discriminator schema for "${e}".`);let c={[e]:n};r.set(a,s?o:o.extend(c))}super(),this._discriminator=e,this._map=r}get discriminator(){return this._discriminator}get variantMap(){return this._map}_resolveVariant(t,n){if(typeof t!=`object`||!t||Array.isArray(t))return{issues:[{code:e.ErrorCode.invalid_type,message:n.messages.variant.type(),path:[]}]};let r=t,i=r[this._discriminator],a=this._map.get(i);if(!a){let t=[...this._map.keys()];return{issues:[{code:e.ErrorCode.invalid_variant,message:n.messages.variant.invalidDiscriminator({discriminator:this._discriminator,expected:t}),params:{discriminator:this._discriminator,expected:t},path:[]}]}}return{matched:a,obj:r}}_parse(e,t){let n=this._resolveVariant(e,t);if(`issues`in n)return{data:e,issues:n.issues,typeOk:!1};let r=n.matched._parseFullSync(e,t);return r.issues.length===0?{data:r.data,issues:[],typeOk:!0}:{data:e,issues:r.issues,typeOk:!0}}async parseAsync(e,n){let i=n??r._makeCtx();return this._withCatchAsync(async()=>{let n=this._prepareInput(e);if(n.skip)return n.value;let r=this._resolveVariant(n.value,i);if(`issues`in r)throw new t.SpellValidationError(r.issues);let a=await r.matched.safeParseAsync(n.value,i);if(!a.success)throw a.error;let o=await this._runValidatorsAsync(a.data,i);if(o.length>0)throw new t.SpellValidationError(o);return this._runPostprocessors(a.data)})}_toDescriptorImpl(){let e={};for(let[t,r]of this._map.entries())n.defineOwnProperty(e,t,r.toDescriptor());return{...this._describeBase(),branches:e,discriminator:this._discriminator,kind:`variant`}}_walk(e){let t=n.objectFromEntries([...this._map.entries()].map(([t,n])=>[t,n.walk(e)]));return e.variant?e.variant(this,t):super._walk(e)}_equalsImpl(e){if(!(e instanceof a)||this._discriminator!==e._discriminator||this._map.size!==e._map.size)return!1;for(let[t,n]of this._map){let r=e._map.get(t);if(!r||!n.equals(r))return!1}return!0}};exports.VariantSchema=a;
|
|
2
2
|
//# sourceMappingURL=variant.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variant.cjs","names":[],"sources":["../../src/schemas/variant.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\nimport { SpellError } from '../errors';\nimport { _messages } from '../messages';\nimport { defineOwnProperty, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { type InferObject, ObjectSchema, type ObjectShape } from './object';\n\ntype VariantMap = Record<string, ObjectSchema<any>>;\ntype InferVariantMap<K extends string, M extends VariantMap> = {\n [Tag in keyof M & string]: M[Tag] extends ObjectSchema<infer S extends ObjectShape>\n ? InferObject<S> & { [P in K]: Tag }\n : never;\n}[keyof M & string];\n\nexport class VariantSchema<K extends string, M extends VariantMap> extends Schema<InferVariantMap<K, M>> {\n private readonly _map: Map<string, ObjectSchema<any>>;\n private readonly _discriminator: K;\n\n protected override get _kind(): string {\n return 'variant';\n }\n\n constructor(discriminator: K, variantMap: M) {\n const map = new Map<string, ObjectSchema<any>>();\n\n for (const [tag, schema] of Object.entries(variantMap)) {\n const discriminatorSchema = new LiteralSchema(tag);\n const existingDiscriminator = schema.shape[discriminator];\n\n if (existingDiscriminator && !existingDiscriminator.equals(discriminatorSchema)) {\n throw new SpellError(\n `s.variant(): branch \"${tag}\" defines a conflicting discriminator schema for \"${discriminator}\".`,\n );\n }\n\n const discriminatorShape = {\n [discriminator]: discriminatorSchema,\n } as unknown as Record<K, AnySchema>;\n\n map.set(tag, existingDiscriminator ? schema : schema.extend(discriminatorShape));\n }\n\n super();\n this._discriminator = discriminator;\n this._map = map;\n }\n\n /** The discriminator field key used to select the matching variant. */\n get discriminator(): K {\n return this._discriminator;\n }\n\n /** Map from discriminator tag value to the extended ObjectSchema for that variant. */\n get variantMap(): ReadonlyMap<string, ObjectSchema<any>> {\n return this._map;\n }\n\n private _resolveVariant(\n value: unknown,\n ctx: ParseContext,\n ): { matched: ObjectSchema<any>; obj: Record<string, unknown> } | { issues: Issue[] } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.variant.type(), path: [] }],\n };\n }\n\n const obj = value as Record<string, unknown>;\n const discValue = obj[this._discriminator] as string;\n const matched = this._map.get(discValue);\n\n if (!matched) {\n const expected = [...this._map.keys()];\n\n return {\n issues: [\n {\n code: ErrorCode.invalid_variant,\n message: ctx.messages.variant.invalidDiscriminator({\n discriminator: this._discriminator,\n expected,\n }),\n params: { discriminator: this._discriminator, expected },\n path: [],\n },\n ],\n };\n }\n\n return { matched, obj };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const resolved = this._resolveVariant(value, ctx);\n\n if ('issues' in resolved) return { data: value, issues: resolved.issues, typeOk: false };\n\n const result = resolved.matched._parseFullSync(value, ctx);\n\n return result.issues.length === 0\n ? { data: result.data, issues: [], typeOk: true }\n : { data: value, issues: result.issues, typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const branches: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of this._map.entries()) {\n defineOwnProperty(branches, key, schema.toDescriptor());\n }\n\n return { ...this._describeBase(), branches, discriminator: this._discriminator, kind: 'variant' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = objectFromEntries([...this._map.entries()].map(([k, s]) => [k, s.walk(visitor)]));\n\n if (visitor.variant) return visitor.variant(this, branches);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof VariantSchema)) return false;\n\n if (this._discriminator !== other._discriminator) return false;\n\n if (this._map.size !== other._map.size) return false;\n\n for (const [tag, schema] of this._map) {\n const otherSchema = other._map.get(tag);\n\n if (!otherSchema || !schema.equals(otherSchema)) return false;\n }\n\n return true;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"variant.cjs","names":[],"sources":["../../src/schemas/variant.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { SpellError } from '../errors';\nimport { _messages } from '../messages';\nimport { defineOwnProperty, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { type InferObject, ObjectSchema, type ObjectShape } from './object';\n\ntype VariantMap = Record<string, ObjectSchema<any>>;\ntype InferVariantMap<K extends string, M extends VariantMap> = {\n [Tag in keyof M & string]: M[Tag] extends ObjectSchema<infer S extends ObjectShape>\n ? InferObject<S> & { [P in K]: Tag }\n : never;\n}[keyof M & string];\n\nexport class VariantSchema<K extends string, M extends VariantMap> extends Schema<InferVariantMap<K, M>> {\n private readonly _map: Map<string, ObjectSchema<any>>;\n private readonly _discriminator: K;\n\n protected override get _kind(): string {\n return 'variant';\n }\n\n constructor(discriminator: K, variantMap: M) {\n const map = new Map<string, ObjectSchema<any>>();\n\n for (const [tag, schema] of Object.entries(variantMap)) {\n const discriminatorSchema = new LiteralSchema(tag);\n const existingDiscriminator = schema.shape[discriminator];\n\n if (existingDiscriminator && !existingDiscriminator.equals(discriminatorSchema)) {\n throw new SpellError(\n `s.variant(): branch \"${tag}\" defines a conflicting discriminator schema for \"${discriminator}\".`,\n );\n }\n\n const discriminatorShape = {\n [discriminator]: discriminatorSchema,\n } as unknown as Record<K, AnySchema>;\n\n map.set(tag, existingDiscriminator ? schema : schema.extend(discriminatorShape));\n }\n\n super();\n this._discriminator = discriminator;\n this._map = map;\n }\n\n /** The discriminator field key used to select the matching variant. */\n get discriminator(): K {\n return this._discriminator;\n }\n\n /** Map from discriminator tag value to the extended ObjectSchema for that variant. */\n get variantMap(): ReadonlyMap<string, ObjectSchema<any>> {\n return this._map;\n }\n\n private _resolveVariant(\n value: unknown,\n ctx: ParseContext,\n ): { matched: ObjectSchema<any>; obj: Record<string, unknown> } | { issues: Issue[] } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.variant.type(), path: [] }],\n };\n }\n\n const obj = value as Record<string, unknown>;\n const discValue = obj[this._discriminator] as string;\n const matched = this._map.get(discValue);\n\n if (!matched) {\n const expected = [...this._map.keys()];\n\n return {\n issues: [\n {\n code: ErrorCode.invalid_variant,\n message: ctx.messages.variant.invalidDiscriminator({\n discriminator: this._discriminator,\n expected,\n }),\n params: { discriminator: this._discriminator, expected },\n path: [],\n },\n ],\n };\n }\n\n return { matched, obj };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const resolved = this._resolveVariant(value, ctx);\n\n if ('issues' in resolved) return { data: value, issues: resolved.issues, typeOk: false };\n\n const result = resolved.matched._parseFullSync(value, ctx);\n\n return result.issues.length === 0\n ? { data: result.data, issues: [], typeOk: true }\n : { data: value, issues: result.issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferVariantMap<K, M>> {\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 InferVariantMap<K, M>;\n\n const resolved = this._resolveVariant(prepared.value, c);\n\n if ('issues' in resolved) throw new SpellValidationError(resolved.issues);\n\n const branch = await resolved.matched.safeParseAsync(prepared.value, c);\n\n if (!branch.success) throw branch.error;\n\n const validationIssues = await this._runValidatorsAsync(branch.data, c);\n\n if (validationIssues.length > 0) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(branch.data) as InferVariantMap<K, M>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const branches: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of this._map.entries()) {\n defineOwnProperty(branches, key, schema.toDescriptor());\n }\n\n return { ...this._describeBase(), branches, discriminator: this._discriminator, kind: 'variant' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = objectFromEntries([...this._map.entries()].map(([k, s]) => [k, s.walk(visitor)]));\n\n if (visitor.variant) return visitor.variant(this, branches);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof VariantSchema)) return false;\n\n if (this._discriminator !== other._discriminator) return false;\n\n if (this._map.size !== other._map.size) return false;\n\n for (const [tag, schema] of this._map) {\n const otherSchema = other._map.get(tag);\n\n if (!otherSchema || !schema.equals(otherSchema)) return false;\n }\n\n return true;\n }\n}\n"],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ export declare class VariantSchema<K extends string, M extends VariantMap> exten
|
|
|
18
18
|
get variantMap(): ReadonlyMap<string, ObjectSchema<any>>;
|
|
19
19
|
private _resolveVariant;
|
|
20
20
|
protected _parse(value: unknown, ctx: ParseContext): ParseValue;
|
|
21
|
+
parseAsync(value: unknown, ctx?: ParseContext): Promise<InferVariantMap<K, M>>;
|
|
21
22
|
protected _toDescriptorImpl(): SchemaDescriptor;
|
|
22
23
|
protected _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null;
|
|
23
24
|
protected _equalsImpl(other: import('../core').AnySchema): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variant.d.ts","sourceRoot":"","sources":["../../src/schemas/variant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAa,MAAM,
|
|
1
|
+
{"version":3,"file":"variant.d.ts","sourceRoot":"","sources":["../../src/schemas/variant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAa,MAAM,EAAkC,MAAM,SAAS,CAAC;AAK5E,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5E,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,KAAK,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,UAAU,IAAI;KAC5D,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,YAAY,CAAC,MAAM,CAAC,SAAS,WAAW,CAAC,GAC/E,WAAW,CAAC,CAAC,CAAC,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,GAAG;KAAE,GAClC,KAAK;CACV,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAEpB,qBAAa,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,UAAU,CAAE,SAAQ,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;IACtD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAI;IAEnC,cAAuB,KAAK,IAAI,MAAM,CAErC;gBAEW,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;IAyB3C,uEAAuE;IACvE,IAAI,aAAa,IAAI,CAAC,CAErB;IAED,sFAAsF;IACtF,IAAI,UAAU,IAAI,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAEvD;IAED,OAAO,CAAC,eAAe;cAmCJ,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU;IAYzD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;cAwB1E,iBAAiB,IAAI,gBAAgB;cAUrC,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;CAe5E"}
|
package/dist/schemas/variant.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ErrorCode as e}from"../types.js";import{SpellError as t}from"../errors.js";import{defineOwnProperty as
|
|
1
|
+
import{ErrorCode as e}from"../types.js";import{SpellError as t,SpellValidationError as n}from"../errors.js";import{defineOwnProperty as r,objectFromEntries as i}from"../safe-object.js";import"../messages.js";import{Schema as a,_makeCtx as o}from"../core.js";import{LiteralSchema as s}from"./literal.js";import"./object.js";var c=class c extends a{_map;_discriminator;get _kind(){return`variant`}constructor(e,n){let r=new Map;for(let[i,a]of Object.entries(n)){let n=new s(i),o=a.shape[e];if(o&&!o.equals(n))throw new t(`s.variant(): branch "${i}" defines a conflicting discriminator schema for "${e}".`);let c={[e]:n};r.set(i,o?a:a.extend(c))}super(),this._discriminator=e,this._map=r}get discriminator(){return this._discriminator}get variantMap(){return this._map}_resolveVariant(t,n){if(typeof t!=`object`||!t||Array.isArray(t))return{issues:[{code:e.invalid_type,message:n.messages.variant.type(),path:[]}]};let r=t,i=r[this._discriminator],a=this._map.get(i);if(!a){let t=[...this._map.keys()];return{issues:[{code:e.invalid_variant,message:n.messages.variant.invalidDiscriminator({discriminator:this._discriminator,expected:t}),params:{discriminator:this._discriminator,expected:t},path:[]}]}}return{matched:a,obj:r}}_parse(e,t){let n=this._resolveVariant(e,t);if(`issues`in n)return{data:e,issues:n.issues,typeOk:!1};let r=n.matched._parseFullSync(e,t);return r.issues.length===0?{data:r.data,issues:[],typeOk:!0}:{data:e,issues:r.issues,typeOk:!0}}async parseAsync(e,t){let r=t??o();return this._withCatchAsync(async()=>{let t=this._prepareInput(e);if(t.skip)return t.value;let i=this._resolveVariant(t.value,r);if(`issues`in i)throw new n(i.issues);let a=await i.matched.safeParseAsync(t.value,r);if(!a.success)throw a.error;let o=await this._runValidatorsAsync(a.data,r);if(o.length>0)throw new n(o);return this._runPostprocessors(a.data)})}_toDescriptorImpl(){let e={};for(let[t,n]of this._map.entries())r(e,t,n.toDescriptor());return{...this._describeBase(),branches:e,discriminator:this._discriminator,kind:`variant`}}_walk(e){let t=i([...this._map.entries()].map(([t,n])=>[t,n.walk(e)]));return e.variant?e.variant(this,t):super._walk(e)}_equalsImpl(e){if(!(e instanceof c)||this._discriminator!==e._discriminator||this._map.size!==e._map.size)return!1;for(let[t,n]of this._map){let r=e._map.get(t);if(!r||!n.equals(r))return!1}return!0}};export{c as VariantSchema};
|
|
2
2
|
//# sourceMappingURL=variant.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variant.js","names":[],"sources":["../../src/schemas/variant.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\nimport { SpellError } from '../errors';\nimport { _messages } from '../messages';\nimport { defineOwnProperty, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { type InferObject, ObjectSchema, type ObjectShape } from './object';\n\ntype VariantMap = Record<string, ObjectSchema<any>>;\ntype InferVariantMap<K extends string, M extends VariantMap> = {\n [Tag in keyof M & string]: M[Tag] extends ObjectSchema<infer S extends ObjectShape>\n ? InferObject<S> & { [P in K]: Tag }\n : never;\n}[keyof M & string];\n\nexport class VariantSchema<K extends string, M extends VariantMap> extends Schema<InferVariantMap<K, M>> {\n private readonly _map: Map<string, ObjectSchema<any>>;\n private readonly _discriminator: K;\n\n protected override get _kind(): string {\n return 'variant';\n }\n\n constructor(discriminator: K, variantMap: M) {\n const map = new Map<string, ObjectSchema<any>>();\n\n for (const [tag, schema] of Object.entries(variantMap)) {\n const discriminatorSchema = new LiteralSchema(tag);\n const existingDiscriminator = schema.shape[discriminator];\n\n if (existingDiscriminator && !existingDiscriminator.equals(discriminatorSchema)) {\n throw new SpellError(\n `s.variant(): branch \"${tag}\" defines a conflicting discriminator schema for \"${discriminator}\".`,\n );\n }\n\n const discriminatorShape = {\n [discriminator]: discriminatorSchema,\n } as unknown as Record<K, AnySchema>;\n\n map.set(tag, existingDiscriminator ? schema : schema.extend(discriminatorShape));\n }\n\n super();\n this._discriminator = discriminator;\n this._map = map;\n }\n\n /** The discriminator field key used to select the matching variant. */\n get discriminator(): K {\n return this._discriminator;\n }\n\n /** Map from discriminator tag value to the extended ObjectSchema for that variant. */\n get variantMap(): ReadonlyMap<string, ObjectSchema<any>> {\n return this._map;\n }\n\n private _resolveVariant(\n value: unknown,\n ctx: ParseContext,\n ): { matched: ObjectSchema<any>; obj: Record<string, unknown> } | { issues: Issue[] } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.variant.type(), path: [] }],\n };\n }\n\n const obj = value as Record<string, unknown>;\n const discValue = obj[this._discriminator] as string;\n const matched = this._map.get(discValue);\n\n if (!matched) {\n const expected = [...this._map.keys()];\n\n return {\n issues: [\n {\n code: ErrorCode.invalid_variant,\n message: ctx.messages.variant.invalidDiscriminator({\n discriminator: this._discriminator,\n expected,\n }),\n params: { discriminator: this._discriminator, expected },\n path: [],\n },\n ],\n };\n }\n\n return { matched, obj };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const resolved = this._resolveVariant(value, ctx);\n\n if ('issues' in resolved) return { data: value, issues: resolved.issues, typeOk: false };\n\n const result = resolved.matched._parseFullSync(value, ctx);\n\n return result.issues.length === 0\n ? { data: result.data, issues: [], typeOk: true }\n : { data: value, issues: result.issues, typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const branches: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of this._map.entries()) {\n defineOwnProperty(branches, key, schema.toDescriptor());\n }\n\n return { ...this._describeBase(), branches, discriminator: this._discriminator, kind: 'variant' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = objectFromEntries([...this._map.entries()].map(([k, s]) => [k, s.walk(visitor)]));\n\n if (visitor.variant) return visitor.variant(this, branches);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof VariantSchema)) return false;\n\n if (this._discriminator !== other._discriminator) return false;\n\n if (this._map.size !== other._map.size) return false;\n\n for (const [tag, schema] of this._map) {\n const otherSchema = other._map.get(tag);\n\n if (!otherSchema || !schema.equals(otherSchema)) return false;\n }\n\n return true;\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"variant.js","names":[],"sources":["../../src/schemas/variant.ts"],"sourcesContent":["import type { AnySchema, Issue, ParseContext, ParseValue, SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema, SpellValidationError, _makeCtx } from '../core';\nimport { SpellError } from '../errors';\nimport { _messages } from '../messages';\nimport { defineOwnProperty, objectFromEntries } from '../safe-object';\nimport { LiteralSchema } from './literal';\nimport { type InferObject, ObjectSchema, type ObjectShape } from './object';\n\ntype VariantMap = Record<string, ObjectSchema<any>>;\ntype InferVariantMap<K extends string, M extends VariantMap> = {\n [Tag in keyof M & string]: M[Tag] extends ObjectSchema<infer S extends ObjectShape>\n ? InferObject<S> & { [P in K]: Tag }\n : never;\n}[keyof M & string];\n\nexport class VariantSchema<K extends string, M extends VariantMap> extends Schema<InferVariantMap<K, M>> {\n private readonly _map: Map<string, ObjectSchema<any>>;\n private readonly _discriminator: K;\n\n protected override get _kind(): string {\n return 'variant';\n }\n\n constructor(discriminator: K, variantMap: M) {\n const map = new Map<string, ObjectSchema<any>>();\n\n for (const [tag, schema] of Object.entries(variantMap)) {\n const discriminatorSchema = new LiteralSchema(tag);\n const existingDiscriminator = schema.shape[discriminator];\n\n if (existingDiscriminator && !existingDiscriminator.equals(discriminatorSchema)) {\n throw new SpellError(\n `s.variant(): branch \"${tag}\" defines a conflicting discriminator schema for \"${discriminator}\".`,\n );\n }\n\n const discriminatorShape = {\n [discriminator]: discriminatorSchema,\n } as unknown as Record<K, AnySchema>;\n\n map.set(tag, existingDiscriminator ? schema : schema.extend(discriminatorShape));\n }\n\n super();\n this._discriminator = discriminator;\n this._map = map;\n }\n\n /** The discriminator field key used to select the matching variant. */\n get discriminator(): K {\n return this._discriminator;\n }\n\n /** Map from discriminator tag value to the extended ObjectSchema for that variant. */\n get variantMap(): ReadonlyMap<string, ObjectSchema<any>> {\n return this._map;\n }\n\n private _resolveVariant(\n value: unknown,\n ctx: ParseContext,\n ): { matched: ObjectSchema<any>; obj: Record<string, unknown> } | { issues: Issue[] } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return {\n issues: [{ code: ErrorCode.invalid_type, message: ctx.messages.variant.type(), path: [] }],\n };\n }\n\n const obj = value as Record<string, unknown>;\n const discValue = obj[this._discriminator] as string;\n const matched = this._map.get(discValue);\n\n if (!matched) {\n const expected = [...this._map.keys()];\n\n return {\n issues: [\n {\n code: ErrorCode.invalid_variant,\n message: ctx.messages.variant.invalidDiscriminator({\n discriminator: this._discriminator,\n expected,\n }),\n params: { discriminator: this._discriminator, expected },\n path: [],\n },\n ],\n };\n }\n\n return { matched, obj };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const resolved = this._resolveVariant(value, ctx);\n\n if ('issues' in resolved) return { data: value, issues: resolved.issues, typeOk: false };\n\n const result = resolved.matched._parseFullSync(value, ctx);\n\n return result.issues.length === 0\n ? { data: result.data, issues: [], typeOk: true }\n : { data: value, issues: result.issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferVariantMap<K, M>> {\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 InferVariantMap<K, M>;\n\n const resolved = this._resolveVariant(prepared.value, c);\n\n if ('issues' in resolved) throw new SpellValidationError(resolved.issues);\n\n const branch = await resolved.matched.safeParseAsync(prepared.value, c);\n\n if (!branch.success) throw branch.error;\n\n const validationIssues = await this._runValidatorsAsync(branch.data, c);\n\n if (validationIssues.length > 0) throw new SpellValidationError(validationIssues);\n\n return this._runPostprocessors(branch.data) as InferVariantMap<K, M>;\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const branches: Record<string, SchemaDescriptor> = {};\n\n for (const [key, schema] of this._map.entries()) {\n defineOwnProperty(branches, key, schema.toDescriptor());\n }\n\n return { ...this._describeBase(), branches, discriminator: this._discriminator, kind: 'variant' };\n }\n\n protected override _walk<R>(visitor: import('../core').SchemaWalker<R>): R | null {\n const branches = objectFromEntries([...this._map.entries()].map(([k, s]) => [k, s.walk(visitor)]));\n\n if (visitor.variant) return visitor.variant(this, branches);\n\n return super._walk(visitor);\n }\n\n protected override _equalsImpl(other: import('../core').AnySchema): boolean {\n if (!(other instanceof VariantSchema)) return false;\n\n if (this._discriminator !== other._discriminator) return false;\n\n if (this._map.size !== other._map.size) return false;\n\n for (const [tag, schema] of this._map) {\n const otherSchema = other._map.get(tag);\n\n if (!otherSchema || !schema.equals(otherSchema)) return false;\n }\n\n return true;\n }\n}\n"],"mappings":"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"}
|