UNPKG

3.28 kBJavaScriptView Raw
1/* eslint require-atomic-updates: off */
2
3const {readFileSync, writeFileSync} = require('fs');
4const _ = require('lodash');
5const pify = require('pify');
6const nopt = require('nopt');
7const npm = require('npm');
8const request = require('request-promise').defaults({json: true});
9const ownPkg = require('../package.json');
10const getLog = require('./lib/log');
11
12const pkg = JSON.parse(readFileSync('./package.json'));
13if (pkg.name === undefined) throw new Error(`"name" key is missing from your package.json`);
14
15require('update-notifier')({
16 pkg: _.defaults(ownPkg, {version: '0.0.0'}),
17}).notify();
18
19const 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
31const shortHands = {
32 v: ['--version'],
33 h: ['--help'],
34};
35
36module.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(`
51semantic-release-cli (v${ownPkg.version})
52
53Usage:
54 semantic-release-cli setup [--tag=<String>]
55
56Options:
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
67Aliases:
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};