Skip to content

fix: platform & plugin prerelease package support #935

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions spec/plugman/install.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,59 +160,59 @@ describe('plugman/install', () => {
execaSpy.and.returnValue(Promise.resolve({ stdout: '2.5.0' }));
return install('android', project, pluginDir('com.cordova.engine'))
.then(() => {
expect(satisfies).toHaveBeenCalledWith('2.5.0', '>=1.0.0', true);
expect(satisfies).toHaveBeenCalledWith('2.5.0', '>=1.0.0', { loose: true, includePrerelease: true });
});
}, TIMEOUT);
it('Test 008 : should check version and munge it a little if it has "rc" in it so it plays nice with semver (introduce a dash in it)', () => {
execaSpy.and.returnValue(Promise.resolve({ stdout: '3.0.0rc1' }));
return install('android', project, pluginDir('com.cordova.engine'))
.then(() => {
expect(satisfies).toHaveBeenCalledWith('3.0.0-rc1', '>=1.0.0', true);
expect(satisfies).toHaveBeenCalledWith('3.0.0-rc1', '>=1.0.0', { loose: true, includePrerelease: true });
});
}, TIMEOUT);
it('Test 009 : should check specific platform version over cordova version if specified', () => {
execaSpy.and.returnValue(Promise.resolve({ stdout: '3.1.0' }));
return install('android', project, pluginDir('com.cordova.engine-android'))
.then(() => {
expect(satisfies).toHaveBeenCalledWith('3.1.0', '>=3.1.0', true);
expect(satisfies).toHaveBeenCalledWith('3.1.0', '>=3.1.0', { loose: true, includePrerelease: true });
});
}, TIMEOUT);
it('Test 010 : should check platform sdk version if specified', () => {
const cordovaVersion = require('../../package.json').version.replace(/-dev|-nightly.*$/, '');
const cordovaVersion = require('../../package.json').version;
execaSpy.and.returnValue(Promise.resolve({ stdout: '18' }));
return install('android', project, pluginDir('com.cordova.engine-android'))
.then(() => {
expect(satisfies.calls.count()).toBe(3);
// <engine name="cordova" VERSION=">=3.0.0"/>
expect(satisfies.calls.argsFor(0)).toEqual([cordovaVersion, '>=3.0.0', true]);
expect(satisfies.calls.argsFor(0)).toEqual([cordovaVersion, '>=3.0.0', { loose: true, includePrerelease: true }]);
// <engine name="cordova-android" VERSION=">=3.1.0"/>
expect(satisfies.calls.argsFor(1)).toEqual(['18.0.0', '>=3.1.0', true]);
expect(satisfies.calls.argsFor(1)).toEqual(['18.0.0', '>=3.1.0', { loose: true, includePrerelease: true }]);
// <engine name="android-sdk" VERSION=">=18"/>
expect(satisfies.calls.argsFor(2)).toEqual(['18.0.0', '>=18', true]);
expect(satisfies.calls.argsFor(2)).toEqual(['18.0.0', '>=18', { loose: true, includePrerelease: true }]);
});
}, TIMEOUT);
it('Test 011 : should check engine versions', () => {
return install('android', project, pluginDir('com.cordova.engine'))
.then(() => {
const plugmanVersion = require('../../package.json').version.replace(/-dev|-nightly.*$/, '');
const cordovaVersion = require('../../package.json').version.replace(/-dev|-nightly.*$/, '');
const plugmanVersion = require('../../package.json').version;
const cordovaVersion = require('../../package.json').version;
expect(satisfies.calls.count()).toBe(4);
// <engine name="cordova" version=">=2.3.0"/>
expect(satisfies.calls.argsFor(0)).toEqual([cordovaVersion, '>=2.3.0', true]);
expect(satisfies.calls.argsFor(0)).toEqual([cordovaVersion, '>=2.3.0', { loose: true, includePrerelease: true }]);
// <engine name="cordova-plugman" version=">=0.10.0" />
expect(satisfies.calls.argsFor(1)).toEqual([plugmanVersion, '>=0.10.0', true]);
expect(satisfies.calls.argsFor(1)).toEqual([plugmanVersion, '>=0.10.0', { loose: true, includePrerelease: true }]);
// <engine name="mega-fun-plugin" version=">=1.0.0" scriptSrc="megaFunVersion" platform="*" />
expect(satisfies.calls.argsFor(2)).toEqual([null, '>=1.0.0', true]);
expect(satisfies.calls.argsFor(2)).toEqual([null, '>=1.0.0', { loose: true, includePrerelease: true }]);
// <engine name="mega-boring-plugin" version=">=3.0.0" scriptSrc="megaBoringVersion" platform="ios|android" />
expect(satisfies.calls.argsFor(3)).toEqual([null, '>=3.0.0', true]);
expect(satisfies.calls.argsFor(3)).toEqual([null, '>=3.0.0', { loose: true, includePrerelease: true }]);
});
}, TIMEOUT);
it('Test 012 : should not check custom engine version that is not supported for platform', () => {
return install('blackberry10', project, pluginDir('com.cordova.engine'))
.then(() => {
// Version >=3.0.0 of `mega-boring-plugin` is specified with platform="ios|android"
expect(satisfies.calls.count()).toBe(3);
expect(satisfies).not.toHaveBeenCalledWith(jasmine.anything(), '>=3.0.0', true);
expect(satisfies).not.toHaveBeenCalledWith(jasmine.anything(), '>=3.0.0', { loose: true, includePrerelease: true });
});
}, TIMEOUT);
});
Expand Down
8 changes: 3 additions & 5 deletions src/cordova/platform/addHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,9 @@ function addHelper (cmd, hooksRunner, projectRoot, targets, opts) {
}
}

