@@ -35,10 +35,9 @@ module.exports = class TsconfigPathsPlugin {
3535 apply ( resolver ) {
3636 if ( ! this . configFile ) return ;
3737
38- const fs = resolver . fileSystem ;
3938 const aliasTarget = resolver . ensureHook ( "internal-resolve" ) ;
4039 const moduleTarget = resolver . ensureHook ( "module" ) ;
41- const aliasOptionsPromise = this . loadAndConvertPaths ( fs ) ;
40+ const aliasOptionsPromise = this . loadAndConvertPaths ( resolver ) ;
4241
4342 resolver
4443 . getHook ( "raw-resolve" )
@@ -90,25 +89,30 @@ module.exports = class TsconfigPathsPlugin {
9089
9190 /**
9291 * Load tsconfig.json (and referenced tsconfigs) and convert paths to AliasPlugin format
93- * @param {import("./ Resolver").FileSystem } fs the file system
92+ * @param {Resolver } resolver the file system
9493 * @returns {Promise<AliasOption[]> } Array of alias options for AliasPlugin
9594 */
96- async loadAndConvertPaths ( fs ) {
95+ async loadAndConvertPaths ( resolver ) {
9796 try {
97+ const fs = resolver . fileSystem ;
9898 const configPath = path . isAbsolute ( this . configFile )
9999 ? this . configFile
100- : path . resolve ( process . cwd ( ) , this . configFile ) ;
100+ : resolver . join ( process . cwd ( ) , this . configFile ) ;
101101
102102 const mainOptions = await this . readTsconfigCompilerOptions (
103- fs ,
103+ resolver ,
104104 configPath ,
105105 ) ;
106106 if ( ! mainOptions ) return [ ] ;
107107
108108 /** @type {AliasOption[] } */
109109 const aliases = [ ] ;
110110 aliases . push (
111- ...this . convertPathsToAliases ( mainOptions . paths , mainOptions . baseUrl ) ,
111+ ...this . convertPathsToAliases (
112+ resolver ,
113+ mainOptions . paths ,
114+ mainOptions . baseUrl ,
115+ ) ,
112116 ) ;
113117
114118 // Collect references from the main tsconfig.json
@@ -129,7 +133,7 @@ module.exports = class TsconfigPathsPlugin {
129133 if ( ! refPathLike ) continue ;
130134 let refPath = path . isAbsolute ( refPathLike )
131135 ? refPathLike
132- : path . resolve ( path . dirname ( configPath ) , refPathLike ) ;
136+ : resolver . join ( path . dirname ( configPath ) , refPathLike ) ;
133137 // If reference points to a directory, append tsconfig.json
134138 try {
135139 const stat = await new Promise ( ( resolve , reject ) => {
@@ -139,19 +143,23 @@ module.exports = class TsconfigPathsPlugin {
139143 } ) ;
140144 } ) ;
141145 if ( stat . isDirectory ( ) ) {
142- refPath = path . join ( refPath , "tsconfig.json" ) ;
146+ refPath = resolver . join ( refPath , "tsconfig.json" ) ;
143147 }
144148 } catch ( _e ) {
145149 // if it doesn't exist as directory/file, try adding tsconfig.json
146150 if ( ! / \. j s o n $ / i. test ( refPath ) ) {
147- refPath = path . join ( refPath , "tsconfig.json" ) ;
151+ refPath = resolver . join ( refPath , "tsconfig.json" ) ;
148152 }
149153 }
150154
151155 const refOptions = await this . readTsconfigCompilerOptions ( fs , refPath ) ;
152156 if ( ! refOptions ) continue ;
153157 aliases . push (
154- ...this . convertPathsToAliases ( refOptions . paths , refOptions . baseUrl ) ,
158+ ...this . convertPathsToAliases (
159+ resolver ,
160+ refOptions . paths ,
161+ refOptions . baseUrl ,
162+ ) ,
155163 ) ;
156164 }
157165
@@ -163,12 +171,13 @@ module.exports = class TsconfigPathsPlugin {
163171
164172 /**
165173 * Read tsconfig.json and return normalized compiler options
166- * @param {import("./ Resolver").FileSystem } fs the file system
174+ * @param {Resolver } resolver the resolver
167175 * @param {string } absTsconfigPath absolute path to tsconfig.json
168176 * @returns {Promise<{ baseUrl: string, paths: {[key: string]: string[]} } | null> } the normalized compiler options
169177 */
170- async readTsconfigCompilerOptions ( fs , absTsconfigPath ) {
178+ async readTsconfigCompilerOptions ( resolver , absTsconfigPath ) {
171179 try {
180+ const fs = resolver . fileSystem ;
172181 const json = await new Promise ( ( resolve , reject ) => {
173182 fs . readFile ( absTsconfigPath , "utf8" , ( err , data ) => {
174183 if ( err ) reject ( err ) ;
@@ -181,7 +190,7 @@ module.exports = class TsconfigPathsPlugin {
181190 if ( ! baseUrl ) {
182191 baseUrl = path . dirname ( absTsconfigPath ) ;
183192 } else if ( ! path . isAbsolute ( baseUrl ) ) {
184- baseUrl = path . resolve ( path . dirname ( absTsconfigPath ) , baseUrl ) ;
193+ baseUrl = resolver . join ( path . dirname ( absTsconfigPath ) , baseUrl ) ;
185194 }
186195 const paths = compilerOptions . paths || { } ;
187196 return { baseUrl, paths } ;
@@ -192,27 +201,28 @@ module.exports = class TsconfigPathsPlugin {
192201
193202 /**
194203 * Convert TypeScript paths configuration to AliasPlugin aliases
204+ * @param {Resolver } resolver the resolver
195205 * @param {{[key: string]: string[]} } paths TypeScript paths mapping
196206 * @param {string } baseUrl Base URL for resolving paths
197207 * @returns {AliasOption[] } Array of alias options
198208 */
199- convertPathsToAliases ( paths , baseUrl ) {
209+ convertPathsToAliases ( resolver , paths , baseUrl ) {
200210 /** @type {AliasOption[] } */
201211 const aliases = [ ] ;
202212
203213 for ( const [ pattern , mappings ] of Object . entries ( paths ) ) {
204214 // Handle exact matches (no wildcards)
205215 if ( ! pattern . includes ( "*" ) ) {
206216 if ( mappings . length > 0 ) {
207- const targetPath = path . resolve ( baseUrl , mappings [ 0 ] ) ;
217+ const targetPath = resolver . join ( baseUrl , mappings [ 0 ] ) ;
208218 aliases . push ( { name : pattern , alias : targetPath } ) ;
209219 }
210220 } else {
211221 // Handle wildcard patterns by mapping the directory
212222 const aliasName = pattern . replace ( / \/ \* $ / , "" ) ;
213223 // Convert targets like "dir/*" -> "dir"
214224 const aliasTargets = mappings . map ( ( mapping ) =>
215- path . resolve ( baseUrl , mapping . replace ( / \/ \* $ / , "" ) ) ,
225+ resolver . join ( baseUrl , mapping . replace ( / \/ \* $ / , "" ) ) ,
216226 ) ;
217227 if ( aliasTargets . length > 0 ) {
218228 aliases . push ( { name : aliasName , alias : aliasTargets [ 0 ] } ) ;
0 commit comments