/* * Copyright (C) 2024-present Puter Technologies Inc. * * This file is part of Puter. * * Puter is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ const fs = require('fs'); const path = require('path'); const uglifyjs = require('uglify-js'); const webpack = require('webpack'); module.exports = async ({ dir, options }) => { let prefix_text = ''; prefix_text += `window.gui_env="${options.env}";\n`; // ----------------------------------------------- // Combine all images into a single js file // ----------------------------------------------- { let icons = 'window.icons = [];\n'; fs.readdirSync(dir).forEach(file => { // skip dotfiles if ( file.startsWith('.') ) { return; } // load image let buff = new Buffer.from(fs.readFileSync(`${dir }/${ file}`)); // convert to base64 let base64data = buff.toString('base64'); // add to `window.icons` if ( file.endsWith('.png') ) { icons += `window.icons['${file}'] = "data:image/png;base64,${base64data}";\n`; } else if ( file.endsWith('.svg') ) { icons += `window.icons['${file}'] = "data:image/svg+xml;base64,${base64data}";\n`; } }); prefix_text += `${icons }\n`; } // ----------------------------------------------- // Concat/merge the JS libraries and save them to ./dist/libs.js // ----------------------------------------------- { const lib_paths = require('./libPaths.cjs'); let js = ''; for ( let i = 0; i < lib_paths.length; i++ ) { const file = path.join(__dirname, '../src/lib/', lib_paths[i]); // js if ( file.endsWith('.js') && !file.endsWith('.min.js') ) { let minified_code = await uglifyjs.minify(fs.readFileSync(file).toString(), { mangle: false }); if ( minified_code && minified_code.code ) { js += minified_code.code; if ( options?.verbose ) { console.log('minified: ', file); } } } else { js += fs.readFileSync(file); if ( options?.verbose ) { console.log('skipped minification: ', file); } } js += '\n\n\n'; } prefix_text += js; } return new webpack.BannerPlugin({ banner: prefix_text, raw: true, }); };