chill-bundles/webpack.config.js

122 lines
4.0 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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(function (options) {
// If set to true, Sass wont print warnings that are caused by dependencies (like bootstrap):
// https://sass-lang.com/documentation/js-api/interfaces/options/#quietDeps
options.sassOptions.quietDeps = true;
options.sassOptions.silenceDeprecations = ['import'];
})
.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;
})();