62 lines
2.3 KiB
JavaScript
62 lines
2.3 KiB
JavaScript
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';
|
|
},
|
|
});
|