feat: Expect plugins to return Promises

BREAKING CHANGE: Each plugin is expected to return an async function or a Promise returning function. The callback parameter is not passed to plugins anymore.
This commit is contained in:
Pierre Vanduynslager
2017-11-24 21:56:15 -05:00
parent d4c7605f68
commit 5bec59b26b
9 changed files with 37 additions and 60 deletions
+6 -19
View File
@@ -1,21 +1,8 @@
module.exports = {
verifyConditions(config, options, cb) {
cb();
},
getLastRelease(config, options, cb) {
cb();
},
analyzeCommits(config, options, cb) {
cb();
},
verifyRelease(config, options, cb) {
cb();
},
generateNotes(config, options, cb) {
cb();
},
publish(config, options, cb) {
cb();
},
verifyConditions: () => {},
getLastRelease: () => {},
analyzeCommits: () => {},
verifyRelease: () => {},
generateNotes: () => {},
publish: () => {},
};
+2 -2
View File
@@ -9,6 +9,6 @@ class InheritedError extends SemanticReleaseError {
}
}
module.exports = function(config, options, cb) {
cb(new InheritedError('Inherited error', 'EINHERITED'));
module.exports = () => {
throw new InheritedError('Inherited error', 'EINHERITED');
};
+2 -2
View File
@@ -1,5 +1,5 @@
module.exports = function(config, options, cb) {
module.exports = () => {
const error = new Error('a');
error.errorProperty = 'errorProperty';
cb(error);
throw error;
};
+1 -3
View File
@@ -1,3 +1 @@
module.exports = (config, options, cb) => {
cb(null);
};
module.exports = () => {};
+1 -3
View File
@@ -1,3 +1 @@
module.exports = function(pluginConfig, options, cb) {
cb(null, {pluginConfig, options});
};
module.exports = (pluginConfig, options) => ({pluginConfig, options});
+18 -19
View File
@@ -1,4 +1,3 @@
import {callbackify} from 'util';
import test from 'ava';
import {writeJson} from 'fs-extra';
import proxyquire from 'proxyquire';
@@ -57,12 +56,12 @@ test.serial('Plugins are called with expected values', async t => {
const options = {
branch: 'master',
verifyConditions: [callbackify(verifyConditions1), callbackify(verifyConditions2)],
getLastRelease: callbackify(getLastRelease),
analyzeCommits: callbackify(analyzeCommits),
verifyRelease: callbackify(verifyRelease),
generateNotes: callbackify(generateNotes),
publish: callbackify(publish),
verifyConditions: [verifyConditions1, verifyConditions2],
getLastRelease,
analyzeCommits,
verifyRelease,
generateNotes,
publish,
};
const pkg = {name, version: '0.0.0-dev'};
normalizeData(pkg);
@@ -140,12 +139,12 @@ test.serial('Use new gitHead, and recreate release notes if a publish plugin cre
const options = {
branch: 'master',
verifyConditions: callbackify(stub().resolves()),
getLastRelease: callbackify(stub().resolves(lastRelease)),
analyzeCommits: callbackify(stub().resolves(nextRelease.type)),
verifyRelease: callbackify(stub().resolves()),
generateNotes: callbackify(generateNotes),
publish: [callbackify(publish1), callbackify(publish2)],
verifyConditions: stub().resolves(),
getLastRelease: stub().resolves(lastRelease),
analyzeCommits: stub().resolves(nextRelease.type),
verifyRelease: stub().resolves(),
generateNotes,
publish: [publish1, publish2],
};
await writeJson('./package.json', {});
@@ -188,12 +187,12 @@ test.serial('Dry-run skips verifyConditions and publish', async t => {
const options = {
dryRun: true,
branch: 'master',
verifyConditions: callbackify(verifyConditions),
getLastRelease: callbackify(getLastRelease),
analyzeCommits: callbackify(analyzeCommits),
verifyRelease: callbackify(verifyRelease),
generateNotes: callbackify(generateNotes),
publish: callbackify(publish),
verifyConditions,
getLastRelease,
analyzeCommits,
verifyRelease,
generateNotes,
publish,
};
const pkg = {name, version: '0.0.0-dev'};
normalizeData(pkg);
+4 -7
View File
@@ -1,4 +1,3 @@
import {callbackify} from 'util';
import test from 'ava';
import {noop} from 'lodash';
import {stub, match} from 'sinon';
@@ -39,7 +38,7 @@ test('Normalize and load plugin that retuns multiple functions', t => {
test('Wrap plugin in a function that validate the output of the plugin', async t => {
const pluginFunction = stub().resolves(1);
const plugin = normalize('', callbackify(pluginFunction), t.context.logger, {
const plugin = normalize('', pluginFunction, t.context.logger, {
validator: output => output === 1,
message: 'The output must be 1',
});
@@ -53,7 +52,7 @@ test('Wrap plugin in a function that validate the output of the plugin', async t
test('Plugin is called with "pluginConfig" (omitting "path") and input', async t => {
const pluginFunction = stub().resolves();
const conf = {path: callbackify(pluginFunction), conf: 'confValue'};
const conf = {path: pluginFunction, conf: 'confValue'};
const plugin = normalize('', conf, t.context.logger);
await plugin('param');
@@ -61,9 +60,8 @@ test('Plugin is called with "pluginConfig" (omitting "path") and input', async t
});
test('Prevent plugins to modify "pluginConfig"', async t => {
const pluginFunction = stub().callsFake((pluginConfig, options, cb) => {
const pluginFunction = stub().callsFake(pluginConfig => {
pluginConfig.conf.subConf = 'otherConf';
cb();
});
const conf = {path: pluginFunction, conf: {subConf: 'originalConf'}};
const plugin = normalize('', conf, t.context.logger);
@@ -73,9 +71,8 @@ test('Prevent plugins to modify "pluginConfig"', async t => {
});
test('Prevent plugins to modify its input', async t => {
const pluginFunction = stub().callsFake((pluginConfig, options, cb) => {
const pluginFunction = stub().callsFake((pluginConfig, options) => {
options.param.subParam = 'otherParam';
cb();
});
const input = {param: {subParam: 'originalSubParam'}};
const plugin = normalize('', pluginFunction, t.context.logger);