From 37e898cfd7abdc47407606f67432fd0242321005 Mon Sep 17 00:00:00 2001
From: Song Gao <158983297@qq.com>
Date: Mon, 7 Dec 2020 21:54:47 +0800
Subject: [PATCH] import statement from "node" in js source file could produce
correct declaration path. (#41816)
* fix #41800
* add test
* fix test
---
src/compiler/moduleNameResolver.ts | 3 +-
.../importDeclFromTypeNodeInJsSource.js | 40 +++++++++++++++++++
.../importDeclFromTypeNodeInJsSource.symbols | 35 ++++++++++++++++
.../importDeclFromTypeNodeInJsSource.types | 36 +++++++++++++++++
.../importDeclFromTypeNodeInJsSource.ts | 26 ++++++++++++
5 files changed, 139 insertions(+), 1 deletion(-)
create mode 100644 tests/baselines/reference/importDeclFromTypeNodeInJsSource.js
create mode 100644 tests/baselines/reference/importDeclFromTypeNodeInJsSource.symbols
create mode 100644 tests/baselines/reference/importDeclFromTypeNodeInJsSource.types
create mode 100644 tests/cases/compiler/importDeclFromTypeNodeInJsSource.ts
diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts
index 6329387b281..259bbafb37f 100644
--- a/src/compiler/moduleNameResolver.ts
+++ b/src/compiler/moduleNameResolver.ts
@@ -1422,7 +1422,8 @@ namespace ts {
export function getPackageNameFromTypesPackageName(mangledName: string): string {
const withoutAtTypePrefix = removePrefix(mangledName, "@types/");
if (withoutAtTypePrefix !== mangledName) {
- return unmangleScopedPackageName(withoutAtTypePrefix);
+ const withoutAtTypeNodePrefix = removePrefix(withoutAtTypePrefix, "node/");
+ return unmangleScopedPackageName(withoutAtTypeNodePrefix);
}
return mangledName;
}
diff --git a/tests/baselines/reference/importDeclFromTypeNodeInJsSource.js b/tests/baselines/reference/importDeclFromTypeNodeInJsSource.js
new file mode 100644
index 00000000000..7abc439c941
--- /dev/null
+++ b/tests/baselines/reference/importDeclFromTypeNodeInJsSource.js
@@ -0,0 +1,40 @@
+//// [tests/cases/compiler/importDeclFromTypeNodeInJsSource.ts] ////
+
+//// [index.d.ts]
+///
+//// [events.d.ts]
+declare module "events" {
+ namespace EventEmitter {
+ class EventEmitter {
+ constructor();
+ }
+ }
+ export = EventEmitter;
+}
+
+//// [b.js]
+import { EventEmitter } from 'events';
+class Foo extends EventEmitter {
+ constructor() {
+ super();
+ }
+}
+export default Foo;
+
+//// [b.js]
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const events_1 = require("events");
+class Foo extends events_1.EventEmitter {
+ constructor() {
+ super();
+ }
+}
+exports.default = Foo;
+
+
+//// [b.d.ts]
+export default Foo;
+declare class Foo extends EventEmitter {
+}
+import { EventEmitter } from "events";
diff --git a/tests/baselines/reference/importDeclFromTypeNodeInJsSource.symbols b/tests/baselines/reference/importDeclFromTypeNodeInJsSource.symbols
new file mode 100644
index 00000000000..107341d01ec
--- /dev/null
+++ b/tests/baselines/reference/importDeclFromTypeNodeInJsSource.symbols
@@ -0,0 +1,35 @@
+=== /src/node_modules/@types/node/index.d.ts ===
+///
+No type information for this code.=== /src/node_modules/@types/node/events.d.ts ===
+declare module "events" {
+>"events" : Symbol("events", Decl(events.d.ts, 0, 0))
+
+ namespace EventEmitter {
+>EventEmitter : Symbol(EventEmitter, Decl(events.d.ts, 0, 25))
+
+ class EventEmitter {
+>EventEmitter : Symbol(EventEmitter, Decl(events.d.ts, 1, 28))
+
+ constructor();
+ }
+ }
+ export = EventEmitter;
+>EventEmitter : Symbol(EventEmitter, Decl(events.d.ts, 0, 25))
+}
+
+=== /src/b.js ===
+import { EventEmitter } from 'events';
+>EventEmitter : Symbol(EventEmitter, Decl(b.js, 0, 8))
+
+class Foo extends EventEmitter {
+>Foo : Symbol(Foo, Decl(b.js, 0, 38))
+>EventEmitter : Symbol(EventEmitter, Decl(b.js, 0, 8))
+
+ constructor() {
+ super();
+>super : Symbol(EventEmitter, Decl(events.d.ts, 1, 28))
+ }
+}
+export default Foo;
+>Foo : Symbol(Foo, Decl(b.js, 0, 38))
+
diff --git a/tests/baselines/reference/importDeclFromTypeNodeInJsSource.types b/tests/baselines/reference/importDeclFromTypeNodeInJsSource.types
new file mode 100644
index 00000000000..4cdf90bb4e7
--- /dev/null
+++ b/tests/baselines/reference/importDeclFromTypeNodeInJsSource.types
@@ -0,0 +1,36 @@
+=== /src/node_modules/@types/node/index.d.ts ===
+///
+No type information for this code.=== /src/node_modules/@types/node/events.d.ts ===
+declare module "events" {
+>"events" : typeof import("events")
+
+ namespace EventEmitter {
+>EventEmitter : typeof EventEmitter
+
+ class EventEmitter {
+>EventEmitter : EventEmitter
+
+ constructor();
+ }
+ }
+ export = EventEmitter;
+>EventEmitter : typeof EventEmitter
+}
+
+=== /src/b.js ===
+import { EventEmitter } from 'events';
+>EventEmitter : typeof EventEmitter
+
+class Foo extends EventEmitter {
+>Foo : Foo
+>EventEmitter : EventEmitter
+
+ constructor() {
+ super();
+>super() : void
+>super : typeof EventEmitter
+ }
+}
+export default Foo;
+>Foo : Foo
+
diff --git a/tests/cases/compiler/importDeclFromTypeNodeInJsSource.ts b/tests/cases/compiler/importDeclFromTypeNodeInJsSource.ts
new file mode 100644
index 00000000000..040994a61d7
--- /dev/null
+++ b/tests/cases/compiler/importDeclFromTypeNodeInJsSource.ts
@@ -0,0 +1,26 @@
+// @target: esnext
+// @module: commonjs
+// @allowJs: true
+// @checkJs: true
+// @declaration: true
+// @outDir: ./dist
+// @filename: /src/node_modules/@types/node/index.d.ts
+///
+// @filename: /src/node_modules/@types/node/events.d.ts
+declare module "events" {
+ namespace EventEmitter {
+ class EventEmitter {
+ constructor();
+ }
+ }
+ export = EventEmitter;
+}
+
+// @filename: /src/b.js
+import { EventEmitter } from 'events';
+class Foo extends EventEmitter {
+ constructor() {
+ super();
+ }
+}
+export default Foo;
\ No newline at end of file