import fs from "node:fs"; import path from "node:path"; import { defineConfig } from "tsup"; /** * Build del servidor: * - incluye código TS de `modules/*` (buildless) * - consume código ya compilado de `packages/*` * - genera un bundle único ESM en `dist/` */ export default defineConfig({ entry: ["src/index.ts"], // punto de entrada principal format: ["esm"], // ESM nativo (Node 18+) target: "node22", // objetivo de compilación bundle: true, // genera un único bundle, evita imports rotos sourcemap: false, clean: true, minify: false, treeshake: true, dts: false, // opcional, genera .d.ts outDir: "dist", platform: "node", // Paquetes de npm a mantener como externos (no se incluyen en el "bundle") external: [], noExternal: ["@repo", "@erp"], esbuildOptions(options) { // Permite resolver imports sin extensión (.ts, .js, .mjs, etc.) options.resolveExtensions = [".ts", ".js", ".mjs", ".json"]; // Corrige la extensión de salida options.outExtension = { ".js": ".js" }; // Permite usar require en contexto ESM (Node >=18) options.banner = { js: ` import { createRequire } from "module"; const require = createRequire(import.meta.url); `, }; }, // Plugin: fuerza a que los imports relativos se traten como locales, no "external" esbuildPlugins: [ { name: "fix-local-imports", setup(build) { build.onResolve({ filter: /^\.{1,2}\// }, (args) => { const abs = path.resolve(args.resolveDir, args.path); // Si es un directorio, intenta resolver a index.(ts|js) if (fs.existsSync(abs) && fs.statSync(abs).isDirectory()) { const indexTs = path.join(abs, "index.ts"); const indexJs = path.join(abs, "index.js"); if (fs.existsSync(indexTs)) return { path: indexTs, external: false }; if (fs.existsSync(indexJs)) return { path: indexJs, external: false }; } // Si es un fichero con extensión válida const withExts = [".ts", ".js", ".mjs"]; for (const ext of withExts) { if (fs.existsSync(abs + ext)) return { path: abs + ext, external: false }; } return { path: abs, external: false }; }); }, }, ], });