UNPKG

nx

Version:

The core Nx plugin contains the core functionality of Nx like the project graph, nx commands and task orchestration.

137 lines (136 loc) 5.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RemoteReleaseClient = void 0; exports.createRemoteReleaseClient = createRemoteReleaseClient; const axios_1 = require("axios"); const print_changes_1 = require("../print-changes"); const shared_1 = require("../shared"); /** * Abstract base class for remote release clients */ class RemoteReleaseClient { constructor( // A workspace isn't guaranteed to have a remote remoteRepoData, createReleaseConfig, tokenData) { this.remoteRepoData = remoteRepoData; this.createReleaseConfig = createReleaseConfig; this.tokenData = tokenData; this.tokenHeader = {}; if (tokenData) { if (tokenData.headerName === 'Authorization') { this.tokenHeader[tokenData.headerName] = `Bearer ${tokenData.token}`; } else { this.tokenHeader[tokenData.headerName] = tokenData.token; } } } getRemoteRepoData() { return this.remoteRepoData; } /** * Make an (optionally authenticated) API request to the remote release provider */ async makeRequest(url, opts = {}) { const remoteRepoData = this.getRemoteRepoData(); if (!remoteRepoData) { throw new Error(`No remote repo data could be resolved for the current workspace`); } const config = { ...opts, baseURL: remoteRepoData.apiBaseUrl, headers: { ...opts.headers, ...this.tokenHeader, }, }; return (await (0, axios_1.default)(url, config)).data; } async createOrUpdateRelease(releaseVersion, changelogContents, latestCommit, { dryRun }) { let existingRelease; try { existingRelease = await this.getReleaseByTag(releaseVersion.gitTag); } catch (err) { if (err.response?.status === 401) { this.handleAuthError(); process.exit(1); } if (err.response?.status === 404) { // No existing release found, this is fine } else { // Rethrow unknown errors for now throw err; } } this.logReleaseAction(existingRelease, releaseVersion.gitTag, dryRun); this.printRemoteReleaseContents(existingRelease ? 'body' in existingRelease ? existingRelease.body : 'description' in existingRelease ? existingRelease.description : '' : '', changelogContents); if (!dryRun) { const remoteReleaseOptions = { version: releaseVersion.gitTag, prerelease: releaseVersion.isPrerelease, body: changelogContents, commit: latestCommit, }; const result = await this.syncRelease(remoteReleaseOptions, existingRelease); if (result.status === 'manual') { await this.handleError(result.error, result); } } } /** * Format references for the release (e.g., PRs, issues) */ formatReferences(_references) { // Base implementation - to be overridden by specific providers return ''; } /** * Print changelog changes */ printRemoteReleaseContents(existingBody, newBody) { console.log(''); (0, print_changes_1.printDiff)(existingBody, newBody, 3, shared_1.noDiffInChangelogMessage); } } exports.RemoteReleaseClient = RemoteReleaseClient; /** * Factory function to create a remote release client based on the given configuration */ async function createRemoteReleaseClient(createReleaseConfig, remoteName = 'origin') { switch (true) { // GitHub and GitHub Enterprise Server case typeof createReleaseConfig === 'object' && (createReleaseConfig.provider === 'github-enterprise-server' || createReleaseConfig.provider === 'github'): // If remote releases are disabled, assume GitHub repo data resolution (but don't attempt to resolve a token) to match existing behavior case createReleaseConfig === false: { const { GithubRemoteReleaseClient } = await Promise.resolve().then(() => require('./github')); const repoData = GithubRemoteReleaseClient.resolveRepoData(createReleaseConfig, remoteName); const token = createReleaseConfig && repoData ? await GithubRemoteReleaseClient.resolveTokenData(repoData.hostname) : null; return new GithubRemoteReleaseClient(repoData, createReleaseConfig, token); } // GitLab case typeof createReleaseConfig === 'object' && createReleaseConfig.provider === 'gitlab': { const { GitLabRemoteReleaseClient } = await Promise.resolve().then(() => require('./gitlab')); const repoData = GitLabRemoteReleaseClient.resolveRepoData(createReleaseConfig, remoteName); const tokenData = repoData ? await GitLabRemoteReleaseClient.resolveTokenData(repoData.hostname) : null; return new GitLabRemoteReleaseClient(repoData, createReleaseConfig, tokenData); } default: throw new Error(`Unsupported remote release configuration: ${JSON.stringify(createReleaseConfig)}`); } }