1 | const ExtractLoader = require('mini-css-extract-plugin').loader
|
2 |
|
3 | const
|
4 | { join } = require('path'),
|
5 | appPaths = require('../app-paths'),
|
6 | postCssConfig = require(appPaths.resolve.app('.postcssrc.js'))
|
7 |
|
8 | const QuasarStylusVariablesLoader = join(__dirname, 'loader.quasar-stylus-variables')
|
9 |
|
10 | function injectRule (chain, pref, lang, test, loader, loaderOptions) {
|
11 | const baseRule = chain.module.rule(lang).test(test)
|
12 |
|
13 |
|
14 | const modulesRule = baseRule.oneOf('modules-query').resourceQuery(/module/)
|
15 | create(modulesRule, true)
|
16 |
|
17 |
|
18 | const modulesExtRule = baseRule.oneOf('modules-ext').test(/\.module\.\w+$/)
|
19 | create(modulesExtRule, true)
|
20 |
|
21 | const normalRule = baseRule.oneOf('normal')
|
22 | create(normalRule, false)
|
23 |
|
24 | function create (rule, modules) {
|
25 | if (pref.extract) {
|
26 | rule.use('mini-css-extract')
|
27 | .loader(ExtractLoader)
|
28 | .options({ publicPath: '../' })
|
29 | }
|
30 | else {
|
31 | rule.use('vue-style-loader')
|
32 | .loader('vue-style-loader')
|
33 | .options({
|
34 | sourceMap: pref.sourceMap
|
35 | })
|
36 | }
|
37 |
|
38 | const cssLoaderOptions = {
|
39 | importLoaders:
|
40 | 1 +
|
41 | 1 +
|
42 | (!pref.extract && pref.minify ? 1 : 0) +
|
43 | (loader ? (loader === 'stylus-loader' ? 2 : 1) : 0),
|
44 | sourceMap: pref.sourceMap
|
45 | }
|
46 |
|
47 | if (modules) {
|
48 | Object.assign(cssLoaderOptions, {
|
49 | modules: {
|
50 | localIdentName: '[name]_[local]_[hash:base64:5]'
|
51 | }
|
52 | })
|
53 | }
|
54 |
|
55 | rule.use('css-loader')
|
56 | .loader('css-loader')
|
57 | .options(cssLoaderOptions)
|
58 |
|
59 | if (!pref.extract && pref.minify) {
|
60 |
|
61 |
|
62 | rule.use('cssnano')
|
63 | .loader('postcss-loader')
|
64 | .options({
|
65 | sourceMap: pref.sourceMap,
|
66 | plugins: [
|
67 | require('cssnano')({
|
68 | preset: ['default', {
|
69 | mergeLonghand: false,
|
70 | convertValues: false,
|
71 | cssDeclarationSorter: false,
|
72 | reduceTransforms: false
|
73 | }]
|
74 | })
|
75 | ]
|
76 | })
|
77 | }
|
78 |
|
79 | const postCssOpts = { sourceMap: pref.sourceMap, ...postCssConfig }
|
80 |
|
81 | pref.rtl && postCssOpts.plugins.push(
|
82 | require('postcss-rtl')(pref.rtl === true ? {} : pref.rtl)
|
83 | )
|
84 |
|
85 | rule.use('postcss-loader')
|
86 | .loader('postcss-loader')
|
87 | .options(postCssOpts)
|
88 |
|
89 | if (loader) {
|
90 | rule.use(loader)
|
91 | .loader(loader)
|
92 | .options({
|
93 | sourceMap: pref.sourceMap,
|
94 | ...loaderOptions
|
95 | })
|
96 |
|
97 | if (loader === 'stylus-loader') {
|
98 | rule.use('quasar-stylus-variables-loader')
|
99 | .loader(QuasarStylusVariablesLoader)
|
100 | }
|
101 | }
|
102 | }
|
103 | }
|
104 |
|
105 | module.exports = function (chain, pref) {
|
106 | injectRule(chain, pref, 'css', /\.css$/)
|
107 | injectRule(chain, pref, 'stylus', /\.styl(us)?$/, 'stylus-loader', {
|
108 | preferPathResolver: 'webpack',
|
109 | ...pref.stylusLoaderOptions
|
110 | })
|
111 | injectRule(chain, pref, 'scss', /\.scss$/, 'sass-loader', pref.scssLoaderOptions)
|
112 | injectRule(chain, pref, 'sass', /\.sass$/, 'sass-loader', {
|
113 | indentedSyntax: true,
|
114 | ...pref.sassLoaderOptions
|
115 | })
|
116 | injectRule(chain, pref, 'less', /\.less$/, 'less-loader', pref.lessLoaderOptions)
|
117 | }
|