/* * Common Environment */ const INDEX_NAME = 'app'; const YML_PATH = './webpack.yml'; const CONF_VAR = 'A2nt\\CMSNiceties\\Templates\\WebpackTemplateProvider'; const path = require('path'); const fs = require('fs'); const yaml = require('js-yaml'); const webpack = require('webpack'); /* * Load webpack configuration from webpack.yml */ const yml = yaml.load( fs.readFileSync(path.join(__dirname, YML_PATH), 'utf8'), ); const conf = yml[CONF_VAR]; let themes = []; // add themes if (conf.THEMESDIR) { const themeDir = conf.THEMESDIR; const dir = path.resolve(__dirname, themeDir); if (fs.existsSync(dir)) { fs.readdirSync(dir).forEach((file) => { filePath = path.join(themeDir, file); const stat = fs.statSync(filePath); if (stat && stat.isDirectory()) { themes.push(filePath); } }); } } /* Setup Entries */ const includes = {}; const modules = [ path.resolve(__dirname, conf.APPDIR, conf.SRC), path.resolve(__dirname, conf.APPDIR, conf.SRC, 'js'), path.resolve(__dirname, conf.APPDIR, conf.SRC, 'scss'), path.resolve(__dirname, conf.APPDIR, conf.SRC, 'img'), path.resolve(__dirname, conf.APPDIR, conf.SRC, 'thirdparty'), path.resolve(__dirname, 'node_modules'), path.resolve(__dirname), path.resolve(__dirname, 'public'), ]; const _addAppFiles = (theme) => { const dirPath = './' + theme; let themeName = path.basename(theme); if (themeName == '.') { themeName = 'app'; } if (fs.existsSync(path.join(dirPath, conf.SRC, 'js', INDEX_NAME + '.js'))) { includes[`${themeName}`] = path.join(dirPath, conf.SRC, 'js', INDEX_NAME + '.js'); } else if ( fs.existsSync(path.join(dirPath, conf.SRC, 'scss', INDEX_NAME + '.scss')) ) { includes[`${themeName}`] = path.join( dirPath, conf.SRC, 'scss', INDEX_NAME + '.scss', ); } modules.push(path.join(dirPath, conf.SRC, 'js')); modules.push(path.join(dirPath, conf.SRC, 'scss')); modules.push(path.join(dirPath, conf.SRC, 'img')); modules.push(path.join(dirPath, conf.SRC, 'thirdparty')); const _getAllFilesFromFolder = function (dir, includeSubFolders = true) { const dirPath = path.resolve(__dirname, dir); let results = []; fs.readdirSync(dirPath).forEach((file) => { if (file.charAt(0) === '_') { return; } const filePath = path.join(dirPath, file); const stat = fs.statSync(filePath); if (stat && stat.isDirectory() && includeSubFolders) { results = results.concat( _getAllFilesFromFolder(filePath, includeSubFolders), ); } else { results.push(filePath); } }); return results; }; // add page specific scripts const typesJSPath = path.join(theme, conf.TYPESJS); if (fs.existsSync(typesJSPath)) { const pageScripts = _getAllFilesFromFolder(typesJSPath, true); pageScripts.forEach((file) => { includes[`${themeName}_${path.basename(file, '.js')}`] = file; }); } // add page specific scss const typesSCSSPath = path.join(theme, conf.TYPESSCSS); if (fs.existsSync(typesSCSSPath)) { const scssIncludes = _getAllFilesFromFolder(typesSCSSPath, true); scssIncludes.forEach((file) => { includes[`${themeName}_${path.basename(file, '.scss')}`] = file; }); } }; _addAppFiles(conf.APPDIR); // add themes themes.forEach((theme) => { _addAppFiles(theme); }); module.exports = { configuration: conf, themes: themes, webpack: { entry: includes, externals: { // comment out jQuery if you don't use it to prevent bootstrap thinking that there's jQuery present jquery: 'jQuery', react: 'React', 'react-dom': 'ReactDOM', }, resolve: { modules: modules, extensions: ['.tsx', '.ts', '.js'], alias: { // comment out jQuery if you don't use it to prevent bootstrap thinking that there's jQuery present 'window.jQuery': require.resolve('jquery'), $: require.resolve('jquery'), jquery: require.resolve('jquery'), jQuery: require.resolve('jquery'), //react: require.resolve('react'), //'react-dom': require.resolve('react-dom'), }, fallback: { path: false, }, }, experiments: { topLevelAwait: true, }, }, };