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