Files
wizarr/app/static/copy-assets.js
Matthieu B 42fdbae8bb Bundle external frontend assets (#1320)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-07-05 18:32:29 +02:00

56 lines
2.4 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const assets = [
// Original assets
{ src: 'node_modules/sortablejs/Sortable.min.js', dest: 'js/sortable.min.js' },
{ src: 'node_modules/tiny-markdown-editor/dist/tiny-mde.min.js', dest: 'js/tiny-mde.min.js' },
{ src: 'node_modules/tiny-markdown-editor/dist/tiny-mde.min.css', dest: 'css/tiny-mde.min.css' },
// Safe Vendor assets (to fix the White Screen of Death / WAF node_modules blocks)
{ src: 'node_modules/alpinejs/dist/cdn.min.js', dest: 'js/vendor/alpine.min.js' },
{ src: 'node_modules/@alpinejs/collapse/dist/cdn.min.js', dest: 'js/vendor/alpine-collapse.min.js' },
{ src: 'node_modules/flowbite/dist/flowbite.min.js', dest: 'js/vendor/flowbite.min.js' },
{ src: 'node_modules/htmx.org/dist/htmx.min.js', dest: 'js/vendor/htmx.min.js' },
{ src: 'node_modules/htmx-ext-preload/dist/preload.min.js', dest: 'js/vendor/htmx-preload.min.js' },
{ src: 'node_modules/animate.css/animate.min.css', dest: 'css/vendor/animate.min.css' },
{ src: 'node_modules/animejs/lib/anime.min.js', dest: 'js/vendor/anime.min.js' },
{ src: 'node_modules/bowser/bundled.js', dest: 'js/vendor/bowser.min.js' },
{ src: 'node_modules/inapp-spy/dist/index.global.js', dest: 'js/vendor/inapp-spy.min.js' }
];
const isProduction = process.env.NODE_ENV === 'production' || process.env.DOCKER_BUILD === 'true';
console.log('📦 Starting cross-platform asset copy...');
assets.forEach(asset => {
const srcPath = path.resolve(__dirname, asset.src);
const destPath = path.resolve(__dirname, asset.dest);
if (!fs.existsSync(srcPath)) {
if (isProduction) {
console.error(`❌ CRITICAL: Source file missing for production build: ${asset.src}`);
process.exit(1); // Fails the build pipeline safely
} else {
console.warn(`⚠️ Warning: Source file not found: ${asset.src}. Skipping in dev mode.`);
return;
}
}
// Ensure destination directory exists
const destDir = path.dirname(destPath);
if (!fs.existsSync(destDir)) {
fs.mkdirSync(destDir, { recursive: true });
}
try {
fs.copyFileSync(srcPath, destPath);
console.log(`✓ Copied ${asset.src} -> ${asset.dest}`);
} catch (err) {
console.error(`❌ Failed to copy ${asset.src}:`, err);
process.exit(1);
}
});
console.log('✨ All assets copied successfully!');