From e4e4b17669eafe18947585efb5eccec2ec29004d Mon Sep 17 00:00:00 2001 From: Andy Date: Mon, 26 Feb 2018 10:38:54 -0800 Subject: [PATCH] Improve error message for untyped import of scoped package (#22189) --- src/compiler/checker.ts | 2 +- src/compiler/moduleNameResolver.ts | 3 ++- ...dModuleImport_noImplicitAny_scoped.errors.txt | 16 ++++++++++++++++ .../untypedModuleImport_noImplicitAny_scoped.js | 15 +++++++++++++++ ...ypedModuleImport_noImplicitAny_scoped.symbols | 4 ++++ ...ntypedModuleImport_noImplicitAny_scoped.types | 4 ++++ .../untypedModuleImport_noImplicitAny_scoped.ts | 11 +++++++++++ 7 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.errors.txt create mode 100644 tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.js create mode 100644 tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.symbols create mode 100644 tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.types create mode 100644 tests/cases/conformance/moduleResolution/untypedModuleImport_noImplicitAny_scoped.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index bb7f8d013fc..2fcc924a7b8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2092,7 +2092,7 @@ namespace ts { else if (noImplicitAny && moduleNotFoundError) { let errorInfo = resolvedModule.packageId && 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, - resolvedModule.packageId.name); + getMangledNameForScopedPackage(resolvedModule.packageId.name)); errorInfo = chainDiagnosticMessages(errorInfo, Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type, moduleReference, diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 50181bb98e4..ddb0f5cbb5d 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -1157,7 +1157,8 @@ namespace ts { return `@types/${getMangledNameForScopedPackage(packageName)}`; } - function getMangledNameForScopedPackage(packageName: string): string { + /* @internal */ + export function getMangledNameForScopedPackage(packageName: string): string { if (startsWith(packageName, "@")) { const replaceSlash = packageName.replace(ts.directorySeparator, mangledScopedPackageSeparator); if (replaceSlash !== packageName) { diff --git a/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.errors.txt b/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.errors.txt new file mode 100644 index 00000000000..0500ac268db --- /dev/null +++ b/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.errors.txt @@ -0,0 +1,16 @@ +/a.ts(1,22): error TS7016: Could not find a declaration file for module '@foo/bar'. '/node_modules/@foo/bar/index.js' implicitly has an 'any' type. + Try `npm install @types/foo__bar` if it exists or add a new declaration (.d.ts) file containing `declare module 'foo__bar';` + + +==== /a.ts (1 errors) ==== + import * as foo from "@foo/bar"; + ~~~~~~~~~~ +!!! error TS7016: Could not find a declaration file for module '@foo/bar'. '/node_modules/@foo/bar/index.js' implicitly has an 'any' type. +!!! error TS7016: Try `npm install @types/foo__bar` if it exists or add a new declaration (.d.ts) file containing `declare module 'foo__bar';` + +==== /node_modules/@foo/bar/package.json (0 errors) ==== + { "name": "@foo/bar", "version": "1.2.3" } + +==== /node_modules/@foo/bar/index.js (0 errors) ==== + This file is not processed. + \ No newline at end of file diff --git a/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.js b/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.js new file mode 100644 index 00000000000..fc33d4a2665 --- /dev/null +++ b/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.js @@ -0,0 +1,15 @@ +//// [tests/cases/conformance/moduleResolution/untypedModuleImport_noImplicitAny_scoped.ts] //// + +//// [package.json] +{ "name": "@foo/bar", "version": "1.2.3" } + +//// [index.js] +This file is not processed. + +//// [a.ts] +import * as foo from "@foo/bar"; + + +//// [a.js] +"use strict"; +exports.__esModule = true; diff --git a/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.symbols b/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.symbols new file mode 100644 index 00000000000..d0c3ed4be83 --- /dev/null +++ b/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.symbols @@ -0,0 +1,4 @@ +=== /a.ts === +import * as foo from "@foo/bar"; +>foo : Symbol(foo, Decl(a.ts, 0, 6)) + diff --git a/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.types b/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.types new file mode 100644 index 00000000000..f3f3fcf9152 --- /dev/null +++ b/tests/baselines/reference/untypedModuleImport_noImplicitAny_scoped.types @@ -0,0 +1,4 @@ +=== /a.ts === +import * as foo from "@foo/bar"; +>foo : any + diff --git a/tests/cases/conformance/moduleResolution/untypedModuleImport_noImplicitAny_scoped.ts b/tests/cases/conformance/moduleResolution/untypedModuleImport_noImplicitAny_scoped.ts new file mode 100644 index 00000000000..4899c1b70ad --- /dev/null +++ b/tests/cases/conformance/moduleResolution/untypedModuleImport_noImplicitAny_scoped.ts @@ -0,0 +1,11 @@ +// @noImplicitReferences: true +// @noImplicitAny: true + +// @filename: /node_modules/@foo/bar/package.json +{ "name": "@foo/bar", "version": "1.2.3" } + +// @filename: /node_modules/@foo/bar/index.js +This file is not processed. + +// @filename: /a.ts +import * as foo from "@foo/bar";