diff --git a/drizzle-zod/package.json b/drizzle-zod/package.json index 86d25a47d7..2530eee93b 100644 --- a/drizzle-zod/package.json +++ b/drizzle-zod/package.json @@ -65,7 +65,7 @@ "license": "Apache-2.0", "peerDependencies": { "drizzle-orm": ">=0.36.0", - "zod": ">=3.0.0" + "zod": "^3.25.0" }, "devDependencies": { "@rollup/plugin-typescript": "^11.1.0", @@ -77,7 +77,7 @@ "rollup": "^3.29.5", "vite-tsconfig-paths": "^4.3.2", "vitest": "^3.1.3", - "zod": "^3.24.1", + "zod": "3.25.0-beta.20250516T044623", "zx": "^7.2.2" } } diff --git a/drizzle-zod/src/column.ts b/drizzle-zod/src/column.ts index c6241cd4f7..632168fa9e 100644 --- a/drizzle-zod/src/column.ts +++ b/drizzle-zod/src/column.ts @@ -53,21 +53,28 @@ import type { SingleStoreYear, } from 'drizzle-orm/singlestore-core'; import type { SQLiteInteger, SQLiteReal, SQLiteText } from 'drizzle-orm/sqlite-core'; -import { z } from 'zod'; -import { z as zod } from 'zod'; +import { z } from 'zod/v4'; +import { z as zod } from 'zod/v4'; import { CONSTANTS } from './constants.ts'; import type { CreateSchemaFactoryOptions } from './schema.types.ts'; import { isColumnType, isWithEnum } from './utils.ts'; import type { Json } from './utils.ts'; export const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]); -export const jsonSchema: z.ZodType = z.union([literalSchema, z.record(z.any()), z.array(z.any())]); +export const jsonSchema: z.ZodType = z.union([literalSchema, z.record(z.string(), z.any()), z.array(z.any())]); export const bufferSchema: z.ZodType = z.custom((v) => v instanceof Buffer); // eslint-disable-line no-instanceof/no-instanceof -export function columnToSchema(column: Column, factory: CreateSchemaFactoryOptions | undefined): z.ZodTypeAny { - const z = factory?.zodInstance ?? zod; +export function columnToSchema( + column: Column, + factory: + | CreateSchemaFactoryOptions< + Partial> | true | undefined + > + | undefined, +): z.ZodType { + const z: typeof zod = factory?.zodInstance ?? zod; const coerce = factory?.coerce ?? {}; - let schema!: z.ZodTypeAny; + let schema!: z.ZodType; if (isWithEnum(column)) { schema = column.enumValues.length ? z.enum(column.enumValues) : z.string(); @@ -94,7 +101,7 @@ export function columnToSchema(column: Column, factory: CreateSchemaFactoryOptio }); } // Handle other types else if (isColumnType>(column, ['PgArray'])) { - schema = z.array(columnToSchema(column.baseColumn, z)); + schema = z.array(columnToSchema(column.baseColumn, factory)); schema = column.size ? (schema as z.ZodArray).length(column.size) : schema; } else if (column.dataType === 'array') { schema = z.array(z.any()); @@ -127,8 +134,10 @@ export function columnToSchema(column: Column, factory: CreateSchemaFactoryOptio function numberColumnToSchema( column: Column, z: typeof zod, - coerce: CreateSchemaFactoryOptions['coerce'], -): z.ZodTypeAny { + coerce: CreateSchemaFactoryOptions< + Partial> | true | undefined + >['coerce'], +): z.ZodType { let unsigned = column.getSQLType().includes('unsigned'); let min!: number; let max!: number; @@ -228,31 +237,39 @@ function numberColumnToSchema( max = Number.MAX_SAFE_INTEGER; } - let schema = coerce === true || coerce?.number ? z.coerce.number() : z.number(); - schema = schema.min(min).max(max); - return integer ? schema.int() : schema; + let schema = coerce === true || coerce?.number + ? integer ? z.coerce.number() : z.coerce.number().int() + : integer + ? z.int() + : z.number(); + schema = schema.gte(min).lte(max); + return schema; } function bigintColumnToSchema( column: Column, z: typeof zod, - coerce: CreateSchemaFactoryOptions['coerce'], -): z.ZodTypeAny { + coerce: CreateSchemaFactoryOptions< + Partial> | true | undefined + >['coerce'], +): z.ZodType { const unsigned = column.getSQLType().includes('unsigned'); const min = unsigned ? 0n : CONSTANTS.INT64_MIN; const max = unsigned ? CONSTANTS.INT64_UNSIGNED_MAX : CONSTANTS.INT64_MAX; const schema = coerce === true || coerce?.bigint ? z.coerce.bigint() : z.bigint(); - return schema.min(min).max(max); + return schema.gte(min).lte(max); } function stringColumnToSchema( column: Column, z: typeof zod, - coerce: CreateSchemaFactoryOptions['coerce'], -): z.ZodTypeAny { + coerce: CreateSchemaFactoryOptions< + Partial> | true | undefined + >['coerce'], +): z.ZodType { if (isColumnType>>(column, ['PgUUID'])) { - return z.string().uuid(); + return z.uuid(); } let max: number | undefined; diff --git a/drizzle-zod/src/column.types.ts b/drizzle-zod/src/column.types.ts index 6d7215db3c..c8c46e70c9 100644 --- a/drizzle-zod/src/column.types.ts +++ b/drizzle-zod/src/column.types.ts @@ -1,5 +1,5 @@ import type { Assume, Column } from 'drizzle-orm'; -import type { z } from 'zod'; +import type { z } from 'zod/v4'; import type { IsEnumDefined, IsNever, Json } from './utils.ts'; type HasBaseColumn = TColumn extends { _: { baseColumn: Column | undefined } } @@ -9,46 +9,86 @@ type HasBaseColumn = TColumn extends { _: { baseColumn: Column | undefi export type GetZodType< TColumn extends Column, + TCoerce extends Partial> | true | undefined, > = HasBaseColumn extends true ? z.ZodArray< - GetZodType> + GetZodType, TCoerce> > + : TColumn['_']['columnType'] extends 'PgUUID' ? z.ZodUUID : IsEnumDefined extends true - ? z.ZodEnum> - : TColumn['_']['columnType'] extends 'PgGeometry' | 'PgPointTuple' ? z.ZodTuple<[z.ZodNumber, z.ZodNumber]> - : TColumn['_']['columnType'] extends 'PgLine' ? z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber]> - : TColumn['_']['data'] extends Date ? z.ZodDate + ? z.ZodEnum<{ [K in Assume[number]]: K }> + : TColumn['_']['columnType'] extends 'PgGeometry' | 'PgPointTuple' ? z.ZodTuple<[z.ZodNumber, z.ZodNumber], null> + : TColumn['_']['columnType'] extends 'PgLine' ? z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null> + : TColumn['_']['data'] extends Date ? CanCoerce extends true ? z.coerce.ZodCoercedDate : z.ZodDate : TColumn['_']['data'] extends Buffer ? z.ZodType : TColumn['_']['dataType'] extends 'array' - ? z.ZodArray[number]>> + ? z.ZodArray[number], '', TCoerce>> : TColumn['_']['data'] extends Record ? TColumn['_']['columnType'] extends 'PgJson' | 'PgJsonb' | 'MySqlJson' | 'SingleStoreJson' | 'SQLiteTextJson' | 'SQLiteBlobJson' - ? z.ZodType - : z.ZodObject<{ [K in keyof TColumn['_']['data']]: GetZodPrimitiveType }, 'strip'> + ? z.ZodType + : z.ZodObject< + { [K in keyof TColumn['_']['data']]: GetZodPrimitiveType }, + {}, + {} + > : TColumn['_']['dataType'] extends 'json' ? z.ZodType - : GetZodPrimitiveType; + : GetZodPrimitiveType; -type GetZodPrimitiveType = TData extends number ? z.ZodNumber - : TData extends bigint ? z.ZodBigInt - : TData extends boolean ? z.ZodBoolean - : TData extends string ? z.ZodString - : z.ZodTypeAny; +type CanCoerce< + TCoerce extends Partial> | true | undefined, + TTo extends 'bigint' | 'boolean' | 'date' | 'number' | 'string', +> = TCoerce extends true ? true + : TCoerce extends Record ? TCoerce[TTo] extends true ? true + : false + : false; + +type GetZodPrimitiveType< + TData, + TColumnType, + TCoerce extends Partial> | true | undefined, +> = TColumnType extends + | 'MySqlTinyInt' + | 'SingleStoreTinyInt' + | 'PgSmallInt' + | 'PgSmallSerial' + | 'MySqlSmallInt' + | 'MySqlMediumInt' + | 'SingleStoreSmallInt' + | 'SingleStoreMediumInt' + | 'PgInteger' + | 'PgSerial' + | 'MySqlInt' + | 'SingleStoreInt' + | 'PgBigInt53' + | 'PgBigSerial53' + | 'MySqlBigInt53' + | 'MySqlSerial' + | 'SingleStoreBigInt53' + | 'SingleStoreSerial' + | 'SQLiteInteger' + | 'MySqlYear' + | 'SingleStoreYear' ? CanCoerce extends true ? z.coerce.ZodCoercedNumber : z.ZodInt + : TData extends number ? CanCoerce extends true ? z.coerce.ZodCoercedNumber : z.ZodNumber + : TData extends bigint ? CanCoerce extends true ? z.coerce.ZodCoercedBigInt : z.ZodBigInt + : TData extends boolean ? CanCoerce extends true ? z.coerce.ZodCoercedBoolean : z.ZodBoolean + : TData extends string ? CanCoerce extends true ? z.coerce.ZodCoercedString : z.ZodString + : z.ZodType; type HandleSelectColumn< - TSchema extends z.ZodTypeAny, + TSchema extends z.ZodType, TColumn extends Column, > = TColumn['_']['notNull'] extends true ? TSchema : z.ZodNullable; type HandleInsertColumn< - TSchema extends z.ZodTypeAny, + TSchema extends z.ZodType, TColumn extends Column, > = TColumn['_']['notNull'] extends true ? TColumn['_']['hasDefault'] extends true ? z.ZodOptional : TSchema : z.ZodOptional>; type HandleUpdateColumn< - TSchema extends z.ZodTypeAny, + TSchema extends z.ZodType, TColumn extends Column, > = TColumn['_']['notNull'] extends true ? z.ZodOptional : z.ZodOptional>; @@ -56,7 +96,8 @@ type HandleUpdateColumn< export type HandleColumn< TType extends 'select' | 'insert' | 'update', TColumn extends Column, -> = TType extends 'select' ? HandleSelectColumn, TColumn> - : TType extends 'insert' ? HandleInsertColumn, TColumn> - : TType extends 'update' ? HandleUpdateColumn, TColumn> - : GetZodType; + TCoerce extends Partial> | true | undefined, +> = TType extends 'select' ? HandleSelectColumn, TColumn> + : TType extends 'insert' ? HandleInsertColumn, TColumn> + : TType extends 'update' ? HandleUpdateColumn, TColumn> + : GetZodType; diff --git a/drizzle-zod/src/schema.ts b/drizzle-zod/src/schema.ts index 40c7e891ce..43eb1c2469 100644 --- a/drizzle-zod/src/schema.ts +++ b/drizzle-zod/src/schema.ts @@ -1,7 +1,7 @@ import { Column, getTableColumns, getViewSelectedFields, is, isTable, isView, SQL } from 'drizzle-orm'; import type { Table, View } from 'drizzle-orm'; import type { PgEnum } from 'drizzle-orm/pg-core'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { columnToSchema } from './column.ts'; import type { Conditions } from './schema.types.internal.ts'; import type { @@ -20,9 +20,11 @@ function handleColumns( columns: Record, refinements: Record, conditions: Conditions, - factory?: CreateSchemaFactoryOptions, -): z.ZodTypeAny { - const columnSchemas: Record = {}; + factory?: CreateSchemaFactoryOptions< + Partial> | true | undefined + >, +): z.ZodType { + const columnSchemas: Record = {}; for (const [key, selected] of Object.entries(columns)) { if (!is(selected, Column) && !is(selected, SQL) && !is(selected, SQL.Aliased) && typeof selected === 'object') { @@ -61,7 +63,12 @@ function handleColumns( return z.object(columnSchemas) as any; } -function handleEnum(enum_: PgEnum, factory?: CreateSchemaFactoryOptions) { +function handleEnum( + enum_: PgEnum, + factory?: CreateSchemaFactoryOptions< + Partial> | true | undefined + >, +) { const zod: typeof z = factory?.zodInstance ?? z; return zod.enum(enum_.enumValues); } @@ -84,7 +91,7 @@ const updateConditions: Conditions = { nullable: (column) => !column.notNull, }; -export const createSelectSchema: CreateSelectSchema = ( +export const createSelectSchema: CreateSelectSchema = ( entity: Table | View | PgEnum<[string, ...string[]]>, refine?: Record, ) => { @@ -95,7 +102,7 @@ export const createSelectSchema: CreateSelectSchema = ( return handleColumns(columns, refine ?? {}, selectConditions) as any; }; -export const createInsertSchema: CreateInsertSchema = ( +export const createInsertSchema: CreateInsertSchema = ( entity: Table, refine?: Record, ) => { @@ -103,7 +110,7 @@ export const createInsertSchema: CreateInsertSchema = ( return handleColumns(columns, refine ?? {}, insertConditions) as any; }; -export const createUpdateSchema: CreateUpdateSchema = ( +export const createUpdateSchema: CreateUpdateSchema = ( entity: Table, refine?: Record, ) => { @@ -111,8 +118,10 @@ export const createUpdateSchema: CreateUpdateSchema = ( return handleColumns(columns, refine ?? {}, updateConditions) as any; }; -export function createSchemaFactory(options?: CreateSchemaFactoryOptions) { - const createSelectSchema: CreateSelectSchema = ( +export function createSchemaFactory< + TCoerce extends Partial> | true | undefined, +>(options?: CreateSchemaFactoryOptions) { + const createSelectSchema: CreateSelectSchema = ( entity: Table | View | PgEnum<[string, ...string[]]>, refine?: Record, ) => { @@ -123,7 +132,7 @@ export function createSchemaFactory(options?: CreateSchemaFactoryOptions) { return handleColumns(columns, refine ?? {}, selectConditions, options) as any; }; - const createInsertSchema: CreateInsertSchema = ( + const createInsertSchema: CreateInsertSchema = ( entity: Table, refine?: Record, ) => { @@ -131,7 +140,7 @@ export function createSchemaFactory(options?: CreateSchemaFactoryOptions) { return handleColumns(columns, refine ?? {}, insertConditions, options) as any; }; - const createUpdateSchema: CreateUpdateSchema = ( + const createUpdateSchema: CreateUpdateSchema = ( entity: Table, refine?: Record, ) => { diff --git a/drizzle-zod/src/schema.types.internal.ts b/drizzle-zod/src/schema.types.internal.ts index 2669e5130a..3bb855a26e 100644 --- a/drizzle-zod/src/schema.types.internal.ts +++ b/drizzle-zod/src/schema.types.internal.ts @@ -1,5 +1,5 @@ import type { Assume, Column, DrizzleTypeError, SelectedFieldsFlat, Simplify, Table, View } from 'drizzle-orm'; -import type { z } from 'zod'; +import type { z } from 'zod/v4'; import type { GetZodType, HandleColumn } from './column.types.ts'; import type { ColumnIsGeneratedAlwaysAs, GetSelection } from './utils.ts'; @@ -9,30 +9,31 @@ export interface Conditions { nullable: (column: Column) => boolean; } -type BuildRefineField = T extends z.ZodTypeAny ? ((schema: T) => z.ZodTypeAny) | z.ZodTypeAny : never; +type BuildRefineField = T extends z.ZodType ? ((schema: T) => z.ZodType) | z.ZodType : never; export type BuildRefine< TColumns extends Record, + TCoerce extends Partial> | true | undefined, > = { [K in keyof TColumns as TColumns[K] extends Column | SelectedFieldsFlat | Table | View ? K : never]?: - TColumns[K] extends Column ? BuildRefineField> - : BuildRefine>; + TColumns[K] extends Column ? BuildRefineField> + : BuildRefine, TCoerce>; }; type HandleRefinement< TType extends 'select' | 'insert' | 'update', TRefinement, TColumn extends Column, -> = TRefinement extends (schema: any) => z.ZodTypeAny ? (TColumn['_']['notNull'] extends true ? ReturnType - : z.ZodNullable>) extends infer TSchema extends z.ZodTypeAny +> = TRefinement extends (schema: any) => z.ZodType ? (TColumn['_']['notNull'] extends true ? ReturnType + : z.ZodNullable>) extends infer TSchema extends z.ZodType ? TType extends 'update' ? z.ZodOptional : TSchema - : z.ZodTypeAny + : z.ZodType : TRefinement; type IsRefinementDefined< TRefinements extends Record | undefined, TKey extends string | symbol | number, -> = TRefinements extends object ? TRefinements[TKey] extends z.ZodTypeAny | ((schema: any) => any) ? true +> = TRefinements extends object ? TRefinements[TKey] extends z.ZodType | ((schema: any) => any) ? true : false : false; @@ -40,23 +41,26 @@ export type BuildSchema< TType extends 'select' | 'insert' | 'update', TColumns extends Record, TRefinements extends Record | undefined, + TCoerce extends Partial> | true | undefined, > = z.ZodObject< Simplify< { [K in keyof TColumns as ColumnIsGeneratedAlwaysAs extends true ? never : K]: TColumns[K] extends infer TColumn extends Column ? IsRefinementDefined extends true - ? Assume, z.ZodTypeAny> - : HandleColumn + ? Assume, z.ZodType> + : HandleColumn : TColumns[K] extends infer TObject extends SelectedFieldsFlat | Table | View ? BuildSchema< TType, GetSelection, - TRefinements extends object ? TRefinements[K & keyof TRefinements] : undefined + TRefinements extends object ? TRefinements[K & keyof TRefinements] : undefined, + TCoerce > : z.ZodAny; } >, - 'strip' + {}, + {} >; export type NoUnknownKeys< @@ -64,7 +68,7 @@ export type NoUnknownKeys< TCompare extends Record, > = { [K in keyof TRefinement]: K extends keyof TCompare - ? TRefinement[K] extends Record ? NoUnknownKeys + ? TRefinement[K] extends Record ? NoUnknownKeys : TRefinement[K] : DrizzleTypeError<`Found unknown key in refinement: "${K & string}"`>; }; diff --git a/drizzle-zod/src/schema.types.ts b/drizzle-zod/src/schema.types.ts index 9ec093593b..da7fede874 100644 --- a/drizzle-zod/src/schema.types.ts +++ b/drizzle-zod/src/schema.types.ts @@ -1,53 +1,61 @@ import type { Table, View } from 'drizzle-orm'; import type { PgEnum } from 'drizzle-orm/pg-core'; -import type { z } from 'zod'; +import type { z } from 'zod/v4'; import type { BuildRefine, BuildSchema, NoUnknownKeys } from './schema.types.internal.ts'; -export interface CreateSelectSchema { - (table: TTable): BuildSchema<'select', TTable['_']['columns'], undefined>; +export interface CreateSelectSchema< + TCoerce extends Partial> | true | undefined, +> { + (table: TTable): BuildSchema<'select', TTable['_']['columns'], undefined, TCoerce>; < TTable extends Table, - TRefine extends BuildRefine, + TRefine extends BuildRefine, >( table: TTable, refine?: NoUnknownKeys, - ): BuildSchema<'select', TTable['_']['columns'], TRefine>; + ): BuildSchema<'select', TTable['_']['columns'], TRefine, TCoerce>; - (view: TView): BuildSchema<'select', TView['_']['selectedFields'], undefined>; + (view: TView): BuildSchema<'select', TView['_']['selectedFields'], undefined, TCoerce>; < TView extends View, - TRefine extends BuildRefine, + TRefine extends BuildRefine, >( view: TView, refine: NoUnknownKeys, - ): BuildSchema<'select', TView['_']['selectedFields'], TRefine>; + ): BuildSchema<'select', TView['_']['selectedFields'], TRefine, TCoerce>; - >(enum_: TEnum): z.ZodEnum; + >(enum_: TEnum): z.ZodEnum<{ [K in TEnum['enumValues'][number]]: K }>; } -export interface CreateInsertSchema { - (table: TTable): BuildSchema<'insert', TTable['_']['columns'], undefined>; +export interface CreateInsertSchema< + TCoerce extends Partial> | true | undefined, +> { + (table: TTable): BuildSchema<'insert', TTable['_']['columns'], undefined, TCoerce>; < TTable extends Table, - TRefine extends BuildRefine>, + TRefine extends BuildRefine, TCoerce>, >( table: TTable, refine?: NoUnknownKeys, - ): BuildSchema<'insert', TTable['_']['columns'], TRefine>; + ): BuildSchema<'insert', TTable['_']['columns'], TRefine, TCoerce>; } -export interface CreateUpdateSchema { - (table: TTable): BuildSchema<'update', TTable['_']['columns'], undefined>; +export interface CreateUpdateSchema< + TCoerce extends Partial> | true | undefined, +> { + (table: TTable): BuildSchema<'update', TTable['_']['columns'], undefined, TCoerce>; < TTable extends Table, - TRefine extends BuildRefine>, + TRefine extends BuildRefine, TCoerce>, >( table: TTable, refine?: TRefine, - ): BuildSchema<'update', TTable['_']['columns'], TRefine>; + ): BuildSchema<'update', TTable['_']['columns'], TRefine, TCoerce>; } -export interface CreateSchemaFactoryOptions { +export interface CreateSchemaFactoryOptions< + TCoerce extends Partial> | true | undefined, +> { zodInstance?: any; - coerce?: Partial> | true; + coerce?: TCoerce; } diff --git a/drizzle-zod/src/utils.ts b/drizzle-zod/src/utils.ts index 553b0a21a5..1c991ad523 100644 --- a/drizzle-zod/src/utils.ts +++ b/drizzle-zod/src/utils.ts @@ -1,6 +1,6 @@ import type { Column, SelectedFieldsFlat, Table, View } from 'drizzle-orm'; import type { PgEnum } from 'drizzle-orm/pg-core'; -import type { z } from 'zod'; +import type { z } from 'zod/v4'; import type { literalSchema } from './column.ts'; export function isColumnType(column: Column, columnTypes: string[]): column is T { diff --git a/drizzle-zod/tests/mysql.test.ts b/drizzle-zod/tests/mysql.test.ts index e0e5986602..6f9a8bf1f7 100644 --- a/drizzle-zod/tests/mysql.test.ts +++ b/drizzle-zod/tests/mysql.test.ts @@ -2,14 +2,14 @@ import { type Equal, sql } from 'drizzle-orm'; import { customType, int, json, mysqlSchema, mysqlTable, mysqlView, serial, text } from 'drizzle-orm/mysql-core'; import type { TopLevelCondition } from 'json-rules-engine'; import { test } from 'vitest'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { jsonSchema } from '~/column.ts'; import { CONSTANTS } from '~/constants.ts'; import { createInsertSchema, createSchemaFactory, createSelectSchema, createUpdateSchema } from '../src'; import { Expect, expectSchemaShape } from './utils.ts'; -const intSchema = z.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(); -const serialNumberModeSchema = z.number().min(0).max(Number.MAX_SAFE_INTEGER).int(); +const intSchema = z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX); +const serialNumberModeSchema = z.int().gte(0).lte(Number.MAX_SAFE_INTEGER); const textSchema = z.string().max(CONSTANTS.INT16_UNSIGNED_MAX); test('table - select', (t) => { @@ -189,12 +189,12 @@ test('refine table - select', (t) => { }); const result = createSelectSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: intSchema.nullable(), - c2: intSchema.max(1000), + c2: intSchema.lte(1000), c3: z.string().transform(Number), }); @@ -213,13 +213,13 @@ test('refine table - select with custom data type', (t) => { const customTextSchema = z.string().min(1).max(100); const result = createSelectSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), c4: customTextSchema, }); const expected = z.object({ c1: intSchema.nullable(), - c2: intSchema.max(1000), + c2: intSchema.lte(1000), c3: z.string().transform(Number), c4: customTextSchema, }); @@ -237,12 +237,12 @@ test('refine table - insert', (t) => { }); const result = createInsertSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: intSchema.nullable().optional(), - c2: intSchema.max(1000), + c2: intSchema.lte(1000), c3: z.string().transform(Number), }); expectSchemaShape(t, expected).from(result); @@ -258,12 +258,12 @@ test('refine table - update', (t) => { }); const result = createUpdateSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: intSchema.nullable().optional(), - c2: intSchema.max(1000).optional(), + c2: intSchema.lte(1000).optional(), c3: z.string().transform(Number), }); expectSchemaShape(t, expected).from(result); @@ -294,29 +294,29 @@ test('refine view - select', (t) => { ); const result = createSelectSchema(view, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), nested: { - c5: (schema) => schema.max(1000), + c5: (schema) => schema.lte(1000), c6: z.string().transform(Number), }, table: { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }, }); const expected = z.object({ c1: intSchema.nullable(), - c2: intSchema.max(1000).nullable(), + c2: intSchema.lte(1000).nullable(), c3: z.string().transform(Number), nested: z.object({ c4: intSchema.nullable(), - c5: intSchema.max(1000).nullable(), + c5: intSchema.lte(1000).nullable(), c6: z.string().transform(Number), }), table: z.object({ c1: intSchema.nullable(), - c2: intSchema.max(1000).nullable(), + c2: intSchema.lte(1000).nullable(), c3: z.string().transform(Number), c4: intSchema.nullable(), c5: intSchema.nullable(), @@ -405,10 +405,10 @@ test('all data types', (t) => { const result = createSelectSchema(table); const expected = z.object({ - bigint1: z.number().min(Number.MIN_SAFE_INTEGER).max(Number.MAX_SAFE_INTEGER).int(), - bigint2: z.bigint().min(CONSTANTS.INT64_MIN).max(CONSTANTS.INT64_MAX), - bigint3: z.number().min(0).max(Number.MAX_SAFE_INTEGER).int(), - bigint4: z.bigint().min(0n).max(CONSTANTS.INT64_UNSIGNED_MAX), + bigint1: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER), + bigint2: z.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX), + bigint3: z.int().gte(0).lte(Number.MAX_SAFE_INTEGER), + bigint4: z.bigint().gte(0n).lte(CONSTANTS.INT64_UNSIGNED_MAX), binary: z.string(), boolean: z.boolean(), char1: z.string().length(10), @@ -419,31 +419,31 @@ test('all data types', (t) => { datetime2: z.string(), decimal1: z.string(), decimal2: z.string(), - double1: z.number().min(CONSTANTS.INT48_MIN).max(CONSTANTS.INT48_MAX), - double2: z.number().min(0).max(CONSTANTS.INT48_UNSIGNED_MAX), - float1: z.number().min(CONSTANTS.INT24_MIN).max(CONSTANTS.INT24_MAX), - float2: z.number().min(0).max(CONSTANTS.INT24_UNSIGNED_MAX), - int1: z.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(), - int2: z.number().min(0).max(CONSTANTS.INT32_UNSIGNED_MAX).int(), + double1: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX), + double2: z.number().gte(0).lte(CONSTANTS.INT48_UNSIGNED_MAX), + float1: z.number().gte(CONSTANTS.INT24_MIN).lte(CONSTANTS.INT24_MAX), + float2: z.number().gte(0).lte(CONSTANTS.INT24_UNSIGNED_MAX), + int1: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX), + int2: z.int().gte(0).lte(CONSTANTS.INT32_UNSIGNED_MAX), json: jsonSchema, - mediumint1: z.number().min(CONSTANTS.INT24_MIN).max(CONSTANTS.INT24_MAX).int(), - mediumint2: z.number().min(0).max(CONSTANTS.INT24_UNSIGNED_MAX).int(), + mediumint1: z.int().gte(CONSTANTS.INT24_MIN).lte(CONSTANTS.INT24_MAX), + mediumint2: z.int().gte(0).lte(CONSTANTS.INT24_UNSIGNED_MAX), enum: z.enum(['a', 'b', 'c']), - real: z.number().min(CONSTANTS.INT48_MIN).max(CONSTANTS.INT48_MAX), - serial: z.number().min(0).max(Number.MAX_SAFE_INTEGER).int(), - smallint1: z.number().min(CONSTANTS.INT16_MIN).max(CONSTANTS.INT16_MAX).int(), - smallint2: z.number().min(0).max(CONSTANTS.INT16_UNSIGNED_MAX).int(), + real: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX), + serial: z.int().gte(0).lte(Number.MAX_SAFE_INTEGER), + smallint1: z.int().gte(CONSTANTS.INT16_MIN).lte(CONSTANTS.INT16_MAX), + smallint2: z.int().gte(0).lte(CONSTANTS.INT16_UNSIGNED_MAX), text1: z.string().max(CONSTANTS.INT16_UNSIGNED_MAX), text2: z.enum(['a', 'b', 'c']), time: z.string(), timestamp1: z.date(), timestamp2: z.string(), - tinyint1: z.number().min(CONSTANTS.INT8_MIN).max(CONSTANTS.INT8_MAX).int(), - tinyint2: z.number().min(0).max(CONSTANTS.INT8_UNSIGNED_MAX).int(), + tinyint1: z.int().gte(CONSTANTS.INT8_MIN).lte(CONSTANTS.INT8_MAX), + tinyint2: z.int().gte(0).lte(CONSTANTS.INT8_UNSIGNED_MAX), varchar1: z.string().max(10), varchar2: z.enum(['a', 'b', 'c']), varbinary: z.string(), - year: z.number().min(1901).max(2155).int(), + year: z.int().gte(1901).lte(2155), longtext1: z.string().max(CONSTANTS.INT32_UNSIGNED_MAX), longtext2: z.enum(['a', 'b', 'c']), mediumtext1: z.string().max(CONSTANTS.INT24_UNSIGNED_MAX), @@ -475,10 +475,10 @@ test('type coercion - all', (t) => { }); const result = createSelectSchema(table); const expected = z.object({ - bigint: z.coerce.bigint().min(CONSTANTS.INT64_MIN).max(CONSTANTS.INT64_MAX), + bigint: z.coerce.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX), boolean: z.coerce.boolean(), timestamp: z.coerce.date(), - int: z.coerce.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(), + int: z.coerce.number().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX).int(), text: z.coerce.string().max(CONSTANTS.INT16_UNSIGNED_MAX), }); expectSchemaShape(t, expected).from(result); @@ -502,7 +502,7 @@ test('type coercion - mixed', (t) => { const result = createSelectSchema(table); const expected = z.object({ timestamp: z.coerce.date(), - int: z.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(), + int: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX), }); expectSchemaShape(t, expected).from(result); Expect>(); diff --git a/drizzle-zod/tests/pg.test.ts b/drizzle-zod/tests/pg.test.ts index 6cefe48f0d..66549f0283 100644 --- a/drizzle-zod/tests/pg.test.ts +++ b/drizzle-zod/tests/pg.test.ts @@ -14,13 +14,13 @@ import { } from 'drizzle-orm/pg-core'; import type { TopLevelCondition } from 'json-rules-engine'; import { test } from 'vitest'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { jsonSchema } from '~/column.ts'; import { CONSTANTS } from '~/constants.ts'; import { createInsertSchema, createSchemaFactory, createSelectSchema, createUpdateSchema } from '../src'; import { Expect, expectEnumValues, expectSchemaShape } from './utils.ts'; -const integerSchema = z.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(); +const integerSchema = z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX); const textSchema = z.string(); test('table - select', (t) => { @@ -234,12 +234,12 @@ test('refine table - select', (t) => { }); const result = createSelectSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: integerSchema.nullable(), - c2: integerSchema.max(1000), + c2: integerSchema.lte(1000), c3: z.string().transform(Number), }); expectSchemaShape(t, expected).from(result); @@ -257,13 +257,13 @@ test('refine table - select with custom data type', (t) => { const customTextSchema = z.string().min(1).max(100); const result = createSelectSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), c4: customTextSchema, }); const expected = z.object({ c1: integerSchema.nullable(), - c2: integerSchema.max(1000), + c2: integerSchema.lte(1000), c3: z.string().transform(Number), c4: customTextSchema, }); @@ -281,12 +281,12 @@ test('refine table - insert', (t) => { }); const result = createInsertSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: integerSchema.nullable().optional(), - c2: integerSchema.max(1000), + c2: integerSchema.lte(1000), c3: z.string().transform(Number), }); expectSchemaShape(t, expected).from(result); @@ -302,12 +302,12 @@ test('refine table - update', (t) => { }); const result = createUpdateSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: integerSchema.nullable().optional(), - c2: integerSchema.max(1000).optional(), + c2: integerSchema.lte(1000).optional(), c3: z.string().transform(Number), }); expectSchemaShape(t, expected).from(result); @@ -338,29 +338,29 @@ test('refine view - select', (t) => { ); const result = createSelectSchema(view, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), nested: { - c5: (schema) => schema.max(1000), + c5: (schema) => schema.lte(1000), c6: z.string().transform(Number), }, table: { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }, }); const expected = z.object({ c1: integerSchema.nullable(), - c2: integerSchema.max(1000).nullable(), + c2: integerSchema.lte(1000).nullable(), c3: z.string().transform(Number), nested: z.object({ c4: integerSchema.nullable(), - c5: integerSchema.max(1000).nullable(), + c5: integerSchema.lte(1000).nullable(), c6: z.string().transform(Number), }), table: z.object({ c1: integerSchema.nullable(), - c2: integerSchema.max(1000).nullable(), + c2: integerSchema.lte(1000).nullable(), c3: z.string().transform(Number), c4: integerSchema.nullable(), c5: integerSchema.nullable(), @@ -453,10 +453,10 @@ test('all data types', (t) => { const result = createSelectSchema(table); const expected = z.object({ - bigint1: z.number().min(Number.MIN_SAFE_INTEGER).max(Number.MAX_SAFE_INTEGER).int(), - bigint2: z.bigint().min(CONSTANTS.INT64_MIN).max(CONSTANTS.INT64_MAX), - bigserial1: z.number().min(Number.MIN_SAFE_INTEGER).max(Number.MAX_SAFE_INTEGER).int(), - bigserial2: z.bigint().min(CONSTANTS.INT64_MIN).max(CONSTANTS.INT64_MAX), + bigint1: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER), + bigint2: z.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX), + bigserial1: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER), + bigserial2: z.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX), bit: z.string().regex(/^[01]+$/).max(5), boolean: z.boolean(), date1: z.date(), @@ -464,12 +464,12 @@ test('all data types', (t) => { char1: z.string().length(10), char2: z.enum(['a', 'b', 'c']), cidr: z.string(), - doublePrecision: z.number().min(CONSTANTS.INT48_MIN).max(CONSTANTS.INT48_MAX), + doublePrecision: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX), geometry1: z.tuple([z.number(), z.number()]), geometry2: z.object({ x: z.number(), y: z.number() }), halfvec: z.array(z.number()).length(3), inet: z.string(), - integer: z.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(), + integer: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX), interval: z.string(), json: jsonSchema, jsonb: jsonSchema, @@ -480,17 +480,17 @@ test('all data types', (t) => { numeric: z.string(), point1: z.object({ x: z.number(), y: z.number() }), point2: z.tuple([z.number(), z.number()]), - real: z.number().min(CONSTANTS.INT24_MIN).max(CONSTANTS.INT24_MAX), - serial: z.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(), - smallint: z.number().min(CONSTANTS.INT16_MIN).max(CONSTANTS.INT16_MAX).int(), - smallserial: z.number().min(CONSTANTS.INT16_MIN).max(CONSTANTS.INT16_MAX).int(), + real: z.number().gte(CONSTANTS.INT24_MIN).lte(CONSTANTS.INT24_MAX), + serial: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX), + smallint: z.int().gte(CONSTANTS.INT16_MIN).lte(CONSTANTS.INT16_MAX), + smallserial: z.int().gte(CONSTANTS.INT16_MIN).lte(CONSTANTS.INT16_MAX), text1: z.string(), text2: z.enum(['a', 'b', 'c']), sparsevec: z.string(), time: z.string(), timestamp1: z.date(), timestamp2: z.string(), - uuid: z.string().uuid(), + uuid: z.uuid(), varchar1: z.string().max(10), varchar2: z.enum(['a', 'b', 'c']), vector: z.array(z.number()).length(3), @@ -523,10 +523,10 @@ test('type coercion - all', (t) => { }); const result = createSelectSchema(table); const expected = z.object({ - bigint: z.coerce.bigint().min(CONSTANTS.INT64_MIN).max(CONSTANTS.INT64_MAX), + bigint: z.coerce.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX), boolean: z.coerce.boolean(), timestamp: z.coerce.date(), - integer: z.coerce.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(), + integer: z.coerce.number().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX).int(), text: z.coerce.string(), }); expectSchemaShape(t, expected).from(result); @@ -550,7 +550,7 @@ test('type coercion - mixed', (t) => { const result = createSelectSchema(table); const expected = z.object({ timestamp: z.coerce.date(), - integer: z.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(), + integer: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX), }); expectSchemaShape(t, expected).from(result); Expect>(); diff --git a/drizzle-zod/tests/singlestore.test.ts b/drizzle-zod/tests/singlestore.test.ts index a62b98fdf5..6e642d8b26 100644 --- a/drizzle-zod/tests/singlestore.test.ts +++ b/drizzle-zod/tests/singlestore.test.ts @@ -2,14 +2,14 @@ import type { Equal } from 'drizzle-orm'; import { customType, int, json, serial, singlestoreSchema, singlestoreTable, text } from 'drizzle-orm/singlestore-core'; import type { TopLevelCondition } from 'json-rules-engine'; import { test } from 'vitest'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { jsonSchema } from '~/column.ts'; import { CONSTANTS } from '~/constants.ts'; import { createInsertSchema, createSchemaFactory, createSelectSchema, createUpdateSchema } from '../src'; import { Expect, expectSchemaShape } from './utils.ts'; -const intSchema = z.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(); -const serialNumberModeSchema = z.number().min(0).max(Number.MAX_SAFE_INTEGER).int(); +const intSchema = z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX); +const serialNumberModeSchema = z.int().gte(0).lte(Number.MAX_SAFE_INTEGER); const textSchema = z.string().max(CONSTANTS.INT16_UNSIGNED_MAX); test('table - select', (t) => { @@ -191,12 +191,12 @@ test('refine table - select', (t) => { }); const result = createSelectSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: intSchema.nullable(), - c2: intSchema.max(1000), + c2: intSchema.lte(1000), c3: z.string().transform(Number), }); @@ -215,13 +215,13 @@ test('refine table - select with custom data type', (t) => { const customTextSchema = z.string().min(1).max(100); const result = createSelectSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), c4: customTextSchema, }); const expected = z.object({ c1: intSchema.nullable(), - c2: intSchema.max(1000), + c2: intSchema.lte(1000), c3: z.string().transform(Number), c4: customTextSchema, }); @@ -239,12 +239,12 @@ test('refine table - insert', (t) => { }); const result = createInsertSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: intSchema.nullable().optional(), - c2: intSchema.max(1000), + c2: intSchema.lte(1000), c3: z.string().transform(Number), }); expectSchemaShape(t, expected).from(result); @@ -260,12 +260,12 @@ test('refine table - update', (t) => { }); const result = createUpdateSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: intSchema.nullable().optional(), - c2: intSchema.max(1000).optional(), + c2: intSchema.lte(1000).optional(), c3: z.string().transform(Number), }); expectSchemaShape(t, expected).from(result); @@ -296,29 +296,29 @@ test('refine table - update', (t) => { // ); // const result = createSelectSchema(view, { -// c2: (schema) => schema.max(1000), +// c2: (schema) => schema.lte(1000), // c3: z.string().transform(Number), // nested: { -// c5: (schema) => schema.max(1000), +// c5: (schema) => schema.lte(1000), // c6: z.string().transform(Number), // }, // table: { -// c2: (schema) => schema.max(1000), +// c2: (schema) => schema.lte(1000), // c3: z.string().transform(Number), // }, // }); // const expected = z.object({ // c1: intSchema.nullable(), -// c2: intSchema.max(1000).nullable(), +// c2: intSchema.lte(1000).nullable(), // c3: z.string().transform(Number), // nested: z.object({ // c4: intSchema.nullable(), -// c5: intSchema.max(1000).nullable(), +// c5: intSchema.lte(1000).nullable(), // c6: z.string().transform(Number), // }), // table: z.object({ // c1: intSchema.nullable(), -// c2: intSchema.max(1000).nullable(), +// c2: intSchema.lte(1000).nullable(), // c3: z.string().transform(Number), // c4: intSchema.nullable(), // c5: intSchema.nullable(), @@ -407,10 +407,10 @@ test('all data types', (t) => { const result = createSelectSchema(table); const expected = z.object({ - bigint1: z.number().min(Number.MIN_SAFE_INTEGER).max(Number.MAX_SAFE_INTEGER).int(), - bigint2: z.bigint().min(CONSTANTS.INT64_MIN).max(CONSTANTS.INT64_MAX), - bigint3: z.number().min(0).max(Number.MAX_SAFE_INTEGER).int(), - bigint4: z.bigint().min(0n).max(CONSTANTS.INT64_UNSIGNED_MAX), + bigint1: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER), + bigint2: z.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX), + bigint3: z.int().gte(0).lte(Number.MAX_SAFE_INTEGER), + bigint4: z.bigint().gte(0n).lte(CONSTANTS.INT64_UNSIGNED_MAX), binary: z.string(), boolean: z.boolean(), char1: z.string().length(10), @@ -421,31 +421,31 @@ test('all data types', (t) => { datetime2: z.string(), decimal1: z.string(), decimal2: z.string(), - double1: z.number().min(CONSTANTS.INT48_MIN).max(CONSTANTS.INT48_MAX), - double2: z.number().min(0).max(CONSTANTS.INT48_UNSIGNED_MAX), - float1: z.number().min(CONSTANTS.INT24_MIN).max(CONSTANTS.INT24_MAX), - float2: z.number().min(0).max(CONSTANTS.INT24_UNSIGNED_MAX), - int1: z.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(), - int2: z.number().min(0).max(CONSTANTS.INT32_UNSIGNED_MAX).int(), + double1: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX), + double2: z.number().gte(0).lte(CONSTANTS.INT48_UNSIGNED_MAX), + float1: z.number().gte(CONSTANTS.INT24_MIN).lte(CONSTANTS.INT24_MAX), + float2: z.number().gte(0).lte(CONSTANTS.INT24_UNSIGNED_MAX), + int1: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX), + int2: z.int().gte(0).lte(CONSTANTS.INT32_UNSIGNED_MAX), json: jsonSchema, - mediumint1: z.number().min(CONSTANTS.INT24_MIN).max(CONSTANTS.INT24_MAX).int(), - mediumint2: z.number().min(0).max(CONSTANTS.INT24_UNSIGNED_MAX).int(), + mediumint1: z.int().gte(CONSTANTS.INT24_MIN).lte(CONSTANTS.INT24_MAX), + mediumint2: z.int().gte(0).lte(CONSTANTS.INT24_UNSIGNED_MAX), enum: z.enum(['a', 'b', 'c']), - real: z.number().min(CONSTANTS.INT48_MIN).max(CONSTANTS.INT48_MAX), - serial: z.number().min(0).max(Number.MAX_SAFE_INTEGER).int(), - smallint1: z.number().min(CONSTANTS.INT16_MIN).max(CONSTANTS.INT16_MAX).int(), - smallint2: z.number().min(0).max(CONSTANTS.INT16_UNSIGNED_MAX).int(), + real: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX), + serial: z.int().gte(0).lte(Number.MAX_SAFE_INTEGER), + smallint1: z.int().gte(CONSTANTS.INT16_MIN).lte(CONSTANTS.INT16_MAX), + smallint2: z.int().gte(0).lte(CONSTANTS.INT16_UNSIGNED_MAX), text1: z.string().max(CONSTANTS.INT16_UNSIGNED_MAX), text2: z.enum(['a', 'b', 'c']), time: z.string(), timestamp1: z.date(), timestamp2: z.string(), - tinyint1: z.number().min(CONSTANTS.INT8_MIN).max(CONSTANTS.INT8_MAX).int(), - tinyint2: z.number().min(0).max(CONSTANTS.INT8_UNSIGNED_MAX).int(), + tinyint1: z.int().gte(CONSTANTS.INT8_MIN).lte(CONSTANTS.INT8_MAX), + tinyint2: z.int().gte(0).lte(CONSTANTS.INT8_UNSIGNED_MAX), varchar1: z.string().max(10), varchar2: z.enum(['a', 'b', 'c']), varbinary: z.string(), - year: z.number().min(1901).max(2155).int(), + year: z.int().gte(1901).lte(2155), longtext1: z.string().max(CONSTANTS.INT32_UNSIGNED_MAX), longtext2: z.enum(['a', 'b', 'c']), mediumtext1: z.string().max(CONSTANTS.INT24_UNSIGNED_MAX), @@ -477,10 +477,10 @@ test('type coercion - all', (t) => { }); const result = createSelectSchema(table); const expected = z.object({ - bigint: z.coerce.bigint().min(CONSTANTS.INT64_MIN).max(CONSTANTS.INT64_MAX), + bigint: z.coerce.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX), boolean: z.coerce.boolean(), timestamp: z.coerce.date(), - int: z.coerce.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(), + int: z.coerce.number().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX).int(), text: z.coerce.string().max(CONSTANTS.INT16_UNSIGNED_MAX), }); expectSchemaShape(t, expected).from(result); @@ -504,7 +504,7 @@ test('type coercion - mixed', (t) => { const result = createSelectSchema(table); const expected = z.object({ timestamp: z.coerce.date(), - int: z.number().min(CONSTANTS.INT32_MIN).max(CONSTANTS.INT32_MAX).int(), + int: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX), }); expectSchemaShape(t, expected).from(result); Expect>(); diff --git a/drizzle-zod/tests/sqlite.test.ts b/drizzle-zod/tests/sqlite.test.ts index 838d521854..c7581f4c4e 100644 --- a/drizzle-zod/tests/sqlite.test.ts +++ b/drizzle-zod/tests/sqlite.test.ts @@ -2,13 +2,13 @@ import { type Equal, sql } from 'drizzle-orm'; import { blob, customType, int, sqliteTable, sqliteView, text } from 'drizzle-orm/sqlite-core'; import type { TopLevelCondition } from 'json-rules-engine'; import { test } from 'vitest'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { bufferSchema, jsonSchema } from '~/column.ts'; import { CONSTANTS } from '~/constants.ts'; import { createInsertSchema, createSchemaFactory, createSelectSchema, createUpdateSchema } from '../src'; import { Expect, expectSchemaShape } from './utils.ts'; -const intSchema = z.number().min(Number.MIN_SAFE_INTEGER).max(Number.MAX_SAFE_INTEGER).int(); +const intSchema = z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER); const textSchema = z.string(); test('table - select', (t) => { @@ -171,12 +171,12 @@ test('refine table - select', (t) => { }); const result = createSelectSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: intSchema.nullable(), - c2: intSchema.max(1000), + c2: intSchema.lte(1000), c3: z.string().transform(Number), }); expectSchemaShape(t, expected).from(result); @@ -194,13 +194,13 @@ test('refine table - select with custom data type', (t) => { const customTextSchema = z.string().min(1).max(100); const result = createSelectSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), c4: customTextSchema, }); const expected = z.object({ c1: intSchema.nullable(), - c2: intSchema.max(1000), + c2: intSchema.lte(1000), c3: z.string().transform(Number), c4: customTextSchema, }); @@ -218,12 +218,12 @@ test('refine table - insert', (t) => { }); const result = createInsertSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: intSchema.nullable().optional(), - c2: intSchema.max(1000), + c2: intSchema.lte(1000), c3: z.string().transform(Number), }); expectSchemaShape(t, expected).from(result); @@ -239,12 +239,12 @@ test('refine table - update', (t) => { }); const result = createUpdateSchema(table, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }); const expected = z.object({ c1: intSchema.nullable().optional(), - c2: intSchema.max(1000).optional(), + c2: intSchema.lte(1000).optional(), c3: z.string().transform(Number), }); expectSchemaShape(t, expected).from(result); @@ -275,29 +275,29 @@ test('refine view - select', (t) => { ); const result = createSelectSchema(view, { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), nested: { - c5: (schema) => schema.max(1000), + c5: (schema) => schema.lte(1000), c6: z.string().transform(Number), }, table: { - c2: (schema) => schema.max(1000), + c2: (schema) => schema.lte(1000), c3: z.string().transform(Number), }, }); const expected = z.object({ c1: intSchema.nullable(), - c2: intSchema.max(1000).nullable(), + c2: intSchema.lte(1000).nullable(), c3: z.string().transform(Number), nested: z.object({ c4: intSchema.nullable(), - c5: intSchema.max(1000).nullable(), + c5: intSchema.lte(1000).nullable(), c6: z.string().transform(Number), }), table: z.object({ c1: intSchema.nullable(), - c2: intSchema.max(1000).nullable(), + c2: intSchema.lte(1000).nullable(), c3: z.string().transform(Number), c4: intSchema.nullable(), c5: intSchema.nullable(), @@ -334,14 +334,14 @@ test('all data types', (t) => { const result = createSelectSchema(table); const expected = z.object({ blob1: bufferSchema, - blob2: z.bigint().min(CONSTANTS.INT64_MIN).max(CONSTANTS.INT64_MAX), + blob2: z.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX), blob3: jsonSchema, - integer1: z.number().min(Number.MIN_SAFE_INTEGER).max(Number.MAX_SAFE_INTEGER).int(), + integer1: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER), integer2: z.boolean(), integer3: z.date(), integer4: z.date(), numeric: z.string(), - real: z.number().min(CONSTANTS.INT48_MIN).max(CONSTANTS.INT48_MAX), + real: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX), text1: z.string(), text2: z.string().max(10), text3: z.enum(['a', 'b', 'c']), @@ -369,10 +369,10 @@ test('type coercion - all', (t) => { }); const result = createSelectSchema(table); const expected = z.object({ - blob: z.coerce.bigint().min(CONSTANTS.INT64_MIN).max(CONSTANTS.INT64_MAX), + blob: z.coerce.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX), integer1: z.coerce.boolean(), integer2: z.coerce.date(), - integer3: z.coerce.number().min(Number.MIN_SAFE_INTEGER).max(Number.MAX_SAFE_INTEGER).int(), + integer3: z.coerce.number().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER).int(), text: z.coerce.string(), }); expectSchemaShape(t, expected).from(result); @@ -395,7 +395,7 @@ test('type coercion - mixed', (t) => { const result = createSelectSchema(table); const expected = z.object({ integer1: z.coerce.date(), - integer2: z.number().min(Number.MIN_SAFE_INTEGER).max(Number.MAX_SAFE_INTEGER).int(), + integer2: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER), }); expectSchemaShape(t, expected).from(result); Expect>(); diff --git a/drizzle-zod/tests/utils.ts b/drizzle-zod/tests/utils.ts index da473b1168..7f947c50bf 100644 --- a/drizzle-zod/tests/utils.ts +++ b/drizzle-zod/tests/utils.ts @@ -1,29 +1,21 @@ import { expect, type TaskContext } from 'vitest'; -import type { z } from 'zod'; +import type { z } from 'zod/v4'; export function expectSchemaShape>(t: TaskContext, expected: T) { return { from(actual: T) { expect(Object.keys(actual.shape)).toStrictEqual(Object.keys(expected.shape)); - - for (const key of Object.keys(actual.shape)) { - expect(actual.shape[key]!._def.typeName).toStrictEqual(expected.shape[key]?._def.typeName); - expect(actual.shape[key]!._def?.checks).toEqual(expected.shape[key]?._def?.checks); - expect(actual.shape[key]!._def?.coerce).toEqual(expected.shape[key]?._def?.coerce); - if (actual.shape[key]?._def.typeName === 'ZodOptional') { - expect(actual.shape[key]!._def.innerType._def.typeName).toStrictEqual( - actual.shape[key]!._def.innerType._def.typeName, - ); - } + for (const key in Object.keys(actual.shape)) { + expect(actual.shape[key]?._zod.def).toStrictEqual(expected.shape[key]?._zod.def); } }, }; } -export function expectEnumValues>(t: TaskContext, expected: T) { +export function expectEnumValues>(t: TaskContext, expected: T) { return { from(actual: T) { - expect(actual._def.values).toStrictEqual(expected._def.values); + expect(actual.def).toStrictEqual(expected.def); }, }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c342eb2a34..8992a4ceb3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -653,8 +653,8 @@ importers: specifier: ^3.1.3 version: 3.1.3(@types/node@18.15.10)(lightningcss@1.25.1)(terser@5.31.0) zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: 3.25.0-beta.20250516T044623 + version: 3.25.0-beta.20250516T044623 zx: specifier: ^7.2.2 version: 7.2.2 @@ -7691,10 +7691,12 @@ packages: libsql@0.3.19: resolution: {integrity: sha512-Aj5cQ5uk/6fHdmeW0TiXK42FqUlwx7ytmMLPSaUQPin5HKKKuUPD62MAbN4OEweGBBI7q1BekoEN4gPUEL6MZA==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] libsql@0.4.1: resolution: {integrity: sha512-qZlR9Yu1zMBeLChzkE/cKfoKV3Esp9cn9Vx5Zirn4AVhDWPcjYhKwbtJcMuHehgk3mH+fJr9qW+3vesBWbQpBg==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lighthouse-logger@1.4.2: @@ -10726,12 +10728,15 @@ packages: zod@3.23.7: resolution: {integrity: sha512-NBeIoqbtOiUMomACV/y+V3Qfs9+Okr18vR5c/5pHClPpufWOrsx8TENboDPe265lFdfewX2yBtNTLPvnmCxwog==} - zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} - zod@3.24.2: resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.24.3: + resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} + + zod@3.25.0-beta.20250516T044623: + resolution: {integrity: sha512-NjcetsH2m7GAPQV0hbYAXefUm8mqJf3W7dPBk41EHQrUcwmh5MCvOrIXXkl62CIKAFQyIgd4mukDEQVzBop9qw==} + zx@7.2.2: resolution: {integrity: sha512-50Gjicd6ijTt7Zcz5fNX+rHrmE0uVqC+X6lYKhf2Cu8wIxDpNIzXwTmzchNdW+JY3LFsRcU43B1lHE4HBMmKgQ==} engines: {node: '>= 16.0.0'} @@ -10866,9 +10871,9 @@ snapshots: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.569.0 - '@aws-sdk/client-sts': 3.569.0 + '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) '@aws-sdk/core': 3.567.0 - '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0) + '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/middleware-host-header': 3.567.0 '@aws-sdk/middleware-logger': 3.568.0 '@aws-sdk/middleware-recursion-detection': 3.567.0 @@ -10911,7 +10916,7 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/client-sso-oidc': 3.583.0 '@aws-sdk/client-sts': 3.583.0 '@aws-sdk/core': 3.582.0 '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0) @@ -10957,9 +10962,9 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.569.0 + '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) '@aws-sdk/core': 3.567.0 - '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0) + '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/middleware-host-header': 3.567.0 '@aws-sdk/middleware-logger': 3.568.0 '@aws-sdk/middleware-recursion-detection': 3.567.0 @@ -10998,13 +11003,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0)': + '@aws-sdk/client-sso-oidc@3.583.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.583.0 + '@aws-sdk/client-sts': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) '@aws-sdk/core': 3.582.0 - '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -11041,7 +11046,6 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sts' - aws-crt '@aws-sdk/client-sso@3.568.0': @@ -11130,13 +11134,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.569.0': + '@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.569.0 '@aws-sdk/core': 3.567.0 - '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0) + '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/middleware-host-header': 3.567.0 '@aws-sdk/middleware-logger': 3.568.0 '@aws-sdk/middleware-recursion-detection': 3.567.0 @@ -11173,61 +11177,61 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)': + '@aws-sdk/client-sts@3.583.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.569.0 - '@aws-sdk/core': 3.567.0 - '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) - '@aws-sdk/middleware-host-header': 3.567.0 - '@aws-sdk/middleware-logger': 3.568.0 - '@aws-sdk/middleware-recursion-detection': 3.567.0 - '@aws-sdk/middleware-user-agent': 3.567.0 - '@aws-sdk/region-config-resolver': 3.567.0 - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-endpoints': 3.567.0 - '@aws-sdk/util-user-agent-browser': 3.567.0 - '@aws-sdk/util-user-agent-node': 3.568.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 + '@aws-sdk/client-sso-oidc': 3.583.0 + '@aws-sdk/core': 3.582.0 + '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.583.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.583.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 + '@smithy/config-resolver': 3.0.0 + '@smithy/core': 2.0.1 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.0 + '@smithy/middleware-retry': 3.0.1 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.0.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.0.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 + '@smithy/util-endpoints': 2.0.0 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/client-sts@3.583.0': + '@aws-sdk/client-sts@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/client-sso-oidc': 3.583.0 '@aws-sdk/core': 3.582.0 - '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -11264,6 +11268,7 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' - aws-crt '@aws-sdk/core@3.567.0': @@ -11340,7 +11345,7 @@ snapshots: '@aws-sdk/credential-provider-env': 3.568.0 '@aws-sdk/credential-provider-process': 3.568.0 '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 '@smithy/property-provider': 2.2.0 @@ -11351,12 +11356,12 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-ini@3.568.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0)': + '@aws-sdk/credential-provider-ini@3.568.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0))': dependencies: '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) '@aws-sdk/credential-provider-env': 3.568.0 '@aws-sdk/credential-provider-process': 3.568.0 - '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0) + '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0) '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 @@ -11368,18 +11373,18 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-ini@3.568.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0))': + '@aws-sdk/credential-provider-ini@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0(@aws-sdk/client-sso-oidc@3.583.0))': dependencies: - '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) - '@aws-sdk/credential-provider-env': 3.568.0 - '@aws-sdk/credential-provider-process': 3.568.0 - '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) - '@aws-sdk/types': 3.567.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 + '@aws-sdk/client-sts': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) + '@aws-sdk/credential-provider-env': 3.577.0 + '@aws-sdk/credential-provider-process': 3.577.0 + '@aws-sdk/credential-provider-sso': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) + '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.0.0 + '@smithy/property-provider': 3.0.0 + '@smithy/shared-ini-file-loader': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -11409,7 +11414,7 @@ snapshots: '@aws-sdk/credential-provider-ini': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/credential-provider-process': 3.568.0 '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 '@smithy/property-provider': 2.2.0 @@ -11421,13 +11426,13 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-node@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0)': + '@aws-sdk/credential-provider-node@3.569.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0))': dependencies: '@aws-sdk/credential-provider-env': 3.568.0 '@aws-sdk/credential-provider-http': 3.568.0 - '@aws-sdk/credential-provider-ini': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0) + '@aws-sdk/credential-provider-ini': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/credential-provider-process': 3.568.0 - '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0) + '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0) '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 @@ -11440,19 +11445,19 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-node@3.569.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0))': + '@aws-sdk/credential-provider-node@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0(@aws-sdk/client-sso-oidc@3.583.0))': dependencies: - '@aws-sdk/credential-provider-env': 3.568.0 - '@aws-sdk/credential-provider-http': 3.568.0 - '@aws-sdk/credential-provider-ini': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) - '@aws-sdk/credential-provider-process': 3.568.0 - '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) - '@aws-sdk/types': 3.567.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 + '@aws-sdk/credential-provider-env': 3.577.0 + '@aws-sdk/credential-provider-http': 3.582.0 + '@aws-sdk/credential-provider-ini': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)) + '@aws-sdk/credential-provider-process': 3.577.0 + '@aws-sdk/credential-provider-sso': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) + '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.0.0 + '@smithy/property-provider': 3.0.0 + '@smithy/shared-ini-file-loader': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -11533,7 +11538,7 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0))': + '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.569.0)': dependencies: '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) '@aws-sdk/types': 3.567.0 @@ -11541,12 +11546,12 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.569.0)': + '@aws-sdk/credential-provider-web-identity@3.577.0(@aws-sdk/client-sts@3.583.0(@aws-sdk/client-sso-oidc@3.583.0))': dependencies: - '@aws-sdk/client-sts': 3.569.0 - '@aws-sdk/types': 3.567.0 - '@smithy/property-provider': 2.2.0 - '@smithy/types': 2.12.0 + '@aws-sdk/client-sts': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.8.1 '@aws-sdk/credential-provider-web-identity@3.577.0(@aws-sdk/client-sts@3.583.0)': @@ -11569,7 +11574,7 @@ snapshots: '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/credential-provider-process': 3.568.0 '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 '@smithy/property-provider': 2.2.0 @@ -11664,7 +11669,7 @@ snapshots: '@aws-sdk/token-providers@3.568.0(@aws-sdk/client-sso-oidc@3.583.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/client-sso-oidc': 3.583.0 '@aws-sdk/types': 3.567.0 '@smithy/property-provider': 2.2.0 '@smithy/shared-ini-file-loader': 2.4.0 @@ -11673,7 +11678,7 @@ snapshots: '@aws-sdk/token-providers@3.577.0(@aws-sdk/client-sso-oidc@3.583.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/client-sso-oidc': 3.583.0 '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 @@ -14002,8 +14007,8 @@ snapshots: express-rate-limit: 7.5.0(express@5.1.0) pkce-challenge: 4.1.0 raw-body: 3.0.0 - zod: 3.24.2 - zod-to-json-schema: 3.24.3(zod@3.24.2) + zod: 3.24.3 + zod-to-json-schema: 3.24.3(zod@3.24.3) transitivePeerDependencies: - supports-color @@ -16885,7 +16890,7 @@ snapshots: hanji: 0.0.5 json-diff: 0.9.0 minimatch: 7.4.6 - zod: 3.23.7 + zod: 3.24.3 transitivePeerDependencies: - supports-color @@ -22651,12 +22656,18 @@ snapshots: dependencies: zod: 3.24.2 - zod@3.23.7: {} + zod-to-json-schema@3.24.3(zod@3.24.3): + dependencies: + zod: 3.24.3 - zod@3.24.1: {} + zod@3.23.7: {} zod@3.24.2: {} + zod@3.24.3: {} + + zod@3.25.0-beta.20250516T044623: {} + zx@7.2.2: dependencies: '@types/fs-extra': 11.0.4