|
1 | 1 | const semver = require('semver')
|
2 | 2 | const log = require('proc-log')
|
3 | 3 | const pacote = require('pacote')
|
4 |
| -const { run, git, npm, pkg, spawn } = require('./util.js') |
| 4 | +const { run, git, npm, pkg: cli, spawn } = require('./util.js') |
5 | 5 |
|
6 | 6 | const resetdeps = () => npm('run', 'resetdeps')
|
7 | 7 |
|
8 | 8 | const op = () => spawn('op', 'item', 'get', 'npm', '--otp', { out: true, ok: true })
|
9 | 9 |
|
10 |
| -const TAGS = { |
11 |
| - // cli is always published to next-MAJOR |
12 |
| - root: (v) => ({ tag: `next-${semver.major(v)}` }), |
13 |
| - // workspaces are always published to latest, except prereleases |
14 |
| - workspace: () => ({ tag: 'latest', preTag: 'prerelease' }), |
| 10 | +const getVersion = async (s) => { |
| 11 | + const mani = await pacote.manifest(s, { preferOnline: true }) |
| 12 | + return mani.version |
| 13 | +} |
| 14 | +const getLatest = async (s) => { |
| 15 | + const pack = await pacote.packument(s, { preferOnline: true }) |
| 16 | + return pack['dist-tags'].latest |
| 17 | +} |
| 18 | + |
| 19 | +const TAG = { |
| 20 | + cli: ({ version }) => `next-${semver.major(version)}`, |
| 21 | + workspace: async ({ name, version }) => { |
| 22 | + const { prerelease, major } = semver.parse(version) |
| 23 | + if (prerelease.length) { |
| 24 | + return 'prerelease' |
| 25 | + } |
| 26 | + if (major === await getLatest(name).then(v => semver.major(v))) { |
| 27 | + return 'latest' |
| 28 | + } |
| 29 | + return 'backport' |
| 30 | + }, |
15 | 31 | }
|
16 | 32 |
|
17 |
| -const needsPublish = async ({ pkg: { private, name, version }, force, tags: getTags }) => { |
| 33 | +const needsPublish = async ({ private, name, version }, { force, getTag }) => { |
18 | 34 | if (private) {
|
19 | 35 | return
|
20 | 36 | }
|
21 | 37 |
|
22 |
| - const tags = getTags(version) |
23 |
| - const tag = semver.parse(version).prerelease.length && tags.preTag |
24 |
| - ? tags.preTag |
25 |
| - : tags.tag |
26 |
| - |
27 |
| - if (force) { |
28 |
| - return tag |
29 |
| - } |
30 |
| - |
31 |
| - const mani = await pacote.manifest(`${name}@${tag}`, { preferOnline: true }) |
32 |
| - if (version !== mani.version) { |
| 38 | + const tag = await getTag({ name, version }) |
| 39 | + if (force || version !== await getVersion(`${name}@${tag}`)) { |
33 | 40 | return tag
|
34 | 41 | }
|
35 | 42 | }
|
36 | 43 |
|
37 |
| -const getPublishes = async ({ force }) => { |
| 44 | +const getPublishes = async (opts) => { |
38 | 45 | const publish = []
|
39 | 46 |
|
40 |
| - for (const { name, pkg: ws } of await pkg.mapWorkspaces()) { |
| 47 | + for (const { name, pkg } of await cli.mapWorkspaces()) { |
41 | 48 | publish.push({
|
42 | 49 | workspace: name,
|
43 |
| - tag: await needsPublish({ |
44 |
| - force, |
45 |
| - pkg: ws, |
46 |
| - tags: TAGS.workspace, |
47 |
| - }), |
| 50 | + tag: await needsPublish(pkg, { ...opts, getTag: TAG.workspace }), |
48 | 51 | })
|
49 | 52 | }
|
50 | 53 |
|
51 | 54 | publish.push({
|
52 |
| - tag: await needsPublish({ |
53 |
| - force, |
54 |
| - pkg, |
55 |
| - tags: TAGS.root, |
56 |
| - }), |
| 55 | + tag: await needsPublish(cli, { ...opts, getTag: TAG.cli }), |
57 | 56 | })
|
58 | 57 |
|
59 | 58 | return publish.filter(p => p.tag)
|
|
0 commit comments