UNPKG

3.33 kBJavaScriptView Raw
1const ExtractLoader = require('mini-css-extract-plugin').loader
2
3const
4 { join } = require('path'),
5 appPaths = require('../app-paths'),
6 postCssConfig = require(appPaths.resolve.app('.postcssrc.js'))
7
8const QuasarStylusVariablesLoader = join(__dirname, 'loader.quasar-stylus-variables')
9
10function injectRule (chain, pref, lang, test, loader, loaderOptions) {
11 const baseRule = chain.module.rule(lang).test(test)
12
13 // rules for <style lang="module">
14 const modulesRule = baseRule.oneOf('modules-query').resourceQuery(/module/)
15 create(modulesRule, true)
16
17 // rules for *.module.* files
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 + // stylePostLoader injected by vue-loader
41 1 + // postCSS loader
42 (!pref.extract && pref.minify ? 1 : 0) + // postCSS with cssnano
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 // needs to be applied separately,
61 // otherwise it messes up RTL
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
105module.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}