|
| 1 | +const fs = require('fs'); |
| 2 | +const path = require('path'); |
| 3 | + |
| 4 | +const assets = [ |
| 5 | + // Original assets |
| 6 | + { src: 'node_modules/sortablejs/Sortable.min.js', dest: 'js/sortable.min.js' }, |
| 7 | + { src: 'node_modules/tiny-markdown-editor/dist/tiny-mde.min.js', dest: 'js/tiny-mde.min.js' }, |
| 8 | + { src: 'node_modules/tiny-markdown-editor/dist/tiny-mde.min.css', dest: 'css/tiny-mde.min.css' }, |
| 9 | + |
| 10 | + // Safe Vendor assets (to fix the White Screen of Death / WAF node_modules blocks) |
| 11 | + { src: 'node_modules/alpinejs/dist/cdn.min.js', dest: 'js/vendor/alpine.min.js' }, |
| 12 | + { src: 'node_modules/@alpinejs/collapse/dist/cdn.min.js', dest: 'js/vendor/alpine-collapse.min.js' }, |
| 13 | + { src: 'node_modules/flowbite/dist/flowbite.min.js', dest: 'js/vendor/flowbite.min.js' }, |
| 14 | + { src: 'node_modules/htmx.org/dist/htmx.min.js', dest: 'js/vendor/htmx.min.js' }, |
| 15 | + { src: 'node_modules/htmx-ext-preload/dist/preload.min.js', dest: 'js/vendor/htmx-preload.min.js' }, |
| 16 | + { src: 'node_modules/animate.css/animate.min.css', dest: 'css/vendor/animate.min.css' }, |
| 17 | + { src: 'node_modules/bowser/bundled.js', dest: 'js/vendor/bowser.min.js' }, |
| 18 | + { src: 'node_modules/inapp-spy/dist/index.global.js', dest: 'js/vendor/inapp-spy.min.js' } |
| 19 | +]; |
| 20 | + |
| 21 | +const isProduction = process.env.NODE_ENV === 'production' || process.env.DOCKER_BUILD === 'true'; |
| 22 | + |
| 23 | +console.log('📦 Starting cross-platform asset copy...'); |
| 24 | + |
| 25 | +assets.forEach(asset => { |
| 26 | + const srcPath = path.resolve(__dirname, asset.src); |
| 27 | + const destPath = path.resolve(__dirname, asset.dest); |
| 28 | + |
| 29 | + if (!fs.existsSync(srcPath)) { |
| 30 | + if (isProduction) { |
| 31 | + console.error(`❌ CRITICAL: Source file missing for production build: ${asset.src}`); |
| 32 | + process.exit(1); // Fails the build pipeline safely |
| 33 | + } else { |
| 34 | + console.warn(`⚠️ Warning: Source file not found: ${asset.src}. Skipping in dev mode.`); |
| 35 | + return; |
| 36 | + } |
| 37 | + } |
| 38 | + |
| 39 | + // Ensure destination directory exists |
| 40 | + const destDir = path.dirname(destPath); |
| 41 | + if (!fs.existsSync(destDir)) { |
| 42 | + fs.mkdirSync(destDir, { recursive: true }); |
| 43 | + } |
| 44 | + |
| 45 | + try { |
| 46 | + fs.copyFileSync(srcPath, destPath); |
| 47 | + console.log(`✓ Copied ${asset.src} -> ${asset.dest}`); |
| 48 | + } catch (err) { |
| 49 | + console.error(`❌ Failed to copy ${asset.src}:`, err); |
| 50 | + process.exit(1); |
| 51 | + } |
| 52 | +}); |
| 53 | + |
| 54 | +console.log('✨ All assets copied successfully!'); |
0 commit comments