Skip to content

Commit d747dc9

Browse files
committed
CB-13123 : plugin add/ install should use cordovaDependency instead of plugin.xml engine tag
1 parent e8fec25 commit d747dc9

File tree

2 files changed

+107
-24
lines changed

2 files changed

+107
-24
lines changed

Diff for: spec/plugman/install.spec.js

+67-5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ var events = require('cordova-common').events;
2727
var plugman = require('../../src/plugman/plugman');
2828
var platforms = require('../../src/plugman/platforms/common');
2929
var knownPlatforms = require('../../src/platforms/platforms');
30+
var cordovaUtil = require('../../src/cordova/util');
3031
var common = require('../common');
3132
var fs = require('fs');
3233
var os = require('os');
@@ -287,15 +288,12 @@ describe('install', function () {
287288
.fin(function () {
288289
var plugmanVersion = require('../../package.json').version.replace(/-dev|-nightly.*$/, '');
289290
var cordovaVersion = require('../../package.json').version.replace(/-dev|-nightly.*$/, '');
290-
expect(satisfies.calls.count()).toBe(4);
291+
// var megaFun = require('../../package.json').version.replace(/-dev|-nightly.*$/, '');
292+
expect(satisfies.calls.count()).toBe(2);
291293
// <engine name="cordova" version=">=2.3.0"/>
292294
expect(satisfies.calls.argsFor(0)).toEqual([ cordovaVersion, '>=2.3.0', true ]);
293295
// <engine name="cordova-plugman" version=">=0.10.0" />
294296
expect(satisfies.calls.argsFor(1)).toEqual([ plugmanVersion, '>=0.10.0', true ]);
295-
// <engine name="mega-fun-plugin" version=">=1.0.0" scriptSrc="megaFunVersion" platform="*" />
296-
expect(satisfies.calls.argsFor(2)).toEqual([ null, '>=1.0.0', true ]);
297-
// <engine name="mega-boring-plugin" version=">=3.0.0" scriptSrc="megaBoringVersion" platform="ios|android" />
298-
expect(satisfies.calls.argsFor(3)).toEqual([ null, '>=3.0.0', true ]);
299297
done();
300298
});
301299
}, TIMEOUT);
@@ -543,3 +541,67 @@ describe('end', function () {
543541
shell.rm('-rf', temp_dir);
544542
}, TIMEOUT);
545543
});
544+
545+
describe('unit tests for checkEngines', function () {
546+
var fail;
547+
var engine = [ { platform: 'android',
548+
minVersion: '>=3.6.0',
549+
currentVersion: '6.2.3' } ];
550+
beforeEach(function () {
551+
spyOn(semver, 'satisfies');
552+
});
553+
554+
it('checkEngines should return true', function () {
555+
spyOn(fs, 'existsSync').and.returnValue(false);
556+
semver.satisfies.and.returnValue(true);
557+
install.checkEngines(engine, 'pluginDir')
558+
.then(function (res) {
559+
expect(res).toBe(true);
560+
}).fail(function err (errMsg) {
561+
fail('fail handler unexpectedly invoked');
562+
console.error(errMsg);
563+
});
564+
});
565+
566+
it('checkEngines should check cordovaDependencies', function () {
567+
var pkgJson = { engines: { cordovaDependencies: { '9.0.0': [Object], '2.0.0': [Object] } } };
568+
spyOn(fs, 'existsSync').and.returnValue(true);
569+
spyOn(cordovaUtil, 'requireNoCache').and.returnValue(pkgJson);
570+
semver.satisfies.and.callThrough();
571+
install.checkEngines(engine, 'pluginDir')
572+
.then(function (res) {
573+
expect(res).toBe(true);
574+
expect(semver.satisfies).toHaveBeenCalledWith('6.2.3', '>=3.6.0', true);
575+
}).fail(function err (errMsg) {
576+
fail('fail handler unexpectedly invoked');
577+
console.error(errMsg);
578+
});
579+
});
580+
581+
it('checkEngines should check if plugin version is supported', function () {
582+
spyOn(fs, 'existsSync').and.returnValue(true);
583+
spyOn(cordovaUtil, 'requireNoCache').and.returnValue(true);
584+
semver.satisfies.and.callThrough();
585+
install.checkEngines(engine, 'pluginDir')
586+
.then(function (res) {
587+
expect(res).toBe(true);
588+
expect(semver.satisfies).toHaveBeenCalledWith('6.2.3', '>=3.6.0', true);
589+
}).fail(function err (errMsg) {
590+
fail('fail handler unexpectedly invoked');
591+
console.error(errMsg);
592+
});
593+
});
594+
595+
it('checkEngines should warn if plugin is not supported', function () {
596+
spyOn(events, 'emit');
597+
spyOn(Q, 'reject').and.callThrough();
598+
semver.satisfies.and.returnValue(false);
599+
install.checkEngines(engine, 'pluginDir')
600+
.then(function (res) {
601+
fail('success handler unexpectedly invoked');
602+
}).fail(function err (errMsg) {
603+
expect(errMsg).toBe('skip');
604+
expect(events.emit).toHaveBeenCalledWith('warn', jasmine.stringMatching(/failed version requirement/));
605+
});
606+
});
607+
});

