Skip to content

Commit 9f0e669

Browse files
committed
fix: handle multiple vue-loader rules
fixes #106
1 parent 86751a1 commit 9f0e669

File tree

1 file changed

+17
-13
lines changed

1 file changed

+17
-13
lines changed

lib/plugin.js

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,36 @@ class VuetifyLoaderPlugin {
2020
// use webpack's RuleSet utility to normalize user rules
2121
const rawRules = compiler.options.module.rules
2222
const { rules } = new RuleSet(rawRules)
23+
this.rules = rules
2324

24-
// find the rule that applies to vue files
25-
const vueRuleIndex = rules.findIndex(rule => rule.use && rule.use.find(isVueLoader))
26-
const vueRule = rules[vueRuleIndex]
25+
// find the rules that apply to vue files
26+
const vueRules = rules.filter(rule => rule.use && rule.use.find(isVueLoader))
2727

28-
if (!vueRule) {
28+
if (!vueRules.length) {
2929
throw new Error(
3030
`[VuetifyLoaderPlugin Error] No matching rule for vue-loader found.\n` +
3131
`Make sure there is at least one root-level rule that uses vue-loader.`
3232
)
3333
}
3434

35+
vueRules.forEach(this.updateRule.bind(this))
36+
37+
compiler.options.module.rules = rules
38+
}
39+
40+
updateRule (rule) {
3541
if (this.options.progressiveImages) {
36-
const vueLoaderOptions = vueRule.use.find(isVueLoader).options
42+
const vueLoaderOptions = rule.use.find(isVueLoader).options
3743
vueLoaderOptions.compilerOptions = vueLoaderOptions.compilerOptions || {}
3844
vueLoaderOptions.compilerOptions.modules = vueLoaderOptions.compilerOptions.modules || []
3945
vueLoaderOptions.compilerOptions.modules.push(progressiveLoaderModule)
4046

41-
const imageRuleIndex = rules.findIndex(rule => {
47+
const imageRuleIndex = this.rules.findIndex(rule => {
4248
return rule.resource &&
4349
!rule.resourceQuery &&
4450
['.png', '.jpg', '.jpeg', '.gif'].some(ext => rule.resource(ext))
4551
})
46-
let imageRule = rules[imageRuleIndex]
52+
let imageRule = this.rules[imageRuleIndex]
4753

4854
const options = typeof this.options.progressiveImages === 'boolean'
4955
? undefined
@@ -118,10 +124,10 @@ class VuetifyLoaderPlugin {
118124
}
119125
}
120126

121-
vueRule.oneOf = [
127+
rule.oneOf = [
122128
{
123129
resourceQuery: '?',
124-
use: vueRule.use
130+
use: rule.use
125131
},
126132
{
127133
use: [
@@ -132,13 +138,11 @@ class VuetifyLoaderPlugin {
132138
attrsMatch: this.options.attrsMatch || []
133139
}
134140
},
135-
...vueRule.use
141+
...rule.use
136142
]
137143
},
138144
]
139-
delete vueRule.use
140-
141-
compiler.options.module.rules = rules
145+
delete rule.use
142146
}
143147
}
144148

0 commit comments

Comments
 (0)