|
| 1 | +const cloneDeep = require('lodash.clonedeep') |
1 | 2 |
|
2 | 3 | const ruleChildren = (loader) => loader.use || loader.oneOf || Array.isArray(loader.loader) && loader.loader || []
|
3 | 4 |
|
4 |
| -const findRulesWithMatchingRule = (rulesSource, matcher) => { |
| 5 | +const findIndexAndRules = (rulesSource, ruleMatcher) => { |
5 | 6 | let result = undefined
|
6 | 7 | const rules = Array.isArray(rulesSource) ? rulesSource : ruleChildren(rulesSource)
|
7 |
| - rules.some((rule, index) => result = matcher(rule) ? {index, rules} : findRulesWithMatchingRule(ruleChildren(rule), matcher)) |
| 8 | + rules.some((rule, index) => result = ruleMatcher(rule) ? {index, rules} : findIndexAndRules(ruleChildren(rule), ruleMatcher)) |
8 | 9 | return result
|
9 | 10 | }
|
10 | 11 |
|
11 |
| -const getRule = (rulesSource, matcher) => { |
12 |
| - const {index, rules} = findRulesWithMatchingRule(rulesSource, matcher) |
| 12 | +const findRule = (rulesSource, ruleMatcher) => { |
| 13 | + const {index, rules} = findIndexAndRules(rulesSource, ruleMatcher) |
13 | 14 | return rules[index]
|
14 | 15 | }
|
15 | 16 |
|
| 17 | +const cssRuleMatcher = (rule) => rule.test && String(rule.test) === String(/\.css$/) |
| 18 | + |
16 | 19 | const createLoaderMatcher = (loader) => (rule) => rule.loader && rule.loader.indexOf(`/${loader}/`) !== -1
|
17 | 20 | const cssLoaderMatcher = createLoaderMatcher('css-loader')
|
18 | 21 | const postcssLoaderMatcher = createLoaderMatcher('postcss-loader')
|
19 | 22 | const fileLoaderMatcher = createLoaderMatcher('file-loader')
|
20 |
| -const cssRuleMatcher = (rule) => rule.test && String(rule.test) === String(/\.css$/) |
21 | 23 |
|
22 |
| -const cloneDeep = require('lodash.clonedeep') |
23 |
| - |
24 |
| -const addAfterLoader = (rulesSource, matcher, value) => { |
25 |
| - const {index, rules} = findRulesWithMatchingRule(rulesSource, matcher) |
| 24 | +const addAfterRule = (rulesSource, ruleMatcher, value) => { |
| 25 | + const {index, rules} = findIndexAndRules(rulesSource, ruleMatcher) |
26 | 26 | rules.splice(index + 1, 0, value)
|
27 | 27 | }
|
28 | 28 |
|
29 |
| -const addBeforeLoader = (rulesSource, matcher, value) => { |
30 |
| - const {index, rules} = findRulesWithMatchingRule(rulesSource, matcher) |
| 29 | +const addBeforeRule = (rulesSource, ruleMatcher, value) => { |
| 30 | + const {index, rules} = findIndexAndRules(rulesSource, ruleMatcher) |
31 | 31 | rules.splice(index, 0, value)
|
32 | 32 | }
|
33 | 33 |
|
34 | 34 | module.exports = function (config, env) {
|
35 |
| - const cssRule = getRule(config.module.rules, cssRuleMatcher) |
36 |
| - const cssRuleCssLoader = getRule(cssRule, cssLoaderMatcher) |
| 35 | + const cssRule = findRule(config.module.rules, cssRuleMatcher) |
| 36 | + const cssRuleCssLoader = findRule(cssRule, cssLoaderMatcher) |
37 | 37 |
|
38 | 38 | cssRuleCssLoader.options = Object.assign({modules: true, localIdentName: '[local]___[hash:base64:5]'}, cssRuleCssLoader.options)
|
39 | 39 |
|
40 | 40 | const sassRule = cloneDeep(cssRule)
|
41 | 41 | sassRule.test = /\.s[ac]ss$/
|
42 |
| - addAfterLoader(sassRule, postcssLoaderMatcher, require.resolve('sass-loader')) |
43 |
| - |
44 |
| - addBeforeLoader(config.module.rules, fileLoaderMatcher, sassRule) |
| 42 | + addAfterRule(sassRule, postcssLoaderMatcher, require.resolve('sass-loader')) |
| 43 | + addBeforeRule(config.module.rules, fileLoaderMatcher, sassRule) |
45 | 44 |
|
46 | 45 | return config
|
47 | 46 | }
|
0 commit comments