@@ -67,7 +67,10 @@ class VueLoaderPlugin implements webpack.Plugin {
67
67
const templateCompilerRule = {
68
68
loader : require . resolve ( './templateLoader' ) ,
69
69
test : / \. v u e $ / ,
70
- resourceQuery : isVueTemplateBlock ,
70
+ resourceQuery : ( query : string ) => {
71
+ const parsed = qs . parse ( query . slice ( 1 ) )
72
+ return parsed . vue != null && parsed . type === 'template'
73
+ } ,
71
74
options : vueLoaderOptions
72
75
}
73
76
@@ -154,18 +157,32 @@ function cloneRule(rule: webpack.RuleSetRule) {
154
157
return res
155
158
}
156
159
157
- function isVueTemplateBlock ( query : string ) {
158
- const parsed = qs . parse ( query . slice ( 1 ) )
159
- return parsed . vue != null && parsed . type === 'template'
160
- }
161
-
162
160
function cloneRuleForRenderFn ( rule : webpack . RuleSetRule ) {
161
+ const resource = rule . resource as Function
162
+ const resourceQuery = rule . resourceQuery as Function
163
+ let currentResource : string
163
164
const res = {
164
165
...rule ,
165
166
resource : {
166
- test : / \. v u e $ /
167
+ test : ( resource : string ) => {
168
+ currentResource = resource
169
+ return true
170
+ }
167
171
} ,
168
- resourceQuery : isVueTemplateBlock
172
+ resourceQuery : ( query : string ) => {
173
+ const parsed = qs . parse ( query . slice ( 1 ) )
174
+ if ( parsed . vue == null || parsed . type !== 'template' ) {
175
+ return false
176
+ }
177
+ const fakeResourcePath = `${ currentResource } .js`
178
+ if ( resource && ! resource ( fakeResourcePath ) ) {
179
+ return false
180
+ }
181
+ if ( resourceQuery && ! resourceQuery ( query ) ) {
182
+ return false
183
+ }
184
+ return true
185
+ }
169
186
}
170
187
if ( rule . oneOf ) {
171
188
res . oneOf = rule . oneOf . map ( cloneRule )
0 commit comments