// Build client : TypeScript (+ .html/.scss par vue) -> client/dist, via // esbuild. Script à la main plutôt qu'un outil plus lourd (Vite, webpack) : // le client reste pour l'instant minimal, et esbuild suffit - y compris // pour le Sass (voir le plugin ci-dessous, qui délègue à `sass` puis laisse // esbuild regrouper le CSS résultant, importé depuis le JS, dans un // app.css voisin). // // Usage : node build.mjs [--watch] // npm run build -> build unique (celui lancé par server/Dockerfile) // npm run watch -> reconstruit à chaque sauvegarde, pour le dev local import { copyFileSync, mkdirSync } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import * as esbuild from 'esbuild'; import * as sass from 'sass'; const here = path.dirname(fileURLToPath(import.meta.url)); const outdir = path.join(here, 'dist'); mkdirSync(outdir, { recursive: true }); copyFileSync(path.join(here, 'src', 'index.html'), path.join(outdir, 'index.html')); /** Plugin esbuild : compile les imports `.scss` en CSS via le paquet `sass`. */ const sassPlugin = { name: 'sass', setup(build) { build.onLoad({ filter: /\.scss$/ }, async (args) => { const result = await sass.compileAsync(args.path); return { contents: result.css, loader: 'css' }; }); }, }; const buildOptions = { entryPoints: [path.join(here, 'src', 'app.ts')], outfile: path.join(outdir, 'app.js'), bundle: true, format: 'esm', target: 'es2022', sourcemap: true, // Chaque vue importe son propre gabarit comme chaîne brute (`import html // from './Vue.html'` - voir global.d.ts) et son propre style Sass ; les // styles sont regroupés automatiquement par esbuild dans app.css. loader: { '.html': 'text' }, plugins: [sassPlugin], }; const watch = process.argv.includes('--watch'); if (watch) { const ctx = await esbuild.context(buildOptions); await ctx.watch(); console.log('[youtubedownloader-client] watching for changes...'); } else { await esbuild.build(buildOptions); console.log('[youtubedownloader-client] built to client/dist'); }