/
publish.js
111 lines (92 loc) · 2.81 KB
/
publish.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
const semver = require('semver')
const log = require('proc-log')
const pacote = require('pacote')
const { run, git, npm, pkg, spawn } = require('./util.js')
const resetdeps = () => npm('run', 'resetdeps')
const op = () => spawn('op', 'item', 'get', 'npm', '--otp', { out: true, ok: true })
const TAGS = {
// cli is always published to next-MAJOR
root: (v) => ({ tag: `next-${semver.major(v)}` }),
// workspaces are always published to latest, except prereleases
workspace: () => ({ tag: 'latest', preTag: 'prerelease' }),
}
const needsPublish = async ({ pkg: { private, name, version }, force, tags: getTags }) => {
if (private) {
return
}
const tags = getTags(version)
const tag = semver.parse(version).prerelease.length && tags.preTag
? tags.preTag
: tags.tag
if (force) {
return tag
}
const mani = await pacote.manifest(`${name}@${tag}`, { preferOnline: true })
if (version !== mani.version) {
return tag
}
}
const getPublishes = async ({ force }) => {
const publish = []
for (const { name, pkg: ws } of await pkg.mapWorkspaces()) {
publish.push({
workspace: name,
tag: await needsPublish({
force,
pkg: ws,
tags: TAGS.workspace,
}),
})
}
publish.push({
tag: await needsPublish({
force,
pkg,
tags: TAGS.root,
}),
})
return publish.filter(p => p.tag)
}
const main = async (opts) => {
const packOnly = opts.pack || opts.packDestination
const publishes = await getPublishes({ force: packOnly })
if (!publishes.length) {
throw new Error(
'Nothing to publish, exiting. ' +
'All packages to publish should have their version bumped before running this script.'
)
}
log.info('publish', '\n' + publishes.map(JSON.stringify).join('\n'))
await git('clean', '-fd')
await resetdeps()
await npm('ls', '--omit=dev', { quiet: true })
await npm('rm', '--global', '--force', 'npm')
await npm('link', '--force', '--ignore-scripts')
if (opts.test) {
await npm('run', 'lint-all', '--ignore-scripts')
await npm('run', 'postlint', '--ignore-scripts')
await npm('run', 'test-all', '--ignore-scripts')
}
await npm('prune', '--omit=dev', '--no-save', '--no-audit', '--no-fund')
await npm('install', '-w', 'docs', '--ignore-scripts', '--no-audit', '--no-fund')
await git.dirty()
for (const p of publishes) {
const workspace = p.workspace && `--workspace=${p.workspace}`
if (packOnly) {
await npm(
'pack',
workspace,
opts.packDestination && `--pack-destination=${opts.packDestination}`
)
} else {
await npm(
'publish',
workspace,
`--tag=${p.tag}`,
opts.dryRun && '--dry-run',
opts.otp && `--otp=${opts.otp === 'op' ? await op() : opts.otp}`
)
}
}
}
run(main).catch(resetdeps)