Skip to content

Commit b8deba7

Browse files
committed
feat: support nextRelease.channel property in publish step
1 parent baf071b commit b8deba7

7 files changed

Lines changed: 43 additions & 90 deletions

File tree

lib/get-channel.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const semver = require('semver');
2+
3+
module.exports = channel => (channel ? (semver.validRange(channel) ? `release-${channel}` : channel) : 'latest');

lib/get-release-info.js

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,7 @@
1-
const execa = require('execa');
21
const normalizeUrl = require('normalize-url');
32

4-
module.exports = async (
5-
{name, publishConfig: {tag} = {}},
6-
{cwd, env: {DEFAULT_NPM_REGISTRY = 'https://registry.npmjs.org/', ...env}},
7-
registry
8-
) => {
9-
const distTag = tag || (await execa.stdout('npm', ['config', 'get', 'tag'], {cwd, env})) || 'latest';
10-
11-
return {
12-
name: `npm package (@${distTag} dist-tag)`,
13-
url:
14-
normalizeUrl(registry) === normalizeUrl(DEFAULT_NPM_REGISTRY)
15-
? `https://www.npmjs.com/package/${name}`
16-
: undefined,
17-
};
18-
};
3+
module.exports = async ({name}, {env: {DEFAULT_NPM_REGISTRY = 'https://registry.npmjs.org/'}}, distTag, registry) => ({
4+
name: `npm package (@${distTag} dist-tag)`,
5+
url:
6+
normalizeUrl(registry) === normalizeUrl(DEFAULT_NPM_REGISTRY) ? `https://www.npmjs.com/package/${name}` : undefined,
7+
});

lib/publish.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const path = require('path');
22
const execa = require('execa');
33
const getRegistry = require('./get-registry');
4+
const getChannel = require('./get-channel');
45
const getReleaseInfo = require('./get-release-info');
56

