From c3ca958ab740841858cfa9cdf16f6c4f5d907a58 Mon Sep 17 00:00:00 2001 From: Mihovil Ilakovac Date: Tue, 20 Aug 2024 14:59:08 +0200 Subject: [PATCH] Solve the Prisma type issues by converting interfaces to types --- .../sdk/wasp/prisma-runtime-library.d.ts | 14 -------------- .../sdk/wasp/server/crud/_operationTypes.ts | 13 +++++++------ .../templates/sdk/wasp/universal/types.ts | 17 +++++++++++++++++ waspc/src/Wasp/Generator/SdkGenerator.hs | 1 - 4 files changed, 24 insertions(+), 21 deletions(-) delete mode 100644 waspc/data/Generator/templates/sdk/wasp/prisma-runtime-library.d.ts diff --git a/waspc/data/Generator/templates/sdk/wasp/prisma-runtime-library.d.ts b/waspc/data/Generator/templates/sdk/wasp/prisma-runtime-library.d.ts deleted file mode 100644 index c93423b579..0000000000 --- a/waspc/data/Generator/templates/sdk/wasp/prisma-runtime-library.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Without this import, Prisma types are resolved incorrectly. -import * as runtime from '@prisma/client/runtime'; - -// Prisma generated types which we use as default input and output types for CRUD -// operations internally use interfaces for some types. -// Our SuperJSON serialization types throw a type error when used with interfaces -// because interfaces don't have a index signature. -// We augment the Prisma generated types to have an index signature. -// Read more https://github.com/microsoft/TypeScript/issues/15300#issuecomment-1320528385 -declare module '@prisma/client/runtime/library.js' { - export interface FieldRef { - [key: string]: any; - } -} diff --git a/waspc/data/Generator/templates/sdk/wasp/server/crud/_operationTypes.ts b/waspc/data/Generator/templates/sdk/wasp/server/crud/_operationTypes.ts index 44eb92a3ea..74d62116ea 100644 --- a/waspc/data/Generator/templates/sdk/wasp/server/crud/_operationTypes.ts +++ b/waspc/data/Generator/templates/sdk/wasp/server/crud/_operationTypes.ts @@ -12,6 +12,7 @@ import type { } from "../_types"; import type { Prisma } from "@prisma/client"; import type { Payload } from "../_types/serialization"; +import type { RecursiveInterfaceToType } from "../../universal/types"; import type { {= crud.entityUpper =}, } from "wasp/entities"; @@ -79,7 +80,7 @@ export type GetAllQueryResolved = typeof _waspGetAllQuery {=# crud.operations.Get =} {=^ overrides.Get.isDefined =} -type GetInput = Prisma.{= crud.entityUpper =}WhereUniqueInput +type GetInput = RecursiveInterfaceToType type GetOutput = _WaspEntity | null export type GetQueryResolved = {= crud.name =}.GetQuery {=/ overrides.Get.isDefined =} @@ -91,10 +92,10 @@ export type GetQueryResolved = typeof _waspGetQuery {=# crud.operations.Create =} {=^ overrides.Create.isDefined =} -type CreateInput = Prisma.XOR< +type CreateInput = RecursiveInterfaceToType +>> type CreateOutput = _WaspEntity export type CreateActionResolved = {= crud.name =}.CreateAction {=/ overrides.Create.isDefined =} @@ -106,11 +107,11 @@ export type CreateActionResolved = typeof _waspCreateAction {=# crud.operations.Update =} {=^ overrides.Update.isDefined =} -type UpdateInput = Prisma.XOR< +type UpdateInput = RecursiveInterfaceToType - & Prisma.{= crud.entityUpper =}WhereUniqueInput + & Prisma.{= crud.entityUpper =}WhereUniqueInput> type UpdateOutput = _WaspEntity export type UpdateActionResolved = {= crud.name =}.UpdateAction @@ -123,7 +124,7 @@ export type UpdateActionResolved = typeof _waspUpdateAction {=# crud.operations.Delete =} {=^ overrides.Delete.isDefined =} -type DeleteInput = Prisma.{= crud.entityUpper =}WhereUniqueInput +type DeleteInput = RecursiveInterfaceToType type DeleteOutput = _WaspEntity export type DeleteActionResolved = {= crud.name =}.DeleteAction {=/ overrides.Delete.isDefined =} diff --git a/waspc/data/Generator/templates/sdk/wasp/universal/types.ts b/waspc/data/Generator/templates/sdk/wasp/universal/types.ts index 46077a0e2e..afa82c2c45 100644 --- a/waspc/data/Generator/templates/sdk/wasp/universal/types.ts +++ b/waspc/data/Generator/templates/sdk/wasp/universal/types.ts @@ -37,3 +37,20 @@ export type Tail = T extends [unknown, ...inf // Source: https://stackoverflow.com/a/55541672 export type IfAny = 0 extends (1 & Value) ? Then : Else; + +// Prisma generated types which we use as default input and output types for CRUD +// operations internally use interfaces for some types. +// Our SuperJSON serialization types throw a type error when used with interfaces +// because interfaces don't have a index signature. +// We augment the Prisma generated types to have an index signature. +// Read more https://github.com/microsoft/TypeScript/issues/15300#issuecomment-1320528385 +export type RecursiveInterfaceToType = { + [K in keyof T]: T[K] extends object + ? RecursiveInterfaceToType + : _DistributiveInterfaceToType +} + +// Applies the RecursiveInterfaceToType to all types in a union +type _DistributiveInterfaceToType = T extends unknown + ? RecursiveInterfaceToType + : never diff --git a/waspc/src/Wasp/Generator/SdkGenerator.hs b/waspc/src/Wasp/Generator/SdkGenerator.hs index eb066c1436..3ea36a85f2 100644 --- a/waspc/src/Wasp/Generator/SdkGenerator.hs +++ b/waspc/src/Wasp/Generator/SdkGenerator.hs @@ -80,7 +80,6 @@ genSdkReal :: AppSpec -> Generator [FileDraft] genSdkReal spec = sequence [ genFileCopy [relfile|vite-env.d.ts|], - genFileCopy [relfile|prisma-runtime-library.d.ts|], genFileCopy [relfile|api/index.ts|], genFileCopy [relfile|api/events.ts|], genFileCopy [relfile|core/storage.ts|],