diff --git a/deno/lib/__tests__/pickomit.test.ts b/deno/lib/__tests__/pickomit.test.ts index d2eb28848..ef2f9c399 100644 --- a/deno/lib/__tests__/pickomit.test.ts +++ b/deno/lib/__tests__/pickomit.test.ts @@ -80,7 +80,7 @@ test("omit parse - fail", () => { test("nonstrict inference", () => { const laxfish = fish.pick({ name: true }).catchall(z.any()); type laxfish = z.infer; - util.assertEqual(true); + util.assertEqual(true); }); test("nonstrict parsing - pass", () => { diff --git a/deno/lib/helpers/util.ts b/deno/lib/helpers/util.ts index 5248d6521..891906fae 100644 --- a/deno/lib/helpers/util.ts +++ b/deno/lib/helpers/util.ts @@ -66,10 +66,8 @@ export namespace util { return undefined; }; - export type identity = T; - export type flatten = identity<{ - [k in keyof T]: T[k]; - }>; + export type identity = objectUtil.identity; + export type flatten = objectUtil.flatten; export type noUndefined = T extends undefined ? never : T; @@ -96,6 +94,45 @@ export namespace util { }; } +export namespace objectUtil { + export type MergeShapes = { + [k in Exclude]: U[k]; + } & V; + + type optionalKeys = { + [k in keyof T]: undefined extends T[k] ? k : never; + }[keyof T]; + + type requiredKeys = { + [k in keyof T]: undefined extends T[k] ? never : k; + }[keyof T]; + + export type addQuestionMarks = Partial< + Pick> + > & + Pick>; + + export type identity = T; + export type flatten = identity<{ [k in keyof T]: T[k] }>; + + export type noNeverKeys = { + [k in keyof T]: [T[k]] extends [never] ? never : k; + }[keyof T]; + + export type noNever = identity<{ + [k in noNeverKeys]: k extends keyof T ? T[k] : never; + }>; + + export const mergeShapes = (first: U, second: T): T & U => { + return { + ...first, + ...second, // second overwrites first + }; + }; + + export type extendShape = flatten & B>; +} + export const ZodParsedType = util.arrayToEnum([ "string", "nan", diff --git a/deno/lib/types.ts b/deno/lib/types.ts index 40e57a0c8..ade1fed27 100644 --- a/deno/lib/types.ts +++ b/deno/lib/types.ts @@ -22,7 +22,7 @@ import { } from "./helpers/parseUtil.ts"; import { partialUtil } from "./helpers/partialUtil.ts"; import { Primitive } from "./helpers/typeAliases.ts"; -import { getParsedType, util, ZodParsedType } from "./helpers/util.ts"; +import { getParsedType, objectUtil, util, ZodParsedType } from "./helpers/util.ts"; import { IssueData, StringValidation, @@ -2110,47 +2110,6 @@ export type ZodNonEmptyArray = ZodArray; ////////// ////////// ///////////////////////////////////////// ///////////////////////////////////////// -export namespace objectUtil { - export type MergeShapes = { - [k in Exclude]: U[k]; - } & V; - - type optionalKeys = { - [k in keyof T]: undefined extends T[k] ? k : never; - }[keyof T]; - - type requiredKeys = { - [k in keyof T]: undefined extends T[k] ? never : k; - }[keyof T]; - - export type addQuestionMarks = Partial< - Pick> - > & - Pick>; - - export type identity = T; - export type flatten = identity<{ [k in keyof T]: T[k] }>; - - export type noNeverKeys = { - [k in keyof T]: [T[k]] extends [never] ? never : k; - }[keyof T]; - - export type noNever = identity<{ - [k in noNeverKeys]: k extends keyof T ? T[k] : never; - }>; - - export const mergeShapes = ( - first: U, - second: T - ): T & U => { - return { - ...first, - ...second, // second overwrites first - }; - }; -} - -export type extendShape = util.flatten & B>; export type UnknownKeysParam = "passthrough" | "strict" | "strip"; @@ -2173,25 +2132,23 @@ export type mergeTypes = { : never; }; -export type processType = util.flatten< - objectUtil.addQuestionMarks ->; export type baseObjectOutputType = - objectUtil.addQuestionMarks<{ - [k in keyof Shape]: Shape[k]["_output"]; - }>; + objectUtil.flatten< + objectUtil.addQuestionMarks<{ + [k in keyof Shape]: Shape[k]["_output"]; + }> + >; export type objectOutputType< Shape extends ZodRawShape, Catchall extends ZodTypeAny, UnknownKeys extends UnknownKeysParam = UnknownKeysParam -> = ZodTypeAny extends Catchall - ? objectUtil.flatten> & Passthrough - : objectUtil.flatten< - baseObjectOutputType & { - [k: string]: Catchall["_output"]; - } & Passthrough - >; +> = (ZodTypeAny extends Catchall + ? baseObjectOutputType & Passthrough + : baseObjectOutputType & { + [k: string]: Catchall["_output"]; + }) & + Passthrough; export type baseObjectInputType = objectUtil.flatten< objectUtil.addQuestionMarks<{ @@ -2451,7 +2408,7 @@ export class ZodObject< // }; extend( augmentation: Augmentation - ): ZodObject, UnknownKeys, Catchall> { + ): ZodObject, UnknownKeys, Catchall> { return new ZodObject({ ...this._def, shape: () => ({ @@ -2506,15 +2463,17 @@ export class ZodObject< merge( merging: Incoming ): ZodObject< - extendShape, + objectUtil.extendShape, Incoming["_def"]["unknownKeys"], Incoming["_def"]["catchall"] > { const merged: any = new ZodObject({ unknownKeys: merging._def.unknownKeys, catchall: merging._def.catchall, - shape: () => - objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + shape: () => ({ + ...this._def.shape(), + ...merging._def.shape(), + }), typeName: ZodFirstPartyTypeKind.ZodObject, }) as any; return merged; diff --git a/playground.ts b/playground.ts index e60b11276..4e01473b6 100644 --- a/playground.ts +++ b/playground.ts @@ -1,14 +1,3 @@ import { z } from "./src"; -const schema = z.object({ array: z.string().array().min(42) }).deepPartial(); - -console.log(schema.shape.array._def); -console.log(schema.shape.array._def.innerType._def.minLength); - -// works as expected -console.log(schema.safeParse({}).success); // true - -// should be false, but is true -console.log(schema.safeParse({ array: [] }).success); // true - -console.log(z.string().array().min(42).safeParse([]).success); +z; diff --git a/src/__tests__/pickomit.test.ts b/src/__tests__/pickomit.test.ts index a6215a42c..06465d843 100644 --- a/src/__tests__/pickomit.test.ts +++ b/src/__tests__/pickomit.test.ts @@ -79,7 +79,7 @@ test("omit parse - fail", () => { test("nonstrict inference", () => { const laxfish = fish.pick({ name: true }).catchall(z.any()); type laxfish = z.infer; - util.assertEqual(true); + util.assertEqual(true); }); test("nonstrict parsing - pass", () => { diff --git a/src/helpers/util.ts b/src/helpers/util.ts index 5248d6521..891906fae 100644 --- a/src/helpers/util.ts +++ b/src/helpers/util.ts @@ -66,10 +66,8 @@ export namespace util { return undefined; }; - export type identity = T; - export type flatten = identity<{ - [k in keyof T]: T[k]; - }>; + export type identity = objectUtil.identity; + export type flatten = objectUtil.flatten; export type noUndefined = T extends undefined ? never : T; @@ -96,6 +94,45 @@ export namespace util { }; } +export namespace objectUtil { + export type MergeShapes = { + [k in Exclude]: U[k]; + } & V; + + type optionalKeys = { + [k in keyof T]: undefined extends T[k] ? k : never; + }[keyof T]; + + type requiredKeys = { + [k in keyof T]: undefined extends T[k] ? never : k; + }[keyof T]; + + export type addQuestionMarks = Partial< + Pick> + > & + Pick>; + + export type identity = T; + export type flatten = identity<{ [k in keyof T]: T[k] }>; + + export type noNeverKeys = { + [k in keyof T]: [T[k]] extends [never] ? never : k; + }[keyof T]; + + export type noNever = identity<{ + [k in noNeverKeys]: k extends keyof T ? T[k] : never; + }>; + + export const mergeShapes = (first: U, second: T): T & U => { + return { + ...first, + ...second, // second overwrites first + }; + }; + + export type extendShape = flatten & B>; +} + export const ZodParsedType = util.arrayToEnum([ "string", "nan", diff --git a/src/types.ts b/src/types.ts index b274f4f16..f5106ca59 100644 --- a/src/types.ts +++ b/src/types.ts @@ -22,7 +22,7 @@ import { } from "./helpers/parseUtil"; import { partialUtil } from "./helpers/partialUtil"; import { Primitive } from "./helpers/typeAliases"; -import { getParsedType, util, ZodParsedType } from "./helpers/util"; +import { getParsedType, objectUtil, util, ZodParsedType } from "./helpers/util"; import { IssueData, StringValidation, @@ -2109,47 +2109,6 @@ export type ZodNonEmptyArray = ZodArray; ////////// ////////// ///////////////////////////////////////// ///////////////////////////////////////// -export namespace objectUtil { - export type MergeShapes = { - [k in Exclude]: U[k]; - } & V; - - type optionalKeys = { - [k in keyof T]: undefined extends T[k] ? k : never; - }[keyof T]; - - type requiredKeys = { - [k in keyof T]: undefined extends T[k] ? never : k; - }[keyof T]; - - export type addQuestionMarks = Partial< - Pick> - > & - Pick>; - - export type identity = T; - export type flatten = identity<{ [k in keyof T]: T[k] }>; - - export type noNeverKeys = { - [k in keyof T]: [T[k]] extends [never] ? never : k; - }[keyof T]; - - export type noNever = identity<{ - [k in noNeverKeys]: k extends keyof T ? T[k] : never; - }>; - - export const mergeShapes = ( - first: U, - second: T - ): T & U => { - return { - ...first, - ...second, // second overwrites first - }; - }; -} - -export type extendShape = util.flatten & B>; export type UnknownKeysParam = "passthrough" | "strict" | "strip"; @@ -2172,25 +2131,23 @@ export type mergeTypes = { : never; }; -export type processType = util.flatten< - objectUtil.addQuestionMarks ->; export type baseObjectOutputType = - objectUtil.addQuestionMarks<{ - [k in keyof Shape]: Shape[k]["_output"]; - }>; + objectUtil.flatten< + objectUtil.addQuestionMarks<{ + [k in keyof Shape]: Shape[k]["_output"]; + }> + >; export type objectOutputType< Shape extends ZodRawShape, Catchall extends ZodTypeAny, UnknownKeys extends UnknownKeysParam = UnknownKeysParam -> = ZodTypeAny extends Catchall - ? objectUtil.flatten> & Passthrough - : objectUtil.flatten< - baseObjectOutputType & { - [k: string]: Catchall["_output"]; - } & Passthrough - >; +> = (ZodTypeAny extends Catchall + ? baseObjectOutputType & Passthrough + : baseObjectOutputType & { + [k: string]: Catchall["_output"]; + }) & + Passthrough; export type baseObjectInputType = objectUtil.flatten< objectUtil.addQuestionMarks<{ @@ -2450,7 +2407,7 @@ export class ZodObject< // }; extend( augmentation: Augmentation - ): ZodObject, UnknownKeys, Catchall> { + ): ZodObject, UnknownKeys, Catchall> { return new ZodObject({ ...this._def, shape: () => ({ @@ -2505,15 +2462,17 @@ export class ZodObject< merge( merging: Incoming ): ZodObject< - extendShape, + objectUtil.extendShape, Incoming["_def"]["unknownKeys"], Incoming["_def"]["catchall"] > { const merged: any = new ZodObject({ unknownKeys: merging._def.unknownKeys, catchall: merging._def.catchall, - shape: () => - objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + shape: () => ({ + ...this._def.shape(), + ...merging._def.shape(), + }), typeName: ZodFirstPartyTypeKind.ZodObject, }) as any; return merged; diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json index 32869d981..9a393fdf8 100644 --- a/tsconfig.cjs.json +++ b/tsconfig.cjs.json @@ -5,10 +5,11 @@ "outDir": "lib", "declaration": true, "declarationMap": false, - "sourceMap": false + "sourceMap": false, + "removeComments": true }, "exclude": [ "./src/**/__tests__", "playground.ts" ] -} +} \ No newline at end of file