Skip to content

Commit e2fabea

Browse files
Copilotandrewbranch
andcommitted
Implement rewriteRelativeImportExtensions feature
Co-authored-by: andrewbranch <3277153+andrewbranch@users.noreply.github.com>
1 parent 84de4c9 commit e2fabea

File tree

3 files changed

+55
-4
lines changed

3 files changed

+55
-4
lines changed

internal/checker/checker.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14498,6 +14498,34 @@ func (c *Checker) resolveExternalModule(location *ast.Node, moduleReference stri
1449814498
)
1449914499
}
1450014500
}
14501+
} else if c.compilerOptions.RewriteRelativeImportExtensions.IsTrue() &&
14502+
location.Flags&ast.NodeFlagsAmbient == 0 &&
14503+
!tspath.IsDeclarationFileName(moduleReference) &&
14504+
!ast.IsLiteralImportTypeNode(location) &&
14505+
!ast.IsPartOfTypeOnlyImportOrExportDeclaration(location) {
14506+
shouldRewrite := c.shouldRewriteModuleSpecifier(moduleReference)
14507+
if !resolvedModule.ResolvedUsingTsExtension && shouldRewrite {
14508+
relativeToSourceFile := tspath.GetRelativePathFromDirectory(
14509+
tspath.GetDirectoryPath(tspath.GetNormalizedAbsolutePath(importingSourceFile.FileName(), c.program.GetCurrentDirectory())),
14510+
resolvedModule.ResolvedFileName,
14511+
tspath.ComparePathsOptions{
14512+
UseCaseSensitiveFileNames: c.program.UseCaseSensitiveFileNames(),
14513+
CurrentDirectory: c.program.GetCurrentDirectory(),
14514+
},
14515+
)
14516+
c.error(
14517+
errorNode,
14518+
diagnostics.This_relative_import_path_is_unsafe_to_rewrite_because_it_looks_like_a_file_name_but_actually_resolves_to_0,
14519+
relativeToSourceFile,
14520+
)
14521+
} else if resolvedModule.ResolvedUsingTsExtension && !shouldRewrite && c.sourceFileMayBeEmitted(sourceFile) {
14522+
c.error(
14523+
errorNode,
14524+
diagnostics.This_import_uses_a_0_extension_to_resolve_to_an_input_TypeScript_file_but_will_not_be_rewritten_during_emit_because_it_is_not_a_relative_path,
14525+
tspath.GetAnyExtensionFromPath(moduleReference, nil, false),
14526+
)
14527+
}
14528+
// TODO: Add project reference check when GetResolvedProjectReferenceToRedirect is implemented
1450114529
}
1450214530

1450314531
if sourceFile.Symbol != nil {
@@ -30379,3 +30407,26 @@ func (c *Checker) GetEmitResolver(file *ast.SourceFile, skipDiagnostics bool) *e
3037930407
func (c *Checker) GetAliasedSymbol(symbol *ast.Symbol) *ast.Symbol {
3038030408
return c.resolveAlias(symbol)
3038130409
}
30410+
30411+
func (c *Checker) sourceFileMayBeEmitted(sourceFile *ast.SourceFile) bool {
30412+
options := c.compilerOptions
30413+
if options.NoEmit.IsTrue() || options.EmitDeclarationOnly.IsTrue() {
30414+
return false
30415+
}
30416+
// Check if this source file is a declaration file
30417+
if tspath.IsDeclarationFileName(sourceFile.FileName()) {
30418+
return false
30419+
}
30420+
// Check if this is a JS file and allowJs is disabled
30421+
if tspath.HasJSFileExtension(sourceFile.FileName()) && !options.AllowJs.IsTrue() {
30422+
return false
30423+
}
30424+
return true
30425+
}
30426+
30427+
func (c *Checker) shouldRewriteModuleSpecifier(specifier string) bool {
30428+
return c.compilerOptions.RewriteRelativeImportExtensions.IsTrue() &&
30429+
tspath.PathIsRelative(specifier) &&
30430+
!tspath.IsDeclarationFileName(specifier) &&
30431+
tspath.HasTSFileExtension(specifier)
30432+
}

internal/transformers/utilities.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ func tryRenameExternalModule(factory *printer.NodeFactory, moduleName *ast.Liter
336336
}
337337

338338
func rewriteModuleSpecifier(emitContext *printer.EmitContext, node *ast.Expression, compilerOptions *core.CompilerOptions) *ast.Expression {
339-
if node == nil || !ast.IsStringLiteral(node) || !shouldRewriteModuleSpecifier(node.Text(), compilerOptions) {
339+
if node == nil || !ast.IsStringLiteral(node) || !ShouldRewriteModuleSpecifier(node.Text(), compilerOptions) {
340340
return node
341341
}
342342
updatedText := tspath.ChangeExtension(node.Text(), outputpaths.GetOutputExtension(node.Text(), compilerOptions.Jsx))
@@ -350,7 +350,7 @@ func rewriteModuleSpecifier(emitContext *printer.EmitContext, node *ast.Expressi
350350
return node
351351
}
352352

353-
func shouldRewriteModuleSpecifier(specifier string, compilerOptions *core.CompilerOptions) bool {
353+
func ShouldRewriteModuleSpecifier(specifier string, compilerOptions *core.CompilerOptions) bool {
354354
return compilerOptions.RewriteRelativeImportExtensions.IsTrue() && tspath.PathIsRelative(specifier) && !tspath.IsDeclarationFileName(specifier) && tspath.HasTSFileExtension(specifier)
355355
}
356356

internal/tsoptions/declscompiler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -810,8 +810,8 @@ var commonOptionsWithBuild = []*CommandLineOption{
810810
AffectsSemanticDiagnostics: true,
811811
AffectsBuildInfo: true,
812812
Category: diagnostics.Modules,
813-
// description: diagnostics.Rewrite_ts_tsx_mts_and_cts_file_extensions_in_relative_import_paths_to_their_JavaScript_equivalent_in_output_files,
814-
DefaultValueDescription: false,
813+
Description: diagnostics.Rewrite_ts_tsx_mts_and_cts_file_extensions_in_relative_import_paths_to_their_JavaScript_equivalent_in_output_files,
814+
DefaultValueDescription: false,
815815
},
816816
{
817817
Name: "resolvePackageJsonExports",

0 commit comments

Comments
 (0)