@@ -10,8 +10,10 @@ const { aliasResolveHandler } = require("./AliasUtils");
1010const { modulesResolveHandler } = require ( "./ModulesUtils" ) ;
1111
1212/** @typedef {import("./Resolver") } Resolver */
13- /** @typedef {{alias: string | string[] | false, name: string, onlyModule?: boolean} } AliasOption */
1413/** @typedef {import("./Resolver").ResolveStepHook } ResolveStepHook */
14+ /** @typedef {import("./AliasUtils").AliasOption } AliasOption */
15+ /** @typedef {import("./Resolver").ResolveRequest } ResolveRequest */
16+ /** @typedef {import("./Resolver").ResolveContext } ResolveContext */
1517
1618/**
1719 * @typedef {object } TsconfigPathsPluginOptions
@@ -37,22 +39,18 @@ module.exports = class TsconfigPathsPlugin {
3739 apply ( resolver ) {
3840 const aliasTarget = resolver . ensureHook ( "internal-resolve" ) ;
3941 const moduleTarget = resolver . ensureHook ( "module" ) ;
40- const aliasResultCachePromise = this . loadAndConvertPaths ( resolver ) ;
4142
4243 resolver
4344 . getHook ( "raw-resolve" )
4445 . tapAsync (
4546 "TsconfigPathsPlugin" ,
4647 async ( request , resolveContext , callback ) => {
4748 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+ ) ;
5654 aliasResolveHandler (
5755 resolver ,
5856 aliases . filter ( ( option ) => option . name !== "*" ) ,
@@ -73,18 +71,14 @@ module.exports = class TsconfigPathsPlugin {
7371 "TsconfigPathsPlugin" ,
7472 async ( request , resolveContext , callback ) => {
7573 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+ ) ;
8479 const directories = aliases
8580 . filter ( ( option ) => option . name === "*" )
8681 . map ( ( option ) => /** @type {string } */ ( option . alias ) ) ;
87- if ( directories . length === 0 ) return callback ( ) ;
8882
8983 modulesResolveHandler (
9084 resolver ,
@@ -101,6 +95,27 @@ module.exports = class TsconfigPathsPlugin {
10195 ) ;
10296 }
10397
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+
104119 /**
105120 * Load tsconfig.json (and referenced tsconfigs) and convert paths to AliasPlugin format
106121 * @param {Resolver } resolver the resolver
0 commit comments