|
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