UNPKG

slickgrid

Version:

A lightning fast JavaScript grid/spreadsheet

114 lines (98 loc) 2.96 kB
require('dotenv/config'); const { Octokit } = require('@octokit/rest'); const chalk = require('chalk'); const parseGitUrl = require('git-url-parse'); const newGithubReleaseUrl = require('new-github-release-url'); const semver = require('semver'); const { execSync } = require('./child-process'); function createGitHubClient() { const { GITHUB_TOKEN } = process.env; const options = {}; if (GITHUB_TOKEN) { options.auth = `token ${GITHUB_TOKEN}`; } return new Octokit(options); } /** * * @param {String} [remote] * @param {Object} [opts] * @returns */ function parseGitRepo(remote = 'origin', opts) { const args = ['config', '--get', `remote.${remote}.url`]; const url = execSync('git', args, opts); if (!url) { throw new Error(`Git remote URL could not be found using "${remote}".`); } return parseGitUrl(url); } function createReleaseClient(type) { switch (type) { // case 'gitlab': // return createGitLabClient(); case 'github': return createGitHubClient(); default: throw new Error('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 */ function createRelease( client, { tag, releaseNote }, { gitRemote, execOpts }, gitDryRun = false ) { const { GITHUB_TOKEN } = process.env; const repo = parseGitRepo(gitRemote, execOpts); const { notes, name } = releaseNote; if (!tag) { return Promise.resolve(); } const prereleaseParts = semver.prerelease(tag.replace(`${name}@`, '')) || []; if (!GITHUB_TOKEN) { const releaseUrl = newGithubReleaseUrl({ user: repo.owner, repo: repo.name, tag, isPrerelease: prereleaseParts.length > 0, title: tag, body: notes }); console.log(`🏷️ (GitHub Release web interface) - 🔗 ${releaseUrl}`); return Promise.resolve(); } const releaseOptions = { owner: repo.owner, repo: repo.name, tag_name: tag, name: tag, body: notes, draft: false, prerelease: prereleaseParts.length > 0, }; if (gitDryRun) { // const repo = await client.repos.get({ // owner: releaseOptions.owner, // repo: releaseOptions.repo, // }); const host = 'github.com'; console.info( // JSON.stringify(releaseOptions) `${chalk.bgMagenta('[dry-run]')} 🔗 https://${host}/${releaseOptions.owner}/${releaseOptions.repo}/releases/tag/${releaseOptions.tag_name} 🏷️ (GitHub Release)` ); return Promise.resolve(); } return client.repos.createRelease(releaseOptions); } // exports module.exports = { createRelease, createReleaseClient, parseGitRepo, }