From b55f02a191d8641cd8cd9d83466d7f036d1e9f8d Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Thu, 21 Aug 2025 15:21:58 +0800 Subject: [PATCH] fix: crud operation typing --- packages/runtime/src/client/crud-types.ts | 15 +++++++-------- packages/runtime/test/schemas/typing/models.ts | 2 ++ packages/runtime/test/schemas/typing/schema.ts | 12 +++++++++++- .../runtime/test/schemas/typing/schema.zmodel | 11 +++++++++-- packages/runtime/test/schemas/typing/typecheck.ts | 5 ++++- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/packages/runtime/src/client/crud-types.ts b/packages/runtime/src/client/crud-types.ts index fd1918df..85cf3b56 100644 --- a/packages/runtime/src/client/crud-types.ts +++ b/packages/runtime/src/client/crud-types.ts @@ -7,7 +7,6 @@ import type { FieldIsDelegateDiscriminator, FieldIsDelegateRelation, FieldIsRelation, - FieldIsRelationArray, FieldType, ForeignKeyFields, GetEnum, @@ -218,11 +217,11 @@ export type WhereInput< : Key]?: Key extends RelationFields ? // relation RelationFilter - : // enum - GetModelFieldType extends GetEnums - ? EnumFilter, ModelFieldIsOptional> - : FieldIsArray extends true - ? ArrayFilter> + : FieldIsArray extends true + ? ArrayFilter> + : // enum + GetModelFieldType extends GetEnums + ? EnumFilter, ModelFieldIsOptional> : // primitive PrimitiveFilter< Schema, @@ -561,9 +560,9 @@ type OptionalFieldsForCreate extends true ? Key - : GetModelField['updatedAt'] extends true + : FieldIsArray extends true ? Key - : FieldIsRelationArray extends true + : GetModelField['updatedAt'] extends true ? Key : never]: GetModelField; }; diff --git a/packages/runtime/test/schemas/typing/models.ts b/packages/runtime/test/schemas/typing/models.ts index a30c2d6e..d5cb870c 100644 --- a/packages/runtime/test/schemas/typing/models.ts +++ b/packages/runtime/test/schemas/typing/models.ts @@ -17,3 +17,5 @@ export type Identity = $TypeDefResult<$Schema, "Identity">; export type IdentityProvider = $TypeDefResult<$Schema, "IdentityProvider">; export const Role = $schema.enums.Role; export type Role = (typeof Role)[keyof typeof Role]; +export const Status = $schema.enums.Status; +export type Status = (typeof Status)[keyof typeof Status]; diff --git a/packages/runtime/test/schemas/typing/schema.ts b/packages/runtime/test/schemas/typing/schema.ts index 2b331e0b..90a532e0 100644 --- a/packages/runtime/test/schemas/typing/schema.ts +++ b/packages/runtime/test/schemas/typing/schema.ts @@ -8,7 +8,7 @@ import { type SchemaDef, type OperandExpression, ExpressionUtils } from "../../../dist/schema"; export const schema = { provider: { - type: "sqlite" + type: "postgresql" }, models: { User: { @@ -49,6 +49,11 @@ export const schema = { attributes: [{ name: "@default", args: [{ name: "value", value: ExpressionUtils.literal("USER") }] }], default: "USER" }, + status: { + name: "status", + type: "Status", + array: true + }, posts: { name: "posts", type: "Post", @@ -325,6 +330,11 @@ export const schema = { Role: { ADMIN: "ADMIN", USER: "USER" + }, + Status: { + ACTIVE: "ACTIVE", + INACTIVE: "INACTIVE", + BANNED: "BANNED" } }, authType: "User", diff --git a/packages/runtime/test/schemas/typing/schema.zmodel b/packages/runtime/test/schemas/typing/schema.zmodel index 2cb789d7..32209ceb 100644 --- a/packages/runtime/test/schemas/typing/schema.zmodel +++ b/packages/runtime/test/schemas/typing/schema.zmodel @@ -1,6 +1,6 @@ datasource db { - provider = "sqlite" - url = "file:./test.db" + provider = 'postgresql' + url = env('DATABASE_URL') } enum Role { @@ -8,6 +8,12 @@ enum Role { USER } +enum Status { + ACTIVE + INACTIVE + BANNED +} + type Identity { providers IdentityProvider[] } @@ -24,6 +30,7 @@ model User { name String email String @unique role Role @default(USER) + status Status[] posts Post[] profile Profile? postCount Int @computed diff --git a/packages/runtime/test/schemas/typing/typecheck.ts b/packages/runtime/test/schemas/typing/typecheck.ts index c7d0cdb7..189d1c97 100644 --- a/packages/runtime/test/schemas/typing/typecheck.ts +++ b/packages/runtime/test/schemas/typing/typecheck.ts @@ -1,7 +1,7 @@ import SQLite from 'better-sqlite3'; import { SqliteDialect } from 'kysely'; import { ZenStackClient } from '../../../dist'; -import { Role, type Identity, type IdentityProvider } from './models'; +import { Role, Status, type Identity, type IdentityProvider } from './models'; import { schema } from './schema'; const client = new ZenStackClient(schema, { @@ -35,6 +35,9 @@ async function find() { where: { name: 'Alex', role: Role.USER, + status: { + has: Status.ACTIVE, + }, }, }); console.log(user1?.name);