1 | const {readFileSync, writeFileSync} = require('fs');
|
2 | const _ = require('lodash');
|
3 | const pify = require('pify');
|
4 | const nopt = require('nopt');
|
5 | const npm = require('npm');
|
6 | const request = require('request-promise').defaults({json: true});
|
7 | const ownPkg = require('../package.json');
|
8 | const getLog = require('./lib/log');
|
9 |
|
10 | const pkg = JSON.parse(readFileSync('./package.json'));
|
11 |
|
12 | require('update-notifier')({
|
13 | pkg: _.defaults(ownPkg, {version: '0.0.0'}),
|
14 | }).notify();
|
15 |
|
16 | const knownOptions = {
|
17 | tag: String,
|
18 | version: Boolean,
|
19 | help: Boolean,
|
20 | keychain: Boolean,
|
21 | 'ask-for-passwords': Boolean,
|
22 | 'gh-token': String,
|
23 | 'npm-token': String,
|
24 | 'gh-username': String,
|
25 | 'npm-username': String,
|
26 | };
|
27 |
|
28 | const shortHands = {
|
29 | v: ['--version'],
|
30 | h: ['--help'],
|
31 | };
|
32 |
|
33 | module.exports = async function(argv) {
|
34 | const info = {
|
35 | options: _.defaults(nopt(knownOptions, shortHands, argv, 2), {
|
36 | keychain: true,
|
37 | tag: 'latest',
|
38 | }),
|
39 | };
|
40 |
|
41 | if (info.options.version) {
|
42 | console.log(ownPkg.version || 'development');
|
43 | return;
|
44 | }
|
45 |
|
46 | if ((info.options.argv.remain[0] !== 'setup' && info.options.argv.remain[0] !== 'init') || info.options.help) {
|
47 | console.log(`
|
48 | semantic-release-cli (v${ownPkg.version})
|
49 |
|
50 | Usage:
|
51 | semantic-release-cli setup [--tag=<String>]
|
52 |
|
53 | Options:
|
54 | -h --help Show this screen.
|
55 | -v --version Show version.
|
56 | --[no-]keychain Use keychain to get passwords [default: true].
|
57 | --ask-for-passwords Ask for the passwords even if passwords are stored [default: false].
|
58 | --tag=<String> npm tag to install [default: 'latest'].
|
59 | --gh-token=<String> GitHub auth token
|
60 | --npm-token=<String> npm auth token
|
61 | --gh-username=<String> GitHub username
|
62 | --npm-username=<String> npm username
|
63 |
|
64 | Aliases:
|
65 | init setup`);
|
66 | return;
|
67 | }
|
68 |
|
69 | let config;
|
70 | try {
|
71 | ({config} = await pify(npm.load)({progress: false}));
|
72 | } catch (error) {
|
73 | console.log('Failed to load npm config.', error);
|
74 | process.exitCode = 1;
|
75 | return;
|
76 | }
|
77 |
|
78 | info.loglevel = config.get('loglevel') || 'warn';
|
79 | const log = getLog(info.loglevel);
|
80 | info.log = log;
|
81 |
|
82 | try {
|
83 | await require('./lib/repository')(pkg, info);
|
84 | await require('./lib/npm')(pkg, info);
|
85 | await require('./lib/github')(pkg, info);
|
86 | await require('./lib/ci')(pkg, info);
|
87 | } catch (error) {
|
88 | log.error(error);
|
89 | process.exitCode = 1;
|
90 | }
|
91 |
|
92 | pkg.version = '0.0.0-development';
|
93 |
|
94 | pkg.scripts = pkg.scripts || {};
|
95 | pkg.scripts['semantic-release'] = 'semantic-release';
|
96 |
|
97 | pkg.repository = pkg.repository || {type: 'git', url: info.giturl};
|
98 |
|
99 | if (info.ghrepo.private && !pkg.publishConfig) {
|
100 | pkg.publishConfig = {access: 'restricted'};
|
101 | }
|
102 |
|
103 | try {
|
104 | const {'dist-tags': distTags} = await request('https://registry.npmjs.org/semantic-release');
|
105 | pkg.devDependencies = pkg.devDependencies || {};
|
106 | pkg.devDependencies['semantic-release'] = `^${distTags[info.options.tag]}`;
|
107 | } catch (error) {
|
108 | log.error('Could not get latest `semantic-release` version.', error);
|
109 | }
|
110 |
|
111 | log.verbose('Writing `package.json`.');
|
112 | writeFileSync('package.json', `${JSON.stringify(pkg, null, 2)}\n`);
|
113 | log.info('Done.');
|
114 | };
|