Add addons support to webpack [SCI-7926]

This commit is contained in:
Anton 2023-03-30 14:22:42 +02:00
parent ed1c4bcb69
commit 07f4156f9b

View file

@ -4,37 +4,76 @@ const { VueLoaderPlugin } = require('vue-loader');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const RemoveEmptyScriptsPlugin = require('webpack-remove-empty-scripts');
const NodePolyfillPlugin = require('node-polyfill-webpack-plugin');
const { execSync } = require('child_process');
const { basename, resolve } = require('path');
const { readdirSync } = require('fs');
const mode = process.env.NODE_ENV === 'development' ? 'development' : 'production';
var entryList = {
application_pack: './app/javascript/packs/application.js',
emoji_button: './app/javascript/packs/emoji_button.js',
fonts: './app/javascript/packs/fonts.js',
fontawesome: './app/javascript/packs/fontawesome.scss',
prism: './app/javascript/packs/prism.js',
tiny_mce: './app/javascript/packs/tiny_mce.js',
tiny_mce_styles: './app/javascript/packs/tiny_mce_styles.scss',
tui_image_editor: './app/javascript/packs/tui_image_editor.js',
tui_image_editor_styles: './app/javascript/packs/tui_image_editor_styles.scss',
croppie: './app/javascript/packs/custom/croppie.js',
croppie_styles: './app/javascript/packs/custom/croppie_styles.scss',
inputmask: './app/javascript/packs/custom/inputmask.js',
pdfjs: './app/javascript/packs/pdfjs/pdf_js.js',
pdf_js_styles: './app/javascript/packs/pdfjs/pdf_js_styles.scss',
pdf_js: './app/javascript/packs/pdfjs/pdf_js.js',
pdf_js_worker: './app/javascript/packs/pdfjs/pdf_js_worker.js',
vue_bmt_filter: './app/javascript/packs/vue/bmt_filter.js',
vue_label_template: './app/javascript/packs/vue/label_template.js',
vue_protocol: './app/javascript/packs/vue/protocol.js',
vue_repository_filter: './app/javascript/packs/vue/repository_filter.js',
vue_repository_print_modal: './app/javascript/packs/vue/repository_print_modal.js',
vue_navigation_top_menu: './app/javascript/packs/vue/navigation/top_menu.js'
}
// Engine pack loading based on https://github.com/rails/webpacker/issues/348#issuecomment-635480949
// Get paths to all engines' folders
console.log('Including packs from addons...');
let enginePaths = [];
try {
enginePaths = execSync('ls -d $PWD/addons/*').toString().split('\n').filter((p) => !!p);
} catch {
console.log('Unable to find any addons.');
}
enginePaths.forEach((path) => {
const packsFolderPath = `${path}/app/javascript/packs`;
let entryFiles;
try {
entryFiles = readdirSync(packsFolderPath);
console.log(`Found packs in ${path}`);
} catch {
console.log(`No packs in ${path}`);
return;
}
entryFiles.forEach((file) => {
// File name without .js
const name = basename(file, '.js');
const entryPath = `${packsFolderPath}/${file}`;
entryList[name] = entryPath;
});
});
module.exports = {
mode,
optimization: {
moduleIds: 'deterministic'
},
entry: {
application_pack: './app/javascript/packs/application.js',
emoji_button: './app/javascript/packs/emoji_button.js',
fonts: './app/javascript/packs/fonts.js',
fontawesome: './app/javascript/packs/fontawesome.scss',
prism: './app/javascript/packs/prism.js',
tiny_mce: './app/javascript/packs/tiny_mce.js',
tiny_mce_styles: './app/javascript/packs/tiny_mce_styles.scss',
tui_image_editor: './app/javascript/packs/tui_image_editor.js',
tui_image_editor_styles: './app/javascript/packs/tui_image_editor_styles.scss',
croppie: './app/javascript/packs/custom/croppie.js',
croppie_styles: './app/javascript/packs/custom/croppie_styles.scss',
inputmask: './app/javascript/packs/custom/inputmask.js',
pdfjs: './app/javascript/packs/pdfjs/pdf_js.js',
pdf_js_styles: './app/javascript/packs/pdfjs/pdf_js_styles.scss',
pdf_js: './app/javascript/packs/pdfjs/pdf_js.js',
pdf_js_worker: './app/javascript/packs/pdfjs/pdf_js_worker.js',
vue_bmt_filter: './app/javascript/packs/vue/bmt_filter.js',
vue_label_template: './app/javascript/packs/vue/label_template.js',
vue_protocol: './app/javascript/packs/vue/protocol.js',
vue_repository_filter: './app/javascript/packs/vue/repository_filter.js',
vue_repository_print_modal: './app/javascript/packs/vue/repository_print_modal.js',
vue_navigation_top_menu: './app/javascript/packs/vue/navigation/top_menu.js'
},
entry: entryList,
output: {
filename: '[name].js',
sourceMapFilename: '[file].map',