From 65b104eb38c60605a0787b67ddc08da653053efc Mon Sep 17 00:00:00 2001 From: zanellig Date: Tue, 19 Aug 2025 03:59:08 -0300 Subject: [PATCH 1/3] Fix `handleColumns` use of `factory.zodInstance` The `handleColumns` used in `drizzle-zod` now uses the `zodInstance` passed in to the `factory` options. The previous implementation caused `createSchemaFactory` to return its methods using `z.object(columnSchemas)` ignoring the custom zod instance passed to the `CreateSchemaFactoryOptions`. --- drizzle-zod/src/schema.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drizzle-zod/src/schema.ts b/drizzle-zod/src/schema.ts index 43eb1c246..01f8575ba 100644 --- a/drizzle-zod/src/schema.ts +++ b/drizzle-zod/src/schema.ts @@ -59,8 +59,8 @@ function handleColumns( } } } - - return z.object(columnSchemas) as any; + const zod: typeof z = factory?.zodInstance ?? z; + return zod.object(columnSchemas) as any; } function handleEnum( From 66d3d628295142c2bc4587a9e5aff8d2fa574cba Mon Sep 17 00:00:00 2001 From: zanellig Date: Tue, 19 Aug 2025 17:27:03 -0300 Subject: [PATCH 2/3] Use `zodInstance` on undefined columns Move the `zod` instance reference to the top of the function and use it on undefined columns to convert them to `z.ZodAny` --- drizzle-zod/src/schema.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drizzle-zod/src/schema.ts b/drizzle-zod/src/schema.ts index 01f8575ba..bd88af32b 100644 --- a/drizzle-zod/src/schema.ts +++ b/drizzle-zod/src/schema.ts @@ -21,10 +21,11 @@ function handleColumns( refinements: Record, conditions: Conditions, factory?: CreateSchemaFactoryOptions< - Partial> | true | undefined + Partial> | true | undefined >, ): z.ZodType { const columnSchemas: Record = {}; + const zod: typeof z = factory?.zodInstance ?? z; for (const [key, selected] of Object.entries(columns)) { if (!is(selected, Column) && !is(selected, SQL) && !is(selected, SQL.Aliased) && typeof selected === 'object') { @@ -40,7 +41,7 @@ function handleColumns( } const column = is(selected, Column) ? selected : undefined; - const schema = column ? columnToSchema(column, factory) : z.any(); + const schema = column ? columnToSchema(column, factory) : zod.any(); const refined = typeof refinement === 'function' ? refinement(schema) : schema; if (conditions.never(column)) { @@ -59,7 +60,6 @@ function handleColumns( } } } - const zod: typeof z = factory?.zodInstance ?? z; return zod.object(columnSchemas) as any; } From 44db0b33037c2f8d98f0b22b0083238ec01b3482 Mon Sep 17 00:00:00 2001 From: zanellig Date: Tue, 19 Aug 2025 17:55:55 -0300 Subject: [PATCH 3/3] Fix usage of `zod` instance on `columnToSchema` This change only re-implements the schemas for `literalSchema`, `jsonSchema` and `bufferSchema` in `columnToSchema` to use the `factory?.zodInstance` passed in to the `columnToSchema` function --- drizzle-zod/src/column.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drizzle-zod/src/column.ts b/drizzle-zod/src/column.ts index 996bd9772..83db848e0 100644 --- a/drizzle-zod/src/column.ts +++ b/drizzle-zod/src/column.ts @@ -119,11 +119,11 @@ export function columnToSchema( } else if (column.dataType === 'string') { schema = stringColumnToSchema(column, z, coerce); } else if (column.dataType === 'json') { - schema = jsonSchema; + schema = z.union([z.union([z.string(), z.number(), z.boolean(), z.null()]), z.record(z.string(), z.any()), z.array(z.any())]); } else if (column.dataType === 'custom') { schema = z.any(); } else if (column.dataType === 'buffer') { - schema = bufferSchema; + schema = z.custom((v) => v instanceof Buffer); } }