From 45f9370997ec353f81fb4312a57410e53174e156 Mon Sep 17 00:00:00 2001 From: Benjamin Lichtman Date: Fri, 1 Jun 2018 14:11:45 -0700 Subject: [PATCH 1/5] Handle installed package missing from registry --- src/services/jsTyping.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/jsTyping.ts b/src/services/jsTyping.ts index 539099510f1..ee757a0ca28 100644 --- a/src/services/jsTyping.ts +++ b/src/services/jsTyping.ts @@ -160,7 +160,7 @@ namespace ts.JsTyping { } // Add the cached typing locations for inferred typings that are already installed packageNameToTypingLocation.forEach((typing, name) => { - if (inferredTypings.has(name) && inferredTypings.get(name) === undefined && isTypingUpToDate(typing, typesRegistry.get(name)!)) { + if (inferredTypings.has(name) && inferredTypings.get(name) === undefined && typesRegistry.has(name) && isTypingUpToDate(typing, typesRegistry.get(name)!)) { inferredTypings.set(name, typing.typingLocation); } }); From e9cddd471d4c8ff40261ec1808c446272e6f6246 Mon Sep 17 00:00:00 2001 From: Benjamin Lichtman Date: Fri, 1 Jun 2018 14:21:21 -0700 Subject: [PATCH 2/5] Add test --- src/harness/unittests/typingsInstaller.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/harness/unittests/typingsInstaller.ts b/src/harness/unittests/typingsInstaller.ts index 34176e8563c..0b355d5aa89 100644 --- a/src/harness/unittests/typingsInstaller.ts +++ b/src/harness/unittests/typingsInstaller.ts @@ -1340,6 +1340,27 @@ namespace ts.projectSystem { assert.deepEqual(result.newTypingNames, ["bar"]); }); + it("should gracefully handle packages that have been removed from the types-registry", () => { + const f = { + path: "/a/b/app.js", + content: "" + }; + const node = { + path: "/a/b/node.d.ts", + content: "" + }; + const host = createServerHost([f, node]); + const cache = createMapFromTemplate({ node: { typingLocation: node.path, version: Semver.parse("1.3.0") } }); + const logger = trackingLogger(); + const result = JsTyping.discoverTypings(host, logger.log, [f.path], getDirectoryPath(f.path), emptySafeList, cache, { enable: true }, ["fs", "bar"], emptyMap); + assert.deepEqual(logger.finish(), [ + 'Inferred typings from unresolved imports: ["node","bar"]', + 'Result: {"cachedTypingPaths":[],"newTypingNames":["node","bar"],"filesToWatch":["/a/b/bower_components","/a/b/node_modules"]}', + ]); + assert.deepEqual(result.cachedTypingPaths, []); + assert.deepEqual(result.newTypingNames, ["node", "bar"]); + }); + it("should search only 2 levels deep", () => { const app = { path: "/app.js", From 34cee162ed287709e3313ed13e0a178fc67f3704 Mon Sep 17 00:00:00 2001 From: Benjamin Lichtman Date: Fri, 1 Jun 2018 15:21:22 -0700 Subject: [PATCH 3/5] Replace has with get and check undefined --- src/services/jsTyping.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/jsTyping.ts b/src/services/jsTyping.ts index ee757a0ca28..516c66688dc 100644 --- a/src/services/jsTyping.ts +++ b/src/services/jsTyping.ts @@ -160,7 +160,8 @@ namespace ts.JsTyping { } // Add the cached typing locations for inferred typings that are already installed packageNameToTypingLocation.forEach((typing, name) => { - if (inferredTypings.has(name) && inferredTypings.get(name) === undefined && typesRegistry.has(name) && isTypingUpToDate(typing, typesRegistry.get(name)!)) { + const registryEntry = typesRegistry.get(name); + if (inferredTypings.has(name) && inferredTypings.get(name) === undefined && registryEntry !== undefined && isTypingUpToDate(typing, typesRegistry.get(name)!)) { inferredTypings.set(name, typing.typingLocation); } }); From 8f14e24575d88d8804e8efca60208594ee30d42b Mon Sep 17 00:00:00 2001 From: Benjamin Lichtman Date: Fri, 1 Jun 2018 15:32:23 -0700 Subject: [PATCH 4/5] Remove second get call --- src/services/jsTyping.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/jsTyping.ts b/src/services/jsTyping.ts index 516c66688dc..21fe04562e9 100644 --- a/src/services/jsTyping.ts +++ b/src/services/jsTyping.ts @@ -161,7 +161,7 @@ namespace ts.JsTyping { // Add the cached typing locations for inferred typings that are already installed packageNameToTypingLocation.forEach((typing, name) => { const registryEntry = typesRegistry.get(name); - if (inferredTypings.has(name) && inferredTypings.get(name) === undefined && registryEntry !== undefined && isTypingUpToDate(typing, typesRegistry.get(name)!)) { + if (inferredTypings.has(name) && inferredTypings.get(name) === undefined && registryEntry !== undefined && isTypingUpToDate(typing, registryEntry!)) { inferredTypings.set(name, typing.typingLocation); } }); From c6bab0f395de0cdf9b1c1f83c8f0df93f83e9658 Mon Sep 17 00:00:00 2001 From: Benjamin Lichtman Date: Mon, 4 Jun 2018 09:20:49 -0700 Subject: [PATCH 5/5] Remove redundant null assertion --- src/services/jsTyping.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/jsTyping.ts b/src/services/jsTyping.ts index 21fe04562e9..e9c96ba2bf6 100644 --- a/src/services/jsTyping.ts +++ b/src/services/jsTyping.ts @@ -161,7 +161,7 @@ namespace ts.JsTyping { // Add the cached typing locations for inferred typings that are already installed packageNameToTypingLocation.forEach((typing, name) => { const registryEntry = typesRegistry.get(name); - if (inferredTypings.has(name) && inferredTypings.get(name) === undefined && registryEntry !== undefined && isTypingUpToDate(typing, registryEntry!)) { + if (inferredTypings.has(name) && inferredTypings.get(name) === undefined && registryEntry !== undefined && isTypingUpToDate(typing, registryEntry)) { inferredTypings.set(name, typing.typingLocation); } });