import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { test } from "vitest"; import fs from "node:fs/promises"; import path from "node:path"; import { getConfig } from "../src/utils/get-config"; interface TmpDirFixture { tmpdir: string; } async function createTempDir() { const tmpdir = path.join(process.cwd(), "test", "getConfig_test-"); return await fs.mkdtemp(tmpdir); } export const tmpdirTest = test.extend({ tmpdir: async ({}, use) => { const directory = await createTempDir(); await use(directory); await fs.rm(directory, { recursive: true }); }, }); let tmpDir = "."; describe("getConfig", async () => { beforeEach(async () => { const tmp = path.join(process.cwd(), "getConfig_test-"); tmpDir = await fs.mkdtemp(tmp); }); afterEach(async () => { await fs.rm(tmpDir, { recursive: true }); }); it("should resolve resolver type alias", async () => { const authPath = path.join(tmpDir, "server", "auth"); const dbPath = path.join(tmpDir, "server", "db"); await fs.mkdir(authPath, { recursive: true }); await fs.mkdir(dbPath, { recursive: true }); //create dummy tsconfig.json await fs.writeFile( path.join(tmpDir, "tsconfig.json"), `{ "compilerOptions": { /* Path Aliases */ "baseUrl": ".", "paths": { "@server/*": ["./server/*"] } } }`, ); //create dummy auth.ts await fs.writeFile( path.join(authPath, "auth.ts"), `import {betterAuth} from "better-auth"; import {prismaAdapter} from "better-auth/adapters/prisma"; import {db} from "@server/db/db"; export const auth = betterAuth({ database: prismaAdapter(db, { provider: 'sqlite' }), emailAndPassword: { enabled: true, } })`, ); //create dummy db.ts await fs.writeFile( path.join(dbPath, "db.ts"), `class PrismaClient { constructor() {} } export const db = new PrismaClient()`, ); const config = await getConfig({ cwd: tmpDir, configPath: "server/auth/auth.ts", }); expect(config).not.toBe(null); }); it("should resolve direct alias", async () => { const authPath = path.join(tmpDir, "server", "auth"); const dbPath = path.join(tmpDir, "server", "db"); await fs.mkdir(authPath, { recursive: true }); await fs.mkdir(dbPath, { recursive: true }); //create dummy tsconfig.json await fs.writeFile( path.join(tmpDir, "tsconfig.json"), `{ "compilerOptions": { /* Path Aliases */ "baseUrl": ".", "paths": { "prismaDbClient": ["./server/db/db"] } } }`, ); //create dummy auth.ts await fs.writeFile( path.join(authPath, "auth.ts"), `import {betterAuth} from "better-auth"; import {prismaAdapter} from "better-auth/adapters/prisma"; import {db} from "prismaDbClient"; export const auth = betterAuth({ database: prismaAdapter(db, { provider: 'sqlite' }), emailAndPassword: { enabled: true, } })`, ); //create dummy db.ts await fs.writeFile( path.join(dbPath, "db.ts"), `class PrismaClient { constructor() {} } export const db = new PrismaClient()`, ); const config = await getConfig({ cwd: tmpDir, configPath: "server/auth/auth.ts", }); expect(config).not.toBe(null); }); it("should resolve resolver type alias with relative path", async () => { const authPath = path.join(tmpDir, "test", "server", "auth"); const dbPath = path.join(tmpDir, "test", "server", "db"); await fs.mkdir(authPath, { recursive: true }); await fs.mkdir(dbPath, { recursive: true }); //create dummy tsconfig.json await fs.writeFile( path.join(tmpDir, "tsconfig.json"), `{ "compilerOptions": { /* Path Aliases */ "baseUrl": "./test", "paths": { "@server/*": ["./server/*"] } } }`, ); //create dummy auth.ts await fs.writeFile( path.join(authPath, "auth.ts"), `import {betterAuth} from "better-auth"; import {prismaAdapter} from "better-auth/adapters/prisma"; import {db} from "@server/db/db"; export const auth = betterAuth({ database: prismaAdapter(db, { provider: 'sqlite' }), emailAndPassword: { enabled: true, } })`, ); //create dummy db.ts await fs.writeFile( path.join(dbPath, "db.ts"), `class PrismaClient { constructor() {} } export const db = new PrismaClient()`, ); const config = await getConfig({ cwd: tmpDir, configPath: "test/server/auth/auth.ts", }); expect(config).not.toBe(null); }); it("should resolve direct alias with relative path", async () => { const authPath = path.join(tmpDir, "test", "server", "auth"); const dbPath = path.join(tmpDir, "test", "server", "db"); await fs.mkdir(authPath, { recursive: true }); await fs.mkdir(dbPath, { recursive: true }); //create dummy tsconfig.json await fs.writeFile( path.join(tmpDir, "tsconfig.json"), `{ "compilerOptions": { /* Path Aliases */ "baseUrl": "./test", "paths": { "prismaDbClient": ["./server/db/db"] } } }`, ); //create dummy auth.ts await fs.writeFile( path.join(authPath, "auth.ts"), `import {betterAuth} from "better-auth"; import {prismaAdapter} from "better-auth/adapters/prisma"; import {db} from "prismaDbClient"; export const auth = betterAuth({ database: prismaAdapter(db, { provider: 'sqlite' }), emailAndPassword: { enabled: true, } })`, ); //create dummy db.ts await fs.writeFile( path.join(dbPath, "db.ts"), `class PrismaClient { constructor() {} } export const db = new PrismaClient()`, ); const config = await getConfig({ cwd: tmpDir, configPath: "test/server/auth/auth.ts", }); expect(config).not.toBe(null); }); it("should resolve with relative import", async () => { const authPath = path.join(tmpDir, "test", "server", "auth"); const dbPath = path.join(tmpDir, "test", "server", "db"); await fs.mkdir(authPath, { recursive: true }); await fs.mkdir(dbPath, { recursive: true }); //create dummy tsconfig.json await fs.writeFile( path.join(tmpDir, "tsconfig.json"), `{ "compilerOptions": { /* Path Aliases */ "baseUrl": "./test", "paths": { "prismaDbClient": ["./server/db/db"] } } }`, ); //create dummy auth.ts await fs.writeFile( path.join(authPath, "auth.ts"), `import {betterAuth} from "better-auth"; import {prismaAdapter} from "better-auth/adapters/prisma"; import {db} from "../db/db"; export const auth = betterAuth({ database: prismaAdapter(db, { provider: 'sqlite' }), emailAndPassword: { enabled: true, } })`, ); //create dummy db.ts await fs.writeFile( path.join(dbPath, "db.ts"), `class PrismaClient { constructor() {} } export const db = new PrismaClient()`, ); const config = await getConfig({ cwd: tmpDir, configPath: "test/server/auth/auth.ts", }); expect(config).not.toBe(null); }); it("should error with invalid alias", async () => { const authPath = path.join(tmpDir, "server", "auth"); const dbPath = path.join(tmpDir, "server", "db"); await fs.mkdir(authPath, { recursive: true }); await fs.mkdir(dbPath, { recursive: true }); //create dummy tsconfig.json await fs.writeFile( path.join(tmpDir, "tsconfig.json"), `{ "compilerOptions": { /* Path Aliases */ "baseUrl": ".", "paths": { "@server/*": ["./PathIsInvalid/*"] } } }`, ); //create dummy auth.ts await fs.writeFile( path.join(authPath, "auth.ts"), `import {betterAuth} from "better-auth"; import {prismaAdapter} from "better-auth/adapters/prisma"; import {db} from "@server/db/db"; export const auth = betterAuth({ database: prismaAdapter(db, { provider: 'sqlite' }), emailAndPassword: { enabled: true, } })`, ); //create dummy db.ts await fs.writeFile( path.join(dbPath, "db.ts"), `class PrismaClient { constructor() {} } export const db = new PrismaClient()`, ); await expect(() => getConfig({ cwd: tmpDir, configPath: "server/auth/auth.ts" }), ).rejects.toThrowError(); }); });