postbuild-server.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /**
  2. * Post-build script for server compilation.
  3. *
  4. * tspc compiles both `src/` and `config/` (TypeScript files under config/),
  5. * so the output directory (`transpiled/`) mirrors the source tree structure
  6. * (e.g. `transpiled/src/`, `transpiled/config/`).
  7. *
  8. * Setting `rootDir: "src"` and `outDir: "dist"` in tsconfig would eliminate this script,
  9. * but that would break once `config/` is included in the compilation.
  10. *
  11. * This script:
  12. * 1. Extracts `transpiled/src/` into `dist/`
  13. * 2. Copies compiled `transpiled/config/` files into `config/` so that
  14. * relative imports from `dist/` (e.g. `../../../config/logger/config.dev`)
  15. * resolve correctly at runtime.
  16. */
  17. import { cpSync, existsSync, readdirSync, renameSync, rmSync } from 'node:fs';
  18. const TRANSPILED_DIR = 'transpiled';
  19. const DIST_DIR = 'dist';
  20. const SRC_SUBDIR = `${TRANSPILED_DIR}/src`;
  21. const CONFIG_SUBDIR = `${TRANSPILED_DIR}/config`;
  22. const PRISMA_SRC_DIR = 'src/generated/prisma';
  23. const PRISMA_DIST_DIR = `${DIST_DIR}/generated/prisma`;
  24. // List transpiled contents for debugging
  25. // biome-ignore lint/suspicious/noConsole: This is a build script, console output is expected.
  26. console.log('Listing files under transpiled:');
  27. // biome-ignore lint/suspicious/noConsole: This is a build script, console output is expected.
  28. console.log(readdirSync(TRANSPILED_DIR).join('\n'));
  29. // Remove old dist
  30. rmSync(DIST_DIR, { recursive: true, force: true });
  31. // Move transpiled/src -> dist
  32. renameSync(SRC_SUBDIR, DIST_DIR);
  33. // Copy compiled config files to app root config/ so runtime imports resolve
  34. if (existsSync(CONFIG_SUBDIR)) {
  35. cpSync(CONFIG_SUBDIR, 'config', { recursive: true, force: true });
  36. }
  37. // Remove leftover transpiled directory
  38. rmSync(TRANSPILED_DIR, { recursive: true, force: true });
  39. // Copy Prisma native engine binaries from src to dist.
  40. // tspc only compiles TypeScript files, so .so.node engine files must be copied manually.
  41. if (existsSync(PRISMA_SRC_DIR)) {
  42. // biome-ignore lint/suspicious/noConsole: This is a build script, console output is expected.
  43. console.log(
  44. `Copying Prisma engine files from ${PRISMA_SRC_DIR} to ${PRISMA_DIST_DIR}...`,
  45. );
  46. const engineFiles = readdirSync(PRISMA_SRC_DIR).filter((f) =>
  47. f.endsWith('.node'),
  48. );
  49. for (const file of engineFiles) {
  50. cpSync(`${PRISMA_SRC_DIR}/${file}`, `${PRISMA_DIST_DIR}/${file}`);
  51. // biome-ignore lint/suspicious/noConsole: This is a build script, console output is expected.
  52. console.log(` Copied: ${file}`);
  53. }
  54. }