ldc-boutique-cnc/webpack.mix.js
2023-07-07 17:56:39 +02:00

126 lines
3.3 KiB
JavaScript
Vendored

const path = require("path");
const fs = require("fs");
const glob = require("glob");
const mix = require("laravel-mix");
require("laravel-mix-artisan-publish");
require("laravel-mix-polyfill");
require("laravel-mix-clean");
require("laravel-mix-eslint");
require("laravel-mix-stylelint");
const assetDir = "assets";
const polyfill = {
enabled: true,
bugfixes: true,
useBuiltIns: "usage",
targets: "last 3 version, not dead, >0.3%",
};
mix.setPublicPath(path.normalize('public/build'));
mix.setResourceRoot('/build');
mix.webpackConfig({
resolve: {
extensions: ["*",".js", ".vue", ".ts"],
alias: {
"@Theme": path.resolve(`resources/theme/assets`),
"@": path.resolve("resources/assets"),
vue$: "vue/dist/vue.runtime.esm-bundler.js",
},
},
module: {
rules: [
{
test: /\.ts$/,
loader: "ts-loader",
options: {
appendTsSuffixTo: [/\.vue$/],
},
},
{
test: /\.vue$/,
loader: "vue-loader",
options: {
esModule: true,
comment: true
},
},
],
},
// Pour debug compilation errors
// stats: {
// children: true,
// warningsFilter: [/\-\-underline\-color/],
// },
});
mix.options({
fileLoaderDirs: {
fonts: `${assetDir}/fonts`,
images: `${assetDir}/images`,
},
postCss: [
require("postcss-discard-comments")({
removeAll: true,
}),
],
});
mix.clean({
cleanOnceBeforeBuildPatterns: [
"*",
],
});
// * COMMON
mix.vue({
runtimeOnly: true,
extractStyles: "css/v-extract.css",
globalStyles: false,
})
.eslint({
fix: true,
extensions: ["js", "ts"],
})
.stylelint({
configFile: ".stylelintrc.json",
files: ["**/*.scss"],
})
.polyfill(polyfill)
.version()
.sourceMaps(false, "inline-source-map")
// * FRONT compilation
.ts("resources/theme/ts/app.ts", "theme/js", { transpileOnly: true })
.sass("resources/theme/sass/app.scss", "theme/css")
// * FRONT MAIL compilation
.sass("resources/theme/sass/mail-theme.scss", "theme/css/mail/html/themes/default.css")
// * BACK Engine compilation
.ts("resources/ts/bo.ts", "back/js", { transpileOnly: true })
.sass("resources/sass/bo.scss", "back/css");
mix.publish({
provider: "Alexusmai\\LaravelFileManager\\FileManagerServiceProvider",
tag: "fm-assets",
path: "artisan",
force: true,
});
// ! Écrasement possible des resources back par front.
// * Copy BACK resources
mix.copyDirectory("resources/assets/images", `public/build/assets/images`)
.copyDirectory("resources/assets/fonts", `public/build/assets/fonts`);
// * Copy FRONT resources
mix.copyDirectory("resources/theme/assets/images", `public/build/assets/images`)
.copyDirectory("resources/theme/assets/fonts", `public/build/assets/fonts`);
// * Copy FAVICON resources
mix.then(() => {
glob.sync(path.normalize('resources/theme/favicon/*')).forEach(filePath => {
if (fs.statSync(path.normalize(filePath)).isFile) {
fs.cpSync(path.normalize(filePath), path.resolve('public/' + path.basename(filePath)));
}
});
});