-
-
Notifications
You must be signed in to change notification settings - Fork 31
/
create-release.ts
64 lines (56 loc) · 1.8 KB
/
create-release.ts
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
import log from 'npmlog';
import semver from 'semver';
import {
createGitHubClient,
createGitLabClient,
parseGitRepo,
ReleaseCommandProps,
ReleaseOptions,
ValidationError
} from '@lerna-lite/core';
/**
* @param {'github' | 'gitlab'} type
*/
export function createReleaseClient(type: 'github' | 'gitlab') {
switch (type) {
case 'gitlab':
return createGitLabClient();
case 'github':
return createGitHubClient();
/* istanbul ignore next: guarded by yargs.choices() */
default:
throw new ValidationError('ERELEASE', 'Invalid release client type');
}
}
/**
* @param {ReturnType<typeof createReleaseClient>} client
* @param {{ tags: string[]; releaseNotes: { name: string; notes: string; }[] }} commandProps
* @param {{ gitRemote: string; execOpts: import('@lerna/child-process').ExecOpts }} opts
*/
export function createRelease(client, { tags, releaseNotes }: ReleaseCommandProps, { gitRemote, execOpts }: ReleaseOptions, gitDryRun = false) {
const repo = parseGitRepo(gitRemote, execOpts);
return Promise.all(
releaseNotes.map(({ notes, name }) => {
const tag = name === 'fixed' ? tags[0] : tags.find((t) => t.startsWith(`${name}@`));
/* istanbul ignore if */
if (!tag) {
return Promise.resolve();
}
const prereleaseParts = semver.prerelease(tag.replace(`${name}@`, '')) || [];
const releaseOptions = {
owner: repo.owner,
repo: repo.name,
tag_name: tag,
name: tag,
body: notes,
draft: false,
prerelease: prereleaseParts.length > 0,
};
if (gitDryRun) {
log.info('dry-run>', `Create Release with repo options: `, JSON.stringify(releaseOptions));
return Promise.resolve();
}
return client.repos.createRelease(releaseOptions);
})
);
}