diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4bf131f..8288812 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b with: node-version: lts/* - - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 + - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 name: Load Yarn cache with: path: ${{ steps.yarn-cache.outputs.dir }} diff --git a/jest.config.unit.json b/jest.config.unit.json index 2e3ab93..758a48c 100644 --- a/jest.config.unit.json +++ b/jest.config.unit.json @@ -4,5 +4,6 @@ "coverageReporters": [["json", { "file": "coverage.unit.json" }]], "preset": "ts-jest/presets/js-with-ts", "testEnvironment": "node", - "testMatch": ["/src/*.test.[jt]s?(x)"] + "testMatch": ["/src/**/*.test.[jt]s?(x)"], + "testPathIgnorePatterns": ["/src/tests/"] } diff --git a/src/generator/main.ts b/src/generator/main.ts index 5f630a7..45eb070 100644 --- a/src/generator/main.ts +++ b/src/generator/main.ts @@ -2,10 +2,10 @@ import { generatorHandler } from '@prisma/generator-helper' import fs from 'node:fs/promises' -import path from 'path/posix' import { analyseDMMF } from '../dmmf' import { generateIndex } from './generateIndex' import { generateModel } from './generateModel' +import { getPrismaClientModule } from './prismaModule' export interface Config { concurrently?: boolean @@ -43,11 +43,10 @@ generatorHandler({ const prismaClientOutput = prismaClient.output?.value ?? 'node_modules/@prisma/client' - const prismaClientModule = prismaClientOutput.endsWith( - 'node_modules/@prisma/client' + const prismaClientModule = getPrismaClientModule( + prismaClientOutput, + outputDir ) - ? '@prisma/client' - : path.relative(outputDir, prismaClientOutput) const longestModelNameLength = Object.keys(validModels).reduce( (max, model) => Math.max(max, model.length), diff --git a/src/generator/prismaModule.test.ts b/src/generator/prismaModule.test.ts new file mode 100644 index 0000000..7dbcce0 --- /dev/null +++ b/src/generator/prismaModule.test.ts @@ -0,0 +1,41 @@ +import path from "path/posix"; +import { getPrismaClientModule } from "./prismaModule"; + +describe("getPrismaClientModule", () => { + it('returns "@prisma/client" when prismaClientOutput ends with node_modules/@prisma/client (forward slashes)', () => { + const prismaClientOutput = "/some/project/node_modules/@prisma/client"; + const outputDir = "/some/project/src"; + expect(getPrismaClientModule(prismaClientOutput, outputDir)).toBe( + "@prisma/client" + ); + }); + + it('returns "@prisma/client" when prismaClientOutput ends with node_modules\\@prisma\\client (backslashes)', () => { + const prismaClientOutput = + "C:\\some\\project\\node_modules\\@prisma\\client"; + const outputDir = "C:\\some\\project\\src"; + expect(getPrismaClientModule(prismaClientOutput, outputDir)).toBe( + "@prisma/client" + ); + }); + + it("returns relative path with forward slashes if not in node_modules", () => { + const prismaClientOutput = "/some/project/generated/prisma-client"; + const outputDir = "/some/project/src"; + const expected = path + .relative(outputDir, prismaClientOutput) + .replace(/\\/g, "/"); + expect(getPrismaClientModule(prismaClientOutput, outputDir)).toBe(expected); + }); + + it("returns relative path with forward slashes if not in node_modules (windows paths)", () => { + const prismaClientOutput = "C:\\some\\project\\generated\\prisma-client"; + const outputDir = "C:\\some\\project\\src"; + const expected = path + .relative(outputDir, prismaClientOutput) + .replace(/\\/g, "/"); + expect(getPrismaClientModule(prismaClientOutput, outputDir)).toBe(expected); + }); +}); + +// We recommend installing an extension to run jest tests. diff --git a/src/generator/prismaModule.ts b/src/generator/prismaModule.ts new file mode 100644 index 0000000..63e2f19 --- /dev/null +++ b/src/generator/prismaModule.ts @@ -0,0 +1,19 @@ +import path from 'path/posix' + +export function getPrismaClientModule( + prismaClientOutput: string, + outputDir: string +): string { + // Normalize to forward slashes for consistent detection and import path + const normalizedPrismaClientOutput = prismaClientOutput.replace(/\\/g, '/') + let prismaClientModule: string + if (normalizedPrismaClientOutput.endsWith('node_modules/@prisma/client')) { + prismaClientModule = '@prisma/client' + } else { + // Always use forward slashes in import paths + prismaClientModule = path + .relative(outputDir, prismaClientOutput) + .replace(/\\/g, '/') + } + return prismaClientModule +}