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
This commit is contained in:
parent
406d9abb5a
commit
0ae42ea3de
|
@ -1759,13 +1759,13 @@ namespace ts {
|
||||||
}
|
}
|
||||||
|
|
||||||
// May be an untyped module. If so, ignore resolutionDiagnostic.
|
// 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) {
|
if (isForAugmentation) {
|
||||||
const diag = Diagnostics.Invalid_module_name_in_augmentation_Module_0_resolves_to_an_untyped_module_at_1_which_cannot_be_augmented;
|
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);
|
error(errorNode, diag, moduleReference, resolvedModule.resolvedFileName);
|
||||||
}
|
}
|
||||||
else if (noImplicitAny && moduleNotFoundError) {
|
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,
|
Diagnostics.Try_npm_install_types_Slash_0_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare_module_0,
|
||||||
moduleReference);
|
moduleReference);
|
||||||
errorInfo = chainDiagnosticMessages(errorInfo,
|
errorInfo = chainDiagnosticMessages(errorInfo,
|
||||||
|
|
|
@ -3146,10 +3146,6 @@
|
||||||
"category": "Error",
|
"category": "Error",
|
||||||
"code": 6142
|
"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}'.": {
|
"Module '{0}' was resolved as locally declared ambient module in file '{1}'.": {
|
||||||
"category": "Message",
|
"category": "Message",
|
||||||
"code": 6144
|
"code": 6144
|
||||||
|
|
|
@ -1846,7 +1846,8 @@ namespace ts {
|
||||||
}
|
}
|
||||||
|
|
||||||
const isFromNodeModulesSearch = resolution.isExternalLibraryImport;
|
const isFromNodeModulesSearch = resolution.isExternalLibraryImport;
|
||||||
const isJsFileFromNodeModules = isFromNodeModulesSearch && !extensionIsTypeScript(resolution.extension);
|
const isJsFile = !extensionIsTypeScript(resolution.extension);
|
||||||
|
const isJsFileFromNodeModules = isFromNodeModulesSearch && isJsFile;
|
||||||
const resolvedFileName = resolution.resolvedFileName;
|
const resolvedFileName = resolution.resolvedFileName;
|
||||||
|
|
||||||
if (isFromNodeModulesSearch) {
|
if (isFromNodeModulesSearch) {
|
||||||
|
@ -1861,7 +1862,12 @@ namespace ts {
|
||||||
const elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModuleJsDepth;
|
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')
|
// 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.
|
// 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) {
|
if (elideImport) {
|
||||||
modulesWithElidedImports.set(file.path, true);
|
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;
|
return options.jsx ? undefined : Diagnostics.Module_0_was_resolved_to_1_but_jsx_is_not_set;
|
||||||
}
|
}
|
||||||
function needAllowJs() {
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,15 @@
|
||||||
/a.ts(1,17): error TS6142: Module './tsx' was resolved to '/tsx.tsx', but '--jsx' is not set.
|
/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(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) ====
|
==== /a.ts (2 errors) ====
|
||||||
import tsx from "./tsx";
|
import tsx from "./tsx"; // Not allowed.
|
||||||
~~~~~~~
|
~~~~~~~
|
||||||
!!! error TS6142: Module './tsx' was resolved to '/tsx.tsx', but '--jsx' is not set.
|
!!! 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.
|
!!! error TS6142: Module './jsx' was resolved to '/jsx.jsx', but '--jsx' is not set.
|
||||||
import js from "./js";
|
import js from "./js"; // OK because it's an untyped module.
|
||||||
~~~~~~
|
|
||||||
!!! error TS6143: Module './js' was resolved to '/js.js', but '--allowJs' is not set.
|
|
||||||
|
|
||||||
==== /tsx.tsx (0 errors) ====
|
==== /tsx.tsx (0 errors) ====
|
||||||
|
|
||||||
|
|
|
@ -7,9 +7,9 @@
|
||||||
//// [js.js]
|
//// [js.js]
|
||||||
|
|
||||||
//// [a.ts]
|
//// [a.ts]
|
||||||
import tsx from "./tsx";
|
import tsx from "./tsx"; // Not allowed.
|
||||||
import jsx from "./jsx";
|
import jsx from "./jsx"; // Not allowed.
|
||||||
import js from "./js";
|
import js from "./js"; // OK because it's an untyped module.
|
||||||
|
|
||||||
|
|
||||||
//// [a.js]
|
//// [a.js]
|
||||||
|
|
|
@ -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`.
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//// [tests/cases/compiler/moduleResolutionWithExtensions_notSupported3.ts] ////
|
//// [tests/cases/compiler/moduleResolutionWithExtensions_notSupported3.ts] ////
|
||||||
|
|
||||||
//// [jsx.jsx]
|
//// [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]
|
//// [a.ts]
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
=== /a.ts ===
|
||||||
|
import jsx from "./jsx";
|
||||||
|
>jsx : Symbol(jsx, Decl(a.ts, 0, 6))
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
=== /a.ts ===
|
||||||
|
import jsx from "./jsx";
|
||||||
|
>jsx : any
|
||||||
|
|
|
@ -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;
|
|
@ -0,0 +1,4 @@
|
||||||
|
=== /src/a.ts ===
|
||||||
|
import * as b from "./b";
|
||||||
|
>b : Symbol(b, Decl(a.ts, 0, 6))
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
=== /src/a.ts ===
|
||||||
|
import * as b from "./b";
|
||||||
|
>b : any
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
|
@ -8,6 +8,6 @@
|
||||||
// @Filename: /js.js
|
// @Filename: /js.js
|
||||||
|
|
||||||
// @Filename: /a.ts
|
// @Filename: /a.ts
|
||||||
import tsx from "./tsx";
|
import tsx from "./tsx"; // Not allowed.
|
||||||
import jsx from "./jsx";
|
import jsx from "./jsx"; // Not allowed.
|
||||||
import js from "./js";
|
import js from "./js"; // OK because it's an untyped module.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// @noImplicitReferences: true
|
// @noImplicitReferences: true
|
||||||
// @jsx: preserve
|
// @jsx: preserve
|
||||||
// @traceResolution: true
|
// @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
|
// @Filename: /jsx.jsx
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
// @noImplicitReferences: true
|
||||||
|
|
||||||
|
// @Filename: /src/b.js
|
||||||
|
export const x = 0;
|
||||||
|
|
||||||
|
// @Filename: /src/a.ts
|
||||||
|
import * as b from "./b";
|
|
@ -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";
|
|
@ -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";
|
|
Loading…
Reference in a new issue