67
module.exports = async ({npmPublish, pkgRoot}, pkg, context) => {
@@ -9,16 +10,17 @@ module.exports = async ({npmPublish, pkgRoot}, pkg, context) => {
910
env,
1011
stdout,
1112
stderr,
12-
nextRelease: {version},
13+
nextRelease: {version, channel},
1314
logger,
1415
} = context;
1516

1617
if (npmPublish !== false && pkg.private !== true) {
1718
const basePath = pkgRoot ? path.resolve(cwd, pkgRoot) : cwd;
1819
const registry = getRegistry(pkg, context);
20+
const distTag = getChannel(channel);
1921

2022
logger.log('Publishing version %s to npm registry', version);
21-
const result = execa('npm', ['publish', basePath, '--registry', registry], {
23+
const result = execa('npm', ['publish', basePath, '--tag', distTag, '--registry', registry], {
2224
cwd,
2325
env,
2426
});
@@ -33,7 +35,7 @@ module.exports = async ({npmPublish, pkgRoot}, pkg, context) => {
3335
await result;
3436

3537
logger.log(`Published ${pkg.name}@${pkg.version} on ${registry}`);
36-
return getReleaseInfo(pkg, context, registry);
38+
return getReleaseInfo(pkg, context, distTag, registry);
3739
}
3840
logger.log(
3941
'Skip publishing to npm registry as %s is %s',

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
"npm": "^6.3.0",
2727
"rc": "^1.2.8",
2828
"read-pkg": "^4.0.0",
29-
"registry-auth-token": "^3.3.1"
29+
"registry-auth-token": "^3.3.1",
30+
"semver": "^5.5.0"
3031
},
3132
"devDependencies": {
3233
"ava": "^0.25.0",

test/get-channel.test.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import test from 'ava';
2+
import getChannel from '../lib/get-channel';
3+
4+
test.serial('Get default channel', t => {
5+
t.is(getChannel(undefined), 'latest');
6+
});
7+
8+
test.serial('Get passed channel if valid', t => {
9+
t.is(getChannel('next'), 'next');
10+
});
11+
12+
test.serial('Prefix channel with "release-" if invalid', t => {
13+
t.is(getChannel('1.x'), 'release-1.x');
14+
t.is(getChannel('1.0.0'), 'release-1.0.0');
15+
});

test/get-release-info.test.js

Lines changed: 4 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,16 @@
1-
import path from 'path';
21
import test from 'ava';
3-
import {writeFile} from 'fs-extra';
4-
import tempy from 'tempy';
52
import getReleaseInfo from '../lib/get-release-info';
63

7-
test.beforeEach(() => {
8-
// Delete all `npm_config` environment variable set by CI as they take precedence over the `.npmrc` because the process that runs the tests is started before the `.npmrc` is created
9-
for (let i = 0, keys = Object.keys(process.env); i < keys.length; i++) {
10-
if (keys[i].startsWith('npm_')) {
11-
delete process.env[keys[i]];
12-
}
13-
}
14-
});
15-
16-
test('Default registry and tag', async t => {
17-
const cwd = tempy.directory();
18-
19-
t.deepEqual(await getReleaseInfo({name: 'module'}, {cwd, env: {}}, 'https://registry.npmjs.org/'), {
20-
name: 'npm package (@latest dist-tag)',
21-
url: 'https://www.npmjs.com/package/module',
22-
});
23-
});
24-
25-
test('Default registry, tag and scoped module', async t => {
26-
const cwd = tempy.directory();
27-
28-
t.deepEqual(await getReleaseInfo({name: '@scope/module'}, {cwd, env: {}}, 'https://registry.npmjs.org/'), {
4+
test('Default registry and scoped module', async t => {
5+
t.deepEqual(await getReleaseInfo({name: '@scope/module'}, {env: {}}, 'latest', 'https://registry.npmjs.org/'), {
296
name: 'npm package (@latest dist-tag)',
307
url: 'https://www.npmjs.com/package/@scope/module',
318
});
329
});
3310

34-
test('Custom registry, tag and scoped module', async t => {
35-
const cwd = tempy.directory();
36-
37-
t.deepEqual(await getReleaseInfo({name: '@scope/module'}, {cwd, env: {}}, 'https://custom.registry.org/'), {
11+
test('Custom registry and scoped module', async t => {
12+
t.deepEqual(await getReleaseInfo({name: '@scope/module'}, {env: {}}, 'latest', 'https://custom.registry.org/'), {
3813
name: 'npm package (@latest dist-tag)',
3914
url: undefined,
4015
});
4116
});
42-
43-
test('Default registry and tag from .npmrc', async t => {
44-
const cwd = tempy.directory();
45-
await writeFile(path.resolve(cwd, '.npmrc'), 'tag=npmrc');
46-
47-
t.deepEqual(
48-
await getReleaseInfo({name: 'module', publishConfig: {}}, {cwd, env: {}}, 'https://registry.npmjs.org/'),
49-
{
50-
name: 'npm package (@npmrc dist-tag)',
51-
url: 'https://www.npmjs.com/package/module',
52-
}
53-
);
54-
});
55-
56-
test('Default registry and tag from package.json', async t => {
57-
const cwd = tempy.directory();
58-
59-
await writeFile(path.resolve(cwd, '.npmrc'), 'tag=npmrc');
60-
61-
t.deepEqual(
62-
await getReleaseInfo({name: 'module', publishConfig: {tag: 'pkg'}}, {cwd, env: {}}, 'https://registry.npmjs.org/'),
63-
{name: 'npm package (@pkg dist-tag)', url: 'https://www.npmjs.com/package/module'}
64-
);
65-
});
66-
67-
test('Default tag', async t => {
68-
const cwd = tempy.directory();
69-
70-
await writeFile(path.resolve(cwd, '.npmrc'), 'tag=');
71-
72-
t.deepEqual(
73-
await getReleaseInfo({name: 'module', publishConfig: {}}, {cwd, env: {}}, 'https://registry.npmjs.org/'),
74-
{
75-
name: 'npm package (@latest dist-tag)',
76-
url: 'https://www.npmjs.com/package/module',
77-
}
78-
);
79-
});

test/integration.test.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ test('Publish the package on a dist-tag', async t => {
275275
stdout: t.context.stdout,
276276
stderr: t.context.stderr,
277277
logger: t.context.logger,
278-
nextRelease: {version: '1.0.0'},
278+
nextRelease: {channel: 'next', version: '1.0.0'},
279279
}
280280
);
281281

@@ -556,7 +556,7 @@ test('Verify token and set up auth only on the fist call, then prepare on prepar
556556
}
557557
);
558558

559-
const result = await t.context.m.publish(
559+
let result = await t.context.m.publish(
560560
{},
561561
{
562562
cwd,
@@ -565,8 +565,14 @@ test('Verify token and set up auth only on the fist call, then prepare on prepar
565565
stdout: t.context.stdout,
566566
stderr: t.context.stderr,
567567
logger: t.context.logger,
568-
nextRelease: {version: '1.0.0'},
568+
nextRelease: {channel: 'next', version: '1.0.0'},
569569
}
570570
);
571+
t.deepEqual(result, {name: 'npm package (@next dist-tag)', url: undefined});
572+
t.is(await execa.stdout('npm', ['view', pkg.name, 'dist-tags.next'], {cwd, env}), '1.0.0');
573+
574+
result = await t.context.m.addChannel({}, {logger: t.context.logger, nextRelease: {version: '1.0.0'}});
575+
571576
t.deepEqual(result, {name: 'npm package (@latest dist-tag)', url: undefined});
577+
t.is(await execa.stdout('npm', ['view', pkg.name, 'dist-tags.latest'], {cwd, env}), '1.0.0');
572578
});

0 commit comments

Comments
 (0)