chill-bundles/webpack.config.js

117 lines
3.7 KiB
JavaScript

const Encore = require("@symfony/webpack-encore");
const { resolve, parse } = require("path");
const {existsSync} = require("fs");
const { readdir } = require("fs").promises;
/**
* get the file names inside given directory recursively, limiting to
* a given depth in the recursion
*
* @param string dir the directory
* @param int depth the maximum depth to look into
*/
async function* getFiles(dir, depth, ignored) {
const dirents = await readdir(dir, { withFileTypes: true });
for (const dirent of dirents) {
const res = resolve(dir, dirent.name);
if (dirent.isDirectory()) {
if (depth > 0) {
yield* getFiles(res, depth - 1, ignored);
}
} else if (ignored.includes(res)) {
continue;
} else {
yield res;
}
}
}
/**
* populate the config of encore in directories inside `'./src'` and
* `'./vendor'` and letting them to alter the encore config.
*
* if a file `chill.webpack.config.js` is found, the default function is
* imported and executed. This function receive two arguments:
*
* - `Encore`, the main encore object
* - `chillEntries`: the entries which will be appended to the main `chill` module,
* resulting in a chill.js and chill.css file.
*
*/
async function populateConfig(Encore, chillEntries) {
// chill-main contains some bootstrap that must be loaded first.
// we register them first and, then, store this chill.webpack.config.js file
// into `toIgnore`, ignoring it when we loop on other folders.
let toIgnore = [];
// loop into chill main
for await (const f of getFiles("./src/Bundle/ChillMainBundle/", 1, [])) {
let filename = parse(f).base;
if (filename === "chill.webpack.config.js") {
configure = require(f);
configure(Encore, chillEntries);
toIgnore.push(f);
}
}
// loop into other chill bundles
for await (const f of getFiles("./src/Bundle", 2, toIgnore)) {
let filename = parse(f).base;
if (filename === "chill.webpack.config.js") {
configure = require(f);
configure(Encore, chillEntries);
}
}
}
// export the final configuration
module.exports = (async () => {
// Manually configure the runtime environment if not already configured yet by the "encore" command.
// It's useful when you use tools that rely on webpack.config.js file.
if (!Encore.isRuntimeEnvironmentConfigured()) {
Encore.configureRuntimeEnvironment(process.env.NODE_ENV || "dev");
}
// basic encore configuration
Encore.setOutputPath("public/build/")
.setPublicPath("/build")
.enableSassLoader()
.enableVueLoader(() => {}, {
version: 3,
})
.enableTypeScriptLoader(function (tsConfig) {
tsConfig.appendTsSuffixTo = [/\.vue$/];
tsConfig.appendTsxSuffixTo = [/\.vue$/];
// temporary fix for https://github.com/vuejs/vue-loader/issues/1915 and https://github.com/vuejs/core/issues/2855
tsConfig.compilerOptions = { strict: !Encore.isProduction() };
tsConfig.silent = false;
})
//.enableForkedTypeScriptTypesChecking()
.autoProvidejQuery()
.enableSourceMaps(!Encore.isProduction())
.cleanupOutputBeforeBuild()
//.enableBuildNotifications()
.enableVersioning()
.enableSingleRuntimeChunk()
.splitEntryChunks();
// populate config with chill entries
let chillEntries = [];
await populateConfig(Encore, chillEntries);
Encore.addAliases({
translator: resolve(__dirname, './assets/translator'),
"@symfony/ux-translator": resolve(__dirname, './vendor/symfony/ux-translator/assets'),
});
//getting the encore config and appending chill entries
config = Encore.getWebpackConfig();
config.entry.chill = chillEntries;
if (!Encore.isProduction()) {
console.log(config);
config.devtool = "eval-source-map";
}
return config;
})();