import { defineConfig } from 'tsup'; import { readFileSync, readdirSync, statSync } from 'node:fs'; import { join } from 'node:path'; const pkg = JSON.parse(readFileSync('./package.json', 'utf8')); // Les self-imports @zen/core/* restent toujours externes — ils pointent vers // d'autres points d'entrée du même package, jamais vers des fichiers internes. const selfImports = Object.keys(pkg.exports) .filter(k => k !== '.' && !k.endsWith('.css')) .map(k => '@zen/core' + k.slice(1)); // Tous les fichiers source .js et .jsx sont compilés en module standalone // (bundle: false). Chaque fichier est transpilé individuellement ; les imports // relatifs sont préservés tels quels dans le dist. // // Pourquoi bundle: false pour tout ? // - Les fichiers *.server.js et *.client.js doivent rester des modules séparés // pour que Next.js respecte les frontières RSC / 'use client'. // - Les modules de registre (registry.js, etc.) sont des singletons : si un // barrel comme index.js bundlait registry.js avec bundle: true, il en ferait // une copie inline distincte de la version importée en relatif par les pages // et widgets — deux instances, zéro partage d'état. // - Tous les fichiers doivent exister dans dist pour que les imports relatifs // des fichiers *.server.js/*.client.js (compilés sans bundling) puissent être // résolus à l'exécution. // // La liste des points d'entrée publics reste définie dans package.json#exports. // Modifier un export public = éditer seulement package.json#exports. function walk(dir, out = []) { for (const name of readdirSync(dir)) { const full = join(dir, name); if (statSync(full).isDirectory()) walk(full, out); else if (/\.(js|jsx)$/.test(name)) out.push(full); } return out; } const SHARED_EXTERNALS = [ 'react', 'react-dom', 'next', 'pg', 'dotenv', 'dotenv/config', 'resend', 'node-cron', '@react-email/components', '@aws-sdk/client-s3', '@aws-sdk/s3-request-presigner', 'readline', 'crypto', 'url', 'fs', 'path', 'net', 'dns', 'tls', ...selfImports, ]; export default defineConfig({ entry: walk('src'), format: ['esm'], dts: false, splitting: false, sourcemap: false, clean: true, bundle: false, external: SHARED_EXTERNALS, esbuildOptions(o) { o.loader = { '.js': 'jsx', '.jsx': 'jsx' }; o.jsx = 'automatic'; o.outbase = 'src'; }, });