/
factory.js
78 lines (69 loc) 路 2.49 KB
/
factory.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import path from 'path';
import { createRequire } from 'module';
import _ from 'lodash';
import _debug from 'debug';
import Version from './version/Version.js';
import Git from './git/Git.js';
import GitLab from './gitlab/GitLab.js';
import GitHub from './github/GitHub.js';
import npm from './npm/npm.js';
const requireCwd = createRequire(process.cwd());
const debug = _debug('release-it:plugins');
const pluginNames = ['npm', 'git', 'github', 'gitlab', 'version'];
const plugins = {
version: Version,
git: Git,
gitlab: GitLab,
github: GitHub,
npm: npm
};
const load = async pluginName => {
let plugin = null;
try {
const module = await import(pluginName);
plugin = module.default;
} catch (err) {
try {
const module = await import(path.join(process.cwd(), pluginName));
plugin = module.default;
} catch (err) {
// In some cases or tests we might need to support "directory imports" (legacy `require`)
const module = await import(requireCwd.resolve(path.join(process.cwd(), pluginName)));
plugin = module.default;
}
}
return [path.parse(pluginName).name, plugin];
};
export let getPlugins = async (config, container) => {
const context = config.getContext();
const disabledPlugins = [];
const enabledExternalPlugins = await _.reduce(
context.plugins,
async (result, pluginConfig, pluginName) => {
const [name, Plugin] = await load(pluginName);
const [namespace, options] = pluginConfig.length === 2 ? pluginConfig : [name, pluginConfig];
config.setContext({ [namespace]: options });
if (await Plugin.isEnabled(options)) {
const instance = new Plugin({ namespace, options: config.getContext(), container });
debug({ namespace, options: instance.options });
(await result).push(instance);
disabledPlugins.push(..._.intersection(pluginNames, _.castArray(Plugin.disablePlugin(options))));
}
return result;
},
[]
);
const enabledPlugins = await pluginNames.reduce(async (result, plugin) => {
if (plugin in plugins && !disabledPlugins.includes(plugin)) {
const Plugin = plugins[plugin];
const pluginOptions = context[plugin];
if (await Plugin.isEnabled(pluginOptions)) {
const instance = new Plugin({ namespace: plugin, options: context, container });
debug({ namespace: plugin, options: instance.options });
(await result).push(instance);
}
}
return result;
}, []);
return [enabledPlugins, enabledExternalPlugins];
};