@vielzeug/spell 26.11.9 → 26.11.11
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/_dev.cjs.map +1 -1
- package/dist/_dev.js.map +1 -1
- package/dist/_object.cjs +2 -0
- package/dist/_object.cjs.map +1 -0
- package/dist/_object.d.ts +9 -0
- package/dist/_object.d.ts.map +1 -0
- package/dist/_object.js +2 -0
- package/dist/_object.js.map +1 -0
- package/dist/_parse.cjs +2 -0
- package/dist/_parse.cjs.map +1 -0
- package/dist/_parse.d.ts +38 -0
- package/dist/_parse.d.ts.map +1 -0
- package/dist/_parse.js +2 -0
- package/dist/_parse.js.map +1 -0
- package/dist/errors.cjs +2 -2
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +15 -26
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/json.cjs +2 -1
- package/dist/json.cjs.map +1 -0
- package/dist/json.d.ts +8 -1
- package/dist/json.d.ts.map +1 -1
- package/dist/json.js +2 -1
- package/dist/json.js.map +1 -0
- package/dist/messages.cjs +1 -1
- package/dist/messages.cjs.map +1 -1
- package/dist/messages.d.ts +7 -6
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +1 -1
- package/dist/messages.js.map +1 -1
- package/dist/predicates.cjs +2 -1
- package/dist/predicates.cjs.map +1 -0
- package/dist/predicates.d.ts +41 -2
- package/dist/predicates.d.ts.map +1 -1
- package/dist/predicates.js +2 -1
- package/dist/predicates.js.map +1 -0
- package/dist/s.cjs +1 -1
- package/dist/s.cjs.map +1 -1
- package/dist/s.d.ts +21 -22
- package/dist/s.d.ts.map +1 -1
- package/dist/s.js +1 -1
- package/dist/s.js.map +1 -1
- package/dist/schema.cjs +2 -0
- package/dist/schema.cjs.map +1 -0
- package/dist/schema.d.ts +93 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/schemas/array.cjs +1 -1
- package/dist/schemas/array.cjs.map +1 -1
- package/dist/schemas/array.d.ts +22 -32
- package/dist/schemas/array.d.ts.map +1 -1
- package/dist/schemas/array.js +1 -1
- package/dist/schemas/array.js.map +1 -1
- package/dist/schemas/bigint.cjs +1 -1
- package/dist/schemas/bigint.cjs.map +1 -1
- package/dist/schemas/bigint.d.ts +14 -18
- package/dist/schemas/bigint.d.ts.map +1 -1
- package/dist/schemas/bigint.js +1 -1
- package/dist/schemas/bigint.js.map +1 -1
- package/dist/schemas/date.cjs +1 -1
- package/dist/schemas/date.cjs.map +1 -1
- package/dist/schemas/date.d.ts +7 -6
- package/dist/schemas/date.d.ts.map +1 -1
- package/dist/schemas/date.js +1 -1
- package/dist/schemas/date.js.map +1 -1
- package/dist/schemas/discriminated-union.cjs +2 -0
- package/dist/schemas/discriminated-union.cjs.map +1 -0
- package/dist/schemas/discriminated-union.d.ts +39 -0
- package/dist/schemas/discriminated-union.d.ts.map +1 -0
- package/dist/schemas/discriminated-union.js +2 -0
- package/dist/schemas/discriminated-union.js.map +1 -0
- package/dist/schemas/intersect.cjs +1 -1
- package/dist/schemas/intersect.cjs.map +1 -1
- package/dist/schemas/intersect.d.ts +10 -9
- package/dist/schemas/intersect.d.ts.map +1 -1
- package/dist/schemas/intersect.js +1 -1
- package/dist/schemas/intersect.js.map +1 -1
- package/dist/schemas/lazy.cjs +1 -1
- package/dist/schemas/lazy.cjs.map +1 -1
- package/dist/schemas/lazy.d.ts +10 -10
- package/dist/schemas/lazy.d.ts.map +1 -1
- package/dist/schemas/lazy.js +1 -1
- package/dist/schemas/lazy.js.map +1 -1
- package/dist/schemas/map.cjs +1 -1
- package/dist/schemas/map.cjs.map +1 -1
- package/dist/schemas/map.d.ts +8 -7
- package/dist/schemas/map.d.ts.map +1 -1
- package/dist/schemas/map.js +1 -1
- package/dist/schemas/map.js.map +1 -1
- package/dist/schemas/number.cjs +1 -1
- package/dist/schemas/number.cjs.map +1 -1
- package/dist/schemas/number.d.ts +20 -27
- package/dist/schemas/number.d.ts.map +1 -1
- package/dist/schemas/number.js +1 -1
- package/dist/schemas/number.js.map +1 -1
- package/dist/schemas/object.cjs +1 -1
- package/dist/schemas/object.cjs.map +1 -1
- package/dist/schemas/object.d.ts +40 -88
- package/dist/schemas/object.d.ts.map +1 -1
- package/dist/schemas/object.js +1 -1
- package/dist/schemas/object.js.map +1 -1
- package/dist/schemas/primitives.cjs +2 -0
- package/dist/schemas/primitives.cjs.map +1 -0
- package/dist/schemas/primitives.d.ts +38 -0
- package/dist/schemas/primitives.d.ts.map +1 -0
- package/dist/schemas/primitives.js +2 -0
- package/dist/schemas/primitives.js.map +1 -0
- package/dist/schemas/record.cjs +1 -1
- package/dist/schemas/record.cjs.map +1 -1
- package/dist/schemas/record.d.ts +7 -8
- package/dist/schemas/record.d.ts.map +1 -1
- package/dist/schemas/record.js +1 -1
- package/dist/schemas/record.js.map +1 -1
- package/dist/schemas/set.cjs +1 -1
- package/dist/schemas/set.cjs.map +1 -1
- package/dist/schemas/set.d.ts +8 -7
- package/dist/schemas/set.d.ts.map +1 -1
- package/dist/schemas/set.js +1 -1
- package/dist/schemas/set.js.map +1 -1
- package/dist/schemas/string.cjs +1 -1
- package/dist/schemas/string.cjs.map +1 -1
- package/dist/schemas/string.d.ts +42 -98
- package/dist/schemas/string.d.ts.map +1 -1
- package/dist/schemas/string.js +1 -1
- package/dist/schemas/string.js.map +1 -1
- package/dist/schemas/tuple.cjs +1 -1
- package/dist/schemas/tuple.cjs.map +1 -1
- package/dist/schemas/tuple.d.ts +9 -9
- package/dist/schemas/tuple.d.ts.map +1 -1
- package/dist/schemas/tuple.js +1 -1
- package/dist/schemas/tuple.js.map +1 -1
- package/dist/schemas/union.cjs +1 -1
- package/dist/schemas/union.cjs.map +1 -1
- package/dist/schemas/union.d.ts +9 -7
- package/dist/schemas/union.d.ts.map +1 -1
- package/dist/schemas/union.js +1 -1
- package/dist/schemas/union.js.map +1 -1
- package/dist/spell.cjs +2 -2
- package/dist/spell.cjs.map +1 -1
- package/dist/spell.iife.js +2 -2
- package/dist/spell.iife.js.map +1 -1
- package/dist/spell.js +842 -1601
- package/dist/spell.js.map +1 -1
- package/dist/types.cjs +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.ts +151 -265
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/dist/core.cjs +0 -2
- package/dist/core.cjs.map +0 -1
- package/dist/core.d.ts +0 -101
- package/dist/core.d.ts.map +0 -1
- package/dist/core.js +0 -2
- package/dist/core.js.map +0 -1
- package/dist/formats.cjs +0 -2
- package/dist/formats.cjs.map +0 -1
- package/dist/formats.d.ts +0 -41
- package/dist/formats.d.ts.map +0 -1
- package/dist/formats.js +0 -2
- package/dist/formats.js.map +0 -1
- package/dist/json-schema.cjs +0 -2
- package/dist/json-schema.cjs.map +0 -1
- package/dist/json-schema.d.ts +0 -5
- package/dist/json-schema.d.ts.map +0 -1
- package/dist/json-schema.js +0 -2
- package/dist/json-schema.js.map +0 -1
- package/dist/safe-object.cjs +0 -2
- package/dist/safe-object.cjs.map +0 -1
- package/dist/safe-object.d.ts +0 -6
- package/dist/safe-object.d.ts.map +0 -1
- package/dist/safe-object.js +0 -2
- package/dist/safe-object.js.map +0 -1
- package/dist/schemas/boolean.cjs +0 -2
- package/dist/schemas/boolean.cjs.map +0 -1
- package/dist/schemas/boolean.d.ts +0 -9
- package/dist/schemas/boolean.d.ts.map +0 -1
- package/dist/schemas/boolean.js +0 -2
- package/dist/schemas/boolean.js.map +0 -1
- package/dist/schemas/enum.cjs +0 -2
- package/dist/schemas/enum.cjs.map +0 -1
- package/dist/schemas/enum.d.ts +0 -12
- package/dist/schemas/enum.d.ts.map +0 -1
- package/dist/schemas/enum.js +0 -2
- package/dist/schemas/enum.js.map +0 -1
- package/dist/schemas/instanceof.cjs +0 -2
- package/dist/schemas/instanceof.cjs.map +0 -1
- package/dist/schemas/instanceof.d.ts +0 -9
- package/dist/schemas/instanceof.d.ts.map +0 -1
- package/dist/schemas/instanceof.js +0 -2
- package/dist/schemas/instanceof.js.map +0 -1
- package/dist/schemas/literal.cjs +0 -2
- package/dist/schemas/literal.cjs.map +0 -1
- package/dist/schemas/literal.d.ts +0 -9
- package/dist/schemas/literal.d.ts.map +0 -1
- package/dist/schemas/literal.js +0 -2
- package/dist/schemas/literal.js.map +0 -1
- package/dist/schemas/never.cjs +0 -2
- package/dist/schemas/never.cjs.map +0 -1
- package/dist/schemas/never.d.ts +0 -8
- package/dist/schemas/never.d.ts.map +0 -1
- package/dist/schemas/never.js +0 -2
- package/dist/schemas/never.js.map +0 -1
- package/dist/schemas/raw-or.cjs +0 -2
- package/dist/schemas/raw-or.cjs.map +0 -1
- package/dist/schemas/raw-or.d.ts +0 -17
- package/dist/schemas/raw-or.d.ts.map +0 -1
- package/dist/schemas/raw-or.js +0 -2
- package/dist/schemas/raw-or.js.map +0 -1
- package/dist/schemas/variant.cjs +0 -2
- package/dist/schemas/variant.cjs.map +0 -1
- package/dist/schemas/variant.d.ts +0 -37
- package/dist/schemas/variant.d.ts.map +0 -1
- package/dist/schemas/variant.js +0 -2
- package/dist/schemas/variant.js.map +0 -1
- package/dist/tolerate.cjs +0 -2
- package/dist/tolerate.cjs.map +0 -1
- package/dist/tolerate.d.ts +0 -10
- package/dist/tolerate.d.ts.map +0 -1
- package/dist/tolerate.js +0 -2
- package/dist/tolerate.js.map +0 -1
- package/dist/validators.cjs +0 -2
- package/dist/validators.cjs.map +0 -1
- package/dist/validators.d.ts +0 -20
- package/dist/validators.d.ts.map +0 -1
- package/dist/validators.js +0 -2
- package/dist/validators.js.map +0 -1
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ const UserSchema = s.object({
|
|
|
19
19
|
id: s.coerce.number().int().positive(),
|
|
20
20
|
name: s.string().trim().min(1),
|
|
21
21
|
email: s.string().trim().email(),
|
|
22
|
-
role: s.
|
|
22
|
+
role: s.enum(['admin', 'editor', 'viewer']).default('viewer'),
|
|
23
23
|
tags: s.array(s.string()).unique().default([]),
|
|
24
24
|
});
|
|
25
25
|
|
package/dist/_dev.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_dev.cjs","names":["warn"],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n
|
|
1
|
+
{"version":3,"file":"_dev.cjs","names":["warn"],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n"],"mappings":"AAGA,SAAgBA,EAAK,EAAmB,CAExC,C"}
|
package/dist/_dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_dev.js","names":["warn"],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n
|
|
1
|
+
{"version":3,"file":"_dev.js","names":["warn"],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n"],"mappings":"AAGA,SAAgBA,EAAK,EAAmB,CAExC,C"}
|
package/dist/_object.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e=require("@vielzeug/arsenal");var t=new Set([`__proto__`,`constructor`,`prototype`]);function n(e){return t.has(e)}function r(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0})}function i(e){let t={};for(let[n,i]of e)r(t,n,i);return t}function a(t){return Array.isArray(t)?t.map(a):t instanceof Date?new Date(t.getTime()):t instanceof Map?new Map([...t].map(([e,t])=>[a(e),a(t)])):t instanceof Set?new Set([...t].map(a)):(0,e.isPlainObject)(t)?i(Object.entries(t).map(([e,t])=>[e,a(t)])):t}function o(e){if(typeof e!=`object`||!e||Object.isFrozen(e))return e;for(let t of Object.values(e))o(t);return Object.freeze(e)}exports.deepFreeze=o,exports.defineOwnProperty=r,exports.isUnsafeObjectKey=n,exports.materialize=a,exports.objectFromEntries=i;
|
|
2
|
+
//# sourceMappingURL=_object.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_object.cjs","names":["isPlainObject","_vielzeug_arsenal","UNSAFE_OBJECT_KEYS","isUnsafeObjectKey","key","defineOwnProperty","target","objectFromEntries","out","value","entries","materialize","k","v","entry","deepFreeze","child"],"sources":["../src/_object.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nconst UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** Keys that would mutate a prototype when assigned through `obj[key] = value`. */\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n\n/** Assigns an own enumerable property without triggering inherited setters such as `__proto__`. */\nexport function defineOwnProperty<T>(target: Record<string, T>, key: string, value: T): void {\n Object.defineProperty(target, key, { configurable: true, enumerable: true, value, writable: true });\n}\n\nexport function objectFromEntries<T>(entries: Iterable<readonly [string, T]>): Record<string, T> {\n const out: Record<string, T> = {};\n\n for (const [key, value] of entries) defineOwnProperty(out, key, value);\n\n return out;\n}\n\n/** Deep-copies arrays, plain objects, dates, maps, and sets; returns every other value as-is. */\nexport function materialize<T>(value: T): T {\n if (Array.isArray(value)) return value.map(materialize) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) return new Map([...value].map(([k, v]) => [materialize(k), materialize(v)])) as T;\n\n if (value instanceof Set) return new Set([...value].map(materialize)) as T;\n\n if (isPlainObject(value)) {\n return objectFromEntries(Object.entries(value).map(([key, entry]) => [key, materialize(entry)])) as T;\n }\n\n return value;\n}\n\nexport function deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n"],"mappings":"A,mCAEA,IAAME,EAAqB,IAAI,IAAI,CAAC,YAAa,cAAe,WAAW,CAAC,EAG5E,SAAgBC,EAAkB,EAAsB,CACtD,OAAOD,EAAmB,IAAIE,CAAG,CACnC,CAGA,SAAgBC,EAAqB,EAA2B,EAAa,EAAgB,CAC3F,OAAO,eAAeC,EAAQF,EAAK,CAAE,aAAc,GAAM,WAAY,GAAM,QAAO,SAAU,EAAK,CAAC,CACpG,CAEA,SAAgBG,EAAqB,EAA4D,CAC/F,IAAMC,EAAyB,CAAC,EAEhC,IAAK,GAAM,CAACJ,EAAKK,KAAUC,EAASL,EAAkBG,EAAKJ,EAAKK,CAAK,EAErE,OAAOD,CACT,CAGA,SAAgBG,EAAe,EAAa,CAa1C,OAZI,MAAM,QAAQF,CAAK,EAAUA,EAAM,IAAIE,CAAW,EAElDF,aAAiB,KAAa,IAAI,KAAKA,EAAM,QAAQ,CAAC,EAEtDA,aAAiB,IAAY,IAAI,IAAI,CAAC,GAAGA,CAAK,CAAC,CAAC,KAAK,CAACG,EAAGC,KAAO,CAACF,EAAYC,CAAC,EAAGD,EAAYE,CAAC,CAAC,CAAC,CAAC,EAEjGJ,aAAiB,IAAY,IAAI,IAAI,CAAC,GAAGA,CAAK,CAAC,CAAC,IAAIE,CAAW,CAAC,GAEpE,EAAIX,EAAAA,cAAAA,CAAcS,CAAK,EACdF,EAAkB,OAAO,QAAQE,CAAK,CAAC,CAAC,KAAK,CAACL,EAAKU,KAAW,CAACV,EAAKO,EAAYG,CAAK,CAAC,CAAC,CAAC,EAG1FL,CACT,CAEA,SAAgBM,EAAc,EAAa,CACzC,GAAsB,OAAON,GAAU,WAAnCA,GAA+C,OAAO,SAASA,CAAK,EAAG,OAAOA,EAElF,IAAK,IAAMO,KAAS,OAAO,OAAOP,CAAK,EAAGM,EAAWC,CAAK,EAE1D,OAAO,OAAO,OAAOP,CAAK,CAC5B,C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Keys that would mutate a prototype when assigned through `obj[key] = value`. */
|
|
2
|
+
export declare function isUnsafeObjectKey(key: string): boolean;
|
|
3
|
+
/** Assigns an own enumerable property without triggering inherited setters such as `__proto__`. */
|
|
4
|
+
export declare function defineOwnProperty<T>(target: Record<string, T>, key: string, value: T): void;
|
|
5
|
+
export declare function objectFromEntries<T>(entries: Iterable<readonly [string, T]>): Record<string, T>;
|
|
6
|
+
/** Deep-copies arrays, plain objects, dates, maps, and sets; returns every other value as-is. */
|
|
7
|
+
export declare function materialize<T>(value: T): T;
|
|
8
|
+
export declare function deepFreeze<T>(value: T): T;
|
|
9
|
+
//# sourceMappingURL=_object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_object.d.ts","sourceRoot":"","sources":["../src/_object.ts"],"names":[],"mappings":"AAIA,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAE3F;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAM/F;AAED,iGAAiG;AACjG,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAc1C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAMzC"}
|
package/dist/_object.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{isPlainObject as e}from"@vielzeug/arsenal";var t=/* @__PURE__ */ new Set([`__proto__`,`constructor`,`prototype`]);function n(e){return t.has(e)}function r(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0})}function i(e){let t={};for(let[n,i]of e)r(t,n,i);return t}function a(t){return Array.isArray(t)?t.map(a):t instanceof Date?new Date(t.getTime()):t instanceof Map?new Map([...t].map(([e,t])=>[a(e),a(t)])):t instanceof Set?new Set([...t].map(a)):e(t)?i(Object.entries(t).map(([e,t])=>[e,a(t)])):t}function o(e){if(typeof e!=`object`||!e||Object.isFrozen(e))return e;for(let t of Object.values(e))o(t);return Object.freeze(e)}export{o as deepFreeze,r as defineOwnProperty,n as isUnsafeObjectKey,a as materialize,i as objectFromEntries};
|
|
2
|
+
//# sourceMappingURL=_object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_object.js","names":["UNSAFE_OBJECT_KEYS","isUnsafeObjectKey","key","defineOwnProperty","target","objectFromEntries","out","value","entries","materialize","k","v","isPlainObject","entry","deepFreeze","child"],"sources":["../src/_object.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nconst UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** Keys that would mutate a prototype when assigned through `obj[key] = value`. */\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n\n/** Assigns an own enumerable property without triggering inherited setters such as `__proto__`. */\nexport function defineOwnProperty<T>(target: Record<string, T>, key: string, value: T): void {\n Object.defineProperty(target, key, { configurable: true, enumerable: true, value, writable: true });\n}\n\nexport function objectFromEntries<T>(entries: Iterable<readonly [string, T]>): Record<string, T> {\n const out: Record<string, T> = {};\n\n for (const [key, value] of entries) defineOwnProperty(out, key, value);\n\n return out;\n}\n\n/** Deep-copies arrays, plain objects, dates, maps, and sets; returns every other value as-is. */\nexport function materialize<T>(value: T): T {\n if (Array.isArray(value)) return value.map(materialize) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) return new Map([...value].map(([k, v]) => [materialize(k), materialize(v)])) as T;\n\n if (value instanceof Set) return new Set([...value].map(materialize)) as T;\n\n if (isPlainObject(value)) {\n return objectFromEntries(Object.entries(value).map(([key, entry]) => [key, materialize(entry)])) as T;\n }\n\n return value;\n}\n\nexport function deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n"],"mappings":"A,kDAEA,IAAMA,kBAAqB,IAAI,IAAI,CAAC,YAAa,cAAe,WAAW,CAAC,EAG5E,SAAgBC,EAAkB,EAAsB,CACtD,OAAOD,EAAmB,IAAIE,CAAG,CACnC,CAGA,SAAgBC,EAAqB,EAA2B,EAAa,EAAgB,CAC3F,OAAO,eAAeC,EAAQF,EAAK,CAAE,aAAc,GAAM,WAAY,GAAM,QAAO,SAAU,EAAK,CAAC,CACpG,CAEA,SAAgBG,EAAqB,EAA4D,CAC/F,IAAMC,EAAyB,CAAC,EAEhC,IAAK,GAAM,CAACJ,EAAKK,KAAUC,EAASL,EAAkBG,EAAKJ,EAAKK,CAAK,EAErE,OAAOD,CACT,CAGA,SAAgBG,EAAe,EAAa,CAa1C,OAZI,MAAM,QAAQF,CAAK,EAAUA,EAAM,IAAIE,CAAW,EAElDF,aAAiB,KAAa,IAAI,KAAKA,EAAM,QAAQ,CAAC,EAEtDA,aAAiB,IAAY,IAAI,IAAI,CAAC,GAAGA,CAAK,CAAC,CAAC,KAAK,CAACG,EAAGC,KAAO,CAACF,EAAYC,CAAC,EAAGD,EAAYE,CAAC,CAAC,CAAC,CAAC,EAEjGJ,aAAiB,IAAY,IAAI,IAAI,CAAC,GAAGA,CAAK,CAAC,CAAC,IAAIE,CAAW,CAAC,EAEhEG,EAAcL,CAAK,EACdF,EAAkB,OAAO,QAAQE,CAAK,CAAC,CAAC,KAAK,CAACL,EAAKW,KAAW,CAACX,EAAKO,EAAYI,CAAK,CAAC,CAAC,CAAC,EAG1FN,CACT,CAEA,SAAgBO,EAAc,EAAa,CACzC,GAAsB,OAAOP,GAAU,WAAnCA,GAA+C,OAAO,SAASA,CAAK,EAAG,OAAOA,EAElF,IAAK,IAAMQ,KAAS,OAAO,OAAOR,CAAK,EAAGO,EAAWC,CAAK,EAE1D,OAAO,OAAO,OAAOR,CAAK,CAC5B,C"}
|
package/dist/_parse.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,t){return e instanceof Promise?e.then(t):t(e)}function t(e){return e.some(e=>e instanceof Promise)?Promise.all(e):e}function n(e,t,...[n]){return n===void 0?{code:e,message:t,path:[]}:{code:e,message:t,params:n,path:[]}}function r(e,t){return typeof e==`function`?e(t):e}function i(e,t){return e.map(e=>({...e,path:[t,...e.path]}))}var a=(e,t)=>e===void 0||t>e?t:e,o=(e,t)=>e===void 0||t<e?t:e,s=e=>({issues:[],typeOk:!0,value:e}),c=(e,...t)=>({issues:t,typeOk:!1,value:e});exports.all=t,exports.atLeast=a,exports.atMost=o,exports.chain=e,exports.invalid=c,exports.issue=n,exports.ok=s,exports.prefixIssues=i,exports.resolveMessage=r;
|
|
2
|
+
//# sourceMappingURL=_parse.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_parse.cjs","names":["chain","value","fn","all","values","issue","params","resolveMessage","message","ctx","prefixIssues","issues","entry","segment","atLeast","current","next","atMost","ok","invalid"],"sources":["../src/_parse.ts"],"sourcesContent":["import type { Messages } from './messages';\nimport type { ErrorCode, Issue, MessageFn } from './types';\n\nexport type MaybePromise<T> = T | Promise<T>;\n\n/** Context threaded through one parse. `async: false` forbids async checks. */\nexport type RunContext = { readonly async: boolean; readonly messages: Messages };\n\n/** Result of running a schema: `issues` is empty on success. */\nexport type Outcome = { issues: Issue[]; value: unknown };\n\n/**\n * Result of a schema's own structural parse. `typeOk: false` means the value has the wrong shape,\n * so the schema's checks and transforms must not run.\n */\nexport type ParseValue = Outcome & { typeOk: boolean };\n\n/** Applies `fn` synchronously when `value` is not a promise. */\nexport function chain<T, R>(value: MaybePromise<T>, fn: (value: T) => MaybePromise<R>): MaybePromise<R> {\n return value instanceof Promise ? value.then(fn) : fn(value);\n}\n\n/** `Promise.all` that stays synchronous when no element is a promise. */\nexport function all<T>(values: MaybePromise<T>[]): MaybePromise<T[]> {\n return values.some((value) => value instanceof Promise) ? Promise.all(values) : (values as T[]);\n}\n\ntype IssueParams<C extends ErrorCode> = Extract<Issue, { code: C }>['params'];\n\nexport function issue<C extends ErrorCode>(\n code: C,\n message: string,\n ...[params]: undefined extends IssueParams<C> ? [params?: IssueParams<C>] : [params: IssueParams<C>]\n): Issue {\n return (params === undefined ? { code, message, path: [] } : { code, message, params, path: [] }) as Issue;\n}\n\nexport function resolveMessage<Ctx extends Record<string, unknown>>(message: MessageFn<Ctx>, ctx: Ctx): string {\n return typeof message === 'function' ? message(ctx) : message;\n}\n\nexport function prefixIssues(issues: readonly Issue[], segment: string | number): Issue[] {\n return issues.map((entry) => ({ ...entry, path: [segment, ...entry.path] }));\n}\n\n/** Tightest lower bound of an existing (optional) bound and a new one. */\nexport const atLeast = <N extends number | bigint>(current: N | undefined, next: N): N =>\n current === undefined || next > current ? next : current;\n\n/** Tightest upper bound of an existing (optional) bound and a new one. */\nexport const atMost = <N extends number | bigint>(current: N | undefined, next: N): N =>\n current === undefined || next < current ? next : current;\n\nexport const ok = (value: unknown): ParseValue => ({ issues: [], typeOk: true, value });\n\nexport const invalid = (value: unknown, ...issues: Issue[]): ParseValue => ({ issues, typeOk: false, value });\n"],"mappings":"AAkBA,SAAgBA,EAAY,EAAwB,EAAoD,CACtG,OAAOC,aAAiB,QAAUA,EAAM,KAAKC,CAAE,EAAIA,EAAGD,CAAK,CAC7D,CAGA,SAAgBE,EAAO,EAA8C,CACnE,OAAOC,EAAO,KAAM,GAAUH,aAAiB,OAAO,EAAI,QAAQ,IAAIG,CAAM,EAAKA,CACnF,CAIA,SAAgBC,EACd,EACA,EACA,GAAG,CAACC,GACG,CACP,OAAQA,IAAW,IAAA,GAAY,CAAE,OAAM,UAAS,KAAM,CAAC,CAAE,EAAI,CAAE,OAAM,UAAS,SAAQ,KAAM,CAAC,CAAE,CACjG,CAEA,SAAgBC,EAAoD,EAAyB,EAAkB,CAC7G,OAAO,OAAOC,GAAY,WAAaA,EAAQC,CAAG,EAAID,CACxD,CAEA,SAAgBE,EAAa,EAA0B,EAAmC,CACxF,OAAOC,EAAO,IAAK,IAAW,CAAE,GAAGC,EAAO,KAAM,CAACC,EAAS,GAAGD,EAAM,IAAI,CAAE,EAAE,CAC7E,CAGA,IAAaE,GAAsC,EAAwB,IACzEC,IAAY,IAAA,IAAaC,EAAOD,EAAUC,EAAOD,EAGtCE,GAAqC,EAAwB,IACxEF,IAAY,IAAA,IAAaC,EAAOD,EAAUC,EAAOD,EAEtCG,EAAM,IAAgC,CAAE,OAAQ,CAAC,EAAG,OAAQ,GAAM,OAAM,GAExEC,GAAW,EAAgB,GAAGR,KAAiC,CAAE,SAAQ,OAAQ,GAAO,OAAM,G"}
|
package/dist/_parse.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Messages } from './messages';
|
|
2
|
+
import type { ErrorCode, Issue, MessageFn } from './types';
|
|
3
|
+
export type MaybePromise<T> = T | Promise<T>;
|
|
4
|
+
/** Context threaded through one parse. `async: false` forbids async checks. */
|
|
5
|
+
export type RunContext = {
|
|
6
|
+
readonly async: boolean;
|
|
7
|
+
readonly messages: Messages;
|
|
8
|
+
};
|
|
9
|
+
/** Result of running a schema: `issues` is empty on success. */
|
|
10
|
+
export type Outcome = {
|
|
11
|
+
issues: Issue[];
|
|
12
|
+
value: unknown;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Result of a schema's own structural parse. `typeOk: false` means the value has the wrong shape,
|
|
16
|
+
* so the schema's checks and transforms must not run.
|
|
17
|
+
*/
|
|
18
|
+
export type ParseValue = Outcome & {
|
|
19
|
+
typeOk: boolean;
|
|
20
|
+
};
|
|
21
|
+
/** Applies `fn` synchronously when `value` is not a promise. */
|
|
22
|
+
export declare function chain<T, R>(value: MaybePromise<T>, fn: (value: T) => MaybePromise<R>): MaybePromise<R>;
|
|
23
|
+
/** `Promise.all` that stays synchronous when no element is a promise. */
|
|
24
|
+
export declare function all<T>(values: MaybePromise<T>[]): MaybePromise<T[]>;
|
|
25
|
+
type IssueParams<C extends ErrorCode> = Extract<Issue, {
|
|
26
|
+
code: C;
|
|
27
|
+
}>['params'];
|
|
28
|
+
export declare function issue<C extends ErrorCode>(code: C, message: string, ...[params]: undefined extends IssueParams<C> ? [params?: IssueParams<C>] : [params: IssueParams<C>]): Issue;
|
|
29
|
+
export declare function resolveMessage<Ctx extends Record<string, unknown>>(message: MessageFn<Ctx>, ctx: Ctx): string;
|
|
30
|
+
export declare function prefixIssues(issues: readonly Issue[], segment: string | number): Issue[];
|
|
31
|
+
/** Tightest lower bound of an existing (optional) bound and a new one. */
|
|
32
|
+
export declare const atLeast: <N extends number | bigint>(current: N | undefined, next: N) => N;
|
|
33
|
+
/** Tightest upper bound of an existing (optional) bound and a new one. */
|
|
34
|
+
export declare const atMost: <N extends number | bigint>(current: N | undefined, next: N) => N;
|
|
35
|
+
export declare const ok: (value: unknown) => ParseValue;
|
|
36
|
+
export declare const invalid: (value: unknown, ...issues: Issue[]) => ParseValue;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=_parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_parse.d.ts","sourceRoot":"","sources":["../src/_parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE3D,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;AAElF,gEAAgE;AAChE,MAAM,MAAM,OAAO,GAAG;IAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvD,gEAAgE;AAChE,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAEtG;AAED,yEAAyE;AACzE,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAEnE;AAED,KAAK,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE9E,wBAAgB,KAAK,CAAC,CAAC,SAAS,SAAS,EACvC,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,SAAS,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GACnG,KAAK,CAEP;AAED,wBAAgB,cAAc,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAE7G;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,CAExF;AAED,0EAA0E;AAC1E,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,KAAG,CAC3B,CAAC;AAE3D,0EAA0E;AAC1E,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,KAAG,CAC1B,CAAC;AAE3D,eAAO,MAAM,EAAE,GAAI,OAAO,OAAO,KAAG,UAAmD,CAAC;AAExF,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,EAAE,GAAG,QAAQ,KAAK,EAAE,KAAG,UAAgD,CAAC"}
|
package/dist/_parse.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,t){return e instanceof Promise?e.then(t):t(e)}function t(e){return e.some(e=>e instanceof Promise)?Promise.all(e):e}function n(e,t,...[n]){return n===void 0?{code:e,message:t,path:[]}:{code:e,message:t,params:n,path:[]}}function r(e,t){return typeof e==`function`?e(t):e}function i(e,t){return e.map(e=>({...e,path:[t,...e.path]}))}var a=(e,t)=>e===void 0||t>e?t:e,o=(e,t)=>e===void 0||t<e?t:e,s=e=>({issues:[],typeOk:!0,value:e}),c=(e,...t)=>({issues:t,typeOk:!1,value:e});export{t as all,a as atLeast,o as atMost,e as chain,c as invalid,n as issue,s as ok,i as prefixIssues,r as resolveMessage};
|
|
2
|
+
//# sourceMappingURL=_parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_parse.js","names":["chain","value","fn","all","values","issue","params","resolveMessage","message","ctx","prefixIssues","issues","entry","segment","atLeast","current","next","atMost","ok","invalid"],"sources":["../src/_parse.ts"],"sourcesContent":["import type { Messages } from './messages';\nimport type { ErrorCode, Issue, MessageFn } from './types';\n\nexport type MaybePromise<T> = T | Promise<T>;\n\n/** Context threaded through one parse. `async: false` forbids async checks. */\nexport type RunContext = { readonly async: boolean; readonly messages: Messages };\n\n/** Result of running a schema: `issues` is empty on success. */\nexport type Outcome = { issues: Issue[]; value: unknown };\n\n/**\n * Result of a schema's own structural parse. `typeOk: false` means the value has the wrong shape,\n * so the schema's checks and transforms must not run.\n */\nexport type ParseValue = Outcome & { typeOk: boolean };\n\n/** Applies `fn` synchronously when `value` is not a promise. */\nexport function chain<T, R>(value: MaybePromise<T>, fn: (value: T) => MaybePromise<R>): MaybePromise<R> {\n return value instanceof Promise ? value.then(fn) : fn(value);\n}\n\n/** `Promise.all` that stays synchronous when no element is a promise. */\nexport function all<T>(values: MaybePromise<T>[]): MaybePromise<T[]> {\n return values.some((value) => value instanceof Promise) ? Promise.all(values) : (values as T[]);\n}\n\ntype IssueParams<C extends ErrorCode> = Extract<Issue, { code: C }>['params'];\n\nexport function issue<C extends ErrorCode>(\n code: C,\n message: string,\n ...[params]: undefined extends IssueParams<C> ? [params?: IssueParams<C>] : [params: IssueParams<C>]\n): Issue {\n return (params === undefined ? { code, message, path: [] } : { code, message, params, path: [] }) as Issue;\n}\n\nexport function resolveMessage<Ctx extends Record<string, unknown>>(message: MessageFn<Ctx>, ctx: Ctx): string {\n return typeof message === 'function' ? message(ctx) : message;\n}\n\nexport function prefixIssues(issues: readonly Issue[], segment: string | number): Issue[] {\n return issues.map((entry) => ({ ...entry, path: [segment, ...entry.path] }));\n}\n\n/** Tightest lower bound of an existing (optional) bound and a new one. */\nexport const atLeast = <N extends number | bigint>(current: N | undefined, next: N): N =>\n current === undefined || next > current ? next : current;\n\n/** Tightest upper bound of an existing (optional) bound and a new one. */\nexport const atMost = <N extends number | bigint>(current: N | undefined, next: N): N =>\n current === undefined || next < current ? next : current;\n\nexport const ok = (value: unknown): ParseValue => ({ issues: [], typeOk: true, value });\n\nexport const invalid = (value: unknown, ...issues: Issue[]): ParseValue => ({ issues, typeOk: false, value });\n"],"mappings":"AAkBA,SAAgBA,EAAY,EAAwB,EAAoD,CACtG,OAAOC,aAAiB,QAAUA,EAAM,KAAKC,CAAE,EAAIA,EAAGD,CAAK,CAC7D,CAGA,SAAgBE,EAAO,EAA8C,CACnE,OAAOC,EAAO,KAAM,GAAUH,aAAiB,OAAO,EAAI,QAAQ,IAAIG,CAAM,EAAKA,CACnF,CAIA,SAAgBC,EACd,EACA,EACA,GAAG,CAACC,GACG,CACP,OAAQA,IAAW,IAAA,GAAY,CAAE,OAAM,UAAS,KAAM,CAAC,CAAE,EAAI,CAAE,OAAM,UAAS,SAAQ,KAAM,CAAC,CAAE,CACjG,CAEA,SAAgBC,EAAoD,EAAyB,EAAkB,CAC7G,OAAO,OAAOC,GAAY,WAAaA,EAAQC,CAAG,EAAID,CACxD,CAEA,SAAgBE,EAAa,EAA0B,EAAmC,CACxF,OAAOC,EAAO,IAAK,IAAW,CAAE,GAAGC,EAAO,KAAM,CAACC,EAAS,GAAGD,EAAM,IAAI,CAAE,EAAE,CAC7E,CAGA,IAAaE,GAAsC,EAAwB,IACzEC,IAAY,IAAA,IAAaC,EAAOD,EAAUC,EAAOD,EAGtCE,GAAqC,EAAwB,IACxEF,IAAY,IAAA,IAAaC,EAAOD,EAAUC,EAAOD,EAEtCG,EAAM,IAAgC,CAAE,OAAQ,CAAC,EAAG,OAAQ,GAAM,OAAM,GAExEC,GAAW,EAAgB,GAAGR,KAAiC,CAAE,SAAQ,OAAQ,GAAO,OAAM,G"}
|
package/dist/errors.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
`)
|
|
1
|
+
var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{};function n(e,t=`.`){return e?e.map(e=>String(typeof e==`object`&&e?e.key:e)).join(t):``}function r(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var i=class extends e{issues;constructor(e,t){super(e.map(({code:e,message:t,path:r})=>`${n(r)||`value`}: ${t} [${e}]`).join(`
|
|
2
|
+
`),t),this.issues=Object.freeze([...e])}flatten(){let e=[],t=[],n=new Map;for(let r of this.issues){if(r.path.length===0){t.push(r.message);continue}let i=JSON.stringify(r.path),a=n.get(i);if(a)a.messages.push(r.message);else{let t={messages:[r.message],path:[...r.path]};n.set(i,t),e.push(t)}}return{fieldErrors:e,formErrors:t}}flattenFirst(){let{fieldErrors:e,formErrors:t}=this.flatten();return{fieldErrors:e.map(({messages:e,path:t})=>({message:e[0],path:t})),formErrors:t}}messagesAt(...e){return this.issues.filter(t=>r(t.path,e)).map(e=>e.message)}};exports.SpellDefinitionError=t,exports.SpellError=e,exports.SpellValidationError=i,exports.joinIssuePath=n;
|
|
3
3
|
//# sourceMappingURL=errors.cjs.map
|
package/dist/errors.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.cjs","names":["
|
|
1
|
+
{"version":3,"file":"errors.cjs","names":["SpellError","message","opts","SpellDefinitionError","joinIssuePath","path","segment","separator","pathsEqual","left","right","index","SpellValidationError","issues","code","fieldErrors","formErrors","byPath","issue","key","existing","entry","messages"],"sources":["../src/errors.ts"],"sourcesContent":["import type { Issue, IssuePath } from './types';\n\n/** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */\nexport class SpellError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** The schema cannot perform the requested operation: a non-portable `definition()` or an invalid derivation. */\nexport class SpellDefinitionError extends SpellError {}\n\nexport type FlatError = { messages: string[]; path: (string | number)[] };\nexport type FlatErrorFirst = { message: string; path: (string | number)[] };\n\n/**\n * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native\n * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or\n * undefined paths join to `''`.\n */\nexport function joinIssuePath(path: IssuePath | undefined, separator = '.'): string {\n if (!path) return '';\n\n return path\n .map((segment) => String(typeof segment === 'object' && segment !== null ? segment.key : segment))\n .join(separator);\n}\n\nfunction pathsEqual(left: readonly (string | number)[], right: readonly (string | number)[]): boolean {\n return left.length === right.length && left.every((segment, index) => segment === right[index]);\n}\n\n/** Validation failure carrying every issue found during the parse. */\nexport class SpellValidationError extends SpellError {\n readonly issues: readonly Issue[];\n\n constructor(issues: readonly Issue[], opts?: ErrorOptions) {\n super(\n issues.map(({ code, message, path }) => `${joinIssuePath(path) || 'value'}: ${message} [${code}]`).join('\\n'),\n opts,\n );\n this.issues = Object.freeze([...issues]);\n }\n\n /** Groups messages by exact path; root-level messages become `formErrors`. */\n flatten(): { fieldErrors: FlatError[]; formErrors: string[] } {\n const fieldErrors: FlatError[] = [];\n const formErrors: string[] = [];\n const byPath = new Map<string, FlatError>();\n\n for (const issue of this.issues) {\n if (issue.path.length === 0) {\n formErrors.push(issue.message);\n continue;\n }\n\n const key = JSON.stringify(issue.path);\n const existing = byPath.get(key);\n\n if (existing) {\n existing.messages.push(issue.message);\n } else {\n const entry = { messages: [issue.message], path: [...issue.path] };\n\n byPath.set(key, entry);\n fieldErrors.push(entry);\n }\n }\n\n return { fieldErrors, formErrors };\n }\n\n /** Like `flatten()`, keeping only the first message per path. */\n flattenFirst(): { fieldErrors: FlatErrorFirst[]; formErrors: string[] } {\n const { fieldErrors, formErrors } = this.flatten();\n\n return { fieldErrors: fieldErrors.map(({ messages, path }) => ({ message: messages[0]!, path })), formErrors };\n }\n\n /** Returns every message attached to exactly `path`, in issue order. */\n messagesAt(...path: (string | number)[]): string[] {\n return this.issues.filter((issue) => pathsEqual(issue.path, path)).map((issue) => issue.message);\n }\n}\n"],"mappings":"AAGA,IAAaA,EAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAMC,EAASC,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGaC,EAAb,cAA0CH,CAAW,CAAC,EAUtD,SAAgBI,EAAc,EAA6B,EAAY,IAAa,CAGlF,OAFKC,EAEEA,EACJ,IAAK,GAAY,OAAO,OAAOC,GAAY,UAAYA,EAAmBA,EAAQ,IAAMA,CAAO,CAAC,CAAC,CACjG,KAAKC,CAAS,EAJC,EAKpB,CAEA,SAASC,EAAW,EAAoC,EAA8C,CACpG,OAAOC,EAAK,SAAWC,EAAM,QAAUD,EAAK,OAAO,EAAS,IAAUH,IAAYI,EAAMC,EAAM,CAChG,CAGA,IAAaC,EAAb,cAA0CZ,CAAW,CACnD,OAEA,YAAY,EAA0B,EAAqB,CACzD,MACEa,EAAO,KAAK,CAAE,OAAM,UAAS,UAAW,GAAGT,EAAcC,CAAI,GAAK,QAAQ,IAAIJ,EAAQ,IAAIa,EAAK,EAAE,CAAC,CAAC,KAAK;CAAI,EAC5GZ,CACF,EACA,KAAK,OAAS,OAAO,OAAO,CAAC,GAAGW,CAAM,CAAC,CACzC,CAGA,SAA8D,CAC5D,IAAME,EAA2B,CAAC,EAC5BC,EAAuB,CAAC,EACxBC,EAAS,IAAI,IAEnB,IAAK,IAAMC,KAAS,KAAK,OAAQ,CAC/B,GAAIA,EAAM,KAAK,SAAW,EAAG,CAC3BF,EAAW,KAAKE,EAAM,OAAO,EAC7B,QACF,CAEA,IAAMC,EAAM,KAAK,UAAUD,EAAM,IAAI,EAC/BE,EAAWH,EAAO,IAAIE,CAAG,EAE/B,GAAIC,EACFA,EAAS,SAAS,KAAKF,EAAM,OAAO,MAC/B,CACL,IAAMG,EAAQ,CAAE,SAAU,CAACH,EAAM,OAAO,EAAG,KAAM,CAAC,GAAGA,EAAM,IAAI,CAAE,EAEjED,EAAO,IAAIE,EAAKE,CAAK,EACrBN,EAAY,KAAKM,CAAK,CACxB,CACF,CAEA,MAAO,CAAE,cAAa,YAAW,CACnC,CAGA,cAAwE,CACtE,GAAM,CAAE,cAAa,cAAe,KAAK,QAAQ,EAEjD,MAAO,CAAE,YAAaN,EAAY,KAAK,CAAE,WAAU,WAAY,CAAE,QAASO,EAAS,GAAK,MAAK,EAAE,EAAG,YAAW,CAC/G,CAGA,WAAW,GAAGjB,EAAqC,CACjD,OAAO,KAAK,OAAO,OAAQ,GAAUG,EAAWU,EAAM,KAAMb,CAAI,CAAC,CAAC,CAAC,IAAK,GAAUa,EAAM,OAAO,CACjG,CACF,E"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,28 +1,11 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
type IssueParams<C extends string> = Extract<Issue, {
|
|
3
|
-
code: C;
|
|
4
|
-
}> extends {
|
|
5
|
-
params: infer P;
|
|
6
|
-
} ? P : undefined;
|
|
7
|
-
/**
|
|
8
|
-
* Creates a single-error failure array. Use in validator functions instead of building the array manually.
|
|
9
|
-
* Typed overloads ensure params match the given error code.
|
|
10
|
-
*/
|
|
11
|
-
export declare function fail<C extends ErrorCode>(code: C, message: string, params: IssueParams<C>): Issue[];
|
|
12
|
-
export declare function fail(code: string, message: string, params?: Record<string, unknown>): Issue[];
|
|
13
|
-
/** Resolve a message value or factory against a context. Re-exported by `core` for schema modules. */
|
|
14
|
-
export declare function resolveMessage<Ctx extends Record<string, unknown>>(msg: MessageFn<Ctx>, ctx: Ctx): string;
|
|
15
|
-
export declare function prependIssuePath(issues: Issue[], prefix: string | number): Issue[];
|
|
16
|
-
/**
|
|
17
|
-
* Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native
|
|
18
|
-
* `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or
|
|
19
|
-
* undefined paths join to `''`.
|
|
20
|
-
*/
|
|
21
|
-
export declare function joinIssuePath(path: IssuePath | undefined, separator?: string): string;
|
|
1
|
+
import type { Issue, IssuePath } from './types';
|
|
22
2
|
/** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */
|
|
23
3
|
export declare class SpellError extends Error {
|
|
24
4
|
constructor(message: string, opts?: ErrorOptions);
|
|
25
5
|
}
|
|
6
|
+
/** The schema cannot perform the requested operation: a non-portable `definition()` or an invalid derivation. */
|
|
7
|
+
export declare class SpellDefinitionError extends SpellError {
|
|
8
|
+
}
|
|
26
9
|
export type FlatError = {
|
|
27
10
|
messages: string[];
|
|
28
11
|
path: (string | number)[];
|
|
@@ -31,15 +14,22 @@ export type FlatErrorFirst = {
|
|
|
31
14
|
message: string;
|
|
32
15
|
path: (string | number)[];
|
|
33
16
|
};
|
|
34
|
-
|
|
35
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native
|
|
19
|
+
* `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or
|
|
20
|
+
* undefined paths join to `''`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function joinIssuePath(path: IssuePath | undefined, separator?: string): string;
|
|
23
|
+
/** Validation failure carrying every issue found during the parse. */
|
|
36
24
|
export declare class SpellValidationError extends SpellError {
|
|
37
|
-
readonly issues: Issue[];
|
|
38
|
-
constructor(issues: Issue[],
|
|
25
|
+
readonly issues: readonly Issue[];
|
|
26
|
+
constructor(issues: readonly Issue[], opts?: ErrorOptions);
|
|
27
|
+
/** Groups messages by exact path; root-level messages become `formErrors`. */
|
|
39
28
|
flatten(): {
|
|
40
29
|
fieldErrors: FlatError[];
|
|
41
30
|
formErrors: string[];
|
|
42
31
|
};
|
|
32
|
+
/** Like `flatten()`, keeping only the first message per path. */
|
|
43
33
|
flattenFirst(): {
|
|
44
34
|
fieldErrors: FlatErrorFirst[];
|
|
45
35
|
formErrors: string[];
|
|
@@ -47,5 +37,4 @@ export declare class SpellValidationError extends SpellError {
|
|
|
47
37
|
/** Returns every message attached to exactly `path`, in issue order. */
|
|
48
38
|
messagesAt(...path: (string | number)[]): string[];
|
|
49
39
|
}
|
|
50
|
-
export {};
|
|
51
40
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,wGAAwG;AACxG,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;CAKjD;AAED,iHAAiH;AACjH,qBAAa,oBAAqB,SAAQ,UAAU;CAAG;AAEvD,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAE5E;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,SAAS,SAAM,GAAG,MAAM,CAMlF;AAMD,sEAAsE;AACtE,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;gBAEtB,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY;IAQzD,8EAA8E;IAC9E,OAAO,IAAI;QAAE,WAAW,EAAE,SAAS,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IA2B7D,iEAAiE;IACjE,YAAY,IAAI;QAAE,WAAW,EAAE,cAAc,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IAMvE,wEAAwE;IACxE,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE;CAGnD"}
|
package/dist/errors.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
`)
|
|
1
|
+
var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{};function n(e,t=`.`){return e?e.map(e=>String(typeof e==`object`&&e?e.key:e)).join(t):``}function r(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var i=class extends e{issues;constructor(e,t){super(e.map(({code:e,message:t,path:r})=>`${n(r)||`value`}: ${t} [${e}]`).join(`
|
|
2
|
+
`),t),this.issues=Object.freeze([...e])}flatten(){let e=[],t=[],n=/* @__PURE__ */ new Map;for(let r of this.issues){if(r.path.length===0){t.push(r.message);continue}let i=JSON.stringify(r.path),a=n.get(i);if(a)a.messages.push(r.message);else{let t={messages:[r.message],path:[...r.path]};n.set(i,t),e.push(t)}}return{fieldErrors:e,formErrors:t}}flattenFirst(){let{fieldErrors:e,formErrors:t}=this.flatten();return{fieldErrors:e.map(({messages:e,path:t})=>({message:e[0],path:t})),formErrors:t}}messagesAt(...e){return this.issues.filter(t=>r(t.path,e)).map(e=>e.message)}};export{t as SpellDefinitionError,e as SpellError,i as SpellValidationError,n as joinIssuePath};
|
|
3
3
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","names":["
|
|
1
|
+
{"version":3,"file":"errors.js","names":["SpellError","message","opts","SpellDefinitionError","joinIssuePath","path","segment","separator","pathsEqual","left","right","index","SpellValidationError","issues","code","fieldErrors","formErrors","byPath","issue","key","existing","entry","messages"],"sources":["../src/errors.ts"],"sourcesContent":["import type { Issue, IssuePath } from './types';\n\n/** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */\nexport class SpellError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** The schema cannot perform the requested operation: a non-portable `definition()` or an invalid derivation. */\nexport class SpellDefinitionError extends SpellError {}\n\nexport type FlatError = { messages: string[]; path: (string | number)[] };\nexport type FlatErrorFirst = { message: string; path: (string | number)[] };\n\n/**\n * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native\n * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or\n * undefined paths join to `''`.\n */\nexport function joinIssuePath(path: IssuePath | undefined, separator = '.'): string {\n if (!path) return '';\n\n return path\n .map((segment) => String(typeof segment === 'object' && segment !== null ? segment.key : segment))\n .join(separator);\n}\n\nfunction pathsEqual(left: readonly (string | number)[], right: readonly (string | number)[]): boolean {\n return left.length === right.length && left.every((segment, index) => segment === right[index]);\n}\n\n/** Validation failure carrying every issue found during the parse. */\nexport class SpellValidationError extends SpellError {\n readonly issues: readonly Issue[];\n\n constructor(issues: readonly Issue[], opts?: ErrorOptions) {\n super(\n issues.map(({ code, message, path }) => `${joinIssuePath(path) || 'value'}: ${message} [${code}]`).join('\\n'),\n opts,\n );\n this.issues = Object.freeze([...issues]);\n }\n\n /** Groups messages by exact path; root-level messages become `formErrors`. */\n flatten(): { fieldErrors: FlatError[]; formErrors: string[] } {\n const fieldErrors: FlatError[] = [];\n const formErrors: string[] = [];\n const byPath = new Map<string, FlatError>();\n\n for (const issue of this.issues) {\n if (issue.path.length === 0) {\n formErrors.push(issue.message);\n continue;\n }\n\n const key = JSON.stringify(issue.path);\n const existing = byPath.get(key);\n\n if (existing) {\n existing.messages.push(issue.message);\n } else {\n const entry = { messages: [issue.message], path: [...issue.path] };\n\n byPath.set(key, entry);\n fieldErrors.push(entry);\n }\n }\n\n return { fieldErrors, formErrors };\n }\n\n /** Like `flatten()`, keeping only the first message per path. */\n flattenFirst(): { fieldErrors: FlatErrorFirst[]; formErrors: string[] } {\n const { fieldErrors, formErrors } = this.flatten();\n\n return { fieldErrors: fieldErrors.map(({ messages, path }) => ({ message: messages[0]!, path })), formErrors };\n }\n\n /** Returns every message attached to exactly `path`, in issue order. */\n messagesAt(...path: (string | number)[]): string[] {\n return this.issues.filter((issue) => pathsEqual(issue.path, path)).map((issue) => issue.message);\n }\n}\n"],"mappings":"AAGA,IAAaA,EAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAMC,EAASC,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGaC,EAAb,cAA0CH,CAAW,CAAC,EAUtD,SAAgBI,EAAc,EAA6B,EAAY,IAAa,CAGlF,OAFKC,EAEEA,EACJ,IAAK,GAAY,OAAO,OAAOC,GAAY,UAAYA,EAAmBA,EAAQ,IAAMA,CAAO,CAAC,CAAC,CACjG,KAAKC,CAAS,EAJC,EAKpB,CAEA,SAASC,EAAW,EAAoC,EAA8C,CACpG,OAAOC,EAAK,SAAWC,EAAM,QAAUD,EAAK,OAAO,EAAS,IAAUH,IAAYI,EAAMC,EAAM,CAChG,CAGA,IAAaC,EAAb,cAA0CZ,CAAW,CACnD,OAEA,YAAY,EAA0B,EAAqB,CACzD,MACEa,EAAO,KAAK,CAAE,OAAM,UAAS,UAAW,GAAGT,EAAcC,CAAI,GAAK,QAAQ,IAAIJ,EAAQ,IAAIa,EAAK,EAAE,CAAC,CAAC,KAAK;CAAI,EAC5GZ,CACF,EACA,KAAK,OAAS,OAAO,OAAO,CAAC,GAAGW,CAAM,CAAC,CACzC,CAGA,SAA8D,CAC5D,IAAME,EAA2B,CAAC,EAC5BC,EAAuB,CAAC,EACxBC,kBAAS,IAAI,IAEnB,IAAK,IAAMC,KAAS,KAAK,OAAQ,CAC/B,GAAIA,EAAM,KAAK,SAAW,EAAG,CAC3BF,EAAW,KAAKE,EAAM,OAAO,EAC7B,QACF,CAEA,IAAMC,EAAM,KAAK,UAAUD,EAAM,IAAI,EAC/BE,EAAWH,EAAO,IAAIE,CAAG,EAE/B,GAAIC,EACFA,EAAS,SAAS,KAAKF,EAAM,OAAO,MAC/B,CACL,IAAMG,EAAQ,CAAE,SAAU,CAACH,EAAM,OAAO,EAAG,KAAM,CAAC,GAAGA,EAAM,IAAI,CAAE,EAEjED,EAAO,IAAIE,EAAKE,CAAK,EACrBN,EAAY,KAAKM,CAAK,CACxB,CACF,CAEA,MAAO,CAAE,cAAa,YAAW,CACnC,CAGA,cAAwE,CACtE,GAAM,CAAE,cAAa,cAAe,KAAK,QAAQ,EAEjD,MAAO,CAAE,YAAaN,EAAY,KAAK,CAAE,WAAU,WAAY,CAAE,QAASO,EAAS,GAAK,MAAK,EAAE,EAAG,YAAW,CAC/G,CAGA,WAAW,GAAGjB,EAAqC,CACjD,OAAO,KAAK,OAAO,OAAQ,GAAUG,EAAWU,EAAM,KAAMb,CAAI,CAAC,CAAC,CAAC,IAAK,GAAUa,EAAM,OAAO,CACjG,CACF,E"}
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./messages.cjs"),n=require("./s.cjs"),r=require("./schema.cjs"),i=require("./types.cjs");exports.ErrorCode=i.ErrorCode,exports.Schema=r.Schema,exports.SpellDefinitionError=e.SpellDefinitionError,exports.SpellError=e.SpellError,exports.SpellValidationError=e.SpellValidationError,exports.createParseContext=t.createParseContext,exports.joinIssuePath=e.joinIssuePath,exports.s=n.s;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export
|
|
2
|
-
export {
|
|
3
|
-
export { createParseContext, type DeepPartial } from './messages';
|
|
1
|
+
export { type FlatError, type FlatErrorFirst, joinIssuePath, SpellDefinitionError, SpellError, SpellValidationError, } from './errors';
|
|
2
|
+
export { createParseContext, type DeepPartial, type Messages } from './messages';
|
|
4
3
|
export { s } from './s';
|
|
5
|
-
export {
|
|
4
|
+
export { Schema } from './schema';
|
|
5
|
+
export { type AnySchema, type CheckContext, ErrorCode, type Infer, type InferInput, type InferOutput, type Issue, type IssuePath, type IssuePathSegment, type MessageFn, type ParseContext, type ParseResult, type PatternDescriptor, type SchemaDescriptor, type SchemaKind, type StandardSchemaV1, type ValidateResult, } from './types';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,kBAAkB,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EACL,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,SAAS,EACT,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SpellDefinitionError as e,SpellError as t,SpellValidationError as n,joinIssuePath as r}from"./errors.js";import{
|
|
1
|
+
import{SpellDefinitionError as e,SpellError as t,SpellValidationError as n,joinIssuePath as r}from"./errors.js";import{createParseContext as i}from"./messages.js";import{s as a}from"./s.js";import{Schema as o}from"./schema.js";import{ErrorCode as s}from"./types.js";export{s as ErrorCode,o as Schema,e as SpellDefinitionError,t as SpellError,n as SpellValidationError,i as createParseContext,r as joinIssuePath,a as s};
|
package/dist/json.cjs
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./_object.cjs");var t={isoDate:`date`,isoDateTime:`date-time`,url:`uri`};function n(e){return e===`base64`||e===`base64url`?{contentEncoding:e}:e===`ip`?{anyOf:[{format:`ipv4`},{format:`ipv6`}]}:{format:t[e]??e}}function r(e,t){let r=[...e.map(n),...t.map(({source:e})=>({pattern:e}))];if(r.length===0)return{};let[i,...a]=r;return a.length===0?i:{allOf:r}}var i=e=>e===void 0?void 0:Number(e);function a(e,t){for(let[n,r]of Object.entries(t))r!==void 0&&(e[n]=r);return e}function o(t){switch(t.kind){case`unknown`:case`lazy`:return{};case`never`:return{not:{}};case`boolean`:return{type:`boolean`};case`string`:return a({type:`string`,...r(t.formats??[],t.patterns??[])},{maxLength:t.maxLength,minLength:t.minLength});case`number`:return a({type:t.integer?`integer`:`number`},{exclusiveMaximum:t.exclusiveMaximum,exclusiveMinimum:t.exclusiveMinimum,maximum:t.maximum,minimum:t.minimum,multipleOf:t.multipleOf});case`bigint`:return a({type:`integer`},{exclusiveMaximum:i(t.exclusiveMaximum),exclusiveMinimum:i(t.exclusiveMinimum),maximum:i(t.maximum),minimum:i(t.minimum),multipleOf:i(t.multipleOf)});case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`enum`:return{enum:[...t.values]};case`array`:return a({items:s(t.items),type:`array`},{maxItems:t.maxItems,minItems:t.minItems,uniqueItems:t.uniqueItems});case`tuple`:return{items:t.rest!==null&&s(t.rest),prefixItems:t.items.map(s),type:`array`};case`set`:return a({$comment:`Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:s(t.items),type:`array`,uniqueItems:!0},{maxItems:t.maxSize,minItems:t.minSize});case`map`:return a({$comment:`Map: represented as an object; key constraints are not representable.`,additionalProperties:s(t.value),type:`object`},{maxProperties:t.maxSize,minProperties:t.minSize});case`record`:return{additionalProperties:s(t.value),propertyNames:s(t.key),type:`object`};case`object`:{let n={},r=[];for(let[i,a]of Object.entries(t.fields))e.defineOwnProperty(n,i,s(a)),a.isOptional||r.push(i);for(let r of t.tolerated??[])Object.hasOwn(n,r)||e.defineOwnProperty(n,r,{});return a({properties:n,type:`object`},{additionalProperties:!t.strict&&void 0,required:r.length>0?r:void 0})}case`union`:return{anyOf:t.branches.map(s)};case`intersect`:return{allOf:t.branches.map(s)};case`discriminatedUnion`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(s)};case`pipe`:return s(t.to)}}function s(e){let t=o(e),n=e.isNullable?{anyOf:[t,{type:`null`}]}:t;return e.description===void 0?n:{...n,description:e.description}}exports.toJsonSchema=s;
|
|
2
|
+
//# sourceMappingURL=json.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.cjs","names":["require__object","JSON_FORMATS","stringFormat","format","stringConstraints","parts","formats","patterns","source","first","rest","toNumber","value","withDefined","key","extra","base","toBase","d","toJsonSchema","properties","required","field","definition","schema"],"sources":["../src/json.ts"],"sourcesContent":["import { defineOwnProperty } from './_object';\nimport type { PatternDescriptor, SchemaDescriptor } from './types';\n\n/** Plain JSON Schema object (targeting JSON Schema 2020-12). */\nexport type JsonSchema = Record<string, unknown>;\n\n/** Spell format names with a different JSON Schema `format` spelling. */\nconst JSON_FORMATS: Readonly<Record<string, string>> = { isoDate: 'date', isoDateTime: 'date-time', url: 'uri' };\n\nfunction stringFormat(format: string): JsonSchema {\n if (format === 'base64' || format === 'base64url') return { contentEncoding: format };\n\n if (format === 'ip') return { anyOf: [{ format: 'ipv4' }, { format: 'ipv6' }] };\n\n return { format: JSON_FORMATS[format] ?? format };\n}\n\n/** JSON Schema patterns are flagless ECMA-262 regexes, so regex flags are not carried over. */\nfunction stringConstraints(formats: readonly string[], patterns: readonly PatternDescriptor[]): JsonSchema {\n const parts = [...formats.map(stringFormat), ...patterns.map(({ source }) => ({ pattern: source }))];\n\n if (parts.length === 0) return {};\n\n const [first, ...rest] = parts;\n\n return rest.length === 0 ? first! : { allOf: parts };\n}\n\nconst toNumber = (value: bigint | undefined) => (value === undefined ? undefined : Number(value));\n\nfunction withDefined(base: JsonSchema, extra: Record<string, unknown>): JsonSchema {\n for (const [key, value] of Object.entries(extra)) if (value !== undefined) base[key] = value;\n\n return base;\n}\n\nfunction toBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n case 'lazy':\n return {};\n\n case 'never':\n return { not: {} };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'string':\n return withDefined(\n { type: 'string', ...stringConstraints(d.formats ?? [], d.patterns ?? []) },\n { maxLength: d.maxLength, minLength: d.minLength },\n );\n\n case 'number':\n return withDefined(\n { type: d.integer ? 'integer' : 'number' },\n {\n exclusiveMaximum: d.exclusiveMaximum,\n exclusiveMinimum: d.exclusiveMinimum,\n maximum: d.maximum,\n minimum: d.minimum,\n multipleOf: d.multipleOf,\n },\n );\n\n case 'bigint':\n return withDefined(\n { type: 'integer' },\n {\n exclusiveMaximum: toNumber(d.exclusiveMaximum),\n exclusiveMinimum: toNumber(d.exclusiveMinimum),\n maximum: toNumber(d.maximum),\n minimum: toNumber(d.minimum),\n multipleOf: toNumber(d.multipleOf),\n },\n );\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'instanceof':\n return { $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.` };\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n return d.value === undefined ? {} : { const: d.value };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'array':\n return withDefined(\n { items: toJsonSchema(d.items), type: 'array' },\n { maxItems: d.maxItems, minItems: d.minItems, uniqueItems: d.uniqueItems },\n );\n\n case 'tuple':\n return {\n items: d.rest === null ? false : toJsonSchema(d.rest),\n prefixItems: d.items.map(toJsonSchema),\n type: 'array',\n };\n\n case 'set':\n return withDefined(\n {\n $comment: 'Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: toJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n },\n { maxItems: d.maxSize, minItems: d.minSize },\n );\n\n case 'map':\n return withDefined(\n {\n $comment: 'Map: represented as an object; key constraints are not representable.',\n additionalProperties: toJsonSchema(d.value),\n type: 'object',\n },\n { maxProperties: d.maxSize, minProperties: d.minSize },\n );\n\n case 'record':\n return { additionalProperties: toJsonSchema(d.value), propertyNames: toJsonSchema(d.key), type: 'object' };\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, field] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, toJsonSchema(field));\n\n if (!field.isOptional) required.push(key);\n }\n\n for (const key of d.tolerated ?? []) if (!Object.hasOwn(properties, key)) defineOwnProperty(properties, key, {});\n\n return withDefined(\n { properties, type: 'object' },\n { additionalProperties: d.strict ? false : undefined, required: required.length > 0 ? required : undefined },\n );\n }\n\n case 'union':\n return { anyOf: d.branches.map(toJsonSchema) };\n\n case 'intersect':\n return { allOf: d.branches.map(toJsonSchema) };\n\n case 'discriminatedUnion':\n return { discriminator: { propertyName: d.discriminator }, oneOf: Object.values(d.branches).map(toJsonSchema) };\n\n case 'pipe':\n return toJsonSchema(d.to);\n }\n}\n\n/**\n * Converts a schema definition (`schema.definition()`) to a JSON Schema 2020-12 object.\n * Non-JSON types (`date`, `map`, `set`, `instanceof`) are approximated and annotated with `$comment`.\n */\nexport function toJsonSchema(definition: SchemaDescriptor): JsonSchema {\n const base = toBase(definition);\n const schema = definition.isNullable ? { anyOf: [base, { type: 'null' }] } : base;\n\n return definition.description === undefined ? schema : { ...schema, description: definition.description };\n}\n"],"mappings":"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"}
|
package/dist/json.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import type { SchemaDescriptor } from './types';
|
|
2
|
+
/** Plain JSON Schema object (targeting JSON Schema 2020-12). */
|
|
3
|
+
export type JsonSchema = Record<string, unknown>;
|
|
4
|
+
/**
|
|
5
|
+
* Converts a schema definition (`schema.definition()`) to a JSON Schema 2020-12 object.
|
|
6
|
+
* Non-JSON types (`date`, `map`, `set`, `instanceof`) are approximated and annotated with `$comment`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function toJsonSchema(definition: SchemaDescriptor): JsonSchema;
|
|
2
9
|
//# sourceMappingURL=json.d.ts.map
|
package/dist/json.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEnE,gEAAgE;AAChE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAgKjD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,gBAAgB,GAAG,UAAU,CAKrE"}
|
package/dist/json.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import{defineOwnProperty as e}from"./_object.js";var t={isoDate:`date`,isoDateTime:`date-time`,url:`uri`};function n(e){return e===`base64`||e===`base64url`?{contentEncoding:e}:e===`ip`?{anyOf:[{format:`ipv4`},{format:`ipv6`}]}:{format:t[e]??e}}function r(e,t){let r=[...e.map(n),...t.map(({source:e})=>({pattern:e}))];if(r.length===0)return{};let[i,...a]=r;return a.length===0?i:{allOf:r}}var i=e=>e===void 0?void 0:Number(e);function a(e,t){for(let[n,r]of Object.entries(t))r!==void 0&&(e[n]=r);return e}function o(t){switch(t.kind){case`unknown`:case`lazy`:return{};case`never`:return{not:{}};case`boolean`:return{type:`boolean`};case`string`:return a({type:`string`,...r(t.formats??[],t.patterns??[])},{maxLength:t.maxLength,minLength:t.minLength});case`number`:return a({type:t.integer?`integer`:`number`},{exclusiveMaximum:t.exclusiveMaximum,exclusiveMinimum:t.exclusiveMinimum,maximum:t.maximum,minimum:t.minimum,multipleOf:t.multipleOf});case`bigint`:return a({type:`integer`},{exclusiveMaximum:i(t.exclusiveMaximum),exclusiveMinimum:i(t.exclusiveMinimum),maximum:i(t.maximum),minimum:i(t.minimum),multipleOf:i(t.multipleOf)});case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`enum`:return{enum:[...t.values]};case`array`:return a({items:s(t.items),type:`array`},{maxItems:t.maxItems,minItems:t.minItems,uniqueItems:t.uniqueItems});case`tuple`:return{items:t.rest!==null&&s(t.rest),prefixItems:t.items.map(s),type:`array`};case`set`:return a({$comment:`Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:s(t.items),type:`array`,uniqueItems:!0},{maxItems:t.maxSize,minItems:t.minSize});case`map`:return a({$comment:`Map: represented as an object; key constraints are not representable.`,additionalProperties:s(t.value),type:`object`},{maxProperties:t.maxSize,minProperties:t.minSize});case`record`:return{additionalProperties:s(t.value),propertyNames:s(t.key),type:`object`};case`object`:{let n={},r=[];for(let[i,a]of Object.entries(t.fields))e(n,i,s(a)),a.isOptional||r.push(i);for(let r of t.tolerated??[])Object.hasOwn(n,r)||e(n,r,{});return a({properties:n,type:`object`},{additionalProperties:!t.strict&&void 0,required:r.length>0?r:void 0})}case`union`:return{anyOf:t.branches.map(s)};case`intersect`:return{allOf:t.branches.map(s)};case`discriminatedUnion`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(s)};case`pipe`:return s(t.to)}}function s(e){let t=o(e),n=e.isNullable?{anyOf:[t,{type:`null`}]}:t;return e.description===void 0?n:{...n,description:e.description}}export{s as toJsonSchema};
|
|
2
|
+
//# sourceMappingURL=json.js.map
|
package/dist/json.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","names":["JSON_FORMATS","stringFormat","format","stringConstraints","parts","formats","patterns","source","first","rest","toNumber","value","withDefined","key","extra","base","toBase","d","toJsonSchema","properties","required","field","defineOwnProperty","definition","schema"],"sources":["../src/json.ts"],"sourcesContent":["import { defineOwnProperty } from './_object';\nimport type { PatternDescriptor, SchemaDescriptor } from './types';\n\n/** Plain JSON Schema object (targeting JSON Schema 2020-12). */\nexport type JsonSchema = Record<string, unknown>;\n\n/** Spell format names with a different JSON Schema `format` spelling. */\nconst JSON_FORMATS: Readonly<Record<string, string>> = { isoDate: 'date', isoDateTime: 'date-time', url: 'uri' };\n\nfunction stringFormat(format: string): JsonSchema {\n if (format === 'base64' || format === 'base64url') return { contentEncoding: format };\n\n if (format === 'ip') return { anyOf: [{ format: 'ipv4' }, { format: 'ipv6' }] };\n\n return { format: JSON_FORMATS[format] ?? format };\n}\n\n/** JSON Schema patterns are flagless ECMA-262 regexes, so regex flags are not carried over. */\nfunction stringConstraints(formats: readonly string[], patterns: readonly PatternDescriptor[]): JsonSchema {\n const parts = [...formats.map(stringFormat), ...patterns.map(({ source }) => ({ pattern: source }))];\n\n if (parts.length === 0) return {};\n\n const [first, ...rest] = parts;\n\n return rest.length === 0 ? first! : { allOf: parts };\n}\n\nconst toNumber = (value: bigint | undefined) => (value === undefined ? undefined : Number(value));\n\nfunction withDefined(base: JsonSchema, extra: Record<string, unknown>): JsonSchema {\n for (const [key, value] of Object.entries(extra)) if (value !== undefined) base[key] = value;\n\n return base;\n}\n\nfunction toBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n case 'lazy':\n return {};\n\n case 'never':\n return { not: {} };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'string':\n return withDefined(\n { type: 'string', ...stringConstraints(d.formats ?? [], d.patterns ?? []) },\n { maxLength: d.maxLength, minLength: d.minLength },\n );\n\n case 'number':\n return withDefined(\n { type: d.integer ? 'integer' : 'number' },\n {\n exclusiveMaximum: d.exclusiveMaximum,\n exclusiveMinimum: d.exclusiveMinimum,\n maximum: d.maximum,\n minimum: d.minimum,\n multipleOf: d.multipleOf,\n },\n );\n\n case 'bigint':\n return withDefined(\n { type: 'integer' },\n {\n exclusiveMaximum: toNumber(d.exclusiveMaximum),\n exclusiveMinimum: toNumber(d.exclusiveMinimum),\n maximum: toNumber(d.maximum),\n minimum: toNumber(d.minimum),\n multipleOf: toNumber(d.multipleOf),\n },\n );\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'instanceof':\n return { $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.` };\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n return d.value === undefined ? {} : { const: d.value };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'array':\n return withDefined(\n { items: toJsonSchema(d.items), type: 'array' },\n { maxItems: d.maxItems, minItems: d.minItems, uniqueItems: d.uniqueItems },\n );\n\n case 'tuple':\n return {\n items: d.rest === null ? false : toJsonSchema(d.rest),\n prefixItems: d.items.map(toJsonSchema),\n type: 'array',\n };\n\n case 'set':\n return withDefined(\n {\n $comment: 'Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: toJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n },\n { maxItems: d.maxSize, minItems: d.minSize },\n );\n\n case 'map':\n return withDefined(\n {\n $comment: 'Map: represented as an object; key constraints are not representable.',\n additionalProperties: toJsonSchema(d.value),\n type: 'object',\n },\n { maxProperties: d.maxSize, minProperties: d.minSize },\n );\n\n case 'record':\n return { additionalProperties: toJsonSchema(d.value), propertyNames: toJsonSchema(d.key), type: 'object' };\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, field] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, toJsonSchema(field));\n\n if (!field.isOptional) required.push(key);\n }\n\n for (const key of d.tolerated ?? []) if (!Object.hasOwn(properties, key)) defineOwnProperty(properties, key, {});\n\n return withDefined(\n { properties, type: 'object' },\n { additionalProperties: d.strict ? false : undefined, required: required.length > 0 ? required : undefined },\n );\n }\n\n case 'union':\n return { anyOf: d.branches.map(toJsonSchema) };\n\n case 'intersect':\n return { allOf: d.branches.map(toJsonSchema) };\n\n case 'discriminatedUnion':\n return { discriminator: { propertyName: d.discriminator }, oneOf: Object.values(d.branches).map(toJsonSchema) };\n\n case 'pipe':\n return toJsonSchema(d.to);\n }\n}\n\n/**\n * Converts a schema definition (`schema.definition()`) to a JSON Schema 2020-12 object.\n * Non-JSON types (`date`, `map`, `set`, `instanceof`) are approximated and annotated with `$comment`.\n */\nexport function toJsonSchema(definition: SchemaDescriptor): JsonSchema {\n const base = toBase(definition);\n const schema = definition.isNullable ? { anyOf: [base, { type: 'null' }] } : base;\n\n return definition.description === undefined ? schema : { ...schema, description: definition.description };\n}\n"],"mappings":"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"}
|
package/dist/messages.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("./_dev.cjs");const e=require("./
|
|
1
|
+
require("./_dev.cjs");const e=require("./_object.cjs");let t=require("@vielzeug/arsenal");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`},discriminatedUnion:{invalidDiscriminator:({discriminator:e,expected:t})=>`Invalid discriminator value at "${e}": expected ${t.map(e=>JSON.stringify(e)).join(` | `)}`,type:()=>`Expected object`},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`,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`,isoDate:()=>`Invalid date`,isoDateTime:()=>`Invalid datetime`,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`}};function r(n,i){let a=e.objectFromEntries(Object.entries(n));for(let[n,o]of Object.entries(i)){if(o===void 0)continue;if(e.isUnsafeObjectKey(n)){`${n}`;continue}let i=a[n];e.defineOwnProperty(a,n,(0,t.isPlainObject)(i)&&(0,t.isPlainObject)(o)?r(i,o):o)}return a}function i(t={}){return e.deepFreeze({messages:r(n,t)})}var a=i();exports.createParseContext=i,exports.defaultContext=a;
|
|
2
2
|
//# sourceMappingURL=messages.cjs.map
|
package/dist/messages.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.cjs","names":["cloneRecord","isUnsafeObjectKey","require_safe_object","_builtinMessages","exact","max","min","step","values","v","className","expected","keys","suffix","substr","prefix","discriminator","k","isRecord","value","mergeMessages","out","base","key","patch","baseValue","createParseContext","messages"],"sources":["../src/messages.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\nimport type { ParseContext } from './types';\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\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 warn(`[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 * Creates an immutable parse context. Pass this context to parse methods when\n * validation messages vary by request, locale, or form. Spell never stores it globally.\n */\nexport function createParseContext(messages: DeepPartial<Messages> = {}): ParseContext {\n return { messages: mergeMessages(_builtinMessages, messages) };\n}\n\n/** @internal */\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"messages.cjs","names":["objectFromEntries","isUnsafeObjectKey","isPlainObject","deepFreeze","require__object","_vielzeug_arsenal","builtinMessages","exact","max","min","step","discriminator","expected","k","values","v","className","keys","suffix","substr","prefix","mergeMessages","out","base","key","value","patch","baseValue","createParseContext","messages","defaultContext"],"sources":["../src/messages.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport { warn } from './_dev';\nimport { deepFreeze, defineOwnProperty, isUnsafeObjectKey, objectFromEntries } from './_object';\nimport type { ParseContext } from './types';\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 isoDate: () => string;\n isoDateTime: () => 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 discriminatedUnion: {\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 discriminatedUnion: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\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 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 isoDate: () => 'Invalid date',\n isoDateTime: () => 'Invalid datetime',\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};\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = objectFromEntries(Object.entries(base));\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n warn(`Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n defineOwnProperty(\n out,\n key,\n isPlainObject(baseValue) && isPlainObject(value)\n ? mergeMessages(baseValue, value as DeepPartial<typeof baseValue>)\n : value,\n );\n }\n\n return out as T;\n}\n\n/**\n * Creates a frozen parse context with the built-in messages merged with `messages`. Pass it to\n * parse methods when validation messages vary by request, locale, or form. Spell never stores it globally.\n */\nexport function createParseContext(messages: DeepPartial<Messages> = {}): ParseContext {\n return deepFreeze({ messages: mergeMessages(builtinMessages, messages) });\n}\n\n/** The context used when a parse method receives none. */\nexport const defaultContext: ParseContext = createParseContext();\n"],"mappings":"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"}
|