zod 4.1.0-canary.20250723T222937 → 4.1.0-canary.20250724T211341
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/package.json +1 -1
- package/src/v3/types.ts +3 -1
- package/src/v4/classic/errors.ts +9 -2
- package/src/v4/classic/schemas.ts +10 -7
- package/src/v4/classic/tests/error-utils.test.ts +43 -0
- package/src/v4/classic/tests/file.test.ts +0 -1
- package/src/v4/classic/tests/partial.test.ts +193 -0
- package/src/v4/classic/tests/pickomit.test.ts +5 -5
- package/src/v4/classic/tests/preprocess.test.ts +4 -15
- package/src/v4/classic/tests/record.test.ts +15 -1
- package/src/v4/classic/tests/recursive-types.test.ts +67 -0
- package/src/v4/classic/tests/string.test.ts +77 -0
- package/src/v4/classic/tests/to-json-schema.test.ts +1 -0
- package/src/v4/classic/tests/transform.test.ts +104 -0
- package/src/v4/classic/tests/union.test.ts +90 -3
- package/src/v4/core/checks.ts +2 -2
- package/src/v4/core/errors.ts +8 -15
- package/src/v4/core/registries.ts +3 -2
- package/src/v4/core/schemas.ts +92 -94
- package/src/v4/core/tests/extend.test.ts +18 -0
- package/src/v4/core/to-json-schema.ts +1 -0
- package/src/v4/core/util.ts +135 -98
- package/src/v4/core/versions.ts +1 -1
- package/src/v4/mini/schemas.ts +3 -1
- package/v3/types.cjs +2 -0
- package/v3/types.d.cts +4 -1
- package/v3/types.d.ts +4 -1
- package/v3/types.js +2 -0
- package/v4/classic/errors.cjs +9 -2
- package/v4/classic/errors.js +9 -2
- package/v4/classic/schemas.cjs +5 -3
- package/v4/classic/schemas.d.cts +2 -1
- package/v4/classic/schemas.d.ts +2 -1
- package/v4/classic/schemas.js +5 -3
- package/v4/core/checks.d.cts +2 -2
- package/v4/core/checks.d.ts +2 -2
- package/v4/core/errors.cjs +4 -9
- package/v4/core/errors.d.cts +4 -6
- package/v4/core/errors.d.ts +4 -6
- package/v4/core/errors.js +4 -9
- package/v4/core/registries.cjs +2 -1
- package/v4/core/registries.d.cts +1 -1
- package/v4/core/registries.d.ts +1 -1
- package/v4/core/registries.js +2 -1
- package/v4/core/schemas.cjs +50 -87
- package/v4/core/schemas.d.cts +8 -3
- package/v4/core/schemas.d.ts +8 -3
- package/v4/core/schemas.js +50 -87
- package/v4/core/to-json-schema.cjs +1 -0
- package/v4/core/to-json-schema.js +1 -0
- package/v4/core/util.cjs +123 -97
- package/v4/core/util.d.cts +2 -0
- package/v4/core/util.d.ts +2 -0
- package/v4/core/util.js +121 -97
- package/v4/core/versions.cjs +1 -1
- package/v4/core/versions.js +1 -1
- package/v4/mini/schemas.cjs +3 -1
- package/v4/mini/schemas.js +3 -1
package/v4/core/schemas.js
CHANGED
|
@@ -156,9 +156,10 @@ export const $ZodURL = /*@__PURE__*/ core.$constructor("$ZodURL", (inst, def) =>
|
|
|
156
156
|
$ZodStringFormat.init(inst, def);
|
|
157
157
|
inst._zod.check = (payload) => {
|
|
158
158
|
try {
|
|
159
|
-
|
|
160
|
-
const
|
|
161
|
-
|
|
159
|
+
// Trim whitespace from input
|
|
160
|
+
const trimmed = payload.value.trim();
|
|
161
|
+
// @ts-ignore
|
|
162
|
+
const url = new URL(trimmed);
|
|
162
163
|
if (def.hostname) {
|
|
163
164
|
def.hostname.lastIndex = 0;
|
|
164
165
|
if (!def.hostname.test(url.hostname)) {
|
|
@@ -187,12 +188,14 @@ export const $ZodURL = /*@__PURE__*/ core.$constructor("$ZodURL", (inst, def) =>
|
|
|
187
188
|
});
|
|
188
189
|
}
|
|
189
190
|
}
|
|
190
|
-
//
|
|
191
|
-
if (
|
|
192
|
-
|
|
191
|
+
// Set the output value based on normalize flag
|
|
192
|
+
if (def.normalize) {
|
|
193
|
+
// Use normalized URL
|
|
194
|
+
payload.value = url.href;
|
|
193
195
|
}
|
|
194
196
|
else {
|
|
195
|
-
|
|
197
|
+
// Preserve the original input (trimmed)
|
|
198
|
+
payload.value = trimmed;
|
|
196
199
|
}
|
|
197
200
|
return;
|
|
198
201
|
}
|
|
@@ -268,6 +271,7 @@ export const $ZodIPv6 = /*@__PURE__*/ core.$constructor("$ZodIPv6", (inst, def)
|
|
|
268
271
|
});
|
|
269
272
|
inst._zod.check = (payload) => {
|
|
270
273
|
try {
|
|
274
|
+
// @ts-ignore
|
|
271
275
|
new URL(`http://[${payload.value}]`);
|
|
272
276
|
// return;
|
|
273
277
|
}
|
|
@@ -299,6 +303,7 @@ export const $ZodCIDRv6 = /*@__PURE__*/ core.$constructor("$ZodCIDRv6", (inst, d
|
|
|
299
303
|
throw new Error();
|
|
300
304
|
if (prefixNum < 0 || prefixNum > 128)
|
|
301
305
|
throw new Error();
|
|
306
|
+
// @ts-ignore
|
|
302
307
|
new URL(`http://[${address}]`);
|
|
303
308
|
}
|
|
304
309
|
catch {
|
|
@@ -319,6 +324,7 @@ export function isValidBase64(data) {
|
|
|
319
324
|
if (data.length % 4 !== 0)
|
|
320
325
|
return false;
|
|
321
326
|
try {
|
|
327
|
+
// @ts-ignore
|
|
322
328
|
atob(data);
|
|
323
329
|
return true;
|
|
324
330
|
}
|
|
@@ -383,6 +389,7 @@ export function isValidJWT(token, algorithm = null) {
|
|
|
383
389
|
const [header] = tokensParts;
|
|
384
390
|
if (!header)
|
|
385
391
|
return false;
|
|
392
|
+
// @ts-ignore
|
|
386
393
|
const parsedHeader = JSON.parse(atob(header));
|
|
387
394
|
if ("typ" in parsedHeader && parsedHeader?.typ !== "JWT")
|
|
388
395
|
return false;
|
|
@@ -653,36 +660,16 @@ export const $ZodArray = /*@__PURE__*/ core.$constructor("$ZodArray", (inst, def
|
|
|
653
660
|
return payload; //handleArrayResultsAsync(parseResults, final);
|
|
654
661
|
};
|
|
655
662
|
});
|
|
656
|
-
function
|
|
657
|
-
// if(isOptional)
|
|
663
|
+
function handlePropertyResult(result, final, key, input) {
|
|
658
664
|
if (result.issues.length) {
|
|
659
665
|
final.issues.push(...util.prefixIssues(key, result.issues));
|
|
660
666
|
}
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
function handleOptionalObjectResult(result, final, key, input) {
|
|
664
|
-
if (result.issues.length) {
|
|
665
|
-
// validation failed against value schema
|
|
666
|
-
if (input[key] === undefined) {
|
|
667
|
-
// if input was undefined, ignore the error
|
|
668
|
-
if (key in input) {
|
|
669
|
-
final.value[key] = undefined;
|
|
670
|
-
}
|
|
671
|
-
else {
|
|
672
|
-
final.value[key] = result.value;
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
else {
|
|
676
|
-
final.issues.push(...util.prefixIssues(key, result.issues));
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
else if (result.value === undefined) {
|
|
680
|
-
// validation returned `undefined`
|
|
681
|
-
if (key in input)
|
|
667
|
+
if (result.value === undefined) {
|
|
668
|
+
if (key in input) {
|
|
682
669
|
final.value[key] = undefined;
|
|
670
|
+
}
|
|
683
671
|
}
|
|
684
672
|
else {
|
|
685
|
-
// non-undefined value
|
|
686
673
|
final.value[key] = result.value;
|
|
687
674
|
}
|
|
688
675
|
}
|
|
@@ -734,42 +721,25 @@ export const $ZodObject = /*@__PURE__*/ core.$constructor("$ZodObject", (inst, d
|
|
|
734
721
|
// A: preserve key order {
|
|
735
722
|
doc.write(`const newResult = {}`);
|
|
736
723
|
for (const key of normalized.keys) {
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
doc.write(`
|
|
724
|
+
const id = ids[key];
|
|
725
|
+
const k = util.esc(key);
|
|
726
|
+
doc.write(`const ${id} = ${parseStr(key)};`);
|
|
727
|
+
doc.write(`
|
|
742
728
|
if (${id}.issues.length) {
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
}))
|
|
753
|
-
);
|
|
729
|
+
payload.issues = payload.issues.concat(${id}.issues.map(iss => ({
|
|
730
|
+
...iss,
|
|
731
|
+
path: iss.path ? [${k}, ...iss.path] : [${k}]
|
|
732
|
+
})));
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
if (${id}.value === undefined) {
|
|
736
|
+
if (${k} in input) {
|
|
737
|
+
newResult[${k}] = undefined;
|
|
754
738
|
}
|
|
755
|
-
} else if (${id}.value === undefined) {
|
|
756
|
-
if (${k} in input) newResult[${k}] = undefined;
|
|
757
739
|
} else {
|
|
758
740
|
newResult[${k}] = ${id}.value;
|
|
759
741
|
}
|
|
760
|
-
|
|
761
|
-
}
|
|
762
|
-
else {
|
|
763
|
-
const id = ids[key];
|
|
764
|
-
// const id = ids[key];
|
|
765
|
-
doc.write(`const ${id} = ${parseStr(key)};`);
|
|
766
|
-
doc.write(`
|
|
767
|
-
if (${id}.issues.length) payload.issues = payload.issues.concat(${id}.issues.map(iss => ({
|
|
768
|
-
...iss,
|
|
769
|
-
path: iss.path ? [${util.esc(key)}, ...iss.path] : [${util.esc(key)}]
|
|
770
|
-
})));`);
|
|
771
|
-
doc.write(`newResult[${util.esc(key)}] = ${id}.value`);
|
|
772
|
-
}
|
|
742
|
+
`);
|
|
773
743
|
}
|
|
774
744
|
doc.write(`payload.value = newResult;`);
|
|
775
745
|
doc.write(`return payload;`);
|
|
@@ -807,33 +777,16 @@ export const $ZodObject = /*@__PURE__*/ core.$constructor("$ZodObject", (inst, d
|
|
|
807
777
|
const shape = value.shape;
|
|
808
778
|
for (const key of value.keys) {
|
|
809
779
|
const el = shape[key];
|
|
810
|
-
// do not add omitted optional keys
|
|
811
|
-
// if (!(key in input)) {
|
|
812
|
-
// if (optionalKeys.has(key)) continue;
|
|
813
|
-
// payload.issues.push({
|
|
814
|
-
// code: "invalid_type",
|
|
815
|
-
// path: [key],
|
|
816
|
-
// expected: "nonoptional",
|
|
817
|
-
// note: `Missing required key: "${key}"`,
|
|
818
|
-
// input,
|
|
819
|
-
// inst,
|
|
820
|
-
// });
|
|
821
|
-
// }
|
|
822
780
|
const r = el._zod.run({ value: input[key], issues: [] }, ctx);
|
|
823
|
-
const isOptional = el._zod.optin === "optional" && el._zod.optout === "optional";
|
|
824
781
|
if (r instanceof Promise) {
|
|
825
|
-
proms.push(r.then((r) =>
|
|
826
|
-
}
|
|
827
|
-
else if (isOptional) {
|
|
828
|
-
handleOptionalObjectResult(r, payload, key, input);
|
|
782
|
+
proms.push(r.then((r) => handlePropertyResult(r, payload, key, input)));
|
|
829
783
|
}
|
|
830
784
|
else {
|
|
831
|
-
|
|
785
|
+
handlePropertyResult(r, payload, key, input);
|
|
832
786
|
}
|
|
833
787
|
}
|
|
834
788
|
}
|
|
835
789
|
if (!catchall) {
|
|
836
|
-
// return payload;
|
|
837
790
|
return proms.length ? Promise.all(proms).then(() => payload) : payload;
|
|
838
791
|
}
|
|
839
792
|
const unrecognized = [];
|
|
@@ -850,10 +803,10 @@ export const $ZodObject = /*@__PURE__*/ core.$constructor("$ZodObject", (inst, d
|
|
|
850
803
|
}
|
|
851
804
|
const r = _catchall.run({ value: input[key], issues: [] }, ctx);
|
|
852
805
|
if (r instanceof Promise) {
|
|
853
|
-
proms.push(r.then((r) =>
|
|
806
|
+
proms.push(r.then((r) => handlePropertyResult(r, payload, key, input)));
|
|
854
807
|
}
|
|
855
808
|
else {
|
|
856
|
-
|
|
809
|
+
handlePropertyResult(r, payload, key, input);
|
|
857
810
|
}
|
|
858
811
|
}
|
|
859
812
|
if (unrecognized.length) {
|
|
@@ -878,6 +831,11 @@ function handleUnionResults(results, final, inst, ctx) {
|
|
|
878
831
|
return final;
|
|
879
832
|
}
|
|
880
833
|
}
|
|
834
|
+
const nonaborted = results.filter((r) => !util.aborted(r));
|
|
835
|
+
if (nonaborted.length === 1) {
|
|
836
|
+
final.value = nonaborted[0].value;
|
|
837
|
+
return nonaborted[0];
|
|
838
|
+
}
|
|
881
839
|
final.issues.push({
|
|
882
840
|
code: "invalid_union",
|
|
883
841
|
input: final.value,
|
|
@@ -1343,14 +1301,15 @@ function handleSetResult(result, final) {
|
|
|
1343
1301
|
export const $ZodEnum = /*@__PURE__*/ core.$constructor("$ZodEnum", (inst, def) => {
|
|
1344
1302
|
$ZodType.init(inst, def);
|
|
1345
1303
|
const values = util.getEnumValues(def.entries);
|
|
1346
|
-
|
|
1304
|
+
const valuesSet = new Set(values);
|
|
1305
|
+
inst._zod.values = valuesSet;
|
|
1347
1306
|
inst._zod.pattern = new RegExp(`^(${values
|
|
1348
1307
|
.filter((k) => util.propertyKeyTypes.has(typeof k))
|
|
1349
1308
|
.map((o) => (typeof o === "string" ? util.escapeRegex(o) : o.toString()))
|
|
1350
1309
|
.join("|")})$`);
|
|
1351
1310
|
inst._zod.parse = (payload, _ctx) => {
|
|
1352
1311
|
const input = payload.value;
|
|
1353
|
-
if (
|
|
1312
|
+
if (valuesSet.has(input)) {
|
|
1354
1313
|
return payload;
|
|
1355
1314
|
}
|
|
1356
1315
|
payload.issues.push({
|
|
@@ -1364,6 +1323,9 @@ export const $ZodEnum = /*@__PURE__*/ core.$constructor("$ZodEnum", (inst, def)
|
|
|
1364
1323
|
});
|
|
1365
1324
|
export const $ZodLiteral = /*@__PURE__*/ core.$constructor("$ZodLiteral", (inst, def) => {
|
|
1366
1325
|
$ZodType.init(inst, def);
|
|
1326
|
+
if (def.values.length === 0) {
|
|
1327
|
+
throw new Error("Cannot create literal schema with no valid values");
|
|
1328
|
+
}
|
|
1367
1329
|
inst._zod.values = new Set(def.values);
|
|
1368
1330
|
inst._zod.pattern = new RegExp(`^(${def.values
|
|
1369
1331
|
.map((o) => (typeof o === "string" ? util.escapeRegex(o) : o ? util.escapeRegex(o.toString()) : String(o)))
|
|
@@ -1386,6 +1348,7 @@ export const $ZodFile = /*@__PURE__*/ core.$constructor("$ZodFile", (inst, def)
|
|
|
1386
1348
|
$ZodType.init(inst, def);
|
|
1387
1349
|
inst._zod.parse = (payload, _ctx) => {
|
|
1388
1350
|
const input = payload.value;
|
|
1351
|
+
// @ts-ignore
|
|
1389
1352
|
if (input instanceof File)
|
|
1390
1353
|
return payload;
|
|
1391
1354
|
payload.issues.push({
|
|
@@ -1531,7 +1494,7 @@ export const $ZodSuccess = /*@__PURE__*/ core.$constructor("$ZodSuccess", (inst,
|
|
|
1531
1494
|
});
|
|
1532
1495
|
export const $ZodCatch = /*@__PURE__*/ core.$constructor("$ZodCatch", (inst, def) => {
|
|
1533
1496
|
$ZodType.init(inst, def);
|
|
1534
|
-
inst._zod
|
|
1497
|
+
util.defineLazy(inst._zod, "optin", () => def.innerType._zod.optin);
|
|
1535
1498
|
util.defineLazy(inst._zod, "optout", () => def.innerType._zod.optout);
|
|
1536
1499
|
util.defineLazy(inst._zod, "values", () => def.innerType._zod.values);
|
|
1537
1500
|
inst._zod.parse = (payload, ctx) => {
|
|
@@ -1596,7 +1559,7 @@ export const $ZodPipe = /*@__PURE__*/ core.$constructor("$ZodPipe", (inst, def)
|
|
|
1596
1559
|
};
|
|
1597
1560
|
});
|
|
1598
1561
|
function handlePipeResult(left, def, ctx) {
|
|
1599
|
-
if (
|
|
1562
|
+
if (left.issues.length) {
|
|
1600
1563
|
return left;
|
|
1601
1564
|
}
|
|
1602
1565
|
return def.out._zod.run({ value: left.value, issues: left.issues }, ctx);
|
package/v4/core/util.cjs
CHANGED
|
@@ -15,6 +15,8 @@ exports.cleanRegex = cleanRegex;
|
|
|
15
15
|
exports.floatSafeRemainder = floatSafeRemainder;
|
|
16
16
|
exports.defineLazy = defineLazy;
|
|
17
17
|
exports.assignProp = assignProp;
|
|
18
|
+
exports.mergeDefs = mergeDefs;
|
|
19
|
+
exports.cloneDef = cloneDef;
|
|
18
20
|
exports.getElementAtPath = getElementAtPath;
|
|
19
21
|
exports.promiseAllObject = promiseAllObject;
|
|
20
22
|
exports.randomString = randomString;
|
|
@@ -127,6 +129,17 @@ function assignProp(target, prop, value) {
|
|
|
127
129
|
configurable: true,
|
|
128
130
|
});
|
|
129
131
|
}
|
|
132
|
+
function mergeDefs(...defs) {
|
|
133
|
+
const mergedDescriptors = {};
|
|
134
|
+
for (const def of defs) {
|
|
135
|
+
const descriptors = Object.getOwnPropertyDescriptors(def);
|
|
136
|
+
Object.assign(mergedDescriptors, descriptors);
|
|
137
|
+
}
|
|
138
|
+
return Object.defineProperties({}, mergedDescriptors);
|
|
139
|
+
}
|
|
140
|
+
function cloneDef(schema) {
|
|
141
|
+
return mergeDefs(schema._zod.def);
|
|
142
|
+
}
|
|
130
143
|
function getElementAtPath(obj, path) {
|
|
131
144
|
if (!path)
|
|
132
145
|
return obj;
|
|
@@ -154,13 +167,12 @@ function randomString(length = 10) {
|
|
|
154
167
|
function esc(str) {
|
|
155
168
|
return JSON.stringify(str);
|
|
156
169
|
}
|
|
157
|
-
exports.captureStackTrace = Error.captureStackTrace
|
|
158
|
-
? Error.captureStackTrace
|
|
159
|
-
: (..._args) => { };
|
|
170
|
+
exports.captureStackTrace = ("captureStackTrace" in Error ? Error.captureStackTrace : (..._args) => { });
|
|
160
171
|
function isObject(data) {
|
|
161
172
|
return typeof data === "object" && data !== null && !Array.isArray(data);
|
|
162
173
|
}
|
|
163
174
|
exports.allowsEval = cached(() => {
|
|
175
|
+
// @ts-ignore
|
|
164
176
|
if (typeof navigator !== "undefined" && navigator?.userAgent?.includes("Cloudflare")) {
|
|
165
177
|
return false;
|
|
166
178
|
}
|
|
@@ -235,6 +247,7 @@ const getParsedType = (data) => {
|
|
|
235
247
|
if (typeof Date !== "undefined" && data instanceof Date) {
|
|
236
248
|
return "date";
|
|
237
249
|
}
|
|
250
|
+
// @ts-ignore
|
|
238
251
|
if (typeof File !== "undefined" && data instanceof File) {
|
|
239
252
|
return "file";
|
|
240
253
|
}
|
|
@@ -329,140 +342,152 @@ exports.BIGINT_FORMAT_RANGES = {
|
|
|
329
342
|
uint64: [/* @__PURE__*/ BigInt(0), /* @__PURE__*/ BigInt("18446744073709551615")],
|
|
330
343
|
};
|
|
331
344
|
function pick(schema, mask) {
|
|
332
|
-
const
|
|
333
|
-
const
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
345
|
+
const currDef = schema._zod.def;
|
|
346
|
+
const def = mergeDefs(schema._zod.def, {
|
|
347
|
+
get shape() {
|
|
348
|
+
const newShape = {};
|
|
349
|
+
for (const key in mask) {
|
|
350
|
+
if (!(key in currDef.shape)) {
|
|
351
|
+
throw new Error(`Unrecognized key: "${key}"`);
|
|
352
|
+
}
|
|
353
|
+
if (!mask[key])
|
|
354
|
+
continue;
|
|
355
|
+
newShape[key] = currDef.shape[key];
|
|
356
|
+
}
|
|
357
|
+
assignProp(this, "shape", newShape); // self-caching
|
|
358
|
+
return newShape;
|
|
359
|
+
},
|
|
346
360
|
checks: [],
|
|
347
361
|
});
|
|
362
|
+
return clone(schema, def);
|
|
348
363
|
}
|
|
349
364
|
function omit(schema, mask) {
|
|
350
|
-
const
|
|
351
|
-
const
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
365
|
+
const currDef = schema._zod.def;
|
|
366
|
+
const def = mergeDefs(schema._zod.def, {
|
|
367
|
+
get shape() {
|
|
368
|
+
const newShape = { ...schema._zod.def.shape };
|
|
369
|
+
for (const key in mask) {
|
|
370
|
+
if (!(key in currDef.shape)) {
|
|
371
|
+
throw new Error(`Unrecognized key: "${key}"`);
|
|
372
|
+
}
|
|
373
|
+
if (!mask[key])
|
|
374
|
+
continue;
|
|
375
|
+
delete newShape[key];
|
|
376
|
+
}
|
|
377
|
+
assignProp(this, "shape", newShape); // self-caching
|
|
378
|
+
return newShape;
|
|
379
|
+
},
|
|
363
380
|
checks: [],
|
|
364
381
|
});
|
|
382
|
+
return clone(schema, def);
|
|
365
383
|
}
|
|
366
384
|
function extend(schema, shape) {
|
|
367
385
|
if (!isPlainObject(shape)) {
|
|
368
386
|
throw new Error("Invalid input to extend: expected a plain object");
|
|
369
387
|
}
|
|
370
|
-
const def = {
|
|
371
|
-
...schema._zod.def,
|
|
388
|
+
const def = mergeDefs(schema._zod.def, {
|
|
372
389
|
get shape() {
|
|
373
390
|
const _shape = { ...schema._zod.def.shape, ...shape };
|
|
374
391
|
assignProp(this, "shape", _shape); // self-caching
|
|
375
392
|
return _shape;
|
|
376
393
|
},
|
|
377
|
-
checks: [],
|
|
378
|
-
};
|
|
394
|
+
checks: [],
|
|
395
|
+
});
|
|
379
396
|
return clone(schema, def);
|
|
380
397
|
}
|
|
381
398
|
function merge(a, b) {
|
|
382
|
-
|
|
383
|
-
...a._zod.def,
|
|
399
|
+
const def = mergeDefs(a._zod.def, {
|
|
384
400
|
get shape() {
|
|
385
401
|
const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };
|
|
386
402
|
assignProp(this, "shape", _shape); // self-caching
|
|
387
403
|
return _shape;
|
|
388
404
|
},
|
|
389
|
-
catchall
|
|
405
|
+
get catchall() {
|
|
406
|
+
return b._zod.def.catchall;
|
|
407
|
+
},
|
|
390
408
|
checks: [], // delete existing checks
|
|
391
409
|
});
|
|
410
|
+
return clone(a, def);
|
|
392
411
|
}
|
|
393
412
|
function partial(Class, schema, mask) {
|
|
394
|
-
const
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
if (
|
|
399
|
-
|
|
413
|
+
const def = mergeDefs(schema._zod.def, {
|
|
414
|
+
get shape() {
|
|
415
|
+
const oldShape = schema._zod.def.shape;
|
|
416
|
+
const shape = { ...oldShape };
|
|
417
|
+
if (mask) {
|
|
418
|
+
for (const key in mask) {
|
|
419
|
+
if (!(key in oldShape)) {
|
|
420
|
+
throw new Error(`Unrecognized key: "${key}"`);
|
|
421
|
+
}
|
|
422
|
+
if (!mask[key])
|
|
423
|
+
continue;
|
|
424
|
+
// if (oldShape[key]!._zod.optin === "optional") continue;
|
|
425
|
+
shape[key] = Class
|
|
426
|
+
? new Class({
|
|
427
|
+
type: "optional",
|
|
428
|
+
innerType: oldShape[key],
|
|
429
|
+
})
|
|
430
|
+
: oldShape[key];
|
|
431
|
+
}
|
|
400
432
|
}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
shape[key] = Class
|
|
416
|
-
? new Class({
|
|
417
|
-
type: "optional",
|
|
418
|
-
innerType: oldShape[key],
|
|
419
|
-
})
|
|
420
|
-
: oldShape[key];
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
return clone(schema, {
|
|
424
|
-
...schema._zod.def,
|
|
425
|
-
shape,
|
|
433
|
+
else {
|
|
434
|
+
for (const key in oldShape) {
|
|
435
|
+
// if (oldShape[key]!._zod.optin === "optional") continue;
|
|
436
|
+
shape[key] = Class
|
|
437
|
+
? new Class({
|
|
438
|
+
type: "optional",
|
|
439
|
+
innerType: oldShape[key],
|
|
440
|
+
})
|
|
441
|
+
: oldShape[key];
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
assignProp(this, "shape", shape); // self-caching
|
|
445
|
+
return shape;
|
|
446
|
+
},
|
|
426
447
|
checks: [],
|
|
427
448
|
});
|
|
449
|
+
return clone(schema, def);
|
|
428
450
|
}
|
|
429
451
|
function required(Class, schema, mask) {
|
|
430
|
-
const
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
if (
|
|
435
|
-
|
|
452
|
+
const def = mergeDefs(schema._zod.def, {
|
|
453
|
+
get shape() {
|
|
454
|
+
const oldShape = schema._zod.def.shape;
|
|
455
|
+
const shape = { ...oldShape };
|
|
456
|
+
if (mask) {
|
|
457
|
+
for (const key in mask) {
|
|
458
|
+
if (!(key in shape)) {
|
|
459
|
+
throw new Error(`Unrecognized key: "${key}"`);
|
|
460
|
+
}
|
|
461
|
+
if (!mask[key])
|
|
462
|
+
continue;
|
|
463
|
+
// overwrite with non-optional
|
|
464
|
+
shape[key] = new Class({
|
|
465
|
+
type: "nonoptional",
|
|
466
|
+
innerType: oldShape[key],
|
|
467
|
+
});
|
|
468
|
+
}
|
|
436
469
|
}
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
shape[key] = new Class({
|
|
450
|
-
type: "nonoptional",
|
|
451
|
-
innerType: oldShape[key],
|
|
452
|
-
});
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
return clone(schema, {
|
|
456
|
-
...schema._zod.def,
|
|
457
|
-
shape,
|
|
458
|
-
// optional: [],
|
|
470
|
+
else {
|
|
471
|
+
for (const key in oldShape) {
|
|
472
|
+
// overwrite with non-optional
|
|
473
|
+
shape[key] = new Class({
|
|
474
|
+
type: "nonoptional",
|
|
475
|
+
innerType: oldShape[key],
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
assignProp(this, "shape", shape); // self-caching
|
|
480
|
+
return shape;
|
|
481
|
+
},
|
|
459
482
|
checks: [],
|
|
460
483
|
});
|
|
484
|
+
return clone(schema, def);
|
|
461
485
|
}
|
|
462
486
|
function aborted(x, startIndex = 0) {
|
|
463
487
|
for (let i = startIndex; i < x.issues.length; i++) {
|
|
464
|
-
if (x.issues[i]?.continue !== true)
|
|
488
|
+
if (x.issues[i]?.continue !== true) {
|
|
465
489
|
return true;
|
|
490
|
+
}
|
|
466
491
|
}
|
|
467
492
|
return false;
|
|
468
493
|
}
|
|
@@ -501,6 +526,7 @@ function getSizableOrigin(input) {
|
|
|
501
526
|
return "set";
|
|
502
527
|
if (input instanceof Map)
|
|
503
528
|
return "map";
|
|
529
|
+
// @ts-ignore
|
|
504
530
|
if (input instanceof File)
|
|
505
531
|
return "file";
|
|
506
532
|
return "unknown";
|
package/v4/core/util.d.cts
CHANGED
|
@@ -121,6 +121,8 @@ export declare function cleanRegex(source: string): string;
|
|
|
121
121
|
export declare function floatSafeRemainder(val: number, step: number): number;
|
|
122
122
|
export declare function defineLazy<T, K extends keyof T>(object: T, key: K, getter: () => T[K]): void;
|
|
123
123
|
export declare function assignProp<T extends object, K extends PropertyKey>(target: T, prop: K, value: K extends keyof T ? T[K] : any): void;
|
|
124
|
+
export declare function mergeDefs(...defs: Record<string, any>[]): any;
|
|
125
|
+
export declare function cloneDef(schema: schemas.$ZodType): any;
|
|
124
126
|
export declare function getElementAtPath(obj: any, path: (string | number)[] | null | undefined): any;
|
|
125
127
|
export declare function promiseAllObject<T extends object>(promisesObj: T): Promise<{
|
|
126
128
|
[k in keyof T]: Awaited<T[k]>;
|
package/v4/core/util.d.ts
CHANGED
|
@@ -121,6 +121,8 @@ export declare function cleanRegex(source: string): string;
|
|
|
121
121
|
export declare function floatSafeRemainder(val: number, step: number): number;
|
|
122
122
|
export declare function defineLazy<T, K extends keyof T>(object: T, key: K, getter: () => T[K]): void;
|
|
123
123
|
export declare function assignProp<T extends object, K extends PropertyKey>(target: T, prop: K, value: K extends keyof T ? T[K] : any): void;
|
|
124
|
+
export declare function mergeDefs(...defs: Record<string, any>[]): any;
|
|
125
|
+
export declare function cloneDef(schema: schemas.$ZodType): any;
|
|
124
126
|
export declare function getElementAtPath(obj: any, path: (string | number)[] | null | undefined): any;
|
|
125
127
|
export declare function promiseAllObject<T extends object>(promisesObj: T): Promise<{
|
|
126
128
|
[k in keyof T]: Awaited<T[k]>;
|