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]