11import * as qs from 'querystring'
2- import webpack = require ( 'webpack' )
2+ import type { Compiler , RuleSetRule } from 'webpack'
33import type { VueLoaderOptions } from './'
44import { clientCache , typeDepToSFCMap } from './resolveScript'
55import fs = require( 'fs' )
@@ -11,10 +11,19 @@ const RuleSet = require('webpack/lib/RuleSet')
1111const id = 'vue-loader-plugin'
1212const NS = 'vue-loader'
1313
14+ // these types are no longer available in webpack 5
15+ type RuleSetQuery = string | { [ k : string ] : any }
16+ interface RuleSetLoader {
17+ loader ?: string | undefined
18+ options ?: RuleSetQuery | undefined
19+ ident ?: string | undefined
20+ query ?: RuleSetQuery | undefined
21+ }
22+
1423class VueLoaderPlugin {
1524 static NS = NS
1625
17- apply ( compiler : webpack . Compiler ) {
26+ apply ( compiler : Compiler ) {
1827 // inject NS for plugin installation check in the main loader
1928 compiler . hooks . compilation . tap ( id , ( compilation ) => {
2029 compilation . hooks . normalModuleLoader . tap ( id , ( loaderContext : any ) => {
@@ -24,7 +33,7 @@ class VueLoaderPlugin {
2433
2534 const rawRules = compiler . options . module ! . rules
2635 // use webpack's RuleSet utility to normalize user rules
27- const rules = new RuleSet ( rawRules ) . rules as webpack . RuleSetRule [ ]
36+ const rules = new RuleSet ( rawRules ) . rules as RuleSetRule [ ]
2837
2938 // find the rule that applies to vue files
3039 let vueRuleIndex = rawRules . findIndex ( createMatcher ( `foo.vue` ) )
@@ -47,7 +56,7 @@ class VueLoaderPlugin {
4756 }
4857
4958 // get the normlized "use" for vue files
50- const vueUse = vueRule . use as webpack . RuleSetLoader [ ]
59+ const vueUse = vueRule . use as RuleSetLoader [ ]
5160 // get vue-loader options
5261 const vueLoaderUseIndex = vueUse . findIndex ( ( u ) => {
5362 // FIXME: this code logic is incorrect when project paths starts with `vue-loader-something`
@@ -171,7 +180,7 @@ class VueLoaderPlugin {
171180}
172181
173182function createMatcher ( fakeFile : string ) {
174- return ( rule : webpack . RuleSetRule ) => {
183+ return ( rule : RuleSetRule ) => {
175184 // #1201 we need to skip the `include` check when locating the vue rule
176185 const clone = Object . assign ( { } , rule )
177186 delete clone . include
@@ -180,7 +189,7 @@ function createMatcher(fakeFile: string) {
180189 }
181190}
182191
183- function cloneRule ( rule : webpack . RuleSetRule ) {
192+ function cloneRule ( rule : RuleSetRule ) {
184193 const resource = rule . resource as Function
185194 const resourceQuery = rule . resourceQuery as Function
186195 // Assuming `test` and `resourceQuery` tests are executed in series and
@@ -225,7 +234,7 @@ function cloneRule(rule: webpack.RuleSetRule) {
225234 return res
226235}
227236
228- function cloneRuleForRenderFn ( rule : webpack . RuleSetRule ) {
237+ function cloneRuleForRenderFn ( rule : RuleSetRule ) {
229238 const resource = rule . resource as Function
230239 const resourceQuery = rule . resourceQuery as Function
231240 let currentResource : string
0 commit comments