Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions scripts/runTests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ const program = Effect.gen(function* () {
if (clean) {
yield* run(".", "tsc", "--noEmit");
}
yield* run("./tests", "prisma", "generate");
const dbExists = yield* fs.exists("prisma/dev.db");
const dbExists = yield* fs.exists("tests/prisma/dev.db");
if (clean || !dbExists) {
yield* run("./tests", "prisma", "db", "push");
}
yield* run("./tests", "prisma", "generate", "--sql");
yield* run("./tests", "tsc", "--noEmit");
yield* run("./tests", "vitest", "run");
}).pipe(
Expand Down
9 changes: 9 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,14 @@ function generateRawSqlOperations() {
try: () => client.$queryRawUnsafe(query, ...values),
catch: (error) => mapError(error, "$queryRawUnsafe", "Prisma")
}),
),

$queryRawTyped: <T>(typedQuery: runtime.TypedSql<unknown[], T>) =>
Effect.flatMap(clientOrTx(client), client =>
Effect.tryPromise({
try: () => client.$queryRawTyped(typedQuery),
catch: (error) => mapError(error, "$queryRawTyped", "Prisma")
}),
),`;
}

Expand Down Expand Up @@ -310,6 +318,7 @@ async function generateUnifiedService(
import { Cause, Context, Data, Effect, Exit, Option, Runtime } from "effect"
import { Service } from "effect/Effect"
import { Prisma, PrismaClient } from "${clientImportPath}"
import * as runtime from "@prisma/client/runtime/client"

export class PrismaClientService extends Context.Tag("PrismaClientService")<
PrismaClientService,
Expand Down
50 changes: 50 additions & 0 deletions tests/integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
PrismaTransactionClientService,
PrismaUniqueConstraintError,
} from "./prisma/generated/effect";
import { getUsersByName } from "./prisma/generated/sql";

describe("Prisma Effect Generator", () => {
const url = "file:prisma/dev.db";
Expand Down Expand Up @@ -240,4 +241,53 @@ describe("Prisma Effect Generator", () => {
}
}).pipe(Effect.provide(MainLayer)),
);

it.effect("should support $queryRawTyped with TypedSQL", () =>
Effect.gen(function* () {
const prisma = yield* PrismaService;
const email = `typed-sql-test-${Date.now()}@example.com`;

// Create test user
const user = yield* prisma.user.create({
data: { email, name: "TypedSQL Test User" },
});

// Use TypedSQL query
const users = yield* prisma.$queryRawTyped(
getUsersByName("%TypedSQL%"),
);

// Verify result
expect(users.length).toBeGreaterThan(0);
expect(users[0].email).toBeDefined();
expect(users[0].name).toContain("TypedSQL");

// Cleanup
yield* prisma.user.delete({ where: { id: user.id } });
}).pipe(Effect.provide(MainLayer)),
);

it.effect("should support $queryRawTyped within transactions", () =>
Effect.gen(function* () {
const prisma = yield* PrismaService;
const email = `tx-typed-sql-${Date.now()}@example.com`;

yield* prisma.$transaction(
Effect.gen(function* () {
yield* prisma.user.create({
data: { email, name: "Transaction TypedSQL User" },
});

const users = yield* prisma.$queryRawTyped(
getUsersByName("%Transaction TypedSQL%"),
);
expect(users.length).toBe(1);
expect(users[0].name).toBe("Transaction TypedSQL User");
}),
);

// Cleanup
yield* prisma.user.delete({ where: { email } });
}).pipe(Effect.provide(MainLayer)),
);
});
5 changes: 3 additions & 2 deletions tests/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ datasource db {
}

generator client {
provider = "prisma-client"
output = "./generated"
provider = "prisma-client"
output = "./generated"
previewFeatures = ["typedSql"]
}

generator effect {
Expand Down
2 changes: 2 additions & 0 deletions tests/prisma/sql/getUsersByName.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
-- @param {String} $1:namePattern - Pattern to match user names
SELECT id, email, name FROM "User" WHERE name LIKE ?