@@ -10,8 +10,10 @@ const { aliasResolveHandler } = require("./AliasUtils");
10
10
const { modulesResolveHandler } = require ( "./ModulesUtils" ) ;
11
11
12
12
/** @typedef {import("./Resolver") } Resolver */
13
- /** @typedef {{alias: string | string[] | false, name: string, onlyModule?: boolean} } AliasOption */
14
13
/** @typedef {import("./Resolver").ResolveStepHook } ResolveStepHook */
14
+ /** @typedef {import("./AliasUtils").AliasOption } AliasOption */
15
+ /** @typedef {import("./Resolver").ResolveRequest } ResolveRequest */
16
+ /** @typedef {import("./Resolver").ResolveContext } ResolveContext */
15
17
16
18
/**
17
19
* @typedef {object } TsconfigPathsPluginOptions
@@ -37,22 +39,18 @@ module.exports = class TsconfigPathsPlugin {
37
39
apply ( resolver ) {
38
40
const aliasTarget = resolver . ensureHook ( "internal-resolve" ) ;
39
41
const moduleTarget = resolver . ensureHook ( "module" ) ;
40
- const aliasResultCachePromise = this . loadAndConvertPaths ( resolver ) ;
41
42
42
43
resolver
43
44
. getHook ( "raw-resolve" )
44
45
. tapAsync (
45
46
"TsconfigPathsPlugin" ,
46
47
async ( request , resolveContext , callback ) => {
47
48
try {
48
- const aliasResult = await aliasResultCachePromise ;
49
- if ( ! aliasResult ) return callback ( ) ;
50
- const { aliases, fileDependencies } = aliasResult ;
51
- for ( const fileDependency of fileDependencies ) {
52
- if ( resolveContext . fileDependencies ) {
53
- resolveContext . fileDependencies . add ( fileDependency ) ;
54
- }
55
- }
49
+ const aliases = await this . beforeResolve (
50
+ resolver ,
51
+ request ,
52
+ resolveContext ,
53
+ ) ;
56
54
aliasResolveHandler (
57
55
resolver ,
58
56
aliases . filter ( ( option ) => option . name !== "*" ) ,
@@ -73,18 +71,14 @@ module.exports = class TsconfigPathsPlugin {
73
71
"TsconfigPathsPlugin" ,
74
72
async ( request , resolveContext , callback ) => {
75
73
try {
76
- const aliasResult = await aliasResultCachePromise ;
77
- if ( ! aliasResult ) return callback ( ) ;
78
- const { aliases, fileDependencies } = aliasResult ;
79
- for ( const fileDependency of fileDependencies ) {
80
- if ( resolveContext . fileDependencies ) {
81
- resolveContext . fileDependencies . add ( fileDependency ) ;
82
- }
83
- }
74
+ const aliases = await this . beforeResolve (
75
+ resolver ,
76
+ request ,
77
+ resolveContext ,
78
+ ) ;
84
79
const directories = aliases
85
80
. filter ( ( option ) => option . name === "*" )
86
81
. map ( ( option ) => /** @type {string } */ ( option . alias ) ) ;
87
- if ( directories . length === 0 ) return callback ( ) ;
88
82
89
83
modulesResolveHandler (
90
84
resolver ,
@@ -101,6 +95,27 @@ module.exports = class TsconfigPathsPlugin {
101
95
) ;
102
96
}
103
97
98
+ /**
99
+ * Pre-process request to load tsconfig.json and convert paths to AliasPlugin format
100
+ * @param {Resolver } resolver the resolver
101
+ * @param {ResolveRequest } request the request
102
+ * @param {ResolveContext } resolveContext the resolve context
103
+ * @returns {Promise<Array<AliasOption>> } the pre-processed request
104
+ */
105
+ async beforeResolve ( resolver , request , resolveContext ) {
106
+ const tsconfigFileData =
107
+ request . tsconfigFileData || ( await this . loadAndConvertPaths ( resolver ) ) ;
108
+ if ( ! tsconfigFileData ) return [ ] ;
109
+ const { aliases, fileDependencies } = tsconfigFileData ;
110
+ for ( const fileDependency of fileDependencies ) {
111
+ if ( resolveContext . fileDependencies ) {
112
+ resolveContext . fileDependencies . add ( fileDependency ) ;
113
+ }
114
+ }
115
+ request . tsconfigFileData = tsconfigFileData ;
116
+ return aliases ;
117
+ }
118
+
104
119
/**
105
120
* Load tsconfig.json (and referenced tsconfigs) and convert paths to AliasPlugin format
106
121
* @param {Resolver } resolver the resolver
0 commit comments