forked from sindresorhus/np
/
cli-implementation.js
executable file
·147 lines (129 loc) · 3.16 KB
/
cli-implementation.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/usr/bin/env node
'use strict';
// eslint-disable-next-line import/no-unassigned-import
require('symbol-observable'); // Important: This needs to be first to prevent weird Observable incompatibilities
const logSymbols = require('log-symbols');
const meow = require('meow');
const updateNotifier = require('update-notifier');
const hasYarn = require('has-yarn');
const config = require('./config');
const {isPackageNameAvailable} = require('./npm/util');
const version = require('./version');
const util = require('./util');
const ui = require('./ui');
const np = require('.');
const cli = meow(`
Usage
$ np <version>
Version can be:
${version.SEMVER_INCREMENTS.join(' | ')} | 1.2.3
Options
--any-branch Allow publishing from any branch
--branch Name of the release branch (default: master)
--no-cleanup Skips cleanup of node_modules
--no-tests Skips tests
--yolo Skips cleanup and testing
--no-publish Skips publishing
--preview Show tasks without actually executing them
--tag Publish under a given dist-tag
--no-yarn Don't use Yarn
--contents Subdirectory to publish
--no-release-draft Skips opening a GitHub release draft
--test-script Name of npm run script to run tests before publishing (default: test)
--no-2fa Don't enable 2FA on new packages (not recommended)
Examples
$ np
$ np patch
$ np 1.0.2
$ np 1.0.2-beta.3 --tag=beta
$ np 1.0.2-beta.3 --tag=beta --contents=dist
`, {
booleanDefault: undefined,
flags: {
anyBranch: {
type: 'boolean'
},
branch: {
type: 'string'
},
cleanup: {
type: 'boolean'
},
tests: {
type: 'boolean'
},
yolo: {
type: 'boolean'
},
publish: {
type: 'boolean'
},
releaseDraft: {
type: 'boolean'
},
tag: {
type: 'string'
},
yarn: {
type: 'boolean'
},
contents: {
type: 'string'
},
preview: {
type: 'boolean'
},
testScript: {
type: 'string'
},
'2fa': {
type: 'boolean'
}
}
});
updateNotifier({pkg: cli.pkg}).notify();
(async () => {
const pkg = util.readPkg();
const defaultFlags = {
cleanup: true,
tests: true,
publish: true,
releaseDraft: true,
yarn: hasYarn(),
'2fa': true
};
const localConfig = await config();
const flags = {
...defaultFlags,
...localConfig,
...cli.flags
};
// Workaround for unintended auto-casing behavior from `meow`.
if ('2Fa' in flags) {
flags['2fa'] = flags['2Fa'];
}
const runPublish = flags.publish && !pkg.private;
const availability = flags.publish ? await isPackageNameAvailable(pkg) : {
isAvailable: false,
isUnknown: false
};
const version = cli.input.length > 0 ? cli.input[0] : false;
const options = await ui({
...flags,
availability,
version,
runPublish
}, pkg);
if (!options.confirm) {
process.exit(0);
}
console.log(); // Prints a newline for readability
const newPkg = await np(options.version, options);
if (options.preview) {
return;
}
console.log(`\n ${newPkg.name} ${newPkg.version} published 🎉`);
})().catch(error => {
console.error(`\n${logSymbols.error} ${error.message}`);
process.exit(1);
});