1
- import { promisify } from 'util' ;
2
-
3
1
import less from 'less' ;
4
2
5
3
import { urlToRequest } from 'loader-utils' ;
6
4
7
5
/* eslint-disable class-methods-use-this */
8
-
9
- const stringifyLoader = require . resolve ( './stringifyLoader.js' ) ;
10
6
const trailingSlash = / [ / \\ ] $ / ;
11
- const isLessCompatible = / \. ( l e | c ) s s $ / ;
12
7
13
8
// This somewhat changed in Less 3.x. Now the file name comes without the
14
9
// automatically added extension whereas the extension is passed in as `options.ext`.
@@ -23,11 +18,6 @@ const isModuleName = /^~[^/\\]+$/;
23
18
* @returns {LessPlugin }
24
19
*/
25
20
function createWebpackLessPlugin ( loaderContext ) {
26
- const { fs } = loaderContext ;
27
-
28
- const loadModule = promisify ( loaderContext . loadModule . bind ( loaderContext ) ) ;
29
- const readFile = promisify ( fs . readFile . bind ( fs ) ) ;
30
-
31
21
const resolve = loaderContext . getResolve ( {
32
22
mainFields : [ 'less' , 'style' , 'main' , '...' ] ,
33
23
mainFiles : [ '_index' , 'index' , '...' ] ,
@@ -40,7 +30,6 @@ function createWebpackLessPlugin(loaderContext) {
40
30
return false ;
41
31
}
42
32
43
- // Our WebpackFileManager handles all the files
44
33
return true ;
45
34
}
46
35
@@ -61,6 +50,20 @@ function createWebpackLessPlugin(loaderContext) {
61
50
return filename ;
62
51
}
63
52
53
+ async resolveFilename ( filename , currentDirectory , options ) {
54
+ const url = this . getUrl ( filename , options ) ;
55
+
56
+ const moduleRequest = urlToRequest (
57
+ url ,
58
+ url . charAt ( 0 ) === '/' ? '' : null
59
+ ) ;
60
+
61
+ // Less is giving us trailing slashes, but the context should have no trailing slash
62
+ const context = currentDirectory . replace ( trailingSlash , '' ) ;
63
+
64
+ return this . resolveRequests ( context , [ moduleRequest , url ] ) ;
65
+ }
66
+
64
67
resolveRequests ( context , possibleRequests ) {
65
68
if ( possibleRequests . length === 0 ) {
66
69
return Promise . reject ( ) ;
@@ -81,50 +84,34 @@ function createWebpackLessPlugin(loaderContext) {
81
84
} ) ;
82
85
}
83
86
84
- async loadFile ( filename , currentDirectory , options , ...args ) {
85
- const url = this . getUrl ( filename , options ) ;
86
-
87
- const moduleRequest = urlToRequest (
88
- url ,
89
- url . charAt ( 0 ) === '/' ? '' : null
90
- ) ;
91
-
92
- // Less is giving us trailing slashes, but the context should have no trailing slash
93
- const context = currentDirectory . replace ( trailingSlash , '' ) ;
94
- let resolvedFilename ;
87
+ async loadFile ( filename , ...args ) {
88
+ let result ;
95
89
96
90
try {
97
- resolvedFilename = await this . resolveRequests ( context , [
98
- moduleRequest ,
99
- url ,
100
- ] ) ;
91
+ result = await super . loadFile ( filename , ...args ) ;
101
92
} catch ( error ) {
102
- loaderContext . emitError ( error ) ;
93
+ if ( error . type !== 'File' ) {
94
+ loaderContext . emitError ( error ) ;
103
95
104
- return super . loadFile ( filename , currentDirectory , options , ...args ) ;
105
- }
96
+ return Promise . reject ( error ) ;
97
+ }
98
+
99
+ try {
100
+ result = await this . resolveFilename ( filename , ...args ) ;
101
+ } catch ( e ) {
102
+ loaderContext . emitError ( e ) ;
106
103
107
- loaderContext . addDependency ( resolvedFilename ) ;
104
+ return Promise . reject ( error ) ;
105
+ }
108
106
109
- if ( isLessCompatible . test ( resolvedFilename ) ) {
110
- const fileBuffer = await readFile ( resolvedFilename ) ;
111
- const contents = fileBuffer . toString ( 'utf8' ) ;
107
+ loaderContext . addDependency ( result ) ;
112
108
113
- return {
114
- contents,
115
- filename : resolvedFilename ,
116
- } ;
109
+ return super . loadFile ( result , ...args ) ;
117
110
}
118
111
119
- const loadedModule = await loadModule (
120
- [ stringifyLoader , resolvedFilename ] . join ( '!' )
121
- ) ;
122
- const contents = JSON . parse ( loadedModule ) ;
112
+ loaderContext . addDependency ( result . filename ) ;
123
113
124
- return {
125
- contents,
126
- filename : resolvedFilename ,
127
- } ;
114
+ return result ;
128
115
}
129
116
}
130
117
0 commit comments