@@ -11,13 +11,6 @@ import { CompilerOptions, MapLike } from 'typescript';
11
11
12
12
const getInnerRequest = require ( 'enhanced-resolve/lib/getInnerRequest' ) ;
13
13
14
- interface NormalModuleFactoryRequest {
15
- request : string ;
16
- context : { issuer : string } ;
17
- contextInfo : { issuer : string } ;
18
- typescriptPathMapped ?: boolean ;
19
- }
20
-
21
14
// eslint-disable-next-line @typescript-eslint/no-empty-interface
22
15
export interface TypeScriptPathsPluginOptions extends Pick < CompilerOptions , 'paths' | 'baseUrl' > { }
23
16
@@ -29,78 +22,94 @@ export class TypeScriptPathsPlugin {
29
22
}
30
23
31
24
// eslint-disable-next-line @typescript-eslint/no-explicit-any
32
- apply ( resolver : any ) {
25
+ apply ( resolver : import ( 'enhanced-resolve' ) . Resolver ) {
33
26
const target = resolver . ensureHook ( 'resolve' ) ;
34
- const resolveAsync = ( request : NormalModuleFactoryRequest , requestContext : { } ) => {
35
- return new Promise < NormalModuleFactoryRequest | undefined > ( ( resolve , reject ) => {
36
- resolver . doResolve (
37
- target ,
38
- request ,
39
- '' ,
40
- requestContext ,
41
- ( error : Error | null , result : NormalModuleFactoryRequest | undefined ) => {
42
- if ( error ) {
43
- reject ( error ) ;
44
- } else {
45
- resolve ( result ) ;
46
- }
47
- } ,
48
- ) ;
49
- } ) ;
50
- } ;
51
-
52
- resolver
53
- . getHook ( 'described-resolve' )
54
- . tapPromise (
55
- 'TypeScriptPathsPlugin' ,
56
- async ( request : NormalModuleFactoryRequest , resolveContext : { } ) => {
57
- if ( ! this . options ) {
58
- throw new Error ( 'TypeScriptPathsPlugin options were not provided.' ) ;
59
- }
60
27
61
- if ( ! request || request . typescriptPathMapped ) {
62
- return ;
63
- }
28
+ resolver . getHook ( 'described-resolve' ) . tapAsync (
29
+ 'TypeScriptPathsPlugin' ,
30
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
+ ( request : any , resolveContext , callback ) => {
32
+ if ( ! this . options ) {
33
+ callback ( ) ;
64
34
65
- const originalRequest = getInnerRequest ( resolver , request ) ;
66
- if ( ! originalRequest ) {
67
- return ;
68
- }
35
+ return ;
36
+ }
69
37
70
- // Only work on Javascript/TypeScript issuers.
71
- if ( ! request . context . issuer || ! request . context . issuer . match ( / \. [ j t ] s x ? $ / ) ) {
72
- return ;
73
- }
38
+ if ( ! request || request . typescriptPathMapped ) {
39
+ callback ( ) ;
74
40
75
- // Relative or absolute requests are not mapped
76
- if ( originalRequest . startsWith ( '.' ) || originalRequest . startsWith ( '/' ) ) {
77
- return ;
78
- }
41
+ return ;
42
+ }
43
+
44
+ const originalRequest = getInnerRequest ( resolver , request ) ;
45
+ if ( ! originalRequest ) {
46
+ callback ( ) ;
47
+
48
+ return ;
49
+ }
50
+
51
+ // Only work on Javascript/TypeScript issuers.
52
+ if ( ! request . context . issuer || ! request . context . issuer . match ( / \. [ j t ] s x ? $ / ) ) {
53
+ callback ( ) ;
54
+
55
+ return ;
56
+ }
57
+
58
+ // Relative or absolute requests are not mapped
59
+ if ( originalRequest . startsWith ( '.' ) || originalRequest . startsWith ( '/' ) ) {
60
+ callback ( ) ;
61
+
62
+ return ;
63
+ }
64
+
65
+ // Ignore all webpack special requests
66
+ if ( originalRequest . startsWith ( '!!' ) ) {
67
+ callback ( ) ;
68
+
69
+ return ;
70
+ }
71
+
72
+ const replacements = findReplacements ( originalRequest , this . options . paths || { } ) ;
73
+
74
+ const tryResolve = ( ) => {
75
+ const potential = replacements . shift ( ) ;
76
+ if ( ! potential ) {
77
+ callback ( ) ;
79
78
80
- // Ignore all webpack special requests
81
- if ( originalRequest . startsWith ( '!!' ) ) {
82
79
return ;
83
80
}
84
81
85
- const replacements = findReplacements ( originalRequest , this . options . paths || { } ) ;
86
- for ( const potential of replacements ) {
87
- const potentialRequest = {
88
- ...request ,
89
- request : path . resolve ( this . options . baseUrl || '' , potential ) ,
90
- typescriptPathMapped : true ,
91
- } ;
92
- const result = await resolveAsync ( potentialRequest , resolveContext ) ;
93
-
94
- if ( result ) {
95
- return result ;
96
- }
97
- }
98
- } ,
99
- ) ;
82
+ const potentialRequest = {
83
+ ...request ,
84
+ request : path . resolve ( this . options ?. baseUrl || '' , potential ) ,
85
+ typescriptPathMapped : true ,
86
+ } ;
87
+
88
+ resolver . doResolve (
89
+ target ,
90
+ potentialRequest ,
91
+ '' ,
92
+ resolveContext ,
93
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
+ ( error : Error | null , result : any ) => {
95
+ if ( error ) {
96
+ callback ( error ) ;
97
+ } else if ( result ) {
98
+ callback ( undefined , result ) ;
99
+ } else {
100
+ tryResolve ( ) ;
101
+ }
102
+ } ,
103
+ ) ;
104
+ } ;
105
+
106
+ tryResolve ( ) ;
107
+ } ,
108
+ ) ;
100
109
}
101
110
}
102
111
103
- function findReplacements ( originalRequest : string , paths : MapLike < string [ ] > ) : Iterable < string > {
112
+ function findReplacements ( originalRequest : string , paths : MapLike < string [ ] > ) : string [ ] {
104
113
// check if any path mapping rules are relevant
105
114
const pathMapOptions = [ ] ;
106
115
for ( const pattern in paths ) {
0 commit comments