5
5
6
6
"use strict" ;
7
7
8
- const forEachBail = require ( "./forEachBail" ) ;
9
- const { PathType, getType } = require ( "./util/path" ) ;
10
-
11
8
/** @typedef {import("./Resolver") } Resolver */
12
- /** @typedef {import("./Resolver").ResolveRequest } ResolveRequest */
13
9
/** @typedef {import("./Resolver").ResolveStepHook } ResolveStepHook */
14
10
/** @typedef {string | Array<string> | false } Alias */
15
11
/** @typedef {{alias: Alias, name: string, onlyModule?: boolean} } AliasOption */
16
12
17
- /** @typedef { AliasOption | Array<AliasOption> } BaseAliasOptions */
13
+ const { aliasResolveHandler } = require ( "./AliasUtils" ) ;
18
14
19
15
module . exports = class AliasPlugin {
20
16
/**
21
17
* @param {string | ResolveStepHook } source source
22
- * @param {BaseAliasOptions | Promise<BaseAliasOptions > } options options
18
+ * @param {AliasOption | Array<AliasOption > } options options
23
19
* @param {string | ResolveStepHook } target target
24
20
*/
25
21
constructor ( source , options , target ) {
26
22
this . source = source ;
27
- this . options = options ;
23
+ this . options = Array . isArray ( options ) ? options : [ options ] ;
28
24
this . target = target ;
29
25
}
30
26
@@ -34,165 +30,18 @@ module.exports = class AliasPlugin {
34
30
*/
35
31
apply ( resolver ) {
36
32
const target = resolver . ensureHook ( this . target ) ;
37
- /**
38
- * @param {string } maybeAbsolutePath path
39
- * @returns {null|string } absolute path with slash ending
40
- */
41
- const getAbsolutePathWithSlashEnding = ( maybeAbsolutePath ) => {
42
- const type = getType ( maybeAbsolutePath ) ;
43
- if ( type === PathType . AbsolutePosix || type === PathType . AbsoluteWin ) {
44
- return resolver . join ( maybeAbsolutePath , "_" ) . slice ( 0 , - 1 ) ;
45
- }
46
- return null ;
47
- } ;
48
- /**
49
- * @param {string } path path
50
- * @param {string } maybeSubPath sub path
51
- * @returns {boolean } true, if path is sub path
52
- */
53
- const isSubPath = ( path , maybeSubPath ) => {
54
- const absolutePath = getAbsolutePathWithSlashEnding ( maybeSubPath ) ;
55
- if ( ! absolutePath ) return false ;
56
- return path . startsWith ( absolutePath ) ;
57
- } ;
33
+
58
34
resolver
59
35
. getHook ( this . source )
60
36
. tapAsync ( "AliasPlugin" , ( request , resolveContext , callback ) => {
61
- const innerRequest = request . request || request . path ;
62
- if ( ! innerRequest ) return callback ( ) ;
63
-
64
- /**
65
- * @param {AliasOption | Array<AliasOption> } options options
66
- * @returns {void }
67
- */
68
- const applyOptions = ( options ) => {
69
- const normalizedOptions = Array . isArray ( options )
70
- ? options
71
- : [ options ] ;
72
-
73
- forEachBail (
74
- normalizedOptions ,
75
- ( item , callback ) => {
76
- /** @type {boolean } */
77
- let shouldStop = false ;
78
-
79
- const matchRequest =
80
- innerRequest === item . name ||
81
- ( ! item . onlyModule &&
82
- ( request . request
83
- ? innerRequest . startsWith ( `${ item . name } /` )
84
- : isSubPath ( innerRequest , item . name ) ) ) ;
85
-
86
- const splitName = item . name . split ( "*" ) ;
87
- const matchWildcard = ! item . onlyModule && splitName . length === 2 ;
88
-
89
- if ( matchRequest || matchWildcard ) {
90
- /**
91
- * @param {Alias } alias alias
92
- * @param {(err?: null|Error, result?: null|ResolveRequest) => void } callback callback
93
- * @returns {void }
94
- */
95
- const resolveWithAlias = ( alias , callback ) => {
96
- if ( alias === false ) {
97
- /** @type {ResolveRequest } */
98
- const ignoreObj = {
99
- ...request ,
100
- path : false ,
101
- } ;
102
- if ( typeof resolveContext . yield === "function" ) {
103
- resolveContext . yield ( ignoreObj ) ;
104
- return callback ( null , null ) ;
105
- }
106
- return callback ( null , ignoreObj ) ;
107
- }
108
-
109
- let newRequestStr ;
110
-
111
- const [ prefix , suffix ] = splitName ;
112
- if (
113
- matchWildcard &&
114
- innerRequest . startsWith ( prefix ) &&
115
- innerRequest . endsWith ( suffix )
116
- ) {
117
- const match = innerRequest . slice (
118
- prefix . length ,
119
- innerRequest . length - suffix . length ,
120
- ) ;
121
- newRequestStr = item . alias . toString ( ) . replace ( "*" , match ) ;
122
- }
123
-
124
- if (
125
- matchRequest &&
126
- innerRequest !== alias &&
127
- ! innerRequest . startsWith ( `${ alias } /` )
128
- ) {
129
- /** @type {string } */
130
- const remainingRequest = innerRequest . slice (
131
- item . name . length ,
132
- ) ;
133
- newRequestStr = alias + remainingRequest ;
134
- }
135
-
136
- if ( newRequestStr !== undefined ) {
137
- shouldStop = true ;
138
- /** @type {ResolveRequest } */
139
- const obj = {
140
- ...request ,
141
- request : newRequestStr ,
142
- fullySpecified : false ,
143
- } ;
144
- return resolver . doResolve (
145
- target ,
146
- obj ,
147
- `aliased with mapping '${ item . name } ': '${ alias } ' to '${ newRequestStr } '` ,
148
- resolveContext ,
149
- ( err , result ) => {
150
- if ( err ) return callback ( err ) ;
151
- if ( result ) return callback ( null , result ) ;
152
- return callback ( ) ;
153
- } ,
154
- ) ;
155
- }
156
- return callback ( ) ;
157
- } ;
158
-
159
- /**
160
- * @param {(null | Error)= } err error
161
- * @param {(null | ResolveRequest)= } result result
162
- * @returns {void }
163
- */
164
- const stoppingCallback = ( err , result ) => {
165
- if ( err ) return callback ( err ) ;
166
-
167
- if ( result ) return callback ( null , result ) ;
168
- // Don't allow other aliasing or raw request
169
- if ( shouldStop ) return callback ( null , null ) ;
170
- return callback ( ) ;
171
- } ;
172
-
173
- if ( Array . isArray ( item . alias ) ) {
174
- return forEachBail (
175
- item . alias ,
176
- resolveWithAlias ,
177
- stoppingCallback ,
178
- ) ;
179
- }
180
- return resolveWithAlias ( item . alias , stoppingCallback ) ;
181
- }
182
-
183
- return callback ( ) ;
184
- } ,
185
- callback ,
186
- ) ;
187
- } ;
188
-
189
- if ( this . options instanceof Promise ) {
190
- this . options . then ( ( options ) => {
191
- applyOptions ( options ) ;
192
- } ) ;
193
- } else {
194
- applyOptions ( this . options ) ;
195
- }
37
+ aliasResolveHandler (
38
+ resolver ,
39
+ this . options ,
40
+ target ,
41
+ request ,
42
+ resolveContext ,
43
+ callback ,
44
+ ) ;
196
45
} ) ;
197
46
}
198
47
} ;
0 commit comments