diff --git a/internal/ast/ast.go b/internal/ast/ast.go index 0173465420..bab4b495e4 100644 --- a/internal/ast/ast.go +++ b/internal/ast/ast.go @@ -4180,6 +4180,10 @@ func IsImportDeclaration(node *Node) bool { return node.Kind == KindImportDeclaration } +func IsImportDeclarationOrJSImportDeclaration(node *Node) bool { + return node.Kind == KindImportDeclaration || node.Kind == KindJSImportDeclaration +} + // ImportSpecifier type ImportSpecifier struct { @@ -7528,6 +7532,53 @@ func IsImportAttributes(node *Node) bool { return node.Kind == KindImportAttributes } +func (node *ImportAttributesNode) GetResolutionModeOverride( /* !!! grammarErrorOnNode?: (node: Node, diagnostic: DiagnosticMessage) => void*/ ) (core.ResolutionMode, bool) { + if node == nil { + return core.ResolutionModeNone, false + } + + attributes := node.AsImportAttributes().Attributes + + if len(attributes.Nodes) != 1 { + // !!! + // grammarErrorOnNode?.( + // node, + // node.token === SyntaxKind.WithKeyword + // ? Diagnostics.Type_import_attributes_should_have_exactly_one_key_resolution_mode_with_value_import_or_require + // : Diagnostics.Type_import_assertions_should_have_exactly_one_key_resolution_mode_with_value_import_or_require, + // ); + return core.ResolutionModeNone, false + } + + elem := attributes.Nodes[0].AsImportAttribute() + if !IsStringLiteralLike(elem.Name()) { + return core.ResolutionModeNone, false + } + if elem.Name().Text() != "resolution-mode" { + // !!! + // grammarErrorOnNode?.( + // elem.name, + // node.token === SyntaxKind.WithKeyword + // ? Diagnostics.resolution_mode_is_the_only_valid_key_for_type_import_attributes + // : Diagnostics.resolution_mode_is_the_only_valid_key_for_type_import_assertions, + // ); + return core.ResolutionModeNone, false + } + if !IsStringLiteralLike(elem.Value) { + return core.ResolutionModeNone, false + } + if elem.Value.Text() != "import" && elem.Value.Text() != "require" { + // !!! + // grammarErrorOnNode?.(elem.value, Diagnostics.resolution_mode_should_be_either_require_or_import); + return core.ResolutionModeNone, false + } + if elem.Value.Text() == "import" { + return core.ResolutionModeESM, true + } else { + return core.ModuleKindCommonJS, true + } +} + // TypeQueryNode type TypeQueryNode struct { @@ -9918,8 +9969,9 @@ type CommentDirective struct { // SourceFile type SourceFileMetaData struct { - PackageJsonType string - ImpliedNodeFormat core.ResolutionMode + PackageJsonType string + PackageJsonDirectory string + ImpliedNodeFormat core.ResolutionMode } type CheckJsDirective struct { diff --git a/internal/ast/utilities.go b/internal/ast/utilities.go index 166d3063ed..c2bf229968 100644 --- a/internal/ast/utilities.go +++ b/internal/ast/utilities.go @@ -2403,7 +2403,7 @@ func GetImpliedNodeFormatForFile(path string, packageJsonType string) core.Modul impliedNodeFormat = core.ResolutionModeESM } else if tspath.FileExtensionIsOneOf(path, []string{tspath.ExtensionDcts, tspath.ExtensionCts, tspath.ExtensionCjs}) { impliedNodeFormat = core.ResolutionModeCommonJS - } else if packageJsonType != "" && tspath.FileExtensionIsOneOf(path, []string{tspath.ExtensionDts, tspath.ExtensionTs, tspath.ExtensionTsx, tspath.ExtensionJs, tspath.ExtensionJsx}) { + } else if tspath.FileExtensionIsOneOf(path, []string{tspath.ExtensionDts, tspath.ExtensionTs, tspath.ExtensionTsx, tspath.ExtensionJs, tspath.ExtensionJsx}) { impliedNodeFormat = core.IfElse(packageJsonType == "module", core.ResolutionModeESM, core.ResolutionModeCommonJS) } @@ -2739,6 +2739,22 @@ func IsTypeOnlyImportOrExportDeclaration(node *Node) bool { return IsTypeOnlyImportDeclaration(node) || isTypeOnlyExportDeclaration(node) } +func IsExclusivelyTypeOnlyImportOrExport(node *Node) bool { + switch node.Kind { + case KindExportDeclaration: + return node.AsExportDeclaration().IsTypeOnly + case KindImportDeclaration, KindJSImportDeclaration: + if importClause := node.AsImportDeclaration().ImportClause; importClause != nil { + return importClause.AsImportClause().IsTypeOnly + } + case KindJSDocImportTag: + if importClause := node.AsJSDocImportTag().ImportClause; importClause != nil { + return importClause.AsImportClause().IsTypeOnly + } + } + return false +} + func GetClassLikeDeclarationOfSymbol(symbol *Symbol) *Node { return core.Find(symbol.Declarations, IsClassLike) } @@ -2941,6 +2957,59 @@ func GetPropertyNameForPropertyNameNode(name *Node) string { panic("Unhandled case in getPropertyNameForPropertyNameNode") } +func IsPartOfTypeOnlyImportOrExportDeclaration(node *Node) bool { + return FindAncestor(node, IsTypeOnlyImportOrExportDeclaration) != nil +} + +func IsPartOfExclusivelyTypeOnlyImportOrExportDeclaration(node *Node) bool { + return FindAncestor(node, IsExclusivelyTypeOnlyImportOrExport) != nil +} + +func IsEmittableImport(node *Node) bool { + switch node.Kind { + case KindImportDeclaration: + return node.AsImportDeclaration().ImportClause == nil || !node.AsImportDeclaration().ImportClause.IsTypeOnly() + case KindExportDeclaration: + return !node.AsExportDeclaration().IsTypeOnly + case KindImportEqualsDeclaration: + return !node.AsImportEqualsDeclaration().IsTypeOnly + case KindCallExpression: + return IsImportCall(node) + } + return false +} + +func IsResolutionModeOverrideHost(node *Node) bool { + if node == nil { + return false + } + switch node.Kind { + case KindImportType, KindExportDeclaration, KindImportDeclaration, KindJSImportDeclaration: + return true + } + return false +} + +func HasResolutionModeOverride(node *Node) bool { + if node == nil { + return false + } + var attributes *ImportAttributesNode + switch node.Kind { + case KindImportType: + attributes = node.AsImportTypeNode().Attributes + case KindImportDeclaration, KindJSImportDeclaration: + attributes = node.AsImportDeclaration().Attributes + case KindExportDeclaration: + attributes = node.AsExportDeclaration().Attributes + } + if attributes != nil { + _, ok := attributes.GetResolutionModeOverride() + return ok + } + return false +} + func IsStringTextContainingNode(node *Node) bool { return node.Kind == KindStringLiteral || IsTemplateLiteralKind(node.Kind) } diff --git a/internal/checker/checker.go b/internal/checker/checker.go index 9a1d547ac9..59ed4274e8 100644 --- a/internal/checker/checker.go +++ b/internal/checker/checker.go @@ -20,6 +20,7 @@ import ( "github.com/microsoft/typescript-go/internal/diagnostics" "github.com/microsoft/typescript-go/internal/evaluator" "github.com/microsoft/typescript-go/internal/jsnum" + "github.com/microsoft/typescript-go/internal/module" "github.com/microsoft/typescript-go/internal/modulespecifiers" "github.com/microsoft/typescript-go/internal/printer" "github.com/microsoft/typescript-go/internal/scanner" @@ -524,12 +525,16 @@ type Program interface { Options() *core.CompilerOptions SourceFiles() []*ast.SourceFile BindSourceFiles() + FileExists(fileName string) bool + GetSourceFile(fileName string) *ast.SourceFile GetEmitModuleFormatOfFile(sourceFile *ast.SourceFile) core.ModuleKind GetImpliedNodeFormatForEmit(sourceFile *ast.SourceFile) core.ModuleKind - GetResolvedModule(currentSourceFile *ast.SourceFile, moduleReference string) *ast.SourceFile + GetResolvedModule(currentSourceFile *ast.SourceFile, moduleReference string, mode core.ResolutionMode) *module.ResolvedModule + GetResolvedModules() map[tspath.Path]module.ModeAwareCache[*module.ResolvedModule] GetSourceFileMetaData(path tspath.Path) *ast.SourceFileMetaData GetJSXRuntimeImportSpecifier(path tspath.Path) (moduleReference string, specifier *ast.Node) GetImportHelpersImportSpecifier(path tspath.Path) *ast.Node + GetModeForUsageLocation(sourceFile *ast.SourceFile, location *ast.Node) core.ResolutionMode } type Host interface { @@ -558,6 +563,7 @@ type Checker struct { varianceTypeParameter *Type languageVersion core.ScriptTarget moduleKind core.ModuleKind + moduleResolutionKind core.ModuleResolutionKind isInferencePartiallyBlocked bool legacyDecorators bool emitStandardClassFields bool @@ -837,6 +843,7 @@ type Checker struct { _jsxFactoryEntity *ast.Node skipDirectInferenceNodes core.Set[*ast.Node] ctx context.Context + packagesMap map[string]bool } func NewChecker(program Program) *Checker { @@ -852,6 +859,7 @@ func NewChecker(program Program) *Checker { c.compareSymbolChains = c.compareSymbolChainsWorker // Closure optimization c.languageVersion = c.compilerOptions.GetEmitScriptTarget() c.moduleKind = c.compilerOptions.GetEmitModuleKind() + c.moduleResolutionKind = c.compilerOptions.GetModuleResolutionKind() c.legacyDecorators = c.compilerOptions.ExperimentalDecorators == core.TSTrue c.emitStandardClassFields = !c.compilerOptions.UseDefineForClassFields.IsFalse() && c.compilerOptions.GetEmitScriptTarget() >= core.ScriptTargetES2022 c.allowSyntheticDefaultImports = c.compilerOptions.GetAllowSyntheticDefaultImports() @@ -5079,7 +5087,7 @@ func (c *Checker) checkImportAttributes(declaration *ast.Node) { if importAttributesType != c.emptyObjectType { c.checkTypeAssignableTo(c.getTypeFromImportAttributes(node), c.getNullableType(importAttributesType, TypeFlagsUndefined), node, nil) } - isTypeOnly := isExclusivelyTypeOnlyImportOrExport(declaration) + isTypeOnly := ast.IsExclusivelyTypeOnlyImportOrExport(declaration) override := c.getResolutionModeOverride(node.AsImportAttributes(), isTypeOnly) isImportAttributes := node.AsImportAttributes().Token == ast.KindWithKeyword if isTypeOnly && override != core.ResolutionModeNone { @@ -5106,29 +5114,19 @@ func (c *Checker) checkImportAttributes(declaration *ast.Node) { message = diagnostics.Import_assertions_are_only_supported_when_the_module_option_is_set_to_esnext_nodenext_or_preserve } c.grammarErrorOnNode(node, message) + return } if isTypeOnly { c.grammarErrorOnNode(node, core.IfElse(isImportAttributes, diagnostics.Import_attributes_cannot_be_used_with_type_only_imports_or_exports, diagnostics.Import_assertions_cannot_be_used_with_type_only_imports_or_exports)) + return } if override != core.ResolutionModeNone { c.grammarErrorOnNode(node, diagnostics.X_resolution_mode_can_only_be_set_for_type_only_imports) } } -func isExclusivelyTypeOnlyImportOrExport(node *ast.Node) bool { - switch node.Kind { - case ast.KindExportDeclaration: - return node.AsExportDeclaration().IsTypeOnly - case ast.KindImportDeclaration, ast.KindJSImportDeclaration: - if importClause := node.AsImportDeclaration().ImportClause; importClause != nil { - return importClause.AsImportClause().IsTypeOnly - } - } - return false -} - func (c *Checker) getTypeFromImportAttributes(node *ast.Node) *Type { links := c.typeNodeLinks.Get(node) if links.resolvedType == nil { @@ -6389,6 +6387,7 @@ func (c *Checker) checkAliasSymbol(node *ast.Node) { c.error(node, diagnostics.ESM_syntax_is_not_allowed_in_a_CommonJS_module_when_module_is_set_to_preserve) } // !!! + // if c.compilerOptions.VerbatimModuleSyntax.IsTrue() && !ast.IsTypeOnlyImportOrExportDeclaration(node) && node.Flags&ast.NodeFlagsAmbient == 0 && targetFlags&ast.SymbolFlagsConstEnum != 0 { // constEnumDeclaration := target.ValueDeclaration // redirect := host.getRedirectReferenceForResolutionFromSourceOfProject(ast.GetSourceFileOfNode(constEnumDeclaration).ResolvedPath) @@ -14310,11 +14309,132 @@ func (c *Checker) resolveExternalModule(location *ast.Node, moduleReference stri if ambientModule != nil { return ambientModule } - // !!! The following only implements simple module resolution - sourceFile := c.program.GetResolvedModule(ast.GetSourceFileOfNode(location), moduleReference) + + importingSourceFile := ast.GetSourceFileOfNode(location) + var ( + contextSpecifier *ast.Node + mode core.ResolutionMode + ) + + if ast.IsStringLiteralLike(location) || location.Parent != nil && ast.IsModuleDeclaration(location.Parent) && location.Parent.AsModuleDeclaration().Name() == location { + contextSpecifier = location + } else if ast.IsModuleDeclaration(location) { + contextSpecifier = location.AsModuleDeclaration().Name() + } else if ast.IsLiteralImportTypeNode(location) { + contextSpecifier = location.AsImportTypeNode().Argument.AsLiteralTypeNode().Literal + } else if ast.IsVariableDeclarationInitializedToRequire(location) { + contextSpecifier = location.AsVariableDeclaration().Initializer.AsCallExpression().Arguments.Nodes[0] + } else { + var ancestor *ast.Node + if location.Flags&ast.NodeFlagsJSDoc != 0 { + ancestor = ast.FindAncestor(location, ast.IsJSDocImportTag) + if ancestor != nil { + contextSpecifier = ancestor.AsJSDocImportTag().JSImportDeclaration.ModuleSpecifier + } + } + if ancestor == nil { + ancestor = ast.FindAncestor(location, ast.IsImportCall) + if ancestor != nil { + contextSpecifier = ancestor.AsCallExpression().Arguments.Nodes[0] + } + } + if ancestor == nil { + ancestor = ast.FindAncestor(location, ast.IsImportDeclarationOrJSImportDeclaration) + if ancestor != nil { + contextSpecifier = ancestor.AsImportDeclaration().ModuleSpecifier + } + } + if ancestor == nil { + ancestor = ast.FindAncestor(location, ast.IsExportDeclaration) + if ancestor != nil { + contextSpecifier = ancestor.AsExportDeclaration().ModuleSpecifier + } + } + if ancestor == nil { + ancestor = ast.FindAncestor(location, ast.IsImportEqualsDeclaration) + if ancestor != nil { + contextSpecifier = ancestor.AsImportEqualsDeclaration().ModuleReference.AsExternalModuleReference().Expression + } + } + } + + if contextSpecifier != nil && ast.IsStringLiteralLike(contextSpecifier) { + mode = c.program.GetModeForUsageLocation(importingSourceFile, contextSpecifier) + } else { + mode = c.program.GetDefaultResolutionModeForFile(importingSourceFile) + } + + var sourceFile *ast.SourceFile + resolvedModule := c.program.GetResolvedModule(importingSourceFile, moduleReference, mode) + if resolvedModule != nil && resolvedModule.IsResolved() { + sourceFile = c.program.GetSourceFile(resolvedModule.ResolvedFileName) + } + if sourceFile != nil { // !!! + if errorNode != nil { + if resolvedModule.ResolvedUsingTsExtension && tspath.IsDeclarationFileName(moduleReference) { + if ast.FindAncestor(location, ast.IsEmittableImport) != nil { + tsExtension := tspath.TryExtractTSExtension(moduleReference) + if tsExtension == "" { + panic("should be able to extract TS extension from string that passes IsDeclarationFileName") + } + c.error( + errorNode, + diagnostics.A_declaration_file_cannot_be_imported_without_import_type_Did_you_mean_to_import_an_implementation_file_0_instead, + c.getSuggestedImportSource(moduleReference, tsExtension, mode), + ) + } + } else if resolvedModule.ResolvedUsingTsExtension && !c.compilerOptions.AllowImportingTsExtensionsFrom(importingSourceFile.FileName()) { + if ast.FindAncestor(location, ast.IsEmittableImport) != nil { + tsExtension := tspath.TryExtractTSExtension(moduleReference) + if tsExtension == "" { + panic("should be able to extract TS extension from string that passes IsDeclarationFileName") + } + c.error( + errorNode, + diagnostics.An_import_path_can_only_end_with_a_0_extension_when_allowImportingTsExtensions_is_enabled, + tsExtension, + ) + } + } + } + if sourceFile.Symbol != nil { + if errorNode != nil { + if resolvedModule.IsExternalLibraryImport && !(tspath.ExtensionIsTs(resolvedModule.Extension) || resolvedModule.Extension == tspath.ExtensionJson) { + c.errorOnImplicitAnyModule(false /*isError*/, errorNode, mode, resolvedModule, moduleReference) + } + if c.moduleResolutionKind == core.ModuleResolutionKindNode16 || c.moduleResolutionKind == core.ModuleResolutionKindNodeNext { + isSyncImport := c.program.GetDefaultResolutionModeForFile(importingSourceFile) == core.ModuleKindCommonJS && ast.FindAncestor(location, ast.IsImportCall) == nil || + ast.FindAncestor(location, ast.IsImportEqualsDeclaration) != nil + overrideHost := ast.FindAncestor(location, ast.IsResolutionModeOverrideHost) + if isSyncImport && c.program.GetDefaultResolutionModeForFile(sourceFile) == core.ModuleKindESNext && !ast.HasResolutionModeOverride(overrideHost) { + if ast.FindAncestorKind(location, ast.KindImportEqualsDeclaration) != nil { + // ImportEquals in an ESM file resolving to another ESM file + c.error(errorNode, diagnostics.Module_0_cannot_be_imported_using_this_construct_The_specifier_only_resolves_to_an_ES_module_which_cannot_be_imported_with_require_Use_an_ECMAScript_import_instead, moduleReference) + } else { + // CJS file resolving to an ESM file + var diagnosticDetails *ast.Diagnostic + ext := tspath.TryGetExtensionFromPath(importingSourceFile.FileName()) + if ext == tspath.ExtensionTs || ext == tspath.ExtensionJs || ext == tspath.ExtensionTsx || ext == tspath.ExtensionJsx { + diagnosticDetails = c.createModeMismatchDetails(importingSourceFile, errorNode) + } + + var message *diagnostics.Message + if overrideHost != nil && overrideHost.Kind == ast.KindImportDeclaration && overrideHost.AsImportDeclaration().ImportClause.IsTypeOnly() { + message = diagnostics.Type_only_import_of_an_ECMAScript_module_from_a_CommonJS_module_must_have_a_resolution_mode_attribute + } else if overrideHost != nil && overrideHost.Kind == ast.KindImportType { + message = diagnostics.Type_import_of_an_ECMAScript_module_from_a_CommonJS_module_must_have_a_resolution_mode_attribute + } else { + message = diagnostics.The_current_file_is_a_CommonJS_module_whose_imports_will_produce_require_calls_however_the_referenced_file_is_an_ECMAScript_module_and_cannot_be_imported_with_require_Consider_writing_a_dynamic_import_0_call_instead + } + + c.diagnostics.Add(NewDiagnosticChainForNode(diagnosticDetails, errorNode, message, moduleReference)) + } + } + } + } return c.getMergedSymbol(sourceFile.Symbol) } if errorNode != nil && moduleNotFoundError != nil && !isSideEffectImport(errorNode) { @@ -14338,16 +14458,149 @@ func (c *Checker) resolveExternalModule(location *ast.Node, moduleReference stri return nil } - // !!! + if resolvedModule != nil && resolvedModule.IsResolved() && !(tspath.ExtensionIsTs(resolvedModule.Extension) || resolvedModule.Extension == tspath.ExtensionJson) { + if isForAugmentation { + c.error( + errorNode, + diagnostics.Invalid_module_name_in_augmentation_Module_0_resolves_to_an_untyped_module_at_1_which_cannot_be_augmented, + moduleReference, + resolvedModule.ResolvedFileName, + ) + } else { + c.errorOnImplicitAnyModule(c.noImplicitAny && moduleNotFoundError != nil, errorNode, mode, resolvedModule, moduleReference) + } + return nil + } if moduleNotFoundError != nil { // !!! - c.error(errorNode, moduleNotFoundError, moduleReference) + isExtensionlessRelativePathImport := tspath.PathIsRelative(moduleReference) && !tspath.HasExtension(moduleReference) + resolutionIsNode16OrNext := c.moduleResolutionKind == core.ModuleResolutionKindNode16 || c.moduleResolutionKind == core.ModuleResolutionKindNodeNext + if !c.compilerOptions.GetResolveJsonModule() && tspath.FileExtensionIs(moduleReference, tspath.ExtensionJson) { + c.error(errorNode, diagnostics.Cannot_find_module_0_Consider_using_resolveJsonModule_to_import_module_with_json_extension, moduleReference) + } else if mode == core.ResolutionModeESM && resolutionIsNode16OrNext && isExtensionlessRelativePathImport { + absoluteRef := tspath.GetNormalizedAbsolutePath(moduleReference, tspath.GetDirectoryPath(importingSourceFile.FileName())) + if suggestedExt := c.getSuggestedImportExtension(absoluteRef); suggestedExt != "" { + c.error(errorNode, diagnostics.Relative_import_paths_need_explicit_file_extensions_in_ECMAScript_imports_when_moduleResolution_is_node16_or_nodenext_Did_you_mean_0, moduleReference+suggestedExt) + } else { + c.error(errorNode, diagnostics.Relative_import_paths_need_explicit_file_extensions_in_ECMAScript_imports_when_moduleResolution_is_node16_or_nodenext_Consider_adding_an_extension_to_the_import_path) + } + } else if resolvedModule != nil && resolvedModule.AlternateResult != "" { + errorInfo := c.createModuleNotFoundChain(resolvedModule, errorNode, moduleReference, mode, moduleReference) + c.diagnostics.Add(NewDiagnosticChainForNode(errorInfo, errorNode, moduleNotFoundError, moduleReference)) + } else { + c.error(errorNode, moduleNotFoundError, moduleReference) + } } return nil } +func (c *Checker) getSuggestedImportSource(moduleReference string, tsExtension string, mode core.ResolutionMode) string { + importSourceWithoutExtension := tspath.RemoveExtension(moduleReference, tsExtension) + + // Direct users to import source with .js extension if outputting an ES module. + // @see https://github.com/microsoft/TypeScript/issues/42151 + if c.moduleKind.IsNonNodeESM() || mode == core.ModuleKindESNext { + preferTs := tspath.IsDeclarationFileName(moduleReference) && c.compilerOptions.GetAllowImportingTsExtensions() + var ext string + switch { + case tsExtension == tspath.ExtensionMts || tsExtension == tspath.ExtensionDmts: + ext = core.IfElse(preferTs, ".mts", ".mjs") + case tsExtension == tspath.ExtensionCts || tsExtension == tspath.ExtensionDcts: + ext = core.IfElse(preferTs, ".cts", ".cjs") + default: + ext = core.IfElse(preferTs, ".ts", ".js") + } + + return importSourceWithoutExtension + ext + } + + return importSourceWithoutExtension +} + +func (c *Checker) getSuggestedImportExtension(extensionlessImportPath string) string { + switch true { + case c.program.FileExists(extensionlessImportPath + ".mts"): + return ".mjs" + case c.program.FileExists(extensionlessImportPath + ".ts"): + return ".js" + case c.program.FileExists(extensionlessImportPath + ".cts"): + return ".cjs" + case c.program.FileExists(extensionlessImportPath + ".mjs"): + return ".mjs" + case c.program.FileExists(extensionlessImportPath + ".js"): + return ".js" + case c.program.FileExists(extensionlessImportPath + ".cjs"): + return ".cjs" + case c.program.FileExists(extensionlessImportPath + ".tsx"): + return core.IfElse(c.compilerOptions.Jsx == core.JsxEmitPreserve, ".jsx", ".js") + case c.program.FileExists(extensionlessImportPath + ".jsx"): + return ".jsx" + case c.program.FileExists(extensionlessImportPath + ".json"): + return ".json" + } + return "" +} + +func (c *Checker) errorOnImplicitAnyModule(isError bool, errorNode *ast.Node, mode core.ResolutionMode, resolvedModule *module.ResolvedModule, moduleReference string) { + if isSideEffectImport(errorNode) { + return + } + + var errorInfo *ast.Diagnostic + if !tspath.IsExternalModuleNameRelative(moduleReference) && resolvedModule.PackageId.Name != "" { + errorInfo = c.createModuleNotFoundChain(resolvedModule, errorNode, moduleReference, mode, resolvedModule.PackageId.Name) + } + c.addErrorOrSuggestion( + isError, + NewDiagnosticChainForNode( + errorInfo, + errorNode, + diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type, + moduleReference, + resolvedModule.ResolvedFileName, + ), + ) +} + +func (c *Checker) createModuleNotFoundChain(resolvedModule *module.ResolvedModule, errorNode *ast.Node, moduleReference string, mode core.ResolutionMode, packageName string) *ast.Diagnostic { + if resolvedModule.AlternateResult != "" { + if strings.Contains(resolvedModule.AlternateResult, "/node_modules/@types/") { + packageName = "@types/" + module.MangleScopedPackageName(packageName) + } + return NewDiagnosticForNode(errorNode, diagnostics.There_are_types_at_0_but_this_result_could_not_be_resolved_when_respecting_package_json_exports_The_1_library_may_need_to_update_its_package_json_or_typings, resolvedModule.AlternateResult, packageName) + } + if c.typesPackageExists(packageName) { + return NewDiagnosticForNode(errorNode, diagnostics.If_the_0_package_actually_exposes_this_module_consider_sending_a_pull_request_to_amend_https_Colon_Slash_Slashgithub_com_SlashDefinitelyTyped_SlashDefinitelyTyped_Slashtree_Slashmaster_Slashtypes_Slash_1, packageName, module.MangleScopedPackageName(packageName)) + } + if c.packageBundlesTypes(packageName) { + return NewDiagnosticForNode(errorNode, diagnostics.If_the_0_package_actually_exposes_this_module_try_adding_a_new_declaration_d_ts_file_containing_declare_module_1, packageName, moduleReference) + } + return NewDiagnosticForNode(errorNode, diagnostics.Try_npm_i_save_dev_types_Slash_1_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare_module_0, moduleReference, module.MangleScopedPackageName(packageName)) +} + +func (c *Checker) createModeMismatchDetails(sourceFile *ast.SourceFile, errorNode *ast.Node) *ast.Diagnostic { + ext := tspath.TryGetExtensionFromPath(sourceFile.FileName()) + targetExt := core.IfElse(ext == tspath.ExtensionTs, tspath.ExtensionMts, core.IfElse(ext == tspath.ExtensionJs, tspath.ExtensionMjs, "")) + meta := c.program.GetSourceFileMetaData(sourceFile.Path()) + packageJsonType := meta.PackageJsonType + packageJsonDirectory := meta.PackageJsonDirectory + var result *ast.Diagnostic + if packageJsonDirectory != "" && packageJsonType == "" { + if targetExt != "" { + result = NewDiagnosticForNode(errorNode, diagnostics.To_convert_this_file_to_an_ECMAScript_module_change_its_file_extension_to_0_or_add_the_field_type_Colon_module_to_1, targetExt, tspath.CombinePaths(packageJsonDirectory, "package.json")) + } else { + result = NewDiagnosticForNode(errorNode, diagnostics.To_convert_this_file_to_an_ECMAScript_module_add_the_field_type_Colon_module_to_0, tspath.CombinePaths(packageJsonDirectory, "package.json")) + } + } else if targetExt != "" { + result = NewDiagnosticForNode(errorNode, diagnostics.To_convert_this_file_to_an_ECMAScript_module_change_its_file_extension_to_0_or_create_a_local_package_json_file_with_type_Colon_module, targetExt) + } else { + result = NewDiagnosticForNode(errorNode, diagnostics.To_convert_this_file_to_an_ECMAScript_module_create_a_local_package_json_file_with_type_Colon_module) + } + return result +} + func (c *Checker) tryFindAmbientModule(moduleName string, withAugmentations bool) *ast.Symbol { if tspath.IsExternalModuleNameRelative(moduleName) { return nil @@ -14686,7 +14939,7 @@ func (c *Checker) getFullyQualifiedName(symbol *ast.Symbol, containingLocation * if symbol.Parent != nil { return c.getFullyQualifiedName(symbol.Parent, containingLocation) + "." + c.symbolToString(symbol) } - return c.symbolToString(symbol) // !!! + return c.symbolToStringEx(symbol, containingLocation, ast.SymbolFlagsAll, SymbolFormatFlagsDoNotIncludeSymbolChain|SymbolFormatFlagsAllowAnyNodeKind) } func (c *Checker) getExportsOfSymbol(symbol *ast.Symbol) ast.SymbolTable { diff --git a/internal/checker/nodebuilderimpl.go b/internal/checker/nodebuilderimpl.go index fe3a665e88..e4ecddbc2b 100644 --- a/internal/checker/nodebuilderimpl.go +++ b/internal/checker/nodebuilderimpl.go @@ -1074,11 +1074,9 @@ func (b *nodeBuilderImpl) getSpecifierForModuleSymbol(symbol *ast.Symbol, overri contextFile := b.ctx.enclosingFile resolutionMode := overrideImportMode if resolutionMode == core.ResolutionModeNone && originalModuleSpecifier != nil { - // !!! import resolution mode support - // resolutionMode = b.ch.host.GetModeForUsageLocation(contextFile, originalModuleSpecifier) + resolutionMode = b.ch.program.GetModeForUsageLocation(contextFile, originalModuleSpecifier) } else if resolutionMode == core.ResolutionModeNone && contextFile != nil { - // !!! import resolution mode support - // resolutionMode = b.ch.host.GetDefaultResolutionModeForFile(contextFile) + resolutionMode = b.ch.program.GetDefaultResolutionModeForFile(contextFile) } cacheKey := module.ModeAwareCacheKey{Name: string(contextFile.Path()), Mode: resolutionMode} links := b.symbolLinks.Get(symbol) diff --git a/internal/checker/utilities.go b/internal/checker/utilities.go index 61caddabee..cfda65e76c 100644 --- a/internal/checker/utilities.go +++ b/internal/checker/utilities.go @@ -12,8 +12,10 @@ import ( "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/diagnostics" "github.com/microsoft/typescript-go/internal/jsnum" + "github.com/microsoft/typescript-go/internal/module" "github.com/microsoft/typescript-go/internal/printer" "github.com/microsoft/typescript-go/internal/scanner" + "github.com/microsoft/typescript-go/internal/tspath" ) func NewDiagnosticForNode(node *ast.Node, message *diagnostics.Message, args ...any) *ast.Diagnostic { @@ -1994,6 +1996,33 @@ func (c *Checker) checkNotCanceled() { } } +func (c *Checker) getPackagesMap() map[string]bool { + if c.packagesMap == nil { + c.packagesMap = make(map[string]bool) + resolvedModules := c.program.GetResolvedModules() + for _, resolvedModulesInFile := range resolvedModules { + for _, module := range resolvedModulesInFile { + if module.PackageId.Name != "" { + c.packagesMap[module.PackageId.Name] = c.packagesMap[module.PackageId.Name] || module.Extension == tspath.ExtensionDts + } + } + } + } + return c.packagesMap +} + +func (c *Checker) typesPackageExists(packageName string) bool { + packagesMap := c.getPackagesMap() + _, ok := packagesMap[module.GetTypesPackageName(packageName)] + return ok +} + +func (c *Checker) packageBundlesTypes(packageName string) bool { + packagesMap := c.getPackagesMap() + hasTypes, _ := packagesMap[packageName] + return hasTypes +} + func ValueToString(value any) string { switch value := value.(type) { case string: diff --git a/internal/compiler/emitHost.go b/internal/compiler/emitHost.go index 8690394062..62fb6b4256 100644 --- a/internal/compiler/emitHost.go +++ b/internal/compiler/emitHost.go @@ -40,6 +40,10 @@ type emitHost struct { program *Program } +func (host *emitHost) GetDefaultResolutionModeForFile(file modulespecifiers.SourceFileForSpecifierGeneration) core.ResolutionMode { + return host.program.GetDefaultResolutionModeForFile(file) +} + func (host *emitHost) FileExists(path string) bool { return host.program.FileExists(path) } diff --git a/internal/compiler/fileloader.go b/internal/compiler/fileloader.go index 41682f87f7..457108c0fa 100644 --- a/internal/compiler/fileloader.go +++ b/internal/compiler/fileloader.go @@ -12,6 +12,7 @@ import ( "github.com/microsoft/typescript-go/internal/collections" "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/module" + "github.com/microsoft/typescript-go/internal/modulespecifiers" "github.com/microsoft/typescript-go/internal/tsoptions" "github.com/microsoft/typescript-go/internal/tspath" ) @@ -254,9 +255,7 @@ func (t *parseTask) start(loader *fileLoader) { } t.file = file - loader.wg.Queue(func() { - t.metadata = loader.loadSourceFileMetaData(file.Path()) - }) + t.metadata = loader.loadSourceFileMetaData(file.FileName()) // !!! if noResolve, skip all of this t.subTasks = make([]*parseTask, 0, len(file.ReferencedFiles)+len(file.Imports())+len(file.ModuleAugmentations)) @@ -267,7 +266,8 @@ func (t *parseTask) start(loader *fileLoader) { } for _, ref := range file.TypeReferenceDirectives { - resolved := loader.resolver.ResolveTypeReferenceDirective(ref.FileName, file.FileName(), core.ModuleKindCommonJS /* !!! */, nil) + resolutionMode := getModeForTypeReferenceDirectiveInFile(ref, file, t.metadata, loader.compilerOptions) + resolved := loader.resolver.ResolveTypeReferenceDirective(ref.FileName, file.FileName(), resolutionMode, nil) if resolved.IsResolved() { t.addSubTask(resolved.ResolvedFileName, false) } @@ -283,7 +283,7 @@ func (t *parseTask) start(loader *fileLoader) { } } - toParse, resolutionsInFile, importHelpersImportSpecifier, jsxRuntimeImportSpecifier := loader.resolveImportsAndModuleAugmentations(file) + toParse, resolutionsInFile, importHelpersImportSpecifier, jsxRuntimeImportSpecifier := loader.resolveImportsAndModuleAugmentations(file, t.metadata) for _, imp := range toParse { t.addSubTask(imp, false) } @@ -296,12 +296,20 @@ func (t *parseTask) start(loader *fileLoader) { }) } -func (p *fileLoader) loadSourceFileMetaData(path tspath.Path) *ast.SourceFileMetaData { - packageJsonType := p.resolver.GetPackageJsonTypeIfApplicable(string(path)) - impliedNodeFormat := ast.GetImpliedNodeFormatForFile(string(path), packageJsonType) +func (p *fileLoader) loadSourceFileMetaData(fileName string) *ast.SourceFileMetaData { + packageJsonScope := p.resolver.GetPackageJsonScopeIfApplicable(fileName) + var packageJsonType, packageJsonDirectory string + if packageJsonScope.Exists() { + packageJsonDirectory = packageJsonScope.PackageDirectory + if value, ok := packageJsonScope.Contents.Type.GetValue(); ok { + packageJsonType = value + } + } + impliedNodeFormat := ast.GetImpliedNodeFormatForFile(fileName, packageJsonType) return &ast.SourceFileMetaData{ - PackageJsonType: packageJsonType, - ImpliedNodeFormat: impliedNodeFormat, + PackageJsonType: packageJsonType, + PackageJsonDirectory: packageJsonDirectory, + ImpliedNodeFormat: impliedNodeFormat, } } @@ -328,7 +336,7 @@ func (p *fileLoader) resolveTripleslashPathReference(moduleName string, containi const externalHelpersModuleNameText = "tslib" // TODO(jakebailey): dedupe -func (p *fileLoader) resolveImportsAndModuleAugmentations(file *ast.SourceFile) ( +func (p *fileLoader) resolveImportsAndModuleAugmentations(file *ast.SourceFile, meta *ast.SourceFileMetaData) ( toParse []string, resolutionsInFile module.ModeAwareCache[*module.ResolvedModule], importHelpersImportSpecifier *ast.Node, @@ -367,16 +375,17 @@ func (p *fileLoader) resolveImportsAndModuleAugmentations(file *ast.SourceFile) if len(moduleNames) != 0 { toParse = make([]string, 0, len(moduleNames)) - resolutions := p.resolveModuleNames(moduleNames, file) + resolutions := p.resolveModuleNames(moduleNames, file, meta) + optionsForFile := p.getCompilerOptionsForFile(file) resolutionsInFile = make(module.ModeAwareCache[*module.ResolvedModule], len(resolutions)) - for i, resolution := range resolutions { - resolvedFileName := resolution.ResolvedFileName + for _, resolution := range resolutions { + resolvedFileName := resolution.resolvedModule.ResolvedFileName // TODO(ercornel): !!!: check if from node modules - mode := core.ModuleKindCommonJS // !!! - resolutionsInFile[module.ModeAwareCacheKey{Name: moduleNames[i].Text(), Mode: mode}] = resolution + mode := getModeForUsageLocation(file, meta, resolution.node, optionsForFile) + resolutionsInFile[module.ModeAwareCacheKey{Name: resolution.node.Text(), Mode: mode}] = resolution.resolvedModule // add file to program only if: // - resolution was successful @@ -396,7 +405,7 @@ func (p *fileLoader) resolveImportsAndModuleAugmentations(file *ast.SourceFile) } else { hasAllowedExtension = tspath.FileExtensionIsOneOf(resolvedFileName, tspath.SupportedTSExtensionsFlat) } - shouldAddFile := resolution.IsResolved() && hasAllowedExtension + shouldAddFile := resolution.resolvedModule.IsResolved() && hasAllowedExtension // TODO(ercornel): !!!: other checks on whether or not to add the file if shouldAddFile { @@ -409,20 +418,20 @@ func (p *fileLoader) resolveImportsAndModuleAugmentations(file *ast.SourceFile) return toParse, resolutionsInFile, importHelpersImportSpecifier, jsxRuntimeImportSpecifier_ } -func (p *fileLoader) resolveModuleNames(entries []*ast.Node, file *ast.SourceFile) []*module.ResolvedModule { +func (p *fileLoader) resolveModuleNames(entries []*ast.Node, file *ast.SourceFile, meta *ast.SourceFileMetaData) []*resolution { if len(entries) == 0 { return nil } - resolvedModules := make([]*module.ResolvedModule, 0, len(entries)) + resolvedModules := make([]*resolution, 0, len(entries)) for _, entry := range entries { moduleName := entry.Text() if moduleName == "" { continue } - resolvedModule := p.resolver.ResolveModuleName(moduleName, file.FileName(), core.ModuleKindCommonJS /* !!! */, nil) - resolvedModules = append(resolvedModules, resolvedModule) + resolvedModule := p.resolver.ResolveModuleName(moduleName, file.FileName(), getModeForUsageLocation(file, meta, entry, p.compilerOptions), nil) + resolvedModules = append(resolvedModules, &resolution{node: entry, resolvedModule: resolvedModule}) } return resolvedModules @@ -440,3 +449,110 @@ func (p *fileLoader) createSyntheticImport(text string, file *ast.SourceFile) *a // !!! importDecl.Flags &^= ast.NodeFlagsSynthesized return externalHelpersModuleReference } + +type resolution struct { + node *ast.Node + resolvedModule *module.ResolvedModule +} + +func (p *fileLoader) getCompilerOptionsForFile(file *ast.SourceFile) *core.CompilerOptions { + // !!! return getRedirectReferenceForResolution(file)?.commandLine.options || options; + return p.compilerOptions +} + +func getModeForTypeReferenceDirectiveInFile(ref *ast.FileReference, file *ast.SourceFile, meta *ast.SourceFileMetaData, options *core.CompilerOptions) core.ResolutionMode { + if ref.ResolutionMode != core.ResolutionModeNone { + return ref.ResolutionMode + } else { + return getDefaultResolutionModeForFile(file, meta, options) + } +} + +func getDefaultResolutionModeForFile(file modulespecifiers.SourceFileForSpecifierGeneration, meta *ast.SourceFileMetaData, options *core.CompilerOptions) core.ResolutionMode { + if importSyntaxAffectsModuleResolution(options) { + return ast.GetImpliedNodeFormatForEmitWorker(file.FileName(), options, meta) + } else { + return core.ResolutionModeNone + } +} + +func getModeForUsageLocation(file *ast.SourceFile, meta *ast.SourceFileMetaData, usage *ast.Node, options *core.CompilerOptions) core.ResolutionMode { + if ast.IsImportDeclaration(usage.Parent) || ast.IsExportDeclaration(usage.Parent) || ast.IsJSDocImportTag(usage.Parent) { + isTypeOnly := ast.IsExclusivelyTypeOnlyImportOrExport(usage.Parent) + if isTypeOnly { + var override core.ResolutionMode + var ok bool + switch usage.Parent.Kind { + case ast.KindImportDeclaration: + override, ok = usage.Parent.AsImportDeclaration().Attributes.GetResolutionModeOverride() + case ast.KindExportDeclaration: + override, ok = usage.Parent.AsExportDeclaration().Attributes.GetResolutionModeOverride() + case ast.KindJSDocImportTag: + override, ok = usage.Parent.AsJSDocImportTag().Attributes.GetResolutionModeOverride() + } + if ok { + return override + } + } + } + if ast.IsLiteralTypeNode(usage.Parent) && ast.IsImportTypeNode(usage.Parent.Parent) { + if override, ok := usage.Parent.Parent.AsImportTypeNode().Attributes.GetResolutionModeOverride(); ok { + return override + } + } + + if options != nil && importSyntaxAffectsModuleResolution(options) { + return getEmitSyntaxForUsageLocationWorker(file, meta, usage, options) + } + + return core.ResolutionModeNone +} + +func importSyntaxAffectsModuleResolution(options *core.CompilerOptions) bool { + moduleResolution := options.GetModuleResolutionKind() + return core.ModuleResolutionKindNode16 <= moduleResolution && moduleResolution <= core.ModuleResolutionKindNodeNext || + options.GetResolvePackageJsonExports() || options.GetResolvePackageJsonImports() +} + +func getEmitSyntaxForUsageLocationWorker(file *ast.SourceFile, meta *ast.SourceFileMetaData, usage *ast.Node, options *core.CompilerOptions) core.ResolutionMode { + if options == nil { + // This should always be provided, but we try to fail somewhat + // gracefully to allow projects like ts-node time to update. + return core.ResolutionModeNone + } + + if ast.IsRequireCall(usage.Parent) || ast.IsExternalModuleReference(usage.Parent) && ast.IsImportEqualsDeclaration(usage.Parent.Parent) { + return core.ModuleKindCommonJS + } + if ast.IsImportCall(ast.WalkUpParenthesizedExpressions(usage.Parent)) { + if shouldTransformImportCallWorker(file, meta, options) { + return core.ModuleKindCommonJS + } else { + return core.ModuleKindESNext + } + } + // If we're in --module preserve on an input file, we know that an import + // is an import. But if this is a declaration file, we'd prefer to use the + // impliedNodeFormat. Since we want things to be consistent between the two, + // we need to issue errors when the user writes ESM syntax in a definitely-CJS + // file, until/unless declaration emit can indicate a true ESM import. On the + // other hand, writing CJS syntax in a definitely-ESM file is fine, since declaration + // emit preserves the CJS syntax. + fileEmitMode := ast.GetEmitModuleFormatOfFileWorker(file, options, meta) + if fileEmitMode == core.ModuleKindCommonJS { + return core.ModuleKindCommonJS + } else { + if fileEmitMode.IsNonNodeESM() || fileEmitMode == core.ModuleKindPreserve { + return core.ModuleKindESNext + } + } + return core.ModuleKindNone +} + +func shouldTransformImportCallWorker(file *ast.SourceFile, meta *ast.SourceFileMetaData, options *core.CompilerOptions) bool { + moduleKind := options.GetEmitModuleKind() + if core.ModuleKindNode16 <= moduleKind && moduleKind <= core.ModuleKindNodeNext || moduleKind == core.ModuleKindPreserve { + return false + } + return ast.GetImpliedNodeFormatForEmitWorker(file.FileName(), options, meta) < core.ModuleKindES2015 +} diff --git a/internal/compiler/program.go b/internal/compiler/program.go index 5bad0857c2..3b7fecd804 100644 --- a/internal/compiler/program.go +++ b/internal/compiler/program.go @@ -374,10 +374,10 @@ func (p *Program) GetTypeCheckerForFile(ctx context.Context, file *ast.SourceFil return p.checkerPool.GetCheckerForFile(ctx, file) } -func (p *Program) GetResolvedModule(file *ast.SourceFile, moduleReference string) *ast.SourceFile { +func (p *Program) GetResolvedModule(file *ast.SourceFile, moduleReference string, mode core.ResolutionMode) *module.ResolvedModule { if resolutions, ok := p.resolvedModules[file.Path()]; ok { - if resolved, ok := resolutions[module.ModeAwareCacheKey{Name: moduleReference, Mode: core.ModuleKindCommonJS}]; ok { - return p.findSourceFile(resolved.ResolvedFileName, FileIncludeReason{FileIncludeKindImport, 0}) + if resolved, ok := resolutions[module.ModeAwareCacheKey{Name: moduleReference, Mode: mode}]; ok { + return resolved } } return nil @@ -701,6 +701,14 @@ func (p *Program) GetImpliedNodeFormatForEmit(sourceFile *ast.SourceFile) core.R return ast.GetImpliedNodeFormatForEmitWorker(sourceFile.FileName(), p.compilerOptions, p.GetSourceFileMetaData(sourceFile.Path())) } +func (p *Program) GetModeForUsageLocation(sourceFile *ast.SourceFile, location *ast.Node) core.ResolutionMode { + return getModeForUsageLocation(sourceFile, p.sourceFileMetaDatas[sourceFile.Path()], location, p.compilerOptions) +} + +func (p *Program) GetDefaultResolutionModeForFile(sourceFile modulespecifiers.SourceFileForSpecifierGeneration) core.ResolutionMode { + return getDefaultResolutionModeForFile(sourceFile, p.sourceFileMetaDatas[sourceFile.Path()], p.compilerOptions) +} + func (p *Program) CommonSourceDirectory() string { p.commonSourceDirectoryOnce.Do(func() { var files []string diff --git a/internal/core/compileroptions.go b/internal/core/compileroptions.go index 8e1b15e1b7..7055d5fd57 100644 --- a/internal/core/compileroptions.go +++ b/internal/core/compileroptions.go @@ -180,6 +180,22 @@ func (options *CompilerOptions) GetModuleResolutionKind() ModuleResolutionKind { } } +func (options *CompilerOptions) GetResolvePackageJsonExports() bool { + return options.ResolvePackageJsonExports.IsTrueOrUnknown() +} + +func (options *CompilerOptions) GetResolvePackageJsonImports() bool { + return options.ResolvePackageJsonImports.IsTrueOrUnknown() +} + +func (options *CompilerOptions) GetAllowImportingTsExtensions() bool { + return options.AllowImportingTsExtensions.IsTrue() || options.RewriteRelativeImportExtensions.IsTrue() +} + +func (options *CompilerOptions) AllowImportingTsExtensionsFrom(fileName string) bool { + return options.GetAllowImportingTsExtensions() || tspath.IsDeclarationFileName(fileName) +} + func (options *CompilerOptions) GetESModuleInterop() bool { if options.ESModuleInterop != TSUnknown { return options.ESModuleInterop == TSTrue @@ -263,10 +279,6 @@ func (options *CompilerOptions) GetAreDeclarationMapsEnabled() bool { return options.DeclarationMap == TSTrue && options.GetEmitDeclarations() } -func (options *CompilerOptions) GetAllowImportingTsExtensions() bool { - return options.AllowImportingTsExtensions == TSTrue || options.RewriteRelativeImportExtensions == TSTrue -} - func (options *CompilerOptions) HasJsonModuleEmitEnabled() bool { switch options.GetEmitModuleKind() { case ModuleKindNone, ModuleKindSystem, ModuleKindUMD: @@ -275,40 +287,6 @@ func (options *CompilerOptions) HasJsonModuleEmitEnabled() bool { return true } -func moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution ModuleResolutionKind) bool { - return moduleResolution >= ModuleResolutionKindNode16 && moduleResolution <= ModuleResolutionKindNodeNext || moduleResolution == ModuleResolutionKindBundler -} - -func (options *CompilerOptions) GetResolvePackageJsonImports() bool { - moduleResolution := options.GetModuleResolutionKind() - if !moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution) { - return false - } - if options.ResolvePackageJsonImports != TSUnknown { - return options.ResolvePackageJsonImports == TSTrue - } - switch moduleResolution { - case ModuleResolutionKindNode16, ModuleResolutionKindNodeNext, ModuleResolutionKindBundler: - return true - } - return false -} - -func (options *CompilerOptions) GetResolvePackageJsonExports() bool { - moduleResolution := options.GetModuleResolutionKind() - if !moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution) { - return false - } - if options.ResolvePackageJsonExports != TSUnknown { - return options.ResolvePackageJsonExports == TSTrue - } - switch moduleResolution { - case ModuleResolutionKindNode16, ModuleResolutionKindNodeNext, ModuleResolutionKindBundler: - return true - } - return false -} - func (options *CompilerOptions) GetPathsBasePath(currentDirectory string) string { if options.Paths.Size() == 0 { return "" @@ -372,6 +350,10 @@ const ( ModuleKindPreserve ModuleKind = 200 ) +func (moduleKind ModuleKind) IsNonNodeESM() bool { + return moduleKind >= ModuleKindES2015 && moduleKind <= ModuleKindESNext +} + type ResolutionMode = ModuleKind // ModuleKindNone | ModuleKindCommonJS | ModuleKindESNext const ( diff --git a/internal/module/resolver.go b/internal/module/resolver.go index 0a8035ce65..7ddcb68f59 100644 --- a/internal/module/resolver.go +++ b/internal/module/resolver.go @@ -137,26 +137,17 @@ func (r *Resolver) GetPackageScopeForPath(directory string) *packagejson.InfoCac return (&resolutionState{compilerOptions: r.compilerOptions, resolver: r}).getPackageScopeForPath(directory) } -func (r *Resolver) GetPackageJsonTypeIfApplicable(path string) string { +func (r *Resolver) GetPackageJsonScopeIfApplicable(path string) *packagejson.InfoCacheEntry { if tspath.FileExtensionIsOneOf(path, []string{tspath.ExtensionMts, tspath.ExtensionCts, tspath.ExtensionMjs, tspath.ExtensionCjs}) { - return "" - } - - var moduleResolutionKind core.ModuleResolutionKind - if r.compilerOptions != nil { - moduleResolutionKind = r.compilerOptions.GetModuleResolutionKind() + return nil } - var packageJsonType string - shouldLookupFromPackageJson := core.ModuleResolutionKindNode16 <= moduleResolutionKind && moduleResolutionKind <= core.ModuleResolutionKindNodeNext || strings.Contains(path, "/node_modules/") - if shouldLookupFromPackageJson { - packageJsonScope := r.GetPackageScopeForPath(tspath.GetDirectoryPath(path)) - if packageJsonScope.Exists() { - packageJsonType, _ = packageJsonScope.Contents.Type.GetValue() - } + moduleResolutionKind := r.compilerOptions.GetModuleResolutionKind() + if core.ModuleResolutionKindNode16 <= moduleResolutionKind && moduleResolutionKind <= core.ModuleResolutionKindNodeNext || strings.Contains(path, "/node_modules/") { + return r.GetPackageScopeForPath(tspath.GetDirectoryPath(path)) } - return packageJsonType + return nil } func (r *Resolver) ResolveTypeReferenceDirective(typeReferenceDirectiveName string, containingFile string, resolutionMode core.ResolutionMode, redirectedReference *ResolvedProjectReference) *ResolvedTypeReferenceDirective { @@ -871,7 +862,7 @@ func (r *resolutionState) loadModuleFromSpecificNodeModulesDirectory(ext extensi r.esmMode { // EsmMode disables index lookup in `loadNodeModuleFromDirectoryWorker` generally, however non-relative package resolutions still assume // a default `index.js` entrypoint if no `main` or `exports` are present - if indexResult := r.loadModuleFromFile(extensions, tspath.CombinePaths(candidate, "index"), onlyRecordFailures); !indexResult.shouldContinueSearching() { + if indexResult := r.loadModuleFromFile(extensions, tspath.CombinePaths(candidate, "index.js"), onlyRecordFailures); !indexResult.shouldContinueSearching() { indexResult.packageId = r.getPackageId(packageDirectory, packageInfo) return indexResult } diff --git a/internal/module/util.go b/internal/module/util.go index a583b97b6c..179042a5d6 100644 --- a/internal/module/util.go +++ b/internal/module/util.go @@ -61,6 +61,10 @@ func UnmangleScopedPackageName(packageName string) string { return packageName } +func GetTypesPackageName(packageName string) string { + return "@types/" + MangleScopedPackageName(packageName) +} + func ComparePatternKeys(a, b string) int { aPatternIndex := strings.Index(a, "*") bPatternIndex := strings.Index(b, "*") diff --git a/internal/modulespecifiers/specifiers.go b/internal/modulespecifiers/specifiers.go index 6fdf74e879..4df9b5cb81 100644 --- a/internal/modulespecifiers/specifiers.go +++ b/internal/modulespecifiers/specifiers.go @@ -563,7 +563,7 @@ func processEnding( if tspath.FileExtensionIsOneOf(fileName, []string{tspath.ExtensionMts, tspath.ExtensionCts}) && tsPriority < jsPriority { return fileName } - if tspath.IsDeclarationFileName(fileName) { + if tspath.FileExtensionIsOneOf(fileName, []string{tspath.ExtensionDmts, tspath.ExtensionMts, tspath.ExtensionDcts, tspath.ExtensionCts}) { inputExt := tspath.GetDeclarationFileExtension(fileName) ext := getJsExtensionForDeclarationFileExtension(inputExt) return tspath.RemoveExtension(fileName, inputExt) + ext @@ -660,6 +660,7 @@ func tryGetModuleNameAsNodeModule( pkgJsonResults := tryDirectoryWithPackageJson( *parts, pathObj, + importingSourceFile, host, overrideMode, options, @@ -669,8 +670,6 @@ func tryGetModuleNameAsNodeModule( packageRootPath := pkgJsonResults.packageRootPath blockedByExports := pkgJsonResults.blockedByExports verbatimFromExports := pkgJsonResults.verbatimFromExports - // !!! classic resolution is dead? - // if options.GetModuleResolutionKind() != core.ModuleResolutionKindClassic { if blockedByExports { return "" // File is under this package.json, but is not publicly exported - there's no way to name it via `node_modules` resolution } @@ -729,6 +728,7 @@ type pkgJsonDirAttemptResult struct { func tryDirectoryWithPackageJson( parts NodeModulePathParts, pathObj ModulePath, + importingSourceFile SourceFileForSpecifierGeneration, host ModuleSpecifierGenerationHost, overrideMode core.ResolutionMode, options *core.CompilerOptions, @@ -752,10 +752,9 @@ func tryDirectoryWithPackageJson( } importMode := overrideMode - // !!! TODO: real resolutionMode support - // if importMode == core.ResolutionModeNone { - // importMode = getDefaultResolutionModeForFile(importingSourceFile, host, options); - // } + if importMode == core.ResolutionModeNone { + importMode = host.GetDefaultResolutionModeForFile(importingSourceFile) + } var packageJsonContent *packagejson.PackageJson if packageJson != nil { @@ -868,7 +867,7 @@ func tryGetModuleNameFromExports( exports packagejson.ExportsOrImports, conditions []string, ) string { - if exports.Type == packagejson.JSONValueTypeObject && allKeysStartWithDot(exports.AsObject()) { + if exports.IsSubpaths() { // sub-mappings // 3 cases: // * directory mappings (legacyish, key ends with / (technically allows index/extension resolution under cjs mode)) diff --git a/internal/modulespecifiers/types.go b/internal/modulespecifiers/types.go index 5022f25477..6658fe6722 100644 --- a/internal/modulespecifiers/types.go +++ b/internal/modulespecifiers/types.go @@ -58,6 +58,7 @@ type ModuleSpecifierGenerationHost interface { GetNearestAncestorDirectoryWithPackageJson(dirname string) string GetPackageJsonInfo(pkgJsonPath string) PackageJsonInfo + GetDefaultResolutionModeForFile(file SourceFileForSpecifierGeneration) core.ResolutionMode } type ImportModuleSpecifierPreference string diff --git a/internal/parser/jsdoc.go b/internal/parser/jsdoc.go index 580df95a1f..c70ed2a99f 100644 --- a/internal/parser/jsdoc.go +++ b/internal/parser/jsdoc.go @@ -457,6 +457,7 @@ func (p *Parser) parseTag(tags []*ast.Node, margin int) *ast.Node { tag = p.parseSeeTag(start, tagName, margin, indentText) case "import": tag = p.parseImportTag(start, tagName, margin, indentText) + ast.SetParentInChildren(tag) default: tag = p.parseUnknownTag(start, tagName, margin, indentText) } diff --git a/internal/transformers/importelision_test.go b/internal/transformers/importelision_test.go index 90ede0aa18..f4db82942b 100644 --- a/internal/transformers/importelision_test.go +++ b/internal/transformers/importelision_test.go @@ -7,6 +7,7 @@ import ( "github.com/microsoft/typescript-go/internal/binder" "github.com/microsoft/typescript-go/internal/checker" "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/module" "github.com/microsoft/typescript-go/internal/modulespecifiers" "github.com/microsoft/typescript-go/internal/printer" "github.com/microsoft/typescript-go/internal/testutil/emittestutil" @@ -18,9 +19,10 @@ type fakeProgram struct { singleThreaded bool compilerOptions *core.CompilerOptions files []*ast.SourceFile - getEmitModuleFormatOfFile func(sourceFile *ast.SourceFile) core.ModuleKind + getEmitModuleFormatOfFile func(sourceFile modulespecifiers.SourceFileForSpecifierGeneration) core.ModuleKind getImpliedNodeFormatForEmit func(sourceFile *ast.SourceFile) core.ModuleKind - getResolvedModule func(currentSourceFile *ast.SourceFile, moduleReference string) *ast.SourceFile + getResolvedModule func(currentSourceFile *ast.SourceFile, moduleReference string, mode core.ResolutionMode) *module.ResolvedModule + getSourceFile func(FileName string) *ast.SourceFile } func (p *fakeProgram) FileExists(path string) bool { @@ -87,8 +89,20 @@ func (p *fakeProgram) GetImpliedNodeFormatForEmit(sourceFile *ast.SourceFile) co return p.getImpliedNodeFormatForEmit(sourceFile) } -func (p *fakeProgram) GetResolvedModule(currentSourceFile *ast.SourceFile, moduleReference string) *ast.SourceFile { - return p.getResolvedModule(currentSourceFile, moduleReference) +func (p *fakeProgram) GetDefaultResolutionModeForFile(sourceFile modulespecifiers.SourceFileForSpecifierGeneration) core.ResolutionMode { + return p.getEmitModuleFormatOfFile(sourceFile) +} + +func (p *fakeProgram) GetModeForUsageLocation(sourceFile *ast.SourceFile, location *ast.Node) core.ResolutionMode { + return p.getEmitModuleFormatOfFile(sourceFile) +} + +func (p *fakeProgram) GetResolvedModule(currentSourceFile *ast.SourceFile, moduleReference string, mode core.ResolutionMode) *module.ResolvedModule { + return p.getResolvedModule(currentSourceFile, moduleReference, mode) +} + +func (p *fakeProgram) GetSourceFile(FileName string) *ast.SourceFile { + return p.getSourceFile(FileName) } func (p *fakeProgram) GetSourceFileMetaData(path tspath.Path) *ast.SourceFileMetaData { @@ -103,6 +117,10 @@ func (p *fakeProgram) GetJSXRuntimeImportSpecifier(path tspath.Path) (moduleRefe return "", nil } +func (p *fakeProgram) GetResolvedModules() map[tspath.Path]module.ModeAwareCache[*module.ResolvedModule] { + panic("unimplemented") +} + func TestImportElision(t *testing.T) { t.Parallel() data := []struct { @@ -155,18 +173,27 @@ func TestImportElision(t *testing.T) { singleThreaded: true, compilerOptions: compilerOptions, files: files, - getEmitModuleFormatOfFile: func(sourceFile *ast.SourceFile) core.ModuleKind { + getEmitModuleFormatOfFile: func(sourceFile modulespecifiers.SourceFileForSpecifierGeneration) core.ModuleKind { return core.ModuleKindESNext }, getImpliedNodeFormatForEmit: func(sourceFile *ast.SourceFile) core.ModuleKind { return core.ModuleKindESNext }, - getResolvedModule: func(currentSourceFile *ast.SourceFile, moduleReference string) *ast.SourceFile { - if currentSourceFile == file && moduleReference == "other" { + getSourceFile: func(fileName string) *ast.SourceFile { + if fileName == "other.ts" { return other } return nil }, + getResolvedModule: func(currentSourceFile *ast.SourceFile, moduleReference string, mode core.ResolutionMode) *module.ResolvedModule { + if currentSourceFile == file && moduleReference == "other" { + return &module.ResolvedModule{ + ResolvedFileName: "other.ts", + Extension: tspath.ExtensionTs, + } + } + return nil + }, }) emitResolver := c.GetEmitResolver(file, false /*skipDiagnostics*/) diff --git a/testdata/baselines/reference/compiler/symbolLinkDeclarationEmitModuleNamesRootDir.types b/testdata/baselines/reference/compiler/symbolLinkDeclarationEmitModuleNamesRootDir.types index f15f65a56d..1baf44e028 100644 --- a/testdata/baselines/reference/compiler/symbolLinkDeclarationEmitModuleNamesRootDir.types +++ b/testdata/baselines/reference/compiler/symbolLinkDeclarationEmitModuleNamesRootDir.types @@ -17,9 +17,9 @@ import { BindingKey } from '@loopback/context'; export const CONTROLLER_CLASS = BindingKey.create(null as any); // line in question >CONTROLLER_CLASS : BindingKey >BindingKey.create(null as any) : BindingKey ->BindingKey.create : >(ctor: T) => BindingKey +>BindingKey.create : >(ctor: T) => BindingKey >BindingKey : typeof BindingKey ->create : >(ctor: T) => BindingKey +>create : >(ctor: T) => BindingKey >null as any : any === /monorepo/context/src/value-promise.d.ts === diff --git a/testdata/baselines/reference/submodule/compiler/allowJsCrossMonorepoPackage.errors.txt b/testdata/baselines/reference/submodule/compiler/allowJsCrossMonorepoPackage.errors.txt index c65aa2ff7c..aa8d24f0dc 100644 --- a/testdata/baselines/reference/submodule/compiler/allowJsCrossMonorepoPackage.errors.txt +++ b/testdata/baselines/reference/submodule/compiler/allowJsCrossMonorepoPackage.errors.txt @@ -1,4 +1,5 @@ -/packages/main/index.ts(1,19): error TS2307: Cannot find module 'shared' or its corresponding type declarations. +/packages/main/index.ts(1,19): error TS7016: Could not find a declaration file for module 'shared'. '/packages/shared/index.js' implicitly has an 'any' type. + Try `npm i --save-dev @types/shared` if it exists or add a new declaration (.d.ts) file containing `declare module 'shared';` ==== /packages/main/tsconfig.json (0 errors) ==== @@ -17,7 +18,8 @@ ==== /packages/main/index.ts (1 errors) ==== import { x } from "shared"; ~~~~~~~~ -!!! error TS2307: Cannot find module 'shared' or its corresponding type declarations. +!!! error TS7016: Could not find a declaration file for module 'shared'. '/packages/shared/index.js' implicitly has an 'any' type. +!!! error TS7016: Try `npm i --save-dev @types/shared` if it exists or add a new declaration (.d.ts) file containing `declare module 'shared';` ==== /node_modules/pkg/index.d.ts (0 errors) ==== export declare function pkg(): "pkg"; diff --git a/testdata/baselines/reference/submodule/compiler/allowJsCrossMonorepoPackage.errors.txt.diff b/testdata/baselines/reference/submodule/compiler/allowJsCrossMonorepoPackage.errors.txt.diff index 231e48b81a..c1914b50c9 100644 --- a/testdata/baselines/reference/submodule/compiler/allowJsCrossMonorepoPackage.errors.txt.diff +++ b/testdata/baselines/reference/submodule/compiler/allowJsCrossMonorepoPackage.errors.txt.diff @@ -2,7 +2,8 @@ +++ new.allowJsCrossMonorepoPackage.errors.txt @@= skipped -0, +0 lines =@@ - -+/packages/main/index.ts(1,19): error TS2307: Cannot find module 'shared' or its corresponding type declarations. ++/packages/main/index.ts(1,19): error TS7016: Could not find a declaration file for module 'shared'. '/packages/shared/index.js' implicitly has an 'any' type. ++ Try `npm i --save-dev @types/shared` if it exists or add a new declaration (.d.ts) file containing `declare module 'shared';` + + +==== /packages/main/tsconfig.json (0 errors) ==== @@ -21,7 +22,8 @@ +==== /packages/main/index.ts (1 errors) ==== + import { x } from "shared"; + ~~~~~~~~ -+!!! error TS2307: Cannot find module 'shared' or its corresponding type declarations. ++!!! error TS7016: Could not find a declaration file for module 'shared'. '/packages/shared/index.js' implicitly has an 'any' type. ++!!! error TS7016: Try `npm i --save-dev @types/shared` if it exists or add a new declaration (.d.ts) file containing `declare module 'shared';` + +==== /node_modules/pkg/index.d.ts (0 errors) ==== + export declare function pkg(): "pkg"; diff --git a/testdata/baselines/reference/submodule/compiler/allowSyntheticDefaultImports8.errors.txt b/testdata/baselines/reference/submodule/compiler/allowSyntheticDefaultImports8.errors.txt index b8a48b7bde..4b35802264 100644 --- a/testdata/baselines/reference/submodule/compiler/allowSyntheticDefaultImports8.errors.txt +++ b/testdata/baselines/reference/submodule/compiler/allowSyntheticDefaultImports8.errors.txt @@ -1,4 +1,4 @@ -a.ts(1,10): error TS2305: Module '"b"' has no exported member 'default'. +a.ts(1,10): error TS2305: Module '"./b"' has no exported member 'default'. ==== b.d.ts (0 errors) ==== @@ -9,6 +9,6 @@ a.ts(1,10): error TS2305: Module '"b"' has no exported member 'default'. ==== a.ts (1 errors) ==== import { default as Foo } from "./b"; ~~~~~~~ -!!! error TS2305: Module '"b"' has no exported member 'default'. +!!! error TS2305: Module '"./b"' has no exported member 'default'. Foo.bar(); Foo.foo(); \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/ambientExportDefaultErrors.types b/testdata/baselines/reference/submodule/compiler/ambientExportDefaultErrors.types index 140b78f173..1844f50943 100644 --- a/testdata/baselines/reference/submodule/compiler/ambientExportDefaultErrors.types +++ b/testdata/baselines/reference/submodule/compiler/ambientExportDefaultErrors.types @@ -15,7 +15,7 @@ export default 2 + 2; >2 : 2 export as namespace Foo; ->Foo : typeof import("./foo.js") +>Foo : typeof import("./foo") === foo2.d.ts === export = 2 + 2; diff --git a/testdata/baselines/reference/submodule/compiler/ambientExportDefaultErrors.types.diff b/testdata/baselines/reference/submodule/compiler/ambientExportDefaultErrors.types.diff index 6b2cb6c619..3e7edfcb65 100644 --- a/testdata/baselines/reference/submodule/compiler/ambientExportDefaultErrors.types.diff +++ b/testdata/baselines/reference/submodule/compiler/ambientExportDefaultErrors.types.diff @@ -5,7 +5,7 @@ export as namespace Foo; ->Foo : typeof import("foo") -+>Foo : typeof import("./foo.js") ++>Foo : typeof import("./foo") === foo2.d.ts === export = 2 + 2; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/checkMergedGlobalUMDSymbol.types b/testdata/baselines/reference/submodule/compiler/checkMergedGlobalUMDSymbol.types index 33b7624316..5717513d28 100644 --- a/testdata/baselines/reference/submodule/compiler/checkMergedGlobalUMDSymbol.types +++ b/testdata/baselines/reference/submodule/compiler/checkMergedGlobalUMDSymbol.types @@ -13,7 +13,7 @@ import * as _three from './three'; >_three : typeof _three export as namespace THREE; ->THREE : typeof import("./global.js") +>THREE : typeof import("./global") declare global { >global : typeof global @@ -25,6 +25,6 @@ declare global { === test.ts === const m = THREE ->m : typeof import("./three.js") ->THREE : typeof import("./three.js") +>m : typeof import("./three") +>THREE : typeof import("./three") diff --git a/testdata/baselines/reference/submodule/compiler/checkMergedGlobalUMDSymbol.types.diff b/testdata/baselines/reference/submodule/compiler/checkMergedGlobalUMDSymbol.types.diff index 4aecfbddbb..80c9740f75 100644 --- a/testdata/baselines/reference/submodule/compiler/checkMergedGlobalUMDSymbol.types.diff +++ b/testdata/baselines/reference/submodule/compiler/checkMergedGlobalUMDSymbol.types.diff @@ -5,7 +5,7 @@ export as namespace THREE; ->THREE : typeof import("global") -+>THREE : typeof import("./global.js") ++>THREE : typeof import("./global") declare global { >global : typeof global @@ -15,5 +15,5 @@ const m = THREE ->m : typeof import("three") ->THREE : typeof import("three") -+>m : typeof import("./three.js") -+>THREE : typeof import("./three.js") ++>m : typeof import("./three") ++>THREE : typeof import("./three") diff --git a/testdata/baselines/reference/submodule/compiler/constEnumNoPreserveDeclarationReexport.types b/testdata/baselines/reference/submodule/compiler/constEnumNoPreserveDeclarationReexport.types index 219539b252..41525d7d9c 100644 --- a/testdata/baselines/reference/submodule/compiler/constEnumNoPreserveDeclarationReexport.types +++ b/testdata/baselines/reference/submodule/compiler/constEnumNoPreserveDeclarationReexport.types @@ -19,8 +19,8 @@ export default MyConstEnum; === ReExport.d.ts === export { MyConstEnum as default } from './ConstEnum'; ->MyConstEnum : typeof import("./ConstEnum.js").MyConstEnum ->default : typeof import("./ConstEnum.js").MyConstEnum +>MyConstEnum : typeof import("./ConstEnum").MyConstEnum +>default : typeof import("./ConstEnum").MyConstEnum === usages.ts === import {MyConstEnum} from "./ConstEnum"; diff --git a/testdata/baselines/reference/submodule/compiler/constEnumNoPreserveDeclarationReexport.types.diff b/testdata/baselines/reference/submodule/compiler/constEnumNoPreserveDeclarationReexport.types.diff index ab25b16491..d62d450055 100644 --- a/testdata/baselines/reference/submodule/compiler/constEnumNoPreserveDeclarationReexport.types.diff +++ b/testdata/baselines/reference/submodule/compiler/constEnumNoPreserveDeclarationReexport.types.diff @@ -6,8 +6,8 @@ export { MyConstEnum as default } from './ConstEnum'; ->MyConstEnum : typeof import("ConstEnum").MyConstEnum ->default : typeof import("ConstEnum").MyConstEnum -+>MyConstEnum : typeof import("./ConstEnum.js").MyConstEnum -+>default : typeof import("./ConstEnum.js").MyConstEnum ++>MyConstEnum : typeof import("./ConstEnum").MyConstEnum ++>default : typeof import("./ConstEnum").MyConstEnum === usages.ts === import {MyConstEnum} from "./ConstEnum"; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.js b/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.js index 0b71f4f3bd..a9487d6b32 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.js @@ -36,9 +36,9 @@ exports.default = fp.l10ns; //// [app.d.ts] declare const _default: { - ar?: import("./locale.js").CustomLocale; - bg?: import("./locale.js").CustomLocale; + ar?: import("./locale").CustomLocale; + bg?: import("./locale").CustomLocale; } & { - default: import("./locale.js").Locale; + default: import("./locale").Locale; }; export default _default; diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.js.diff index 15aadb1aa0..b1770d23af 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.js.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.js.diff @@ -8,15 +8,3 @@ +const fp = { l10ns: {} }; exports.default = fp.l10ns; - - //// [app.d.ts] - declare const _default: { -- ar?: import("./locale").CustomLocale; -- bg?: import("./locale").CustomLocale; -+ ar?: import("./locale.js").CustomLocale; -+ bg?: import("./locale.js").CustomLocale; - } & { -- default: import("./locale").Locale; -+ default: import("./locale.js").Locale; - }; - export default _default; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.types b/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.types index e802576791..d1c88c91c8 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.types +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.types @@ -57,7 +57,7 @@ const fp = { l10ns: {} } as FlatpickrFn; >{} : {} export default fp.l10ns; ->fp.l10ns : { ar?: import("./locale.js").CustomLocale; bg?: import("./locale.js").CustomLocale; } & { default: import("./locale.js").Locale; } +>fp.l10ns : { ar?: import("./locale").CustomLocale; bg?: import("./locale").CustomLocale; } & { default: import("./locale").Locale; } >fp : FlatpickrFn ->l10ns : { ar?: import("./locale.js").CustomLocale; bg?: import("./locale.js").CustomLocale; } & { default: import("./locale.js").Locale; } +>l10ns : { ar?: import("./locale").CustomLocale; bg?: import("./locale").CustomLocale; } & { default: import("./locale").Locale; } diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.types.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.types.diff index f0d3e5a2a0..f62cb0d58a 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.types.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitAliasFromIndirectFile.types.diff @@ -5,7 +5,7 @@ export default fp.l10ns; ->fp.l10ns : { ar?: import("locale").CustomLocale; bg?: import("locale").CustomLocale; } & { default: import("locale").Locale; } -+>fp.l10ns : { ar?: import("./locale.js").CustomLocale; bg?: import("./locale.js").CustomLocale; } & { default: import("./locale.js").Locale; } ++>fp.l10ns : { ar?: import("./locale").CustomLocale; bg?: import("./locale").CustomLocale; } & { default: import("./locale").Locale; } >fp : FlatpickrFn ->l10ns : { ar?: import("locale").CustomLocale; bg?: import("locale").CustomLocale; } & { default: import("locale").Locale; } -+>l10ns : { ar?: import("./locale.js").CustomLocale; bg?: import("./locale.js").CustomLocale; } & { default: import("./locale.js").Locale; } ++>l10ns : { ar?: import("./locale").CustomLocale; bg?: import("./locale").CustomLocale; } & { default: import("./locale").Locale; } diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.errors.txt b/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.errors.txt index 5b318a29fa..51403f7c7e 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.errors.txt +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.errors.txt @@ -1,4 +1,4 @@ -/makeC.ts(1,10): error TS2305: Module '"/node_modules/pkg/index"' has no exported member 'C'. +/index.ts(2,14): error TS2742: The inferred type of 'c' cannot be named without a reference to './node_modules/pkg'. This is likely not portable. A type annotation is necessary. ==== /node_modules/pkg/package.json (0 errors) ==== @@ -21,15 +21,15 @@ ==== /node_modules/pkg/index.d.cts (0 errors) ==== export {}; -==== /makeC.ts (1 errors) ==== +==== /makeC.ts (0 errors) ==== import { C } from "pkg"; - ~ -!!! error TS2305: Module '"/node_modules/pkg/index"' has no exported member 'C'. export function makeC() { return new C(); } -==== /index.ts (0 errors) ==== +==== /index.ts (1 errors) ==== import { makeC } from "./makeC"; export const c = makeC(); + ~ +!!! error TS2742: The inferred type of 'c' cannot be named without a reference to './node_modules/pkg'. This is likely not portable. A type annotation is necessary. \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.errors.txt.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.errors.txt.diff index 63e1bdbd61..be55f0d1c1 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.errors.txt.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.errors.txt.diff @@ -2,7 +2,7 @@ +++ new.declarationEmitBundlerConditions.errors.txt @@= skipped -0, +0 lines =@@ - -+/makeC.ts(1,10): error TS2305: Module '"/node_modules/pkg/index"' has no exported member 'C'. ++/index.ts(2,14): error TS2742: The inferred type of 'c' cannot be named without a reference to './node_modules/pkg'. This is likely not portable. A type annotation is necessary. + + +==== /node_modules/pkg/package.json (0 errors) ==== @@ -25,15 +25,15 @@ +==== /node_modules/pkg/index.d.cts (0 errors) ==== + export {}; + -+==== /makeC.ts (1 errors) ==== ++==== /makeC.ts (0 errors) ==== + import { C } from "pkg"; -+ ~ -+!!! error TS2305: Module '"/node_modules/pkg/index"' has no exported member 'C'. + export function makeC() { + return new C(); + } + -+==== /index.ts (0 errors) ==== ++==== /index.ts (1 errors) ==== + import { makeC } from "./makeC"; + export const c = makeC(); ++ ~ ++!!! error TS2742: The inferred type of 'c' cannot be named without a reference to './node_modules/pkg'. This is likely not portable. A type annotation is necessary. + \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.js b/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.js index b3c15757be..e54034e41c 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.js @@ -34,6 +34,7 @@ export const c = makeC(); //// [makeC.d.ts] -export declare function makeC(): any; +import { C } from "pkg"; +export declare function makeC(): C; //// [index.d.ts] export declare const c: any; diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.js.diff index a2c4eff626..2d4ba0874a 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.js.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitBundlerConditions.js.diff @@ -1,12 +1,8 @@ --- old.declarationEmitBundlerConditions.js +++ new.declarationEmitBundlerConditions.js -@@= skipped -33, +33 lines =@@ - - - //// [makeC.d.ts] --import { C } from "pkg"; --export declare function makeC(): C; -+export declare function makeC(): any; +@@= skipped -36, +36 lines =@@ + import { C } from "pkg"; + export declare function makeC(): C; //// [index.d.ts] -export declare const c: import("pkg").C; +export declare const c: any; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.js b/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.js index f934448d70..b33ee3070f 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.js @@ -27,6 +27,6 @@ exports.d = { e: projC_1.e }; //// [index.d.ts] export declare const d: { e: { - f: (foo: import("../projA/index.js").Foo) => boolean; + f: (foo: import("../projA").Foo) => boolean; }; }; diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.js.diff index a4517fe8eb..eba36378c1 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.js.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.js.diff @@ -8,11 +8,3 @@ +const projC_1 = require("../projC"); exports.d = { e: projC_1.e }; - - //// [index.d.ts] - export declare const d: { - e: { -- f: (foo: import("../projA").Foo) => boolean; -+ f: (foo: import("../projA/index.js").Foo) => boolean; - }; - }; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.types b/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.types index 78fc6a937a..57460ab6f4 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.types +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.types @@ -18,19 +18,19 @@ export declare const f: (foo: Foo) => boolean; === projC/index.d.ts === export declare const e: { ->e : { f: (foo: import("../projA/index.js").Foo) => boolean; } +>e : { f: (foo: import("../projA").Foo) => boolean; } f: (foo: import("../projA").Foo) => boolean; ->f : (foo: import("../projA/index.js").Foo) => boolean ->foo : import("../projA/index.js").Foo +>f : (foo: import("../projA").Foo) => boolean +>foo : import("../projA").Foo }; === projD/index.ts === import {e} from "../projC"; ->e : { f: (foo: import("../projA/index.js").Foo) => boolean; } +>e : { f: (foo: import("../projA").Foo) => boolean; } export const d = {e}; ->d : { e: { f: (foo: import("../projA/index.js").Foo) => boolean; }; } ->{e} : { e: { f: (foo: import("../projA/index.js").Foo) => boolean; }; } ->e : { f: (foo: import("../projA/index.js").Foo) => boolean; } +>d : { e: { f: (foo: import("../projA").Foo) => boolean; }; } +>{e} : { e: { f: (foo: import("../projA").Foo) => boolean; }; } +>e : { f: (foo: import("../projA").Foo) => boolean; } diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.types.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.types.diff index 5cf6052820..ccc72218d2 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.types.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitCrossFileCopiedGeneratedImportType.types.diff @@ -1,28 +1,22 @@ --- old.declarationEmitCrossFileCopiedGeneratedImportType.types +++ new.declarationEmitCrossFileCopiedGeneratedImportType.types -@@= skipped -17, +17 lines =@@ - - === projC/index.d.ts === - export declare const e: { -->e : { f: (foo: import("../projA").Foo) => boolean; } -+>e : { f: (foo: import("../projA/index.js").Foo) => boolean; } +@@= skipped -21, +21 lines =@@ f: (foo: import("../projA").Foo) => boolean; -->f : (foo: import("../projA").Foo) => boolean + >f : (foo: import("../projA").Foo) => boolean ->foo : import("projA/index").Foo -+>f : (foo: import("../projA/index.js").Foo) => boolean -+>foo : import("../projA/index.js").Foo ++>foo : import("../projA").Foo }; === projD/index.ts === import {e} from "../projC"; ->e : { f: (foo: import("projA/index").Foo) => boolean; } -+>e : { f: (foo: import("../projA/index.js").Foo) => boolean; } ++>e : { f: (foo: import("../projA").Foo) => boolean; } export const d = {e}; ->d : { e: { f: (foo: import("projA/index").Foo) => boolean; }; } ->{e} : { e: { f: (foo: import("projA/index").Foo) => boolean; }; } ->e : { f: (foo: import("projA/index").Foo) => boolean; } -+>d : { e: { f: (foo: import("../projA/index.js").Foo) => boolean; }; } -+>{e} : { e: { f: (foo: import("../projA/index.js").Foo) => boolean; }; } -+>e : { f: (foo: import("../projA/index.js").Foo) => boolean; } ++>d : { e: { f: (foo: import("../projA").Foo) => boolean; }; } ++>{e} : { e: { f: (foo: import("../projA").Foo) => boolean; }; } ++>e : { f: (foo: import("../projA").Foo) => boolean; } diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitDoesNotUseReexportedNamespaceAsLocal.types b/testdata/baselines/reference/submodule/compiler/declarationEmitDoesNotUseReexportedNamespaceAsLocal.types index dc15c089d7..3df63b2ac0 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitDoesNotUseReexportedNamespaceAsLocal.types +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitDoesNotUseReexportedNamespaceAsLocal.types @@ -13,7 +13,7 @@ export const x = add(import("./sub")); >"./sub" : "./sub" export * as Q from "./sub"; ->Q : typeof import("./sub") +>Q : typeof import("./sub.js") declare function add(x: Promise): T; >add : (x: Promise) => T diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitDoesNotUseReexportedNamespaceAsLocal.types.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitDoesNotUseReexportedNamespaceAsLocal.types.diff index 148ccb5cfa..750bfc4c10 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitDoesNotUseReexportedNamespaceAsLocal.types.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitDoesNotUseReexportedNamespaceAsLocal.types.diff @@ -15,7 +15,7 @@ export * as Q from "./sub"; ->Q : typeof import("sub") -+>Q : typeof import("./sub") ++>Q : typeof import("./sub.js") declare function add(x: Promise): T; >add : (x: Promise) => T \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.js b/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.js index dcc6c8a39d..91254750e8 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.js @@ -31,4 +31,4 @@ exports.a = (0, typescript_fsa_1.getA)(); //// [index.d.ts] -export declare const a: import("../cache/typescript-fsa/index.js").A; +export declare const a: import("../cache/typescript-fsa").A; diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.js.diff index 4571acc533..aebc51e130 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.js.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.js.diff @@ -11,4 +11,4 @@ //// [index.d.ts] -export declare const a: import("typescript-fsa").A; -+export declare const a: import("../cache/typescript-fsa/index.js").A; \ No newline at end of file ++export declare const a: import("../cache/typescript-fsa").A; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.types b/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.types index 05fe1dea9c..878ea15aa9 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.types +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.types @@ -18,15 +18,15 @@ import * as _whatever from "p2"; >_whatever : typeof _whatever import { getA } from "typescript-fsa"; ->getA : () => import("../cache/typescript-fsa/index.js").A +>getA : () => import("../cache/typescript-fsa").A export const a = getA(); ->a : import("../cache/typescript-fsa/index.js").A ->getA() : import("../cache/typescript-fsa/index.js").A ->getA : () => import("../cache/typescript-fsa/index.js").A +>a : import("../cache/typescript-fsa").A +>getA() : import("../cache/typescript-fsa").A +>getA : () => import("../cache/typescript-fsa").A === /p2/index.d.ts === export const a: import("typescript-fsa").A; ->a : import("../cache/typescript-fsa/index.js").A +>a : import("../cache/typescript-fsa").A diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.types.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.types.diff index 8df52d2e5e..0725825517 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.types.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitForGlobalishSpecifierSymlink2.types.diff @@ -5,18 +5,18 @@ import { getA } from "typescript-fsa"; ->getA : () => import("/cache/typescript-fsa/index").A -+>getA : () => import("../cache/typescript-fsa/index.js").A ++>getA : () => import("../cache/typescript-fsa").A export const a = getA(); ->a : import("/cache/typescript-fsa/index").A ->getA() : import("/cache/typescript-fsa/index").A ->getA : () => import("/cache/typescript-fsa/index").A -+>a : import("../cache/typescript-fsa/index.js").A -+>getA() : import("../cache/typescript-fsa/index.js").A -+>getA : () => import("../cache/typescript-fsa/index.js").A ++>a : import("../cache/typescript-fsa").A ++>getA() : import("../cache/typescript-fsa").A ++>getA : () => import("../cache/typescript-fsa").A === /p2/index.d.ts === export const a: import("typescript-fsa").A; ->a : import("/cache/typescript-fsa/index").A -+>a : import("../cache/typescript-fsa/index.js").A ++>a : import("../cache/typescript-fsa").A diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitMonorepoBaseUrl.js b/testdata/baselines/reference/submodule/compiler/declarationEmitMonorepoBaseUrl.js index 38087c3e93..f689b6ccaa 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitMonorepoBaseUrl.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitMonorepoBaseUrl.js @@ -44,11 +44,15 @@ export function resolveParserPlugins() { //// [index.js] -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //// [index.js] -import { createPlugin } from "@babel/parser"; -export function resolveParserPlugins() { - return [createPlugin()]; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.resolveParserPlugins = resolveParserPlugins; +const parser_1 = require("@babel/parser"); +function resolveParserPlugins() { + return [(0, parser_1.createPlugin)()]; } diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitMonorepoBaseUrl.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitMonorepoBaseUrl.js.diff index 649dd54cca..2fe4470542 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitMonorepoBaseUrl.js.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitMonorepoBaseUrl.js.diff @@ -1,25 +1,6 @@ --- old.declarationEmitMonorepoBaseUrl.js +++ new.declarationEmitMonorepoBaseUrl.js -@@= skipped -43, +43 lines =@@ - - - //// [index.js] --"use strict"; --Object.defineProperty(exports, "__esModule", { value: true }); -+export {}; - //// [index.js] --"use strict"; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.resolveParserPlugins = resolveParserPlugins; --const parser_1 = require("@babel/parser"); --function resolveParserPlugins() { -- return [(0, parser_1.createPlugin)()]; -+import { createPlugin } from "@babel/parser"; -+export function resolveParserPlugins() { -+ return [createPlugin()]; - } - - +@@= skipped -58, +58 lines =@@ //// [index.d.ts] export {}; //// [index.d.ts] diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.js b/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.js index 340a0f3845..043b2d9ee6 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.js @@ -38,5 +38,5 @@ exports.fun2 = (0, bbb_1.create)(); //// [index.d.ts] import { T, Q } from "./lib"; -export declare const fun: () => import("./bbb.js").INode; -export declare const fun2: () => import("./bbb.js").INode; +export declare const fun: () => import("./bbb").INode; +export declare const fun2: () => import("./bbb").INode; diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.js.diff index da7a8fcb0f..e09ce24362 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.js.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.js.diff @@ -8,11 +8,3 @@ +const bbb_1 = require("./bbb"); exports.fun = (0, bbb_1.create)(); exports.fun2 = (0, bbb_1.create)(); - - - //// [index.d.ts] - import { T, Q } from "./lib"; --export declare const fun: () => import("./bbb").INode; --export declare const fun2: () => import("./bbb").INode; -+export declare const fun: () => import("./bbb.js").INode; -+export declare const fun2: () => import("./bbb.js").INode; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.types b/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.types index 3802f00102..9c72ab5937 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.types +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.types @@ -38,15 +38,15 @@ import { T, Q } from "./lib"; >Q : any import { create } from "./bbb"; ->create : () => () => import("./bbb.js").INode +>create : () => () => import("./bbb").INode export const fun = create(); ->fun : () => import("./bbb.js").INode ->create() : () => import("./bbb.js").INode ->create : () => () => import("./bbb.js").INode +>fun : () => import("./bbb").INode +>create() : () => import("./bbb").INode +>create : () => () => import("./bbb").INode export const fun2 = create(); ->fun2 : () => import("./bbb.js").INode ->create() : () => import("./bbb.js").INode ->create : () => () => import("./bbb.js").INode +>fun2 : () => import("./bbb").INode +>create() : () => import("./bbb").INode +>create : () => () => import("./bbb").INode diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.types.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.types.diff index 098b0313bf..af87da2e3c 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.types.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitQualifiedAliasTypeArgument.types.diff @@ -5,20 +5,20 @@ import { create } from "./bbb"; ->create : () => () => import("bbb").INode -+>create : () => () => import("./bbb.js").INode ++>create : () => () => import("./bbb").INode export const fun = create(); ->fun : () => import("bbb").INode ->create() : () => import("bbb").INode ->create : () => () => import("bbb").INode -+>fun : () => import("./bbb.js").INode -+>create() : () => import("./bbb.js").INode -+>create : () => () => import("./bbb.js").INode ++>fun : () => import("./bbb").INode ++>create() : () => import("./bbb").INode ++>create : () => () => import("./bbb").INode export const fun2 = create(); ->fun2 : () => import("bbb").INode ->create() : () => import("bbb").INode ->create : () => () => import("bbb").INode -+>fun2 : () => import("./bbb.js").INode -+>create() : () => import("./bbb.js").INode -+>create : () => () => import("./bbb.js").INode ++>fun2 : () => import("./bbb").INode ++>create() : () => import("./bbb").INode ++>create : () => () => import("./bbb").INode diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.js b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.js index 8bd4f15a8a..a052f78c20 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.js @@ -71,6 +71,6 @@ __exportStar(require("./keys"), exports); //// [keys.d.ts] import { MetadataAccessor } from "@raymondfeng/pkg2"; -export declare const ADMIN: MetadataAccessor; +export declare const ADMIN: MetadataAccessor; //// [index.d.ts] export * from './keys'; diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.js.diff index 24dd71e50d..2c631d0f54 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.js.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.js.diff @@ -14,6 +14,6 @@ //// [keys.d.ts] import { MetadataAccessor } from "@raymondfeng/pkg2"; -export declare const ADMIN: MetadataAccessor; -+export declare const ADMIN: MetadataAccessor; ++export declare const ADMIN: MetadataAccessor; //// [index.d.ts] export * from './keys'; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.types b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.types index b3e38d0c38..a6ce84ee96 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.types +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.types @@ -8,11 +8,11 @@ import {MetadataAccessor} from "@raymondfeng/pkg2"; >MetadataAccessor : typeof MetadataAccessor export const ADMIN = MetadataAccessor.create('1'); ->ADMIN : MetadataAccessor ->MetadataAccessor.create('1') : MetadataAccessor ->MetadataAccessor.create : (key: string) => MetadataAccessor +>ADMIN : MetadataAccessor +>MetadataAccessor.create('1') : MetadataAccessor +>MetadataAccessor.create : (key: string) => MetadataAccessor >MetadataAccessor : typeof MetadataAccessor ->create : (key: string) => MetadataAccessor +>create : (key: string) => MetadataAccessor >'1' : "1" === monorepo/pkg1/dist/index.d.ts === diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.types.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.types.diff index 59ccbb01c7..eb9a2111e7 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.types.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference.types.diff @@ -7,12 +7,12 @@ ->ADMIN : MetadataAccessor ->MetadataAccessor.create('1') : MetadataAccessor ->MetadataAccessor.create : (key: string) => MetadataAccessor -+>ADMIN : MetadataAccessor -+>MetadataAccessor.create('1') : MetadataAccessor -+>MetadataAccessor.create : (key: string) => MetadataAccessor ++>ADMIN : MetadataAccessor ++>MetadataAccessor.create('1') : MetadataAccessor ++>MetadataAccessor.create : (key: string) => MetadataAccessor >MetadataAccessor : typeof MetadataAccessor ->create : (key: string) => MetadataAccessor -+>create : (key: string) => MetadataAccessor ++>create : (key: string) => MetadataAccessor >'1' : "1" === monorepo/pkg1/dist/index.d.ts === \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.js b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.js index 7258430ab5..04f9db1d53 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.js @@ -74,6 +74,6 @@ __exportStar(require("./keys"), exports); //// [keys.d.ts] import { MetadataAccessor } from "@raymondfeng/pkg2"; -export declare const ADMIN: MetadataAccessor; +export declare const ADMIN: MetadataAccessor; //// [index.d.ts] export * from './keys'; diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.js.diff index 48deacffd8..e4c91af8f8 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.js.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.js.diff @@ -14,6 +14,6 @@ //// [keys.d.ts] import { MetadataAccessor } from "@raymondfeng/pkg2"; -export declare const ADMIN: MetadataAccessor; -+export declare const ADMIN: MetadataAccessor; ++export declare const ADMIN: MetadataAccessor; //// [index.d.ts] export * from './keys'; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.types b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.types index 3879b1b483..8a7267b255 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.types +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.types @@ -8,11 +8,11 @@ import {MetadataAccessor} from "@raymondfeng/pkg2"; >MetadataAccessor : typeof MetadataAccessor export const ADMIN = MetadataAccessor.create('1'); ->ADMIN : MetadataAccessor ->MetadataAccessor.create('1') : MetadataAccessor ->MetadataAccessor.create : (key: string) => MetadataAccessor +>ADMIN : MetadataAccessor +>MetadataAccessor.create('1') : MetadataAccessor +>MetadataAccessor.create : (key: string) => MetadataAccessor >MetadataAccessor : typeof MetadataAccessor ->create : (key: string) => MetadataAccessor +>create : (key: string) => MetadataAccessor >'1' : "1" === monorepo/pkg1/dist/index.d.ts === @@ -56,7 +56,7 @@ import "./secondary"; export * from './types'; === monorepo/pkg2/dist/types.d.ts === export {MetadataAccessor} from '@raymondfeng/pkg1'; ->MetadataAccessor : typeof import("../../pkg1/dist/types.js").MetadataAccessor +>MetadataAccessor : typeof import("../../pkg1/dist").MetadataAccessor === monorepo/pkg2/dist/secondary.d.ts === export {IdType} from '@raymondfeng/pkg1'; diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.types.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.types.diff index 39b43eb295..b945f2fef7 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.types.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference2.types.diff @@ -7,12 +7,12 @@ ->ADMIN : MetadataAccessor ->MetadataAccessor.create('1') : MetadataAccessor ->MetadataAccessor.create : (key: string) => MetadataAccessor -+>ADMIN : MetadataAccessor -+>MetadataAccessor.create('1') : MetadataAccessor -+>MetadataAccessor.create : (key: string) => MetadataAccessor ++>ADMIN : MetadataAccessor ++>MetadataAccessor.create('1') : MetadataAccessor ++>MetadataAccessor.create : (key: string) => MetadataAccessor >MetadataAccessor : typeof MetadataAccessor ->create : (key: string) => MetadataAccessor -+>create : (key: string) => MetadataAccessor ++>create : (key: string) => MetadataAccessor >'1' : "1" === monorepo/pkg1/dist/index.d.ts === @@ -21,7 +21,7 @@ === monorepo/pkg2/dist/types.d.ts === export {MetadataAccessor} from '@raymondfeng/pkg1'; ->MetadataAccessor : typeof import("monorepo/pkg1/dist/types").MetadataAccessor -+>MetadataAccessor : typeof import("../../pkg1/dist/types.js").MetadataAccessor ++>MetadataAccessor : typeof import("../../pkg1/dist").MetadataAccessor === monorepo/pkg2/dist/secondary.d.ts === export {IdType} from '@raymondfeng/pkg1'; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.js b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.js index 481fee6889..ca11f0526b 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.js @@ -71,6 +71,6 @@ __exportStar(require("./keys"), exports); //// [keys.d.ts] import { MetadataAccessor } from "@raymondfeng/pkg2"; -export declare const ADMIN: MetadataAccessor; +export declare const ADMIN: MetadataAccessor; //// [index.d.ts] export * from './keys'; diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.js.diff index a77228f3f5..63337a5943 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.js.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.js.diff @@ -15,6 +15,6 @@ +//// [keys.d.ts] +import { MetadataAccessor } from "@raymondfeng/pkg2"; -+export declare const ADMIN: MetadataAccessor; ++export declare const ADMIN: MetadataAccessor; //// [index.d.ts] export * from './keys'; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.types b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.types index 8b1ce5c1f2..4175506338 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.types +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.types @@ -8,11 +8,11 @@ import {MetadataAccessor} from "@raymondfeng/pkg2"; >MetadataAccessor : typeof MetadataAccessor export const ADMIN = MetadataAccessor.create('1'); ->ADMIN : MetadataAccessor ->MetadataAccessor.create('1') : MetadataAccessor ->MetadataAccessor.create : (key: string) => MetadataAccessor +>ADMIN : MetadataAccessor +>MetadataAccessor.create('1') : MetadataAccessor +>MetadataAccessor.create : (key: string) => MetadataAccessor >MetadataAccessor : typeof MetadataAccessor ->create : (key: string) => MetadataAccessor +>create : (key: string) => MetadataAccessor >'1' : "1" === monorepo/pkg1/dist/index.d.ts === @@ -55,5 +55,5 @@ export declare class MetadataAccessor { export * from './types'; === monorepo/pkg2/dist/types.d.ts === export {MetadataAccessor} from '@raymondfeng/pkg1'; ->MetadataAccessor : typeof import("../../pkg1/dist/types.js").MetadataAccessor +>MetadataAccessor : typeof import("../../pkg1/dist").MetadataAccessor diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.types.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.types.diff index fbfe101a75..114161545b 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.types.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReexportedSymlinkReference3.types.diff @@ -7,12 +7,12 @@ ->ADMIN : MetadataAccessor ->MetadataAccessor.create('1') : MetadataAccessor ->MetadataAccessor.create : (key: string) => MetadataAccessor -+>ADMIN : MetadataAccessor -+>MetadataAccessor.create('1') : MetadataAccessor -+>MetadataAccessor.create : (key: string) => MetadataAccessor ++>ADMIN : MetadataAccessor ++>MetadataAccessor.create('1') : MetadataAccessor ++>MetadataAccessor.create : (key: string) => MetadataAccessor >MetadataAccessor : typeof MetadataAccessor ->create : (key: string) => MetadataAccessor -+>create : (key: string) => MetadataAccessor ++>create : (key: string) => MetadataAccessor >'1' : "1" === monorepo/pkg1/dist/index.d.ts === @@ -21,4 +21,4 @@ === monorepo/pkg2/dist/types.d.ts === export {MetadataAccessor} from '@raymondfeng/pkg1'; ->MetadataAccessor : typeof import("monorepo/pkg1/dist/types").MetadataAccessor -+>MetadataAccessor : typeof import("../../pkg1/dist/types.js").MetadataAccessor ++>MetadataAccessor : typeof import("../../pkg1/dist").MetadataAccessor diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitReusesLambdaParameterNodes.js b/testdata/baselines/reference/submodule/compiler/declarationEmitReusesLambdaParameterNodes.js index 101f972d83..cc21d5c76c 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitReusesLambdaParameterNodes.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitReusesLambdaParameterNodes.js @@ -12,8 +12,13 @@ export function CustomSelect2(x: Props