UNPKG

1.69 kBJavaScriptView Raw
1"use strict";
2
3const semver = require("semver");
4
5const { createGitLabClient } = require("@lerna/gitlab-client");
6const { createGitHubClient, parseGitRepo } = require("@lerna/github-client");
7const { ValidationError } = require("@lerna/validation-error");
8
9module.exports.createRelease = createRelease;
10module.exports.createReleaseClient = createReleaseClient;
11
12/**
13 * @param {'github' | 'gitlab'} type
14 */
15function createReleaseClient(type) {
16 switch (type) {
17 case "gitlab":
18 return createGitLabClient();
19 case "github":
20 return createGitHubClient();
21 /* istanbul ignore next: guarded by yargs.choices() */
22 default:
23 throw new ValidationError("ERELEASE", "Invalid release client type");
24 }
25}
26
27/**
28 * @param {ReturnType<typeof createReleaseClient>} client
29 * @param {{ tags: string[]; releaseNotes: { name: string; notes: string; }[] }} commandProps
30 * @param {{ gitRemote: string; execOpts: import("@lerna/child-process").ExecOpts }} opts
31 */
32function createRelease(client, { tags, releaseNotes }, { gitRemote, execOpts }) {
33 const repo = parseGitRepo(gitRemote, execOpts);
34
35 return Promise.all(
36 releaseNotes.map(({ notes, name }) => {
37 const tag = name === "fixed" ? tags[0] : tags.find((t) => t.startsWith(`${name}@`));
38
39 /* istanbul ignore if */
40 if (!tag) {
41 return Promise.resolve();
42 }
43
44 const prereleaseParts = semver.prerelease(tag.replace(`${name}@`, "")) || [];
45
46 return client.repos.createRelease({
47 owner: repo.owner,
48 repo: repo.name,
49 tag_name: tag,
50 name: tag,
51 body: notes,
52 draft: false,
53 prerelease: prereleaseParts.length > 0,
54 });
55 })
56 );
57}