if (/-nightly|-dev$/.exec(platDetails.version)) {
msg = 'Warning: using prerelease platform ' + platform +
'@' + platDetails.version +
'.\nUse \'cordova platform add ' +
platform + '@latest\' to add the latest published version instead.';
if (semver.prerelease(platDetails.version)) {
msg = `Warning: using prerelease platform ${platform}@${platDetails.version}.`;
msg += `\nUse 'cordova platform add ${platform}@latest to add the latest published version instead.`;
events.emit('warn', msg);
}

Expand Down
18 changes: 4 additions & 14 deletions src/plugman/install.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,22 +99,12 @@ function possiblyFetch (id, plugins_dir, options) {

function checkEngines (engines) {
for (let i = 0; i < engines.length; i++) {
const engine = engines[i];

// This is a hack to allow plugins with <engine> tag to be installed with
// engine with '-dev' or '-nightly' suffixes. It is required due to new semver range logic,
// introduced in [email protected]. For more details see https://github.com/npm/node-semver#prerelease-tags.
//
// This may lead to false-positive checks, when engine version with dropped
// suffix is equal to one of range bounds, for example: 5.1.0-dev >= 5.1.0.
// However this shouldn't be a problem, because this only should happen in dev workflow.
engine.currentVersion = engine.currentVersion && engine.currentVersion.replace(/-dev|-nightly.*$/, '');
if (semver.satisfies(engine.currentVersion, engine.minVersion, /* loose= */true) || engine.currentVersion === null) {
const { currentVersion, minVersion, name } = engines[i];

if (semver.satisfies(currentVersion, minVersion, { loose: true, includePrerelease: true }) || currentVersion === null) {
continue; // engine ok!
} else {
const msg = 'Plugin doesn\'t support this project\'s ' + engine.name + ' version. ' +
engine.name + ': ' + engine.currentVersion +
', failed version requirement: ' + engine.minVersion;
const msg = `Plugin doesn't support this project's ${name} version. ${name}: ${currentVersion}, failed version requirement: ${minVersion}`;
events.emit('warn', msg);
return Promise.reject(Object.assign(new Error(), { skip: true }));
}
Expand Down