@@ -3,8 +3,6 @@ import path from "path";
33import less from "less" ;
44import { klona } from "klona/full" ;
55
6- import { urlToRequest } from "loader-utils" ;
7-
86/* eslint-disable class-methods-use-this */
97const trailingSlash = / [ / \\ ] $ / ;
108
@@ -16,6 +14,16 @@ const IS_SPECIAL_MODULE_IMPORT = /^~[^/]+$/;
1614// `[drive_letter]:\` + `\\[server]\[sharename]\`
1715const IS_NATIVE_WIN32_PATH = / ^ [ a - z ] : [ / \\ ] | ^ \\ \\ / i;
1816
17+ // Examples:
18+ // - ~package
19+ // - ~package/
20+ // - ~@org
21+ // - ~@org/
22+ // - ~@org/package
23+ // - ~@org/package/
24+ const IS_MODULE_IMPORT = / ^ ~ ( [ ^ / ] + | [ ^ / ] + \/ | @ [ ^ / ] + [ / ] [ ^ / ] + | @ [ ^ / ] + \/ ? | @ [ ^ / ] + [ / ] [ ^ / ] + \/ ) $ / ;
25+ const MODULE_REQUEST_REGEX = / ^ [ ^ ? ] * ~ / ;
26+
1927/**
2028 * Creates a Less plugin that uses webpack's resolving engine that is provided by the loaderContext.
2129 *
@@ -28,6 +36,7 @@ function createWebpackLessPlugin(loaderContext) {
2836 mainFields : [ "less" , "style" , "main" , "..." ] ,
2937 mainFiles : [ "index" , "..." ] ,
3038 extensions : [ ".less" , ".css" ] ,
39+ preferRelative : true ,
3140 } ) ;
3241
3342 class WebpackFileManager extends less . FileManager {
@@ -56,31 +65,40 @@ function createWebpackLessPlugin(loaderContext) {
5665 // Less is giving us trailing slashes, but the context should have no trailing slash
5766 const context = currentDirectory . replace ( trailingSlash , "" ) ;
5867
59- const request = urlToRequest (
60- filename ,
61- // eslint-disable-next-line no-undefined
62- filename . charAt ( 0 ) === "/" ? loaderContext . rootContext : undefined
63- ) ;
68+ let request = filename ;
69+
70+ // A `~` makes the url an module
71+ if ( MODULE_REQUEST_REGEX . test ( filename ) ) {
72+ request = request . replace ( MODULE_REQUEST_REGEX , "" ) ;
73+ }
74+
75+ if ( IS_MODULE_IMPORT . test ( filename ) ) {
76+ request = request [ request . length - 1 ] === "/" ? request : `${ request } /` ;
77+ }
6478
6579 return this . resolveRequests ( context , [ ...new Set ( [ request , filename ] ) ] ) ;
6680 }
6781
68- resolveRequests ( context , possibleRequests ) {
82+ async resolveRequests ( context , possibleRequests ) {
6983 if ( possibleRequests . length === 0 ) {
7084 return Promise . reject ( ) ;
7185 }
7286
73- return resolve ( context , possibleRequests [ 0 ] )
74- . then ( ( result ) => result )
75- . catch ( ( error ) => {
76- const [ , ...tailPossibleRequests ] = possibleRequests ;
87+ let result ;
7788
78- if ( tailPossibleRequests . length === 0 ) {
79- throw error ;
80- }
89+ try {
90+ result = await resolve ( context , possibleRequests [ 0 ] ) ;
91+ } catch ( error ) {
92+ const [ , ...tailPossibleRequests ] = possibleRequests ;
93+
94+ if ( tailPossibleRequests . length === 0 ) {
95+ throw error ;
96+ }
8197
82- return this . resolveRequests ( context , tailPossibleRequests ) ;
83- } ) ;
98+ result = await this . resolveRequests ( context , tailPossibleRequests ) ;
99+ }
100+
101+ return result ;
84102 }
85103
86104 async loadFile ( filename , ...args ) {
0 commit comments