mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
122 lines
4.0 KiB
JavaScript
122 lines
4.0 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(function (options) {
|
||
// If set to true, Sass won’t 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;
|
||
})();
|