Diff for: src/plugman/install.js

+40-19
Original file line numberDiff line numberDiff line change
@@ -100,33 +100,54 @@ function possiblyFetch (id, plugins_dir, options) {
100100
return require('./plugman').fetch(id, plugins_dir, opts);
101101
}
102102

103-
function checkEngines (engines) {
103+
function checkEngines (engines, plugin_dir) {
104+
var plugin_pkgJson_path = path.join(plugin_dir, 'package.json');
105+
var plugin_pkgJson;
106+
107+
if (fs.existsSync(plugin_pkgJson_path)) {
108+
plugin_pkgJson = cordovaUtil.requireNoCache(plugin_pkgJson_path);
109+
}
104110

105111
for (var i = 0; i < engines.length; i++) {
106112
var engine = engines[i];
107-
108-
// This is a hack to allow plugins with <engine> tag to be installed with
109-
// engine with '-dev' or '-nightly' suffixes. It is required due to new semver range logic,
110-
// introduced in [email protected]. For more details see https://github.com/npm/node-semver#prerelease-tags.
111-
//
112-
// This may lead to false-positive checks, when engine version with dropped
113-
// suffix is equal to one of range bounds, for example: 5.1.0-dev >= 5.1.0.
114-
// However this shouldn't be a problem, because this only should happen in dev workflow.
115-
engine.currentVersion = engine.currentVersion && engine.currentVersion.replace(/-dev|-nightly.*$/, '');
116-
if (semver.satisfies(engine.currentVersion, engine.minVersion, /* loose= */true) || engine.currentVersion === null) {
117-
continue; // engine ok!
118-
} else {
119-
var msg = 'Plugin doesn\'t support this project\'s ' + engine.name + ' version. ' +
120-
engine.name + ': ' + engine.currentVersion +
121-
', failed version requirement: ' + engine.minVersion;
122-
events.emit('warn', msg);
123-
return Q.reject('skip');
113+
if (engine && engine.currentVersion) {
114+
if (plugin_pkgJson && plugin_pkgJson.engines && plugin_pkgJson.engines.cordovaDependencies) {
115+
for (var key in plugin_pkgJson.engines.cordovaDependencies) {
116+
if (plugin_pkgJson.engines.cordovaDependencies.hasOwnProperty(key)) {
117+
if (((key < engine.currentVersion) || (key === engine.currentVersion)) && (plugin_pkgJson.engines.cordovaDependencies[key])) {
118+
var plugin_pkgJson_min = plugin_pkgJson.engines.cordovaDependencies[key];
119+
if (plugin_pkgJson_min[engine.name]) {
120+
engine.minVersion = plugin_pkgJson_min[engine.name];
121+
}
122+
}
123+
}
124+
}
125+
// This is a hack to allow plugins with <engine> tag to be installed with
126+
// engine with '-dev' or '-nightly' suffixes. It is required due to new semver range logic,
127+
// introduced in [email protected]. For more details see https://github.com/npm/node-semver#prerelease-tags.
128+
//
129+
// This may lead to false-positive checks, when engine version with dropped
130+
// suffix is equal to one of range bounds, for example: 5.1.0-dev >= 5.1.0.
131+
// However this shouldn't be a problem, because this only should happen in dev workflow.
132+
}
133+
engine.currentVersion = engine.currentVersion && engine.currentVersion.replace(/-dev|-nightly.*$/, '');
134+
if (semver.satisfies(engine.currentVersion, engine.minVersion, /* loose= */true) || engine.currentVersion === null) {
135+
continue; // engine ok!
136+
} else {
137+
var msg = 'Plugin doesn\'t support this project\'s ' + engine.name + ' version. ' +
138+
engine.name + ': ' + engine.currentVersion +
139+
', failed version requirement: ' + engine.minVersion;
140+
events.emit('warn', msg);
141+
return Q.reject('skip');
142+
}
124143
}
125144
}
126145

127146
return Q(true);
128147
}
129148

149+
module.exports.checkEngines = checkEngines;
150+
130151
function cleanVersionOutput (version, name) {
131152
var out = version.trim();
132153
var rc_index = out.indexOf('rc');
@@ -310,7 +331,7 @@ function runInstall (actions, platform, project_dir, plugin_dir, plugins_dir, op
310331
options.platformVersion = platformVersion;
311332
return callEngineScripts(theEngines, path.resolve(plugins_dir, '..'));
312333
}).then(function (engines) {
313-
return checkEngines(engines);
334+
return module.exports.checkEngines(engines, plugin_dir);
314335
}).then(function () {
315336
filtered_variables = variableMerge.mergeVariables(plugin_dir, platform, options);
316337
install.filtered_variables = filtered_variables;

0 commit comments

Comments
 (0)