This is an automated email from the ASF dual-hosted git repository.

erisu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cordova-electron.git


The following commit(s) were added to refs/heads/master by this push:
     new 8b51fc3  chore: configure app rel dependencies as abs paths (#125)
8b51fc3 is described below

commit 8b51fc309b844ba2e784bfd1b2c24de37ad8a6fe
Author: エリス <[email protected]>
AuthorDate: Tue Jan 21 09:12:46 2020 +0900

    chore: configure app rel dependencies as abs paths (#125)
---
 bin/templates/cordova/lib/PackageJsonParser.js     | 29 +++++++-
 bin/templates/cordova/lib/prepare.js               |  2 +-
 .../cordova/lib/PackageJsonParser.spec.js          | 81 ++++++++++++++++++----
 3 files changed, 96 insertions(+), 16 deletions(-)

diff --git a/bin/templates/cordova/lib/PackageJsonParser.js 
b/bin/templates/cordova/lib/PackageJsonParser.js
index cd4fba1..336692b 100644
--- a/bin/templates/cordova/lib/PackageJsonParser.js
+++ b/bin/templates/cordova/lib/PackageJsonParser.js
@@ -22,9 +22,10 @@ const path = require('path');
 const { events } = require('cordova-common');
 
 class PackageJsonParser {
-    constructor (wwwDir) {
+    constructor (wwwDir, projectRootDir) {
         this.path = path.join(wwwDir, 'package.json');
         this.www = wwwDir;
+        this.projectRootDir = projectRootDir;
         this.package = {
             main: 'cdv-electron-main.js'
         };
@@ -38,8 +39,26 @@ class PackageJsonParser {
             this.package.description = config.description() || 'A sample 
Apache Cordova application that responds to the deviceready event.';
 
             if (projectPackageJson.dependencies) {
-                const cordovaDependencies = 
Object.keys(projectPackageJson.dependencies)
-                    .filter((npmPackage) => 
/^cordova(?!-plugin)-/.test(npmPackage));
+                const cordovaDependencies = [];
+                const droppedPackages = [];
+
+                for (const [npmPackage, npmPackageValue] of 
Object.entries(projectPackageJson.dependencies)) {
+                    if (/^cordova(?!-plugin)-/.test(npmPackage)) {
+                        cordovaDependencies.push(npmPackage);
+                    }
+
+                    // Format FilePath Based Dependencies
+                    if (npmPackageValue.startsWith('file:..')) {
+                        const relativePath = npmPackageValue.split('file:')[1];
+                        const absolutePath = path.resolve(this.projectRootDir, 
relativePath);
+
+                        if (fs.pathExistsSync(absolutePath)) {
+                            projectPackageJson.dependencies[npmPackage] = 
`file:${absolutePath}`;
+                        } else {
+                            droppedPackages.push(npmPackage);
+                        }
+                    }
+                }
 
                 // If Cordova dependencies are detected in "dependencies" of 
"package.json" warn for potential app package bloating
                 if (cordovaDependencies.length) {
@@ -53,6 +72,10 @@ Packages defined as a dependency will be bundled with the 
application and can in
 `);
                 }
 
+                if (droppedPackages.length) {
+                    events.emit('warn', `[Cordova Electron] The following 
local npm dependencies could not be located and will not be deployed to the 
Electron app:\n\t${droppedPackages.join('\n\t- ')}`);
+                }
+
                 this.package.dependencies = projectPackageJson.dependencies;
             }
 
diff --git a/bin/templates/cordova/lib/prepare.js 
b/bin/templates/cordova/lib/prepare.js
index 5be77ea..0babddf 100644
--- a/bin/templates/cordova/lib/prepare.js
+++ b/bin/templates/cordova/lib/prepare.js
@@ -74,7 +74,7 @@ module.exports.prepare = function (cordovaProject, options) {
 
     const projectPackageJson = 
JSON.parse(fs.readFileSync(path.join(cordovaProject.root, 'package.json'), 
'utf8'));
 
-    (new PackageJsonParser(this.locations.www))
+    (new PackageJsonParser(this.locations.www, cordovaProject.root))
         .configure(this.config, projectPackageJson)
         .write();
 
diff --git a/tests/spec/unit/templates/cordova/lib/PackageJsonParser.spec.js 
b/tests/spec/unit/templates/cordova/lib/PackageJsonParser.spec.js
index a823c1a..f85360f 100644
--- a/tests/spec/unit/templates/cordova/lib/PackageJsonParser.spec.js
+++ b/tests/spec/unit/templates/cordova/lib/PackageJsonParser.spec.js
@@ -18,6 +18,7 @@
 */
 
 const path = require('path');
+const fs = require('fs-extra');
 const rewire = require('rewire');
 
 const PackageJsonParser = 
rewire('../../../../../../bin/templates/cordova/lib/PackageJsonParser');
@@ -66,7 +67,7 @@ describe('PackageJsonParser class', () => {
     });
 
     it('should set initial value correctly.', () => {
-        packageJsonParser = new PackageJsonParser(locations.www);
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project');
 
         // mock package JSON Object
         const packageJsonObj = { main: 'cdv-electron-main.js' };
@@ -77,7 +78,8 @@ describe('PackageJsonParser class', () => {
     });
 
     it('should return when config xml is not defined.', () => {
-        packageJsonParser = new 
PackageJsonParser(locations.www).configure(undefined);
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project')
+            .configure(undefined);
 
         // mock package JSON Object
         const packageJsonObj = { main: 'cdv-electron-main.js' };
@@ -86,7 +88,8 @@ describe('PackageJsonParser class', () => {
     });
 
     it('should set package json object values to default, when config xml is 
empty.', () => {
-        packageJsonParser = new 
PackageJsonParser(locations.www).configure(cfgEmpty, 
defaultMockProjectPackageJson);
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project')
+            .configure(cfgEmpty, defaultMockProjectPackageJson);
 
         // mock package JSON Object
         const packageJsonObj = {
@@ -108,7 +111,8 @@ describe('PackageJsonParser class', () => {
     });
 
     it('should read and set package json object values from config xml.', () 
=> {
-        packageJsonParser = new 
PackageJsonParser(locations.www).configure(cfg, defaultMockProjectPackageJson);
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project')
+            .configure(cfg, defaultMockProjectPackageJson);
 
         // mock package JSON Object
         const packageJsonObj = {
@@ -129,8 +133,9 @@ describe('PackageJsonParser class', () => {
         expect(packageJsonParser.package).toEqual(packageJsonObj.package);
     });
 
-    it('should warn that cordova-electron is defined as dependency.', () => {
-        packageJsonParser = new 
PackageJsonParser(locations.www).configure(cfg, defaultMockProjectPackageJson);
+    it('should warn when "cordova-*" prefixed dependency is defined in 
package.json dependencies.', () => {
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project')
+            .configure(cfg, defaultMockProjectPackageJson);
 
         expect(emitSpy).toHaveBeenCalled();
 
@@ -144,23 +149,71 @@ describe('PackageJsonParser class', () => {
         expect(actual).toContain('cordova-electron');
     });
 
-    it('should not warn that cordova-electron is defined as dev dependency.', 
() => {
-        // Fix defaultMockProjectPackageJson where cordova-* is devDependency
+    it('should not warn when "cordova-*" prefixed dependency is not defined in 
package.json dependencies.', () => {
         const mockProjectPackageJson = Object.assign({}, 
defaultMockProjectPackageJson);
         mockProjectPackageJson.devDependencies = Object.assign({}, 
defaultMockProjectPackageJson.dependencies);
+        mockProjectPackageJson.dependencies = { foobar: '1.0.0' }; // setting 
a non "cordova-" dependency
+
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project')
+            .configure(cfg, mockProjectPackageJson);
+
+        expect(emitSpy).not.toHaveBeenCalled();
+    });
+
+    it('should skip configuring the Electron app\'s dependencies when the 
Cordova project\'s package.json dependencies are not set.', () => {
+        const mockProjectPackageJson = Object.assign({}, 
defaultMockProjectPackageJson);
         mockProjectPackageJson.dependencies = {};
 
-        packageJsonParser = new 
PackageJsonParser(locations.www).configure(cfg, mockProjectPackageJson);
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project')
+            .configure(cfg, mockProjectPackageJson);
+
+        expect(emitSpy).not.toHaveBeenCalled();
+    });
+
+    it('should skip preparing npm packages that already contain absolute 
paths.', () => {
+        const mockProjectPackageJson = Object.assign({}, 
defaultMockProjectPackageJson);
+        mockProjectPackageJson.dependencies = { foobar: 
'file:/tmp/foobar.tar.gz' };
+
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project')
+            .configure(cfg, mockProjectPackageJson);
+
+        expect(emitSpy).not.toHaveBeenCalled();
+    });
+
+    it('should convert npm packages that contain relative path to be absolute 
paths.', () => {
+        const mockProjectPackageJson = Object.assign({}, 
defaultMockProjectPackageJson);
+        mockProjectPackageJson.dependencies = { foobar: 
'file:../tmp/foobar.tar.gz' };
+
+        spyOn(fs, 'pathExistsSync').and.returnValue(true);
+
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project', '/root/project')
+            .configure(cfg, mockProjectPackageJson);
 
         expect(emitSpy).not.toHaveBeenCalled();
     });
 
+    it('should warn that an npm packages will be dropped when the absolute 
path could not be found.', () => {
+        const mockProjectPackageJson = Object.assign({}, 
defaultMockProjectPackageJson);
+        mockProjectPackageJson.dependencies = { foobar: 
'file:../tmp/foobar.tar.gz' };
+
+        spyOn(fs, 'pathExistsSync').and.returnValue(false);
+
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project', '/root/project')
+            .configure(cfg, mockProjectPackageJson);
+
+        const actual = emitSpy.calls.argsFor(0)[1];
+        const expectedPartial = '[Cordova Electron] The following local npm 
dependencies could not be located and will not be deployed to the Electron 
app:';
+        expect(actual).toContain(expectedPartial);
+        expect(actual).toContain('foobar');
+    });
+
     it('should not set package dependencies when project dependencies is 
missing.', () => {
         const mockProjectPackageJson = Object.assign({}, 
defaultMockProjectPackageJson);
         mockProjectPackageJson.devDependencies = Object.assign({}, 
defaultMockProjectPackageJson.dependencies);
         delete mockProjectPackageJson.dependencies;
 
-        packageJsonParser = new 
PackageJsonParser(locations.www).configure(cfg, mockProjectPackageJson);
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project')
+            .configure(cfg, mockProjectPackageJson);
 
         expect(emitSpy).not.toHaveBeenCalled();
         expect(packageJsonParser.package.dependencies).not.toBeDefined();
@@ -170,7 +223,9 @@ describe('PackageJsonParser class', () => {
         const writeFileSyncSpy = jasmine.createSpy('writeFileSync');
         packageJsonParser.__set__('fs', { writeFileSync: writeFileSyncSpy });
 
-        packageJsonParser = new 
PackageJsonParser(locations.www).configure(cfgEmpty, 
defaultMockProjectPackageJson).write();
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project')
+            .configure(cfgEmpty, defaultMockProjectPackageJson)
+            .write();
 
         expect(writeFileSyncSpy).toHaveBeenCalled();
 
@@ -209,7 +264,9 @@ describe('PackageJsonParser class', () => {
         const writeFileSyncSpy = jasmine.createSpy('writeFileSync');
         packageJsonParser.__set__('fs', { writeFileSync: writeFileSyncSpy });
 
-        packageJsonParser = new 
PackageJsonParser(locations.www).configure(cfg, 
defaultMockProjectPackageJson).write();
+        packageJsonParser = new PackageJsonParser(locations.www, 
'/root/project')
+            .configure(cfg, defaultMockProjectPackageJson)
+            .write();
 
         expect(writeFileSyncSpy).toHaveBeenCalled();
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to