diff --git a/index.js b/index.js
index 4853e2a..af47280 100644
--- a/index.js
+++ b/index.js
@@ -92,15 +92,16 @@
 
 function getTargetPackageSpecFromNpmInstallOutput (npmInstallOutput) {
     const lines = npmInstallOutput.split('\n');
-    if (lines[0].startsWith('+ ')) {
-        // npm >= 5
-        return lines[0].slice(2);
-    } else if (lines[1].startsWith('└─') || lines[1].startsWith('`-')) {
-        // 3 <= npm <= 4
-        return lines[1].slice(4).split(' ')[0];
-    } else {
-        throw new CordovaError('Could not determine package name from output:\n' + npmInstallOutput);
+    for (let i = 0; i < lines.length; i++) {
+        if (lines[i].startsWith('+ ')) {
+            // npm >= 5
+            return lines[i].slice(2);
+        } else if (lines[i].startsWith('└─') || lines[i].startsWith('`-')) {
+            // 3 <= npm <= 4
+            return lines[i].slice(4).split(' ')[0];
+        }
     }
+    throw new CordovaError('Could not determine package name from output:\n' + npmInstallOutput);
 }
 
 // Resolves to installation path of package defined by spec if the right version
diff --git a/spec/fetch-unit.spec.js b/spec/fetch-unit.spec.js
index e4c612f..514126e 100644
--- a/spec/fetch-unit.spec.js
+++ b/spec/fetch-unit.spec.js
@@ -78,6 +78,44 @@
     });
 });
 
+describe('getTargetPackageSpecFromNpmInstallOutput', () => {
+    const fetch = rewire('..');
+    const getTargetPackageSpecFromNpmInstallOutput = fetch.__get__('getTargetPackageSpecFromNpmInstallOutput');
+    const outputSampleNpm5 = '+ cordova-electron@1.0.0-dev';
+    const outputSampleNpm3 = 'helloworld@1.0.0 /cordova-project\n' +
+                             '└─┬ cordova-electron@1.0.0-dev  (git://github.com/apache/cordova-electron.git)';
+    const outputSampleNpm5WithPostinstall = '> electron@3.1.1 postinstall /cordova-project/node_modules/electron\n' +
+                                            '> node install.js\n\n' +
+                                            '+ cordova-electron@1.0.0-dev\n';
+    const outputSampleNpm3WithPostinstall = '> electron@3.1.1 postinstall /cordova-project/node_modules/electron\n' +
+                                            '> node install.js\n' +
+                                            'helloworld@1.0.0 /cordova-project\n' +
+                                            '└─┬ cordova-electron@1.0.0-dev  (git://github.com/apache/cordova-electron.git)';
+    const wrongOutputSample = 'Wrong output';
+
+    it('should parse the package name using  npm >= 5', () => {
+        expect(getTargetPackageSpecFromNpmInstallOutput(outputSampleNpm5)).toEqual('cordova-electron@1.0.0-dev');
+    });
+
+    it('should parse the package name using npm 3 <= npm <= 4', () => {
+        expect(getTargetPackageSpecFromNpmInstallOutput(outputSampleNpm3)).toEqual('cordova-electron@1.0.0-dev');
+    });
+
+    it('should parse the package name using npm >= 5 with postinstall ', () => {
+        expect(getTargetPackageSpecFromNpmInstallOutput(outputSampleNpm5WithPostinstall)).toEqual('cordova-electron@1.0.0-dev');
+    });
+
+    it('should parse the package name using npm 3 <= npm <= 4 with postinstall', () => {
+        expect(getTargetPackageSpecFromNpmInstallOutput(outputSampleNpm3WithPostinstall)).toEqual('cordova-electron@1.0.0-dev');
+    });
+
+    it('should gracefully handle if could not determine the package name from output', () => {
+        expect(() => {
+            getTargetPackageSpecFromNpmInstallOutput(wrongOutputSample);
+        }).toThrow(new Error('Could not determine package name from output:\n' + wrongOutputSample));
+    });
+});
+
 describe('resolvePathToPackage', () => {
     let tmpDir, resolvePathToPackage, expectedPath, NODE_PATH;
 
