44 */
55"use strict" ;
66
7+ const path = require ( "path" ) ;
78const asyncLib = require ( "neo-async" ) ;
89const {
910 Tapable,
@@ -20,6 +21,8 @@ const cachedMerge = require("./util/cachedMerge");
2021
2122const EMPTY_RESOLVE_OPTIONS = { } ;
2223
24+ const MATCH_RESOURCE_REGEX = / ^ ( [ ^ ! ] + ) ! = ! / ;
25+
2326const loaderToIdent = data => {
2427 if ( ! data . options ) {
2528 return data . loader ;
@@ -158,19 +161,33 @@ class NormalModuleFactory extends Tapable {
158161 const context = data . context ;
159162 const request = data . request ;
160163
161- const noPreAutoLoaders = request . startsWith ( "-!" ) ;
162- const noAutoLoaders = noPreAutoLoaders || request . startsWith ( "!" ) ;
163- const noPrePostAutoLoaders = request . startsWith ( "!!" ) ;
164- let elements = request
164+ const loaderResolver = this . getResolver ( "loader" ) ;
165+ const normalResolver = this . getResolver ( "normal" , data . resolveOptions ) ;
166+
167+ let matchResource = undefined ;
168+ let requestWithoutMatchResource = request ;
169+ const matchResourceMatch = MATCH_RESOURCE_REGEX . exec ( request ) ;
170+ if ( matchResourceMatch ) {
171+ matchResource = matchResourceMatch [ 1 ] ;
172+ if ( / ^ \. \. ? \/ / . test ( matchResource ) ) {
173+ matchResource = path . join ( context , matchResource ) ;
174+ }
175+ requestWithoutMatchResource = request . substr (
176+ matchResourceMatch [ 0 ] . length
177+ ) ;
178+ }
179+
180+ const noPreAutoLoaders = requestWithoutMatchResource . startsWith ( "-!" ) ;
181+ const noAutoLoaders =
182+ noPreAutoLoaders || requestWithoutMatchResource . startsWith ( "!" ) ;
183+ const noPrePostAutoLoaders = requestWithoutMatchResource . startsWith ( "!!" ) ;
184+ let elements = requestWithoutMatchResource
165185 . replace ( / ^ - ? ! + / , "" )
166186 . replace ( / ! ! + / g, "!" )
167187 . split ( "!" ) ;
168188 let resource = elements . pop ( ) ;
169189 elements = elements . map ( identToLoaderRequest ) ;
170190
171- const loaderResolver = this . getResolver ( "loader" ) ;
172- const normalResolver = this . getResolver ( "normal" , data . resolveOptions ) ;
173-
174191 asyncLib . parallel (
175192 [
176193 callback =>
@@ -234,12 +251,15 @@ class NormalModuleFactory extends Tapable {
234251 ) ;
235252 }
236253
237- const userRequest = loaders
238- . map ( loaderToIdent )
239- . concat ( [ resource ] )
240- . join ( "!" ) ;
254+ const userRequest =
255+ ( matchResource !== undefined ? `${ matchResource } !=!` : "" ) +
256+ loaders
257+ . map ( loaderToIdent )
258+ . concat ( [ resource ] )
259+ . join ( "!" ) ;
241260
242- let resourcePath = resource ;
261+ let resourcePath =
262+ matchResource !== undefined ? matchResource : resource ;
243263 let resourceQuery = "" ;
244264 const queryIndex = resourcePath . indexOf ( "?" ) ;
245265 if ( queryIndex >= 0 ) {
@@ -249,6 +269,10 @@ class NormalModuleFactory extends Tapable {
249269
250270 const result = this . ruleSet . exec ( {
251271 resource : resourcePath ,
272+ realResource :
273+ matchResource !== undefined
274+ ? resource . replace ( / \? .* / , "" )
275+ : resourcePath ,
252276 resourceQuery,
253277 issuer : contextInfo . issuer ,
254278 compiler : contextInfo . compiler
@@ -326,6 +350,7 @@ class NormalModuleFactory extends Tapable {
326350 rawRequest : request ,
327351 loaders,
328352 resource,
353+ matchResource,
329354 resourceResolveData,
330355 settings,
331356 type,
0 commit comments