From 0ae42ea3def8cab3405e55927320d9dbc2ebfcd9 Mon Sep 17 00:00:00 2001 From: Andy Date: Tue, 19 Sep 2017 12:42:29 -0700 Subject: [PATCH] Allow relative imports of '.js' files when `--noImplicitAny` is disabled (#18489) * Allow relative imports of '.js' files when `--noImplicitAny` is disabled * Update baselines, and don't ignore a diagnostic about missing JSX --- src/compiler/checker.ts | 4 ++-- src/compiler/diagnosticMessages.json | 4 ---- src/compiler/program.ts | 12 +++++++++--- ...eResolutionWithExtensions_notSupported.errors.txt | 11 ++++------- .../moduleResolutionWithExtensions_notSupported.js | 6 +++--- ...ResolutionWithExtensions_notSupported3.errors.txt | 12 ------------ .../moduleResolutionWithExtensions_notSupported3.js | 2 +- ...uleResolutionWithExtensions_notSupported3.symbols | 4 ++++ ...oduleResolutionWithExtensions_notSupported3.types | 4 ++++ .../moduleResolution_relativeImportJsFile.js | 12 ++++++++++++ .../moduleResolution_relativeImportJsFile.symbols | 4 ++++ .../moduleResolution_relativeImportJsFile.types | 4 ++++ ...ion_relativeImportJsFile_noImplicitAny.errors.txt | 11 +++++++++++ ...eResolution_relativeImportJsFile_noImplicitAny.js | 12 ++++++++++++ .../moduleResolutionWithExtensions_notSupported.ts | 6 +++--- .../moduleResolutionWithExtensions_notSupported3.ts | 2 +- .../moduleResolution_relativeImportJsFile.ts | 7 +++++++ ...eResolution_relativeImportJsFile_noImplicitAny.ts | 8 ++++++++ .../untypedModuleImport_noLocalImports.ts | 9 --------- 19 files changed, 89 insertions(+), 45 deletions(-) delete mode 100644 tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.errors.txt create mode 100644 tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.symbols create mode 100644 tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.types create mode 100644 tests/baselines/reference/moduleResolution_relativeImportJsFile.js create mode 100644 tests/baselines/reference/moduleResolution_relativeImportJsFile.symbols create mode 100644 tests/baselines/reference/moduleResolution_relativeImportJsFile.types create mode 100644 tests/baselines/reference/moduleResolution_relativeImportJsFile_noImplicitAny.errors.txt create mode 100644 tests/baselines/reference/moduleResolution_relativeImportJsFile_noImplicitAny.js create mode 100644 tests/cases/compiler/moduleResolution_relativeImportJsFile.ts create mode 100644 tests/cases/compiler/moduleResolution_relativeImportJsFile_noImplicitAny.ts delete mode 100644 tests/cases/conformance/moduleResolution/untypedModuleImport_noLocalImports.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 70bf20cdbf6..98b7a9d044f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1759,13 +1759,13 @@ namespace ts { } // May be an untyped module. If so, ignore resolutionDiagnostic. - if (resolvedModule && resolvedModule.isExternalLibraryImport && !extensionIsTypeScript(resolvedModule.extension)) { + if (resolvedModule && !extensionIsTypeScript(resolvedModule.extension) && resolutionDiagnostic === undefined || resolutionDiagnostic === Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type) { if (isForAugmentation) { const diag = Diagnostics.Invalid_module_name_in_augmentation_Module_0_resolves_to_an_untyped_module_at_1_which_cannot_be_augmented; error(errorNode, diag, moduleReference, resolvedModule.resolvedFileName); } else if (noImplicitAny && moduleNotFoundError) { - let errorInfo = chainDiagnosticMessages(/*details*/ undefined, + let errorInfo = !resolvedModule.isExternalLibraryImport ? undefined : chainDiagnosticMessages(/*details*/ undefined, Diagnostics.Try_npm_install_types_Slash_0_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare_module_0, moduleReference); errorInfo = chainDiagnosticMessages(errorInfo, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index e273950424c..662e87d3159 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3146,10 +3146,6 @@ "category": "Error", "code": 6142 }, - "Module '{0}' was resolved to '{1}', but '--allowJs' is not set.": { - "category": "Error", - "code": 6143 - }, "Module '{0}' was resolved as locally declared ambient module in file '{1}'.": { "category": "Message", "code": 6144 diff --git a/src/compiler/program.ts b/src/compiler/program.ts index f18d396e9dd..fe0b4c4de36 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1846,7 +1846,8 @@ namespace ts { } const isFromNodeModulesSearch = resolution.isExternalLibraryImport; - const isJsFileFromNodeModules = isFromNodeModulesSearch && !extensionIsTypeScript(resolution.extension); + const isJsFile = !extensionIsTypeScript(resolution.extension); + const isJsFileFromNodeModules = isFromNodeModulesSearch && isJsFile; const resolvedFileName = resolution.resolvedFileName; if (isFromNodeModulesSearch) { @@ -1861,7 +1862,12 @@ namespace ts { const elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModuleJsDepth; // Don't add the file if it has a bad extension (e.g. 'tsx' if we don't have '--allowJs') // This may still end up being an untyped module -- the file won't be included but imports will be allowed. - const shouldAddFile = resolvedFileName && !getResolutionDiagnostic(options, resolution) && !options.noResolve && i < file.imports.length && !elideImport; + const shouldAddFile = resolvedFileName + && !getResolutionDiagnostic(options, resolution) + && !options.noResolve + && i < file.imports.length + && !elideImport + && !(isJsFile && !options.allowJs); if (elideImport) { modulesWithElidedImports.set(file.path, true); @@ -2236,7 +2242,7 @@ namespace ts { return options.jsx ? undefined : Diagnostics.Module_0_was_resolved_to_1_but_jsx_is_not_set; } function needAllowJs() { - return options.allowJs ? undefined : Diagnostics.Module_0_was_resolved_to_1_but_allowJs_is_not_set; + return options.allowJs || !options.noImplicitAny ? undefined : Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type; } } diff --git a/tests/baselines/reference/moduleResolutionWithExtensions_notSupported.errors.txt b/tests/baselines/reference/moduleResolutionWithExtensions_notSupported.errors.txt index 958837f7a0b..991b83bc306 100644 --- a/tests/baselines/reference/moduleResolutionWithExtensions_notSupported.errors.txt +++ b/tests/baselines/reference/moduleResolutionWithExtensions_notSupported.errors.txt @@ -1,18 +1,15 @@ /a.ts(1,17): error TS6142: Module './tsx' was resolved to '/tsx.tsx', but '--jsx' is not set. /a.ts(2,17): error TS6142: Module './jsx' was resolved to '/jsx.jsx', but '--jsx' is not set. -/a.ts(3,16): error TS6143: Module './js' was resolved to '/js.js', but '--allowJs' is not set. -==== /a.ts (3 errors) ==== - import tsx from "./tsx"; +==== /a.ts (2 errors) ==== + import tsx from "./tsx"; // Not allowed. ~~~~~~~ !!! error TS6142: Module './tsx' was resolved to '/tsx.tsx', but '--jsx' is not set. - import jsx from "./jsx"; + import jsx from "./jsx"; // Not allowed. ~~~~~~~ !!! error TS6142: Module './jsx' was resolved to '/jsx.jsx', but '--jsx' is not set. - import js from "./js"; - ~~~~~~ -!!! error TS6143: Module './js' was resolved to '/js.js', but '--allowJs' is not set. + import js from "./js"; // OK because it's an untyped module. ==== /tsx.tsx (0 errors) ==== diff --git a/tests/baselines/reference/moduleResolutionWithExtensions_notSupported.js b/tests/baselines/reference/moduleResolutionWithExtensions_notSupported.js index eb6057f9693..6771a977b35 100644 --- a/tests/baselines/reference/moduleResolutionWithExtensions_notSupported.js +++ b/tests/baselines/reference/moduleResolutionWithExtensions_notSupported.js @@ -7,9 +7,9 @@ //// [js.js] //// [a.ts] -import tsx from "./tsx"; -import jsx from "./jsx"; -import js from "./js"; +import tsx from "./tsx"; // Not allowed. +import jsx from "./jsx"; // Not allowed. +import js from "./js"; // OK because it's an untyped module. //// [a.js] diff --git a/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.errors.txt b/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.errors.txt deleted file mode 100644 index 45e058bae54..00000000000 --- a/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.errors.txt +++ /dev/null @@ -1,12 +0,0 @@ -/a.ts(1,17): error TS6143: Module './jsx' was resolved to '/jsx.jsx', but '--allowJs' is not set. - - -==== /a.ts (1 errors) ==== - import jsx from "./jsx"; - ~~~~~~~ -!!! error TS6143: Module './jsx' was resolved to '/jsx.jsx', but '--allowJs' is not set. - -==== /jsx.jsx (0 errors) ==== - // Test the error message if we have `--jsx` but not `--allowJw`. - - \ No newline at end of file diff --git a/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.js b/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.js index ca0fa6ca402..1c8a2537e0f 100644 --- a/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.js +++ b/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.js @@ -1,7 +1,7 @@ //// [tests/cases/compiler/moduleResolutionWithExtensions_notSupported3.ts] //// //// [jsx.jsx] -// Test the error message if we have `--jsx` but not `--allowJw`. +// If we have "--jsx" set and not "--allowJs", it's an implicit-any module. //// [a.ts] diff --git a/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.symbols b/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.symbols new file mode 100644 index 00000000000..071936029fa --- /dev/null +++ b/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.symbols @@ -0,0 +1,4 @@ +=== /a.ts === +import jsx from "./jsx"; +>jsx : Symbol(jsx, Decl(a.ts, 0, 6)) + diff --git a/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.types b/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.types new file mode 100644 index 00000000000..70fe2e49dbf --- /dev/null +++ b/tests/baselines/reference/moduleResolutionWithExtensions_notSupported3.types @@ -0,0 +1,4 @@ +=== /a.ts === +import jsx from "./jsx"; +>jsx : any + diff --git a/tests/baselines/reference/moduleResolution_relativeImportJsFile.js b/tests/baselines/reference/moduleResolution_relativeImportJsFile.js new file mode 100644 index 00000000000..94984a414e2 --- /dev/null +++ b/tests/baselines/reference/moduleResolution_relativeImportJsFile.js @@ -0,0 +1,12 @@ +//// [tests/cases/compiler/moduleResolution_relativeImportJsFile.ts] //// + +//// [b.js] +export const x = 0; + +//// [a.ts] +import * as b from "./b"; + + +//// [a.js] +"use strict"; +exports.__esModule = true; diff --git a/tests/baselines/reference/moduleResolution_relativeImportJsFile.symbols b/tests/baselines/reference/moduleResolution_relativeImportJsFile.symbols new file mode 100644 index 00000000000..693e1501a11 --- /dev/null +++ b/tests/baselines/reference/moduleResolution_relativeImportJsFile.symbols @@ -0,0 +1,4 @@ +=== /src/a.ts === +import * as b from "./b"; +>b : Symbol(b, Decl(a.ts, 0, 6)) + diff --git a/tests/baselines/reference/moduleResolution_relativeImportJsFile.types b/tests/baselines/reference/moduleResolution_relativeImportJsFile.types new file mode 100644 index 00000000000..051c4dad861 --- /dev/null +++ b/tests/baselines/reference/moduleResolution_relativeImportJsFile.types @@ -0,0 +1,4 @@ +=== /src/a.ts === +import * as b from "./b"; +>b : any + diff --git a/tests/baselines/reference/moduleResolution_relativeImportJsFile_noImplicitAny.errors.txt b/tests/baselines/reference/moduleResolution_relativeImportJsFile_noImplicitAny.errors.txt new file mode 100644 index 00000000000..e3d36d4334c --- /dev/null +++ b/tests/baselines/reference/moduleResolution_relativeImportJsFile_noImplicitAny.errors.txt @@ -0,0 +1,11 @@ +/src/a.ts(1,20): error TS7016: Could not find a declaration file for module './b'. '/src/b.js' implicitly has an 'any' type. + + +==== /src/a.ts (1 errors) ==== + import * as b from "./b"; + ~~~~~ +!!! error TS7016: Could not find a declaration file for module './b'. '/src/b.js' implicitly has an 'any' type. + +==== /src/b.js (0 errors) ==== + export const x = 0; + \ No newline at end of file diff --git a/tests/baselines/reference/moduleResolution_relativeImportJsFile_noImplicitAny.js b/tests/baselines/reference/moduleResolution_relativeImportJsFile_noImplicitAny.js new file mode 100644 index 00000000000..28b512b91a4 --- /dev/null +++ b/tests/baselines/reference/moduleResolution_relativeImportJsFile_noImplicitAny.js @@ -0,0 +1,12 @@ +//// [tests/cases/compiler/moduleResolution_relativeImportJsFile_noImplicitAny.ts] //// + +//// [b.js] +export const x = 0; + +//// [a.ts] +import * as b from "./b"; + + +//// [a.js] +"use strict"; +exports.__esModule = true; diff --git a/tests/cases/compiler/moduleResolutionWithExtensions_notSupported.ts b/tests/cases/compiler/moduleResolutionWithExtensions_notSupported.ts index 58b039ad8c2..931c1291e48 100644 --- a/tests/cases/compiler/moduleResolutionWithExtensions_notSupported.ts +++ b/tests/cases/compiler/moduleResolutionWithExtensions_notSupported.ts @@ -8,6 +8,6 @@ // @Filename: /js.js // @Filename: /a.ts -import tsx from "./tsx"; -import jsx from "./jsx"; -import js from "./js"; +import tsx from "./tsx"; // Not allowed. +import jsx from "./jsx"; // Not allowed. +import js from "./js"; // OK because it's an untyped module. diff --git a/tests/cases/compiler/moduleResolutionWithExtensions_notSupported3.ts b/tests/cases/compiler/moduleResolutionWithExtensions_notSupported3.ts index e06f603377c..b665f6932d7 100644 --- a/tests/cases/compiler/moduleResolutionWithExtensions_notSupported3.ts +++ b/tests/cases/compiler/moduleResolutionWithExtensions_notSupported3.ts @@ -1,7 +1,7 @@ // @noImplicitReferences: true // @jsx: preserve // @traceResolution: true -// Test the error message if we have `--jsx` but not `--allowJw`. +// If we have "--jsx" set and not "--allowJs", it's an implicit-any module. // @Filename: /jsx.jsx diff --git a/tests/cases/compiler/moduleResolution_relativeImportJsFile.ts b/tests/cases/compiler/moduleResolution_relativeImportJsFile.ts new file mode 100644 index 00000000000..41b6831d582 --- /dev/null +++ b/tests/cases/compiler/moduleResolution_relativeImportJsFile.ts @@ -0,0 +1,7 @@ +// @noImplicitReferences: true + +// @Filename: /src/b.js +export const x = 0; + +// @Filename: /src/a.ts +import * as b from "./b"; diff --git a/tests/cases/compiler/moduleResolution_relativeImportJsFile_noImplicitAny.ts b/tests/cases/compiler/moduleResolution_relativeImportJsFile_noImplicitAny.ts new file mode 100644 index 00000000000..cf89af925c3 --- /dev/null +++ b/tests/cases/compiler/moduleResolution_relativeImportJsFile_noImplicitAny.ts @@ -0,0 +1,8 @@ +// @noImplicitReferences: true +// @noImplicitAny: true + +// @Filename: /src/b.js +export const x = 0; + +// @Filename: /src/a.ts +import * as b from "./b"; diff --git a/tests/cases/conformance/moduleResolution/untypedModuleImport_noLocalImports.ts b/tests/cases/conformance/moduleResolution/untypedModuleImport_noLocalImports.ts deleted file mode 100644 index 8313628e6d7..00000000000 --- a/tests/cases/conformance/moduleResolution/untypedModuleImport_noLocalImports.ts +++ /dev/null @@ -1,9 +0,0 @@ -// @noImplicitReferences: true -// @currentDirectory: / -// This tests that untyped module imports don't happen with local imports. - -// @filename: /foo.js -This file is not processed. - -// @filename: /a.ts -import * as foo from "./foo";