/** * باندل تک‌فایل برای Docker (release/app.js) بعد از nest build. * Prisma client + engines را کنار app.js کپی می‌کند تا روی Alpine بدون npm کار کند. */ const esbuild = require('esbuild'); const { existsSync, mkdirSync, rmSync, cpSync, realpathSync, } = require('fs'); const path = require('path'); const root = path.join(__dirname, '..'); const config = require(path.join(root, 'esbuild.release.config.cjs')); const releaseDir = path.join(root, 'release'); function resolvePkg(name) { return path.dirname(require.resolve(`${name}/package.json`, { paths: [root] })); } function copyPrismaIntoRelease() { const prismaClientSrc = resolvePkg('@prisma/client'); const prismaClientDest = path.join(releaseDir, 'node_modules', '@prisma', 'client'); mkdirSync(path.dirname(prismaClientDest), { recursive: true }); cpSync(prismaClientSrc, prismaClientDest, { recursive: true }); // .prisma/client lives next to @prisma/client in pnpm layout (or under node_modules/.prisma) const candidates = [ path.join(root, 'node_modules', '.prisma', 'client'), path.join(prismaClientSrc, '..', '.prisma', 'client'), path.join(path.dirname(prismaClientSrc), '.prisma', 'client'), ]; let prismaEngineSrc = candidates.find((p) => existsSync(p)); if (!prismaEngineSrc) { // pnpm: @prisma/client -> .../node_modules/@prisma/client ; .prisma is sibling under node_modules const nm = path.join(prismaClientSrc, '..', '..', '.prisma', 'client'); if (existsSync(nm)) prismaEngineSrc = nm; } if (!prismaEngineSrc) { throw new Error( 'Prisma generated client (.prisma/client) یافت نشد. ابتدا: pnpm --filter api exec prisma generate', ); } const prismaEngineDest = path.join(releaseDir, 'node_modules', '.prisma', 'client'); mkdirSync(path.dirname(prismaEngineDest), { recursive: true }); cpSync(realpathSync(prismaEngineSrc), prismaEngineDest, { recursive: true }); } async function main() { const entry = config.entryPoints[0]; const fallbackEntry = path.join(root, 'dist', 'src', 'main.js'); if (!existsSync(entry)) { if (existsSync(fallbackEntry)) { config.entryPoints = [fallbackEntry]; } else { console.error('dist/main.js یافت نشد. ابتدا اجرا کنید: pnpm --filter api build'); process.exit(1); } } rmSync(releaseDir, { recursive: true, force: true }); mkdirSync(releaseDir, { recursive: true }); await esbuild.build(config); copyPrismaIntoRelease(); console.log('نوشت:', config.outfile); console.log('Prisma client در release/node_modules کپی شد.'); } main().catch((err) => { console.error(err); process.exit(1); });