From f83d48c92961de46e7302251b188a326e5f5ec60 Mon Sep 17 00:00:00 2001 From: Andres David Jimenez Sulbaran Date: Thu, 26 Mar 2026 17:51:06 -0600 Subject: [PATCH 1/3] fix(prisma): migration fix with better api v4 impl --- .../app/routes/todo-app.tsx | 21 +- .../20260315013849_init_sqlite/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 3 - .../react-router-example/prisma/schema.prisma | 3 +- dev.db | Bin 57344 -> 57344 bytes packages/prisma/prisma/dev.db | Bin 53248 -> 53248 bytes packages/prisma/src/cli.ts | 6 +- packages/prisma/src/commands/init.ts | 13 +- packages/prisma/src/schema-generator/index.ts | 191 ++++++++++-------- .../prisma/src/services/formatter-service.ts | 28 ++- .../prisma/src/services/generator-service.ts | 34 +++- .../prisma/src/services/render-service.ts | 2 +- .../react/router-better-auth/src/index.ts | 1 + 13 files changed, 184 insertions(+), 118 deletions(-) delete mode 100644 apps/react-router-example/prisma/migrations/20260315013849_init_sqlite/migration.sql delete mode 100644 apps/react-router-example/prisma/migrations/migration_lock.toml diff --git a/apps/react-router-example/app/routes/todo-app.tsx b/apps/react-router-example/app/routes/todo-app.tsx index 23e3505d..16f94f8d 100644 --- a/apps/react-router-example/app/routes/todo-app.tsx +++ b/apps/react-router-example/app/routes/todo-app.tsx @@ -5,7 +5,7 @@ import { withActionEffect, withLoaderEffect } from "../lib/runtime.server.js" import { randomUUID } from "node:crypto" import { Form, useActionData, useSubmit } from "react-router" import { useState } from "react" -import { withBetterAuthGuard, withBetterAuthGuardAction } from "@effectify/react-router-better-auth" +import { AuthService, withBetterAuthGuard, withBetterAuthGuardAction } from "@effectify/react-router-better-auth" import * as PrismaRepository from "./../../prisma/generated/effect/prisma-repository.js" import { TodoId, TodoModel } from "./../../prisma/generated/effect/index.js" @@ -16,7 +16,10 @@ export const loader = Effect.gen(function*() { }) const todos = yield* TodoRepo.findMany() return yield* httpSuccess({ todos: todos }) -}).pipe(withBetterAuthGuard.with({ redirectOnFail: "/login" }), withLoaderEffect) +}).pipe( + withBetterAuthGuard.with({ redirectOnFail: "/login" }), + withLoaderEffect, +) export const action = Effect.gen(function*() { const { request } = yield* ActionArgsContext @@ -26,6 +29,10 @@ export const action = Effect.gen(function*() { const title = String(formData.get("title") ?? "") const content = String(formData.get("content") ?? "") + // Get authenticated user from auth context + const auth = yield* AuthService.AuthContext + const userId = auth.user?.id + const TodoRepo = yield* PrismaRepository.make(TodoModel, { modelName: "todo", spanPrefix: "Todo", @@ -65,18 +72,24 @@ export const action = Effect.gen(function*() { return yield* httpFailure("Title is required") } + if (!userId) { + return yield* httpFailure("Not authenticated") + } + yield* TodoRepo.create({ data: { id: TodoId.makeUnsafe(randomUUID()), title, content, status: "PENDING", - authorId: 1, published: false, }, }) return yield* httpRedirect("/todo-app") -}).pipe(withBetterAuthGuardAction.with({ redirectOnFail: "/login" }), withActionEffect) +}).pipe( + withBetterAuthGuardAction.with({ redirectOnFail: "/login" }), + withActionEffect, +) export default function TodoApp({ loaderData }: Route.ComponentProps) { const actionData = useActionData() diff --git a/apps/react-router-example/prisma/migrations/20260315013849_init_sqlite/migration.sql b/apps/react-router-example/prisma/migrations/20260315013849_init_sqlite/migration.sql deleted file mode 100644 index e69de29b..00000000 diff --git a/apps/react-router-example/prisma/migrations/migration_lock.toml b/apps/react-router-example/prisma/migrations/migration_lock.toml deleted file mode 100644 index e1640d1f..00000000 --- a/apps/react-router-example/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (e.g., Git) -provider = "sqlite" \ No newline at end of file diff --git a/apps/react-router-example/prisma/schema.prisma b/apps/react-router-example/prisma/schema.prisma index 4da48238..7f891263 100644 --- a/apps/react-router-example/prisma/schema.prisma +++ b/apps/react-router-example/prisma/schema.prisma @@ -30,5 +30,4 @@ model Todo { content String? published Boolean @default(false) status TodoStatus @default(PENDING) - authorId Int -} \ No newline at end of file +} diff --git a/dev.db b/dev.db index b422ac6e8d2d70584aea2fb3e3b904cbe961d32c..e22e4ca9367274a79fa0b342feeedc27ece034d8 100644 GIT binary patch delta 341 zcmZoTz}#?vd4e>f!$cWpMu&|FOZ?dsxDy$;6E|}NgmY`EF#9qZxdv1^Mh1CDRz>;; z6joTKMFv&oX1J7Bl$PZhMwu5Vf)q_oyri&sRdf`K2uM4x6Yn)1Dc&CL)jXZN=|IE8 z5ITa_BBpaCqrG#YrgqCHy=7#6wX1WANmiiPMl?0^*LkwF8GAuhPg_)l*U^4p! zSvJN1#=Q))CQdAvJj-F5ZWE&-m#?p{t$d@Ttt}zvO>VrQU{1(dBLgEdT>}$c1EUZl nV=F@-GSV|PHl6I~q%pb2*+9d{3`IN&qTW~+U3_!Mr8T?&Rm5kj delta 125 zcmZoTz}#?vd4e>f?L--8M%#@EOZ-{nx!V{va|MKRPh6nRqQdOUI63i>!sb=cQ7l3r zDPAYuYdliCJ>08#I(gGKOC)$A6fOiQ%#KQ7=3@$(%ziF Tvx#4U%h%V}R(^BHr8T?&aO5YL diff --git a/packages/prisma/prisma/dev.db b/packages/prisma/prisma/dev.db index a0388127f4c426174a1fc4e31a8f58e12a01f5fa..8c57d0f27797521e1e396de51977a02344b09d5e 100644 GIT binary patch delta 19 bcmZozz}&Ead4e?Kqlq%kjE^=ZEI1DUN;C*4 delta 19 bcmZozz}&Ead4e?K{)sZqjQckxEI1DUNGAv4 diff --git a/packages/prisma/src/cli.ts b/packages/prisma/src/cli.ts index 74559524..528d09ec 100755 --- a/packages/prisma/src/cli.ts +++ b/packages/prisma/src/cli.ts @@ -10,6 +10,7 @@ import { prismaCommand } from "./commands/prisma.js" import { GeneratorService } from "./services/generator-service.js" import { RenderService } from "./services/render-service.js" import { FormatterService } from "./services/formatter-service.js" +import { GenerateSchemnaService } from "./schema-generator/index.js" const cli = Command.run( prismaCommand.pipe(Command.withSubcommands([initCommand])), @@ -22,13 +23,14 @@ const GeneratorLayer = GeneratorService.layer.pipe( Layer.provide(RenderService.layer), Layer.provide(FormatterService.layer), Layer.provide(NodeServices.layer), + Layer.provide(GenerateSchemnaService.layer), ) const MainLayer = Layer.mergeAll( GeneratorLayer, RenderService.layer, FormatterService.layer, - NodeServices.layer, -) + GenerateSchemnaService.layer, +).pipe(Layer.provideMerge(NodeServices.layer)) cli.pipe(Effect.provide(MainLayer), NodeRuntime.runMain) diff --git a/packages/prisma/src/commands/init.ts b/packages/prisma/src/commands/init.ts index 7fa73add..6bd67fd9 100644 --- a/packages/prisma/src/commands/init.ts +++ b/packages/prisma/src/commands/init.ts @@ -1,11 +1,16 @@ import * as Command from "effect/unstable/cli/Command" import * as Flag from "effect/unstable/cli/Flag" -import * as NodeFileSystem from "@effect/platform-node/NodeFileSystem" import * as NodePath from "@effect/platform-node/NodePath" import * as FileSystem from "effect/FileSystem" import * as Console from "effect/Console" import * as Effect from "effect/Effect" import * as Match from "effect/Match" +import { Data } from "effect" + +// Tagged error for Prisma initialization +class PrismaNotInitialized extends Data.TaggedError("PrismaNotInitialized")<{ + readonly message: string +}> {} // Flag for the init command const outputOption = Flag.string("output").pipe( @@ -80,7 +85,7 @@ const checkPrismaSetup = () => yield* Console.log( " https://www.prisma.io/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-prismaPostgres", ) - yield* Effect.fail(new Error("Prisma not initialized")) + return yield* new PrismaNotInitialized({ message: "Prisma not initialized" }) } }) @@ -126,7 +131,7 @@ generator effect { yield* Console.log(" 1. Set your DATABASE_URL environment variable") yield* Console.log(" 2. Run: npx prisma generate") - yield* Effect.sync(() => process.exit(0)) + return yield* Effect.sync(() => process.exit(0)) }) export const initCommand = Command.make( @@ -137,5 +142,5 @@ export const initCommand = Command.make( ({ output }) => initializePrismaSchema({ output, - }).pipe(Effect.provide(NodeFileSystem.layer), Effect.provide(NodePath.layer)), + }).pipe(Effect.provide(NodePath.layer)), ) diff --git a/packages/prisma/src/schema-generator/index.ts b/packages/prisma/src/schema-generator/index.ts index 5adcf0c9..26eefb13 100644 --- a/packages/prisma/src/schema-generator/index.ts +++ b/packages/prisma/src/schema-generator/index.ts @@ -2,109 +2,134 @@ import * as FileSystem from "effect/FileSystem" import * as Path from "effect/Path" import type { DMMF } from "@prisma/generator-helper" import * as Effect from "effect/Effect" -import { RenderService } from "../services/render-service.js" +import * as Layer from "effect/Layer" +import { RenderError, RenderService } from "../services/render-service.js" import { FormatterService } from "../services/formatter-service.js" import * as EnumGenerator from "./effect/enum.js" import * as EffectGenerator from "./effect/generator.js" import * as JoinTableGenerator from "./effect/join-table.js" import * as KyselyGenerator from "./kysely/generator.js" import * as PrismaGenerator from "./prisma/generator.js" +import * as ServiceMap from "effect/ServiceMap" +import * as PlatformError from "effect/PlatformError" -/** - * Generate Effect schemas (enums, types, index) - * Replicates legacy generator logic using Effect patterns and Eta templates - */ -export const generateSchemas = (dmmf: DMMF.Document, outputDir: string) => - Effect.gen(function*() { +export class GenerateSchemnaService extends ServiceMap.Service< + GenerateSchemnaService, + { + generate: ( + dmmf: DMMF.Document, + outputDir: string, + ) => Effect.Effect< + void, + Error | PlatformError.PlatformError | RenderError, + FormatterService | RenderService + > + } +>()("@effectify/prisma/schema-generator/GenerateSchemnaService", { + make: Effect.gen(function*() { const fs = yield* FileSystem.FileSystem const path = yield* Path.Path - const { render } = yield* RenderService - const { format } = yield* FormatterService + return { + generate: (dmmf: DMMF.Document, outputDir: string) => + Effect.gen(function*() { + const { render } = yield* RenderService + const { format } = yield* FormatterService - yield* fs.makeDirectory(outputDir, { recursive: true }) + yield* fs.makeDirectory(outputDir, { recursive: true }) - // Write schemas/ files into a "schemas" subdirectory for proper module resolution - const schemasDir = path.join(outputDir, "schemas") - yield* fs.makeDirectory(schemasDir, { recursive: true }) + // Write schemas/ files into a "schemas" subdirectory for proper module resolution + const schemasDir = path.join(outputDir, "schemas") + yield* fs.makeDirectory(schemasDir, { recursive: true }) - const writeSchemaFile = (filename: string, content: string) => - Effect.gen(function*() { - const formatted = yield* format(content) - const filePath = path.join(schemasDir, filename) - yield* fs.writeFileString(filePath, formatted) - }) + const writeSchemaFile = (filename: string, content: string) => + Effect.gen(function*() { + const formatted = yield* format(content) + const filePath = path.join(schemasDir, filename) + yield* fs.writeFileString(filePath, formatted) + }) - // Generate Enums - const enums = PrismaGenerator.getEnums(dmmf) - const enumsData = EnumGenerator.prepareEnumsData(enums) - if (enumsData) { - const content = yield* render("effect-enums", enumsData) - yield* writeSchemaFile("enums.ts", content) - } + // Generate Enums + const enums = PrismaGenerator.getEnums(dmmf) + const enumsData = EnumGenerator.prepareEnumsData(enums) + if (enumsData) { + const content = yield* render("effect-enums", enumsData) + yield* writeSchemaFile("enums.ts", content) + } - // Generate Types - const models = PrismaGenerator.getModels(dmmf) - const joinTables = PrismaGenerator.getManyToManyJoinTables(dmmf) - const hasEnums = enums.length > 0 + // Generate Types + const models = PrismaGenerator.getModels(dmmf) + const joinTables = PrismaGenerator.getManyToManyJoinTables(dmmf) + const hasEnums = enums.length > 0 - // Header - const headerData = EffectGenerator.prepareTypesHeaderData(dmmf, hasEnums) - let content = yield* render("effect-types-header", headerData) + // Header + const headerData = EffectGenerator.prepareTypesHeaderData( + dmmf, + hasEnums, + ) + let content = yield* render("effect-types-header", headerData) - // Branded IDs - const brandedIdsData = models - .map((model) => { - const fields = PrismaGenerator.getModelFields(model) - return EffectGenerator.prepareBrandedIdSchemaData(model, fields) - }) - .filter((data): data is NonNullable => data !== null) + // Branded IDs + const brandedIdsData = models + .map((model) => { + const fields = PrismaGenerator.getModelFields(model) + return EffectGenerator.prepareBrandedIdSchemaData(model, fields) + }) + .filter((data): data is NonNullable => data !== null) - if (brandedIdsData.length > 0) { - content += `\n\n// ===== Branded ID Schemas =====` - for (const data of brandedIdsData) { - const idContent = yield* render("effect-branded-id", data) - content += `\n\n${idContent}` - } - } + if (brandedIdsData.length > 0) { + content += `\n\n// ===== Branded ID Schemas =====` + for (const data of brandedIdsData) { + const idContent = yield* render("effect-branded-id", data) + content += `\n\n${idContent}` + } + } - // Models - const modelsData = models.map((model) => { - const fields = PrismaGenerator.getModelFields(model) - return EffectGenerator.prepareModelSchemaData(dmmf, model, fields) - }) + // Models + const modelsData = models.map((model) => { + const fields = PrismaGenerator.getModelFields(model) + return EffectGenerator.prepareModelSchemaData(dmmf, model, fields) + }) - if (modelsData.length > 0) { - content += `\n\n// ===== Model Schemas =====` - for (const data of modelsData) { - const modelContent = yield* render("effect-model", data) - content += `\n\n${modelContent}` - } - } + if (modelsData.length > 0) { + content += `\n\n// ===== Model Schemas =====` + for (const data of modelsData) { + const modelContent = yield* render("effect-model", data) + content += `\n\n${modelContent}` + } + } - // Join Tables - const joinTablesData = joinTables.map((jt) => JoinTableGenerator.prepareJoinTableData(jt, dmmf)) - if (joinTablesData.length > 0) { - for (const data of joinTablesData) { - const jtContent = yield* render("effect-join-table", data) - content += `\n\n${jtContent}` - } - } + // Join Tables + const joinTablesData = joinTables.map((jt) => JoinTableGenerator.prepareJoinTableData(jt, dmmf)) + if (joinTablesData.length > 0) { + for (const data of joinTablesData) { + const jtContent = yield* render("effect-join-table", data) + content += `\n\n${jtContent}` + } + } - // DB Interface - const dbInterfaceData = KyselyGenerator.prepareDBInterfaceData( - models, - joinTables, - ) - const dbInterfaceContent = yield* render( - "kysely-db-interface", - dbInterfaceData, - ) - content += `\n\n${dbInterfaceContent}` + // DB Interface + const dbInterfaceData = KyselyGenerator.prepareDBInterfaceData( + models, + joinTables, + ) + const dbInterfaceContent = yield* render( + "kysely-db-interface", + dbInterfaceData, + ) + content += `\n\n${dbInterfaceContent}` - yield* writeSchemaFile("types.ts", content) + yield* writeSchemaFile("types.ts", content) - // Index - const indexData = KyselyGenerator.prepareIndexData(hasEnums) - const indexContent = yield* render("effect-index", indexData) - yield* writeSchemaFile("index.ts", indexContent) - }) + // Index + const indexData = KyselyGenerator.prepareIndexData(hasEnums) + const indexContent = yield* render("effect-index", indexData) + yield* writeSchemaFile("index.ts", indexContent) + }), + } + }), +}) { + static readonly layer = Layer.effect(GenerateSchemnaService, this.make).pipe( + Layer.provide(RenderService.layer), + Layer.provide(FormatterService.layer), + ) +} diff --git a/packages/prisma/src/services/formatter-service.ts b/packages/prisma/src/services/formatter-service.ts index 55d8c8b0..32d8a178 100644 --- a/packages/prisma/src/services/formatter-service.ts +++ b/packages/prisma/src/services/formatter-service.ts @@ -3,7 +3,16 @@ import * as Effect from "effect/Effect" import * as Layer from "effect/Layer" import { createFromBuffer } from "@dprint/formatter" import { getPath } from "@dprint/typescript" -import * as fs from "node:fs" +import * as FileSystem from "effect/FileSystem" +import * as Data from "effect/Data" + +export class FormatError extends Data.TaggedError("FormatError")<{ + error?: unknown +}> { + override get message(): string { + return `Format error: ${this.message}` + } +} export class FormatterService extends ServiceMap.Service< FormatterService, @@ -12,19 +21,16 @@ export class FormatterService extends ServiceMap.Service< } >()("FormatterService", { make: Effect.gen(function*() { - const buffer = fs.readFileSync(getPath()) + const fs = yield* FileSystem.FileSystem + const buffer = yield* fs.readFile(getPath()) const formatter = createFromBuffer(buffer) return { - format: (code: string): Effect.Effect => { - try { - return Effect.succeed( - formatter.formatText({ filePath: "file.ts", fileText: code }), - ) - } catch (error) { - return Effect.fail(new Error(`Failed to format code: ${error}`)) - } - }, + format: (code: string) => + Effect.try({ + try: () => formatter.formatText({ filePath: "file.ts", fileText: code }), + catch: (error) => new FormatError({ error }), + }), } }), }) { diff --git a/packages/prisma/src/services/generator-service.ts b/packages/prisma/src/services/generator-service.ts index 4c58430b..476b4d0a 100644 --- a/packages/prisma/src/services/generator-service.ts +++ b/packages/prisma/src/services/generator-service.ts @@ -6,8 +6,17 @@ import * as Layer from "effect/Layer" import { GeneratorContext } from "./generator-context.js" import { RenderService } from "./render-service.js" import { FormatterService } from "./formatter-service.js" -import { generateSchemas } from "../schema-generator/index.js" +import { GenerateSchemnaService } from "../schema-generator/index.js" import * as ServiceMap from "effect/ServiceMap" +import { Data } from "effect" + +class GeneratorError extends Data.TaggedError("GeneratorError")<{ + message: string +}> { + override get message(): string { + return `Generator error: ${this.message}` + } +} export class GeneratorService extends ServiceMap.Service< GeneratorService, @@ -176,6 +185,8 @@ export class GeneratorService extends ServiceMap.Service< yield* fs.writeFileString(path.join(outputDir, "index.ts"), formatted) }) + const generateSchema = yield* GenerateSchemnaService + const generate = Effect.gen(function*() { const options = yield* GeneratorContext const models = options.dmmf.datamodel.models @@ -183,7 +194,7 @@ export class GeneratorService extends ServiceMap.Service< const schemaDir = path.dirname(options.schemaPath) if (!outputDir) { - return yield* Effect.fail(new Error("No output directory specified")) + return yield* new GeneratorError({ message: "No output directory specified" }) } const { clientImportPath, customError } = getGeneratorConfig( @@ -195,12 +206,19 @@ export class GeneratorService extends ServiceMap.Service< // Generate Effect/Kysely Schemas (enums.ts, types.ts, schemas/index.ts) const schemasDir = path.join(outputDir, "schemas") - yield* generateSchemas(options.dmmf, schemasDir).pipe( - Effect.provideService(FileSystem.FileSystem, fs), - Effect.provideService(Path.Path, path), - Effect.provideService(RenderService, renderService), - Effect.provideService(FormatterService, formatterService), - ) + + // yield* generateSchemas(options.dmmf, schemasDir).pipe( + // Effect.provideService(FileSystem.FileSystem, fs), + // Effect.provideService(Path.Path, path), + // Effect.provideService(RenderService, renderService), + // Effect.provideService(FormatterService, formatterService), + // ) + + yield* generateSchema.generate(options.dmmf, schemasDir) + .pipe( + Effect.provideService(RenderService, renderService), + Effect.provideService(FormatterService, formatterService), + ) yield* generatePrismaSchema(outputDir) yield* generatePrismaRepository(outputDir, clientImportPath) diff --git a/packages/prisma/src/services/render-service.ts b/packages/prisma/src/services/render-service.ts index 13f51486..57173e59 100644 --- a/packages/prisma/src/services/render-service.ts +++ b/packages/prisma/src/services/render-service.ts @@ -6,7 +6,7 @@ import { fileURLToPath } from "node:url" import * as Path from "effect/Path" import * as Data from "effect/Data" -class RenderError extends Data.TaggedError("RenderError")<{ +export class RenderError extends Data.TaggedError("RenderError")<{ templateName: string error: unknown }> { diff --git a/packages/react/router-better-auth/src/index.ts b/packages/react/router-better-auth/src/index.ts index 4aa1e081..4dc29e71 100644 --- a/packages/react/router-better-auth/src/index.ts +++ b/packages/react/router-better-auth/src/index.ts @@ -1,2 +1,3 @@ export * from "./lib/auth-guard.js" export * from "./lib/handlers.js" +export { AuthService } from "@effectify/node-better-auth" From c4681186cd50ed044fe2be8d7602651444060682 Mon Sep 17 00:00:00 2001 From: Andres David Jimenez Sulbaran Date: Thu, 26 Mar 2026 20:54:25 -0600 Subject: [PATCH 2/3] fix(prisma): add prisma:generate target and update typecheck dependencies --- apps/react-remix-example/project.json | 8 ++++++++ apps/react-router-example/project.json | 9 ++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/apps/react-remix-example/project.json b/apps/react-remix-example/project.json index cf4a70db..7bb337fc 100644 --- a/apps/react-remix-example/project.json +++ b/apps/react-remix-example/project.json @@ -33,9 +33,17 @@ "typecheck": { "executor": "nx:run-script", "cache": true, + "dependsOn": ["prisma:generate"], "options": { "script": "typecheck" } + }, + "prisma:generate": { + "executor": "nx:run-commands", + "options": { + "command": "pnpm dlx prisma generate", + "cwd": "apps/react-remix-example" + } } }, "tags": [] diff --git a/apps/react-router-example/project.json b/apps/react-router-example/project.json index d97285ae..98c200cb 100644 --- a/apps/react-router-example/project.json +++ b/apps/react-router-example/project.json @@ -12,7 +12,7 @@ "command": "tsc", "cwd": "apps/react-router-example" }, - "dependsOn": ["typegen"] + "dependsOn": ["typegen", "prisma:generate"] }, "typegen": { "executor": "nx:run-commands", @@ -21,6 +21,13 @@ "cwd": "apps/react-router-example" } }, + "prisma:generate": { + "executor": "nx:run-commands", + "options": { + "command": "pnpm dlx prisma generate", + "cwd": "apps/react-router-example" + } + }, "build": { "executor": "@nx/vite:build", "outputs": ["{options.outputPath}"], From 438e8e10f4fe835e139870278a7ff3ca1c9687be Mon Sep 17 00:00:00 2001 From: Andres David Jimenez Sulbaran Date: Thu, 26 Mar 2026 21:11:31 -0600 Subject: [PATCH 3/3] fix: add ^build dependency to prisma:generate for typecheck --- apps/react-remix-example/project.json | 1 + apps/react-router-example/project.json | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/react-remix-example/project.json b/apps/react-remix-example/project.json index 7bb337fc..d1824cfe 100644 --- a/apps/react-remix-example/project.json +++ b/apps/react-remix-example/project.json @@ -40,6 +40,7 @@ }, "prisma:generate": { "executor": "nx:run-commands", + "dependsOn": ["^build"], "options": { "command": "pnpm dlx prisma generate", "cwd": "apps/react-remix-example" diff --git a/apps/react-router-example/project.json b/apps/react-router-example/project.json index 98c200cb..ed621761 100644 --- a/apps/react-router-example/project.json +++ b/apps/react-router-example/project.json @@ -23,6 +23,7 @@ }, "prisma:generate": { "executor": "nx:run-commands", + "dependsOn": ["^build"], "options": { "command": "pnpm dlx prisma generate", "cwd": "apps/react-router-example"