From bc18850e0533102a158adfb9ffcdc42cca454ce4 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@keylocation.sg>
Date: Sat, 23 Sep 2017 08:00:17 +0200
Subject: [PATCH] fix: use dummy time if missing from npm response (#830)

---
 lib/api/npm.js                          |  7 ++++++-
 test/api/__snapshots__/npm.spec.js.snap | 27 +++++++++++++++++++++++++
 test/api/npm.spec.js                    |  9 +++++++++
 3 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/lib/api/npm.js b/lib/api/npm.js
index 3a60f114d4..00824525db 100644
--- a/lib/api/npm.js
+++ b/lib/api/npm.js
@@ -81,7 +81,12 @@ async function getDependency(name, logger) {
     };
     Object.keys(dep.versions).forEach(version => {
       // We don't use any of the version payload currently
-      dep.versions[version] = { time: res.body.time[version] };
+      dep.versions[version] = {
+        // fall back to arbitrary time for old npm servers
+        time: res.body.time
+          ? res.body.time[version]
+          : '2017-01-01T12:00:00.000Z',
+      };
     });
     npmCache[cacheKey] = dep;
     logger.trace({ dependency: dep }, 'dependency');
diff --git a/test/api/__snapshots__/npm.spec.js.snap b/test/api/__snapshots__/npm.spec.js.snap
index 134266500f..b86e454878 100644
--- a/test/api/__snapshots__/npm.spec.js.snap
+++ b/test/api/__snapshots__/npm.spec.js.snap
@@ -139,6 +139,33 @@ Array [
 ]
 `;
 
+exports[`api/npm should use dummy time if missing 1`] = `
+Object {
+  "dist-tags": Object {
+    "latest": "0.0.1",
+  },
+  "homepage": "https://google.com",
+  "name": undefined,
+  "renovate-config": undefined,
+  "repositoryUrl": "https://google.com",
+  "versions": Object {
+    "0.0.1": Object {
+      "time": "2017-01-01T12:00:00.000Z",
+    },
+  },
+}
+`;
+
+exports[`api/npm should use dummy time if missing 2`] = `
+Array [
+  "https://registry.npmjs.org/foobar",
+  Object {
+    "headers": Object {},
+    "json": true,
+  },
+]
+`;
+
 exports[`api/npm should use homepage 1`] = `
 Object {
   "dist-tags": Object {
diff --git a/test/api/npm.spec.js b/test/api/npm.spec.js
index 9e1aeccc33..ce9132a59e 100644
--- a/test/api/npm.spec.js
+++ b/test/api/npm.spec.js
@@ -100,4 +100,13 @@ describe('api/npm', () => {
     const call = got.mock.calls[0];
     expect(call).toMatchSnapshot();
   });
+  it('should use dummy time if missing', async () => {
+    const noTimeResponse = { ...npmResponse };
+    delete noTimeResponse.body.time;
+    got.mockImplementation(() => Promise.resolve(noTimeResponse));
+    const res = await npm.getDependency('foobar', logger);
+    expect(res).toMatchSnapshot();
+    const call = got.mock.calls[0];
+    expect(call).toMatchSnapshot();
+  });
 });
-- 
GitLab