@@ -13,7 +13,7 @@ use pathdiff::diff_paths;
13
13
use swc_atoms:: JsWord ;
14
14
use swc_common:: { FileName , Mark , Span , DUMMY_SP } ;
15
15
use swc_ecma_ast:: * ;
16
- use swc_ecma_loader:: resolve:: Resolve ;
16
+ use swc_ecma_loader:: resolve:: { Resolution , Resolve } ;
17
17
use swc_ecma_utils:: { quote_ident, ExprFactory } ;
18
18
use tracing:: { debug, info, warn, Level } ;
19
19
@@ -155,8 +155,8 @@ where
155
155
false
156
156
} ;
157
157
158
- let is_resolved_as_ts = if let Some ( ext) = target_path. extension ( ) {
159
- ext == "ts" || ext == "tsx "
158
+ let is_resolved_as_non_js = if let Some ( ext) = target_path. extension ( ) {
159
+ ext != "js "
160
160
} else {
161
161
false
162
162
} ;
@@ -173,17 +173,31 @@ where
173
173
false
174
174
} ;
175
175
176
- if !is_resolved_as_js && !is_resolved_as_index && !is_exact {
176
+ if orig_filename == "index" {
177
+ // Import: `./foo/index`
178
+ // Resolved: `./foo/index.js`
179
+
180
+ if self . config . resolve_fully {
181
+ target_path. set_file_name ( "index.js" ) ;
182
+ } else {
183
+ target_path. set_file_name ( "index" ) ;
184
+ }
185
+ } else if is_resolved_as_index && is_resolved_as_js && orig_filename != "index.js" {
186
+ // Import: `./foo`
187
+ // Resolved: `./foo/index.js`
188
+
189
+ target_path. pop ( ) ;
190
+ } else if !is_resolved_as_js && !is_resolved_as_index && !is_exact {
177
191
target_path. set_file_name ( orig_filename) ;
178
- } else if is_resolved_as_ts && is_exact {
192
+ } else if is_resolved_as_non_js && is_exact {
179
193
if let Some ( ext) = Path :: new ( orig_filename) . extension ( ) {
180
194
target_path. set_extension ( ext) ;
181
195
} else {
182
196
target_path. set_extension ( "js" ) ;
183
197
}
184
- } else if self . config . resolve_fully && is_resolved_as_ts {
198
+ } else if self . config . resolve_fully && is_resolved_as_non_js {
185
199
target_path. set_extension ( "js" ) ;
186
- } else if is_resolved_as_ts && is_resolved_as_index {
200
+ } else if is_resolved_as_non_js && is_resolved_as_index {
187
201
if orig_filename == "index" {
188
202
target_path. set_extension ( "" ) ;
189
203
} else {
@@ -216,7 +230,7 @@ where
216
230
None
217
231
} ;
218
232
219
- let orig_filename = module_specifier. split ( '/' ) . last ( ) ;
233
+ let orig_slug = module_specifier. split ( '/' ) . last ( ) ;
220
234
221
235
let target = self . resolver . resolve ( base, module_specifier) ;
222
236
let mut target = match target {
@@ -230,24 +244,30 @@ where
230
244
// Bazel uses symlink
231
245
//
232
246
// https://github.com/swc-project/swc/issues/8265
233
- if let FileName :: Real ( resolved) = & target {
247
+ if let FileName :: Real ( resolved) = & target. filename {
234
248
if let Ok ( orig) = read_link ( resolved) {
235
- target = FileName :: Real ( orig) ;
249
+ target. filename = FileName :: Real ( orig) ;
236
250
}
237
251
}
238
252
239
- info ! ( "Resolved to {}" , target) ;
253
+ let Resolution {
254
+ filename : target,
255
+ slug,
256
+ } = target;
257
+ let slug = slug. as_deref ( ) . or ( orig_slug) ;
258
+
259
+ info ! ( "Resolved as {target:?} with slug = {slug:?}" ) ;
240
260
241
261
let mut target = match target {
242
262
FileName :: Real ( v) => {
243
263
// @nestjs/common should be preserved as a whole
244
264
if v. starts_with ( "." ) || v. starts_with ( ".." ) || v. is_absolute ( ) {
245
265
v
246
266
} else {
247
- return Ok ( self . to_specifier ( v, orig_filename ) ) ;
267
+ return Ok ( self . to_specifier ( v, slug ) ) ;
248
268
}
249
269
}
250
- FileName :: Custom ( s) => return Ok ( self . to_specifier ( s. into ( ) , orig_filename ) ) ,
270
+ FileName :: Custom ( s) => return Ok ( self . to_specifier ( s. into ( ) , slug ) ) ,
251
271
_ => {
252
272
unreachable ! (
253
273
"Node path provider does not support using `{:?}` as a target file name" ,
@@ -293,7 +313,7 @@ where
293
313
294
314
let rel_path = match rel_path {
295
315
Some ( v) => v,
296
- None => return Ok ( self . to_specifier ( target, orig_filename ) ) ,
316
+ None => return Ok ( self . to_specifier ( target, slug ) ) ,
297
317
} ;
298
318
299
319
debug ! ( "Relative path: {}" , rel_path. display( ) ) ;
@@ -323,7 +343,7 @@ where
323
343
Cow :: Owned ( format ! ( "./{}" , s) )
324
344
} ;
325
345
326
- Ok ( self . to_specifier ( s. into_owned ( ) . into ( ) , orig_filename ) )
346
+ Ok ( self . to_specifier ( s. into_owned ( ) . into ( ) , slug ) )
327
347
}
328
348
}
329
349
0 commit comments