UNPKG

3.14 kBJavaScriptView Raw
1const {readFileSync, writeFileSync} = require('fs');
2const _ = require('lodash');
3const pify = require('pify');
4const nopt = require('nopt');
5const npm = require('npm');
6const request = require('request-promise').defaults({json: true});
7const ownPkg = require('../package.json');
8const getLog = require('./lib/log');
9
10const pkg = JSON.parse(readFileSync('./package.json'));
11
12require('update-notifier')({
13 pkg: _.defaults(ownPkg, {version: '0.0.0'}),
14}).notify();
15
16const 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
28const shortHands = {
29 v: ['--version'],
30 h: ['--help'],
31};
32
33module.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(`
48semantic-release-cli (v${ownPkg.version})
49
50Usage:
51 semantic-release-cli setup [--tag=<String>]
52
53Options:
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
64Aliases:
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};