-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwebpack.mix.js
122 lines (113 loc) · 3.05 KB
/
webpack.mix.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**
* Laravel Mix
*
* An elegant wrapper around Webpack for the 80% use case.
*
* @see https://laravel.com/docs/8.x/mix
* @author PH
*/
const desire = require('./webpack/desire');
const dependencies = require('./webpack/dependencies');
const mix = require('laravel-mix');
const path = require('path');
const merge = require('webpack-merge');
const namespace = require('./package.json').namespace;
const config = merge(desire(`${__dirname}/resources/config`), desire(`${__dirname}/resources/config-local`));
const resources = path.join(__dirname, 'resources');
require('laravel-mix-copy-watched');
/**
* Create additional Laravel Mix functions.
*/
mix.inWatch = () => process.argv.includes('--watch');
mix.inBuild = () => !process.argv.includes('--watch') && !mix.inProduction();
/**
* Change Webpack configuration.
*
* @see https://webpack.js.org/configuration/
*/
mix.webpackConfig({
devtool: mix.inProduction() ? 'none' : 'inline-source-map',
output: {
jsonpFunction: `${namespace}WebpackJsonpCallback`
},
externals: {
// require("jquery") is external and available
// on the global var jQuery
"jquery": "jQuery"
}
});
/**
* Change Laravel Mix options.
*
* @see https://laravel-mix.com/docs/5.0/options
* @see https://laravel-mix.com/docs/5.0/os-notifications
*/
mix.setPublicPath('dist');
mix.disableNotifications();
mix.options({
processCssUrls: false
});
if (!mix.inProduction()) {
mix.sourceMaps(false, 'inline-source-map');
}
/**
* Change BrowserSync configuration.
*
* @see https://laravel-mix.com/docs/5.0/browsersync
*/
mix.browserSync({
proxy: config.devUrl,
files: config.watch,
open: config.open
});
/**
* Autoload some dependencies for each module.
*
* @see https://laravel-mix.com/docs/5.0/autoloading
*/
mix.autoload({
jquery: ['$', 'window.jQuery']
});
/**
* Manage tasks based on the environment.
*
* @author PH
*/
if (mix.inProduction()) {
mix.version();
mix.copy(`${resources}/assets/fonts/**/*`, 'dist/fonts');
mix.copy(`${resources}/assets/images/**/*`, 'dist/images');
} else if (mix.inBuild()) {
mix.copy(`${resources}/assets/fonts/**/*`, 'dist/fonts');
mix.copy(`${resources}/assets/images/**/*`, 'dist/images');
} else if (mix.inWatch()) {
mix.copyWatched(`${resources}/assets/images/**/*`, 'dist/images');
}
/**
* Load all the dependencies included in manifest file.
*
* @author PH
*/
dependencies(config).forEach(dependency => {
const ext = path.parse(dependency).ext;
const filename = path.parse(dependency).name;
const dir = path.parse(dependency).dir;
switch (ext) {
case '.js':
if (mix.inProduction()) {
mix.js(`${resources}/assets/${dependency}`, `${dir}/${filename}.js`).babel(`dist/${dir}/${filename}.js`, `dist/${dir}/${filename}.js`);
} else {
mix.js(`${resources}/assets/${dependency}`, `${dir}/${filename}.js`);
}
break;
case '.scss':
mix.sass(`${resources}/assets/${dependency}`, `${dir}/${filename}.css`);
break;
}
});
/**
* Create manifest.js file.
*
* @see https://laravel-mix.com/docs/5.0/extract
*/
mix.extract();