I did everything described here: https://preview.keenthemes.com/html/metronic/docs/getting-started/integration/laravel.
Except for the part: The default dev dependency laravel-mixis required for next steps, you should leave it in the npm/package.json.(I am not sure what it means.)
Then I run npm install to install all dependencies and update all the dependencies. (Since I already had some updated dependencies)
I got the following error.:
Error [ERR_REQUIRE_ESM]: require() of ES Module [laravelApp]/node_modules/del/index.js from [laravelApp]/webpack.mix.js not supported. Instead change the require of index.js in [laravelApp]/webpack.mix.js to a dynamic import() which is available in all CommonJS modules.
Also if change require to import. Then I get mix.options is not a function. (basically none of the mix function are getting called.)
My package.json
{
"private": true,
"scripts": {
"dev": "npm run development",
"development": "mix",
"watch": "mix watch",
"watch-poll": "mix watch -- --watch-options-poll=1000",
"hot": "mix watch --hot",
"prod": "npm run production",
"production": "mix --production",
"devVite": "vite",
"build": "vite build"
},
"devDependencies": {
"@babel/plugin-syntax-jsx": "^7.18.6",
"@babel/plugin-transform-modules-commonjs": "^7.13.8",
"@babel/preset-react": "^7.18.6",
"@babel/register": "^7.13.14",
"@tailwindcss/forms": "^0.4.0",
"@vitejs/plugin-react": "^2.2.0",
"@vitejs/plugin-react-refresh": "^1.3.6",
"alpinejs": "^3.7.1",
"autoprefixer": "^10.4.2",
"axios": "^0.24.0",
"copy-webpack-plugin": "^8.1.0",
"css-loader": "^5.2.0",
"css-minimizer-webpack-plugin": "^4.2.2",
"extract-loader": "^5.1.0",
"file-loader": "^6.2.0",
"fs-extra": "^10.0.0",
"gulp": "^4.0.2",
"gulp-clean-css": "^4.3.0",
"gulp-concat": "^2.6.1",
"gulp-connect": "^5.7.0",
"gulp-dart-sass": "^1.0.2",
"gulp-if": "^3.0.0",
"gulp-rename": "^2.0.0",
"gulp-rewrite-css": "^1.1.2",
"gulp-rtlcss": "^2.0.0",
"gulp-sourcemaps": "^3.0.0",
"gulp-terser": "^2.0.1",
"imports-loader": "^1.2.0",
"laravel-mix": "^6.0.49",
"laravel-vite-plugin": "^0.7.0",
"lazypipe": "^1.0.2",
"lodash": "^4.17.19",
"merge-stream": "^2.0.0",
"mini-css-extract-plugin": "^1.3.4",
"postcss": "^8.4.5",
"postcss-import": "^14.0.2",
"postcss-loader": "^4.0.4",
"pretty": "^2.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"replace-in-file-webpack-plugin": "^1.0.6",
"resolve-url-loader": "^4.0.0",
"rtlcss": "^3.5.0",
"rtlcss-webpack-plugin": "^4.0.6",
"sass": "^1.47.0",
"sass-loader": "^10.1.0",
"script-loader": "^0.7.2",
"tailwindcss": "^3.1.0",
"terser-webpack-plugin": "^5.0.3",
"url-loader": "^4.1.1",
"vite": "^3.2.3",
"webpack": "^5.28.0",
"webpack-cli": "^4.6.0",
"webpack-dev-server": "^4.11.1",
"webpack-exclude-assets-plugin": "^0.1.1",
"webpack-merge-and-include-globally": "^2.3.4",
"webpack-messages": "^2.0.4",
"webpack-rtl-plugin": "^1.3.0",
"yargs": "^16.2.0",
"yarn-install": "^1.0.0"
},
"dependencies": {
"@babel/core": "^7.20.2",
"@babel/preset-env": "^7.20.2",
"@ckeditor/ckeditor5-alignment": "^31.1.0",
"@ckeditor/ckeditor5-build-balloon": "^23.1.0",
"@ckeditor/ckeditor5-build-balloon-block": "^23.1.0",
"@ckeditor/ckeditor5-build-classic": "^23.1.0",
"@ckeditor/ckeditor5-build-decoupled-document": "^23.1.0",
"@ckeditor/ckeditor5-build-inline": "^23.1.0",
"@fortawesome/fontawesome-free": "^5.15.3",
"@popperjs/core": "^2.11.6",
"@shopify/draggable": "^1.0.0-beta.12",
"@yaireo/tagify": "^4.9.2",
"acorn": "^8.0.4",
"apexcharts": "^3.30.0",
"autosize": "^5.0.1",
"axios": "^0.24.0",
"bootstrap": "5.2.2",
"bootstrap-cookie-alert": "^1.2.1",
"bootstrap-daterangepicker": "^3.1.0",
"bootstrap-icons": "^1.5.0",
"bootstrap-maxlength": "^1.10.1",
"bootstrap-multiselectsplitter": "^1.0.4",
"chalk": "^4.1.0",
"chart.js": "^3.6.0",
"clipboard": "^2.0.8",
"countup.js": "^2.0.7",
"cropperjs": "^1.5.12",
"datatables.net": "^1.10.25",
"datatables.net-bs5": "^1.10.25",
"datatables.net-buttons": "^1.7.1",
"datatables.net-buttons-bs5": "^1.7.1",
"datatables.net-colreorder": "^1.5.4",
"datatables.net-colreorder-bs5": "^1.5.4",
"datatables.net-datetime": "^1.1.0",
"datatables.net-fixedcolumns": "^3.3.3",
"datatables.net-fixedcolumns-bs5": "^3.3.3",
"datatables.net-fixedheader": "^3.1.9",
"datatables.net-fixedheader-bs5": "^3.1.9",
"datatables.net-plugins": "^1.10.24",
"datatables.net-responsive": "^2.2.9",
"datatables.net-responsive-bs5": "^2.2.9",
"datatables.net-rowgroup": "^1.1.3",
"datatables.net-rowgroup-bs5": "^1.1.3",
"datatables.net-rowreorder": "^1.2.8",
"datatables.net-rowreorder-bs5": "^1.2.8",
"datatables.net-scroller": "^2.0.4",
"datatables.net-scroller-bs5": "^2.0.4",
"datatables.net-select": "^1.3.3",
"datatables.net-select-bs5": "^1.3.3",
"del": "^7.0.0",
"dropzone": "^5.9.2",
"es6-promise": "^4.2.8",
"es6-promise-polyfill": "^1.2.0",
"es6-shim": "^0.35.5",
"esri-leaflet": "^3.0.2",
"esri-leaflet-geocoder": "^3.0.0",
"flatpickr": "^4.6.9",
"flot": "^4.2.2",
"fslightbox": "^3.3.0-2",
"fullcalendar": "^5.8.0",
"glob": "^8.0.3",
"handlebars": "^4.7.7",
"inputmask": "^5.0.6",
"jkanban": "^1.3.1",
"jquery": "3.6.0",
"jquery-ui-dist": "^1.13.2",
"jquery.repeater": "^1.2.1",
"jstree": "^3.3.11",
"jszip": "^3.6.0",
"leaflet": "^1.7.1",
"line-awesome": "^1.3.0",
"moment": "^2.29.1",
"moment-with-locales-es6": "^1.0.1",
"nouislider": "^15.2.0",
"npm": "^9.1.1",
"npm-install-all": "^1.1.6",
"pdfmake": "^0.2.0",
"prism-themes": "^1.7.0",
"prismjs": "^1.24.1",
"quill": "^1.3.7",
"replace-in-file-webpack-plugin": "^1.0.6",
"rimraf": "^3.0.2",
"select2": "^4.1.0-rc.0",
"smooth-scroll": "^16.1.3",
"sweetalert2": "^11.0.18",
"tiny-slider": "^2.9.3",
"tinymce": "^5.8.2",
"toastr": "^2.1.4",
"ts-loader": "^9.4.1",
"typed.js": "^2.0.12",
"vis-timeline": "^7.4.9",
"wnumb": "^1.2.0"
}
}
My webpack.mix.js:
const mix = require('laravel-mix');
const glob = require('glob');
const path = require('path');
const ReplaceInFileWebpackPlugin = require('replace-in-file-webpack-plugin');
const rimraf = require('rimraf');
const del = require('del');
const fs = require('fs');
/*
|--------------------------------------------------------------------------
| Mix Asset Management
|--------------------------------------------------------------------------
|
| Mix provides a clean, fluent API for defining some Webpack build steps
| for your Laravel applications. By default, we are compiling the CSS
| file for the application as well as bundling up all the JS files.
|
*/
// arguments/params from the line command
const args = getParameters();
mix.options({
cssNano: {
discardComments: false,
}
});
// Remove existing generated assets from public folder
del.sync(['public/css/*', 'public/js/*', 'public/media/*', 'public/plugins/*',]);
// Build 3rd party plugins css/js
mix.sass(`resources/src/webpack/plugins/plugins.scss`, `public/assets/plugins/global/plugins.bundle.css`).then(() => {
// remove unused preprocessed fonts folder
rimraf(path.resolve('public/fonts'), () => {
});
rimraf(path.resolve('public/images'), () => {
});
}).sourceMaps(!mix.inProduction())
// .setResourceRoot('./')
.options({processCssUrls: false}).js([`resources/src/webpack/plugins/plugins.js`], `public/assets/plugins/global/plugins.bundle.js`);
// Build extended plugin styles
mix.sass(`resources/src/sass/plugins.scss`, `public/assets/plugins/global/plugins-custom.bundle.css`);
mix.sass(`resources/src/sass/style.scss`, `public/assets/css/style.bundle.css`, {sassOptions: {includePaths: ['node_modules']}})
// .options({processCssUrls: false})
.js([`resources/src/webpack/scripts.js`], `public/assets/js/scripts.bundle.js`);
mix.js('./resources/src/js/widgets/**/!(_)*.js', 'public/assets/js/widgets.bundle.js');
// Dark skin mode css files
if (args.indexOf('dark_mode') !== -1) {
mix.sass(`resources/src/plugins/plugins.dark.scss`, `public/assets/plugins/global/plugins.dark.bundle.css`);
mix.sass(`resources/src/sass/plugins.dark.scss`, `public/assets/plugins/global/plugins-custom.dark.bundle.css`);
mix.sass(`resources/src/sass/style.dark.scss`, `public/assets/css/style.dark.bundle.css`, {sassOptions: {includePaths: ['node_modules']}});
}
// Build custom 3rd party plugins
(glob.sync(`resources/src/plugins/custom/**/*.js`) || []).forEach(file => {
mix.js(file, `public/assets/${file.replace(`resources/src/`, '').replace('.js', '.bundle.js')}`);
});
(glob.sync(`resources/src/plugins/custom/**/*.scss`) || []).forEach(file => {
mix.sass(file, `public/assets/${file.replace(`resources/src/`, '').replace('.scss', '.bundle.css')}`);
});
(glob.sync(`resources/src/sass/pages/**/!(_)*.scss`) || []).forEach(file => {
file = file.replace(/[\\\/]+/g, '/');
mix.sass(file, file.replace(`resources/src/sass`, `public/assets/css`).replace(/\.scss$/, '.css'));
});
var extendedFiles = [];
// Extend custom js files for laravel
(glob.sync('resources/src/extended/js/**/*.js') || []).forEach(file => {
var output = `public/assets/${file.replace('resources/src/extended/', '')}`;
mix.js(file, output);
extendedFiles.push(output);
});
(glob.sync('resources/src/js/custom/**/*.js') || []).forEach(file => {
var output = `public/assets/${file.replace('resources/src/', '')}`;
if (extendedFiles.indexOf(output) === -1) {
mix.js(file, output);
}
});
mix.copyDirectory('resources/src/media', `public/assets/media`);
mix.copyDirectory(`resources/src/media`, `public/assets/media`);
(glob.sync(`resources/src/sass/themes/**/!(_)*.scss`) || []).forEach(file => {
file = file.replace(/[\\\/]+/g, '/');
mix.sass(file, file.replace(`resources/src/sass`, `public/assets/css`).replace(/\.scss$/, '.css'));
});
let plugins = [
new ReplaceInFileWebpackPlugin([
{
// rewrite font paths
dir: path.resolve(`public/assets/plugins/global`),
test: /\.css$/,
rules: [
{
// fontawesome
search: /url\((\.\.\/)?webfonts\/(fa-.*?)"?\)/g,
replace: 'url(./fonts/@fortawesome/$2)',
},
{
// flaticon
search: /url\(("?\.\/)?font\/(Flaticon\..*?)"?\)/g,
replace: 'url(./fonts/flaticon/$2)',
},
{
// flaticon2
search: /url\(("?\.\/)?font\/(Flaticon2\..*?)"?\)/g,
replace: 'url(./fonts/flaticon2/$2)',
},
{
// keenthemes fonts
search: /url\(("?\.\/)?(Ki\..*?)"?\)/g,
replace: 'url(./fonts/keenthemes-icons/$2)',
},
{
// lineawesome fonts
search: /url\(("?\.\.\/)?fonts\/(la-.*?)"?\)/g,
replace: 'url(./fonts/line-awesome/$2)',
},
{
// socicons
search: /url\(("?\.\.\/)?font\/(socicon\..*?)"?\)/g,
replace: 'url(./fonts/socicon/$2)',
},
{
// bootstrap-icons
search: /url\(.*?(bootstrap-icons\..*?)"?\)/g,
replace: 'url(./fonts/bootstrap-icons/$1)',
},
],
},
]),
];
mix.webpackConfig({
plugins: plugins,
ignoreWarnings: [{
module: /esri-leaflet/,
message: /version/,
}],
resolve: {
alias: {
"@": path.resolve(__dirname, "resources/"),
'handlebars': 'handlebars/dist/handlebars.js',
},
extensions: ['.js', '.scss'],
fallback: {
util: false,
},
}
});
// Webpack.mix does not copy fonts, manually copy
(glob.sync(`resources/src/plugins/**/*.+(woff|woff2|eot|ttf)`) || []).forEach(file => {
var folder = file.match(/resources\/src\/plugins\/(.*?)\//)[1];
mix.copy(file, `public/assets/plugins/global/fonts/${folder}/${path.basename(file)}`);
});
(glob.sync('node_modules/+(@fortawesome|socicon|line-awesome|bootstrap-icons)/**/*.+(woff|woff2|eot|ttf)') || []).forEach(file => {
var folder = file.match(/node_modules\/(.*?)\//)[1];
mix.copy(file, `public/assets/plugins/global/fonts/${folder}/${path.basename(file)}`);
});
// Raw plugins
(glob.sync(`resources/src/plugins/custom/**/*.js.json`) || []).forEach(file => {
let filePaths = JSON.parse(fs.readFileSync(file, 'utf-8'));
const fileName = path.basename(file).replace('.js.json', '');
mix.scripts(filePaths, `public/assets/plugins/custom/${fileName}/${fileName}.bundle.js`);
});
function getParameters() {
var possibleArgs = [
'dark_mode'
];
for (var i = 0; i <= 13; i++) {
possibleArgs.push('demo' + i);
}
var args = [];
possibleArgs.forEach(function (key) {
if (process.env['npm_config_' + key]) {
args.push(key);
}
});
return args;
}
I tried changing the require to import. Adding type module in package.json, and all the other things I could find in the internet. It fails everytime.