diff --git a/plugins/github-release-manager/src/GitHubReleaseManager.tsx b/plugins/github-release-manager/src/GitHubReleaseManager.tsx index 692b43baa1..cde0a846d3 100644 --- a/plugins/github-release-manager/src/GitHubReleaseManager.tsx +++ b/plugins/github-release-manager/src/GitHubReleaseManager.tsx @@ -66,15 +66,16 @@ export function GitHubReleaseManager({ }: GitHubReleaseManagerProps) { const pluginApiClient = useApi(githubReleaseManagerApiRef); const classes = useStyles(); - const usernameResponse = useAsync(() => pluginApiClient.getUsername()); const query = useQuery(); - const parsedQuery = getParsedQuery({ query }); const project: Project = { owner: parsedQuery.owner ?? '', repo: parsedQuery.repo ?? '', versioningStrategy: parsedQuery.versioningStrategy ?? 'semver', }; + const usernameResponse = useAsync(() => + pluginApiClient.getUsername({ owner: project.owner, repo: project.repo }), + ); if (usernameResponse.error) { return {usernameResponse.error.message}; diff --git a/plugins/github-release-manager/src/api/PluginApiClient.ts b/plugins/github-release-manager/src/api/PluginApiClient.ts index 3b7e0da80f..291749b217 100644 --- a/plugins/github-release-manager/src/api/PluginApiClient.ts +++ b/plugins/github-release-manager/src/api/PluginApiClient.ts @@ -19,6 +19,7 @@ import { Octokit } from '@octokit/rest'; import { readGitHubIntegrationConfigs } from '@backstage/integration'; import { CalverTagParts } from '../helpers/tagParts/getCalverTagParts'; +import { DISABLE_CACHE } from '../constants/constants'; import { getRcGitHubInfo } from '../cards/createRc/getRcGitHubInfo'; import { Project } from '../contexts/ProjectContext'; import { SemverTagParts } from '../helpers/tagParts/getSemverTagParts'; @@ -27,258 +28,296 @@ type UnboxPromise> = T extends Promise ? U : never; -export type ApiMethodRetval< +type UnboxReturnedPromise< T extends (...args: any) => Promise > = UnboxPromise>; -export type UnboxArray = T extends (infer U)[] ? U : T; +type UnboxArray = T extends (infer U)[] ? U : T; -type PartialProject = Omit; +type OwnerRepo = { + owner: Project['owner']; + repo: Project['repo']; +}; -export interface IPluginApiClient { - getHost: () => string; +type GetHost = () => string; - getRepoPath: (args: PartialProject) => string; +type GetRepoPath = (args: OwnerRepo) => string; - getOwners: () => Promise<{ owners: string[] }>; +type GetOwners = () => Promise<{ + owners: string[]; +}>; +export type GetOwnersResult = UnboxReturnedPromise; - getRepositories: (args: { - owner: string; - }) => Promise<{ repositories: string[] }>; +type GetRepositories = (args: { + owner: string; +}) => Promise<{ + repositories: string[]; +}>; +export type GetRepositoriesResult = UnboxReturnedPromise; - getUsername: () => Promise<{ username: string }>; +type GetUsername = ( + args: OwnerRepo, +) => Promise<{ + username: string; +}>; +export type GetUsernameResult = UnboxReturnedPromise; - getRecentCommits: ( - args: { releaseBranchName?: string } & PartialProject, - ) => Promise< - { - htmlUrl: string; - sha: string; - author: { - htmlUrl?: string; - login?: string; - }; - commit: { - message: string; - }; - firstParentSha?: string; - }[] - >; - - getLatestRelease: ( - args: PartialProject, - ) => Promise<{ - latestRelease: { - targetCommitish: string; - tagName: string; - prerelease: boolean; - id: number; - htmlUrl: string; - body?: string | null; - } | null; - }>; - - getRepository: ( - args: PartialProject, - ) => Promise<{ - repository: { - pushPermissions: boolean | undefined; - defaultBranch: string; - name: string; - }; - }>; - - getLatestCommit: ( - args: { - defaultBranch: string; - } & PartialProject, - ) => Promise<{ - sha: string; +type GetRecentCommits = ( + args: { + releaseBranchName?: string; + } & OwnerRepo, +) => Promise< + { htmlUrl: string; + sha: string; + author: { + htmlUrl?: string; + login?: string; + }; commit: { message: string; }; - }>; + firstParentSha?: string; + }[] +>; +export type GetRecentCommitsResult = UnboxReturnedPromise; +export type GetRecentCommitsResultSingle = UnboxArray; - getBranch: ( - args: { - branchName: string; - } & PartialProject, - ) => Promise<{ - name: string; - links: { - html: string; - }; - commit: { - sha: string; - commit: { - tree: { - sha: string; - }; - }; - }; - }>; +type GetLatestRelease = ( + args: OwnerRepo, +) => Promise<{ + targetCommitish: string; + tagName: string; + prerelease: boolean; + id: number; + htmlUrl: string; + body?: string | null; +} | null>; +export type GetLatestReleaseResult = UnboxReturnedPromise; - createRc: { - createRef: ( - args: { - mostRecentSha: string; - targetBranch: string; - } & PartialProject, - ) => Promise<{ ref: string }>; +type GetRepository = ( + args: OwnerRepo, +) => Promise<{ + pushPermissions: boolean | undefined; + defaultBranch: string; + name: string; +}>; +export type GetRepositoryResult = UnboxReturnedPromise; - getComparison: ( - args: { - previousReleaseBranch: string; - nextReleaseBranch: string; - } & PartialProject, - ) => Promise<{ htmlUrl: string; aheadBy: number }>; - - createRelease: ( - args: { - nextGitHubInfo: ReturnType; - releaseBody: string; - } & PartialProject, - ) => Promise<{ - createReleaseResponse: { - name: string | null; - htmlUrl: string; - tagName: string; - }; - }>; +type GetLatestCommit = ( + args: { + defaultBranch: string; + } & OwnerRepo, +) => Promise<{ + sha: string; + htmlUrl: string; + commit: { + message: string; }; +}>; +export type GetLatestCommitResult = UnboxReturnedPromise; - patch: { - createTempCommit: ( - args: { - tagParts: SemverTagParts | CalverTagParts; - releaseBranchTree: string; - selectedPatchCommit: UnboxArray< - ApiMethodRetval - >; - } & PartialProject, - ) => Promise<{ - message: string; - sha: string; - }>; - - forceBranchHeadToTempCommit: ( - args: { - releaseBranchName: string; - tempCommit: ApiMethodRetval< - IPluginApiClient['patch']['createTempCommit'] - >; - } & PartialProject, - ) => Promise; - - merge: ({ - base, - head, - }: { - base: string; - head: string; - } & PartialProject) => Promise<{ - htmlUrl: string; - commit: { - message: string; - tree: { - sha: string; - }; - }; - }>; - - createCherryPickCommit: ( - args: { - bumpedTag: string; - selectedPatchCommit: UnboxArray< - ApiMethodRetval - >; - mergeTree: string; - releaseBranchSha: string; - } & PartialProject, - ) => Promise<{ - message: string; - sha: string; - }>; - - replaceTempCommit: ( - args: { - releaseBranchName: string; - cherryPickCommit: ApiMethodRetval< - IPluginApiClient['patch']['createCherryPickCommit'] - >; - } & PartialProject, - ) => Promise<{ - ref: string; - object: { +type GetBranch = ( + args: { + branchName: string; + } & OwnerRepo, +) => Promise<{ + name: string; + links: { + html: string; + }; + commit: { + sha: string; + commit: { + tree: { sha: string; }; - }>; - - createTagObject: ({ - bumpedTag, - updatedReference, - }: { - bumpedTag: string; - updatedReference: ApiMethodRetval< - IPluginApiClient['patch']['replaceTempCommit'] - >; - } & PartialProject) => Promise<{ - tag: string; - sha: string; - }>; - - createReference: ( - args: { - bumpedTag: string; - createdTagObject: ApiMethodRetval< - IPluginApiClient['patch']['createTagObject'] - >; - } & PartialProject, - ) => Promise<{ - ref: string; - }>; - - updateRelease: ( - args: { - bumpedTag: string; - latestRelease: NonNullable< - ApiMethodRetval['latestRelease'] - >; - tagParts: SemverTagParts | CalverTagParts; - selectedPatchCommit: UnboxArray< - ApiMethodRetval - >; - } & PartialProject, - ) => Promise<{ - name: string | null; - tagName: string; - htmlUrl: string; - }>; + }; }; +}>; +export type GetBranchResult = UnboxReturnedPromise; +type CreateRef = ( + args: { + mostRecentSha: string; + targetBranch: string; + } & OwnerRepo, +) => Promise<{ + ref: string; +}>; +export type CreateRefResult = UnboxReturnedPromise; + +type GetComparison = ( + args: { + previousReleaseBranch: string; + nextReleaseBranch: string; + } & OwnerRepo, +) => Promise<{ + htmlUrl: string; + aheadBy: number; +}>; +export type GetComparisonResult = UnboxReturnedPromise; + +type CreateRelease = ( + args: { + nextGitHubInfo: ReturnType; + releaseBody: string; + } & OwnerRepo, +) => Promise<{ + name: string | null; + htmlUrl: string; + tagName: string; +}>; +export type CreateReleaseResult = UnboxReturnedPromise; + +type CreateTempCommit = ( + args: { + tagParts: SemverTagParts | CalverTagParts; + releaseBranchTree: string; + selectedPatchCommit: UnboxArray< + UnboxReturnedPromise + >; + } & OwnerRepo, +) => Promise<{ + message: string; + sha: string; +}>; +export type CreateTempCommitResult = UnboxReturnedPromise; + +type ForceBranchHeadToTempCommit = ( + args: { + releaseBranchName: string; + tempCommit: CreateTempCommitResult; + } & OwnerRepo, +) => Promise; +export type ForceBranchHeadToTempCommitResult = UnboxReturnedPromise; + +type Merge = ({ + base, + head, +}: { + base: string; + head: string; +} & OwnerRepo) => Promise<{ + htmlUrl: string; + commit: { + message: string; + tree: { + sha: string; + }; + }; +}>; +export type MergeResult = UnboxReturnedPromise; + +type CreateCherryPickCommit = ( + args: { + bumpedTag: string; + selectedPatchCommit: UnboxArray< + UnboxReturnedPromise + >; + mergeTree: string; + releaseBranchSha: string; + } & OwnerRepo, +) => Promise<{ + message: string; + sha: string; +}>; +export type CreateCherryPickCommitResult = UnboxReturnedPromise; + +type ReplaceTempCommit = ( + args: { + releaseBranchName: string; + cherryPickCommit: UnboxReturnedPromise< + IPluginApiClient['patch']['createCherryPickCommit'] + >; + } & OwnerRepo, +) => Promise<{ + ref: string; + object: { + sha: string; + }; +}>; +export type ReplaceTempCommitResult = UnboxReturnedPromise; + +type CreateTagObject = ({ + bumpedTag, + updatedReference, +}: { + bumpedTag: string; + updatedReference: ReplaceTempCommitResult; +} & OwnerRepo) => Promise<{ + tag: string; + sha: string; +}>; +export type CreateTagObjectResult = UnboxReturnedPromise; + +type CreateReference = ( + args: { + bumpedTag: string; + createdTagObject: CreateTagObjectResult; + } & OwnerRepo, +) => Promise<{ + ref: string; +}>; +export type CreateReferenceResult = UnboxReturnedPromise; + +type UpdateRelease = ( + args: { + bumpedTag: string; + latestRelease: NonNullable; + tagParts: SemverTagParts | CalverTagParts; + selectedPatchCommit: GetRecentCommitsResultSingle; + } & OwnerRepo, +) => Promise<{ + name: string | null; + tagName: string; + htmlUrl: string; +}>; +export type UpdateReleaseResult = UnboxReturnedPromise; + +type PromoteRelease = ( + args: { + releaseId: NonNullable['id']; + releaseVersion: string; + } & OwnerRepo, +) => Promise<{ + name: string | null; + tagName: string; + htmlUrl: string; +}>; +export type PromoteReleaseResult = UnboxReturnedPromise; + +export interface IPluginApiClient { + getHost: GetHost; + getRepoPath: GetRepoPath; + getOwners: GetOwners; + getRepositories: GetRepositories; + getUsername: GetUsername; + getRecentCommits: GetRecentCommits; + getLatestRelease: GetLatestRelease; + getRepository: GetRepository; + getLatestCommit: GetLatestCommit; + getBranch: GetBranch; + createRc: { + createRef: CreateRef; + getComparison: GetComparison; + createRelease: CreateRelease; + }; + patch: { + createTempCommit: CreateTempCommit; + forceBranchHeadToTempCommit: ForceBranchHeadToTempCommit; + merge: Merge; + createCherryPickCommit: CreateCherryPickCommit; + replaceTempCommit: ReplaceTempCommit; + createTagObject: CreateTagObject; + createReference: CreateReference; + updateRelease: UpdateRelease; + }; promoteRc: { - promoteRelease: ( - args: { - releaseId: NonNullable< - ApiMethodRetval['latestRelease'] - >['id']; - releaseVersion: string; - } & PartialProject, - ) => Promise<{ - name: string | null; - tagName: string; - htmlUrl: string; - }>; + promoteRelease: PromoteRelease; }; } -const DISABLE_CACHE = { - headers: { - 'If-None-Match': '', - }, -}; - export class PluginApiClient implements IPluginApiClient { private readonly githubAuthApi: OAuthApi; private readonly baseUrl: string; @@ -331,7 +370,7 @@ export class PluginApiClient implements IPluginApiClient { return this.host; } - public getRepoPath({ owner, repo }: PartialProject) { + public getRepoPath({ owner, repo }: OwnerRepo) { return `${owner}/${repo}`; } @@ -385,7 +424,7 @@ export class PluginApiClient implements IPluginApiClient { releaseBranchName, }: { releaseBranchName?: string; - } & PartialProject) { + } & OwnerRepo) { const { octokit } = await this.getOctokit(); const recentCommitsResponse = await octokit.repos.listCommits({ owner, @@ -408,7 +447,7 @@ export class PluginApiClient implements IPluginApiClient { })); } - async getLatestRelease({ owner, repo }: PartialProject) { + async getLatestRelease({ owner, repo }: OwnerRepo) { const { octokit } = await this.getOctokit(); const { data: latestReleases } = await octokit.repos.listReleases({ owner, @@ -418,26 +457,22 @@ export class PluginApiClient implements IPluginApiClient { }); if (latestReleases.length === 0) { - return { - latestRelease: null, - }; + return null; } const latestRelease = latestReleases[0]; return { - latestRelease: { - targetCommitish: latestRelease.target_commitish, - tagName: latestRelease.tag_name, - prerelease: latestRelease.prerelease, - id: latestRelease.id, - htmlUrl: latestRelease.html_url, - body: latestRelease.body, - }, + targetCommitish: latestRelease.target_commitish, + tagName: latestRelease.tag_name, + prerelease: latestRelease.prerelease, + id: latestRelease.id, + htmlUrl: latestRelease.html_url, + body: latestRelease.body, }; } - async getRepository({ owner, repo }: PartialProject) { + async getRepository({ owner, repo }: OwnerRepo) { const { octokit } = await this.getOctokit(); const { data: repository } = await octokit.repos.get({ owner, @@ -446,11 +481,9 @@ export class PluginApiClient implements IPluginApiClient { }); return { - repository: { - pushPermissions: repository.permissions?.push, - defaultBranch: repository.default_branch, - name: repository.name, - }, + pushPermissions: repository.permissions?.push, + defaultBranch: repository.default_branch, + name: repository.name, }; } @@ -458,7 +491,9 @@ export class PluginApiClient implements IPluginApiClient { owner, repo, defaultBranch, - }: { defaultBranch: string } & PartialProject) { + }: { + defaultBranch: GetRepositoryResult['defaultBranch']; + } & OwnerRepo) { const { octokit } = await this.getOctokit(); const { data: latestCommit } = await octokit.repos.getCommit({ owner, @@ -480,7 +515,9 @@ export class PluginApiClient implements IPluginApiClient { owner, repo, branchName, - }: { branchName: string } & PartialProject) { + }: { + branchName: string; + } & OwnerRepo) { const { octokit } = await this.getOctokit(); const { data: branch } = await octokit.repos.getBranch({ @@ -515,7 +552,7 @@ export class PluginApiClient implements IPluginApiClient { }: { mostRecentSha: string; targetBranch: string; - } & PartialProject) => { + } & OwnerRepo) => { const { octokit } = await this.getOctokit(); const createRefResponse = await octokit.git.createRef({ owner, @@ -537,7 +574,7 @@ export class PluginApiClient implements IPluginApiClient { }: { previousReleaseBranch: string; nextReleaseBranch: string; - } & PartialProject) => { + } & OwnerRepo) => { const { octokit } = await this.getOctokit(); const compareCommitsResponse = await octokit.repos.compareCommits({ owner, @@ -560,7 +597,7 @@ export class PluginApiClient implements IPluginApiClient { }: { nextGitHubInfo: ReturnType; releaseBody: string; - } & PartialProject) => { + } & OwnerRepo) => { const { octokit } = await this.getOctokit(); const createReleaseResponse = await octokit.repos.createRelease({ owner, @@ -573,11 +610,9 @@ export class PluginApiClient implements IPluginApiClient { }); return { - createReleaseResponse: { - name: createReleaseResponse.data.name, - htmlUrl: createReleaseResponse.data.html_url, - tagName: createReleaseResponse.data.tag_name, - }, + name: createReleaseResponse.data.name, + htmlUrl: createReleaseResponse.data.html_url, + tagName: createReleaseResponse.data.tag_name, }; }, }; @@ -592,10 +627,8 @@ export class PluginApiClient implements IPluginApiClient { }: { tagParts: SemverTagParts | CalverTagParts; releaseBranchTree: string; - selectedPatchCommit: UnboxArray< - ApiMethodRetval - >; - } & PartialProject) => { + selectedPatchCommit: GetRecentCommitsResultSingle; + } & OwnerRepo) => { const { octokit } = await this.getOctokit(); const { data: tempCommit } = await octokit.git.createCommit({ owner, @@ -618,15 +651,14 @@ export class PluginApiClient implements IPluginApiClient { tempCommit, }: { releaseBranchName: string; - tempCommit: ApiMethodRetval< - IPluginApiClient['patch']['createTempCommit'] - >; - } & PartialProject) => { + tempCommit: CreateTempCommitResult; + } & OwnerRepo) => { const { octokit } = await this.getOctokit(); + // await octokit.request("PATCH reposrefs") await octokit.git.updateRef({ owner, repo, - ref: releaseBranchName, + ref: `heads/${releaseBranchName}`, sha: tempCommit.sha, force: true, }); @@ -637,7 +669,7 @@ export class PluginApiClient implements IPluginApiClient { repo, base, head, - }: { base: string; head: string } & PartialProject) => { + }: { base: string; head: string } & OwnerRepo) => { const { octokit } = await this.getOctokit(); const { data: merge } = await octokit.repos.merge({ owner, @@ -666,12 +698,10 @@ export class PluginApiClient implements IPluginApiClient { releaseBranchSha, }: { bumpedTag: string; - selectedPatchCommit: UnboxArray< - ApiMethodRetval - >; + selectedPatchCommit: GetRecentCommitsResultSingle; mergeTree: string; releaseBranchSha: string; - } & PartialProject) => { + } & OwnerRepo) => { const { octokit } = await this.getOctokit(); const { data: cherryPickCommit } = await octokit.git.createCommit({ owner, @@ -694,15 +724,13 @@ export class PluginApiClient implements IPluginApiClient { cherryPickCommit, }: { releaseBranchName: string; - cherryPickCommit: ApiMethodRetval< - IPluginApiClient['patch']['createCherryPickCommit'] - >; - } & PartialProject) => { + cherryPickCommit: CreateCherryPickCommitResult; + } & OwnerRepo) => { const { octokit } = await this.getOctokit(); const { data: updatedReference } = await octokit.git.updateRef({ owner, repo, - ref: releaseBranchName, + ref: `heads/${releaseBranchName}`, sha: cherryPickCommit.sha, force: true, }); @@ -722,10 +750,8 @@ export class PluginApiClient implements IPluginApiClient { updatedReference, }: { bumpedTag: string; - updatedReference: ApiMethodRetval< - IPluginApiClient['patch']['replaceTempCommit'] - >; - } & PartialProject) => { + updatedReference: ReplaceTempCommitResult; + } & OwnerRepo) => { const { octokit } = await this.getOctokit(); const { data: createdTagObject } = await octokit.git.createTag({ owner, @@ -750,10 +776,8 @@ export class PluginApiClient implements IPluginApiClient { createdTagObject, }: { bumpedTag: string; - createdTagObject: ApiMethodRetval< - IPluginApiClient['patch']['createTagObject'] - >; - } & PartialProject) => { + createdTagObject: CreateTagObjectResult; + } & OwnerRepo) => { const { octokit } = await this.getOctokit(); const { data: reference } = await octokit.git.createRef({ owner, @@ -776,14 +800,10 @@ export class PluginApiClient implements IPluginApiClient { selectedPatchCommit, }: { bumpedTag: string; - latestRelease: NonNullable< - ApiMethodRetval['latestRelease'] - >; + latestRelease: NonNullable; tagParts: SemverTagParts | CalverTagParts; - selectedPatchCommit: UnboxArray< - ApiMethodRetval - >; - } & PartialProject) => { + selectedPatchCommit: GetRecentCommitsResultSingle; + } & OwnerRepo) => { const { octokit } = await this.getOctokit(); const { data: updatedRelease } = await octokit.repos.updateRelease({ owner, @@ -792,9 +812,9 @@ export class PluginApiClient implements IPluginApiClient { tag_name: bumpedTag, body: `${latestRelease.body} - #### [Patch ${tagParts.patch}](${selectedPatchCommit.htmlUrl}) +#### [Patch ${tagParts.patch}](${selectedPatchCommit.htmlUrl}) - ${selectedPatchCommit.commit.message}`, +${selectedPatchCommit.commit.message}`, }); return { @@ -812,11 +832,9 @@ export class PluginApiClient implements IPluginApiClient { releaseId, releaseVersion, }: { - releaseId: NonNullable< - ApiMethodRetval['latestRelease'] - >['id']; + releaseId: NonNullable['id']; releaseVersion: string; - } & PartialProject) => { + } & OwnerRepo) => { const { octokit } = await this.getOctokit(); const { data: promotedRelease } = await octokit.repos.updateRelease({ owner, diff --git a/plugins/github-release-manager/src/cards/createRc/CreateRc.test.tsx b/plugins/github-release-manager/src/cards/createRc/CreateRc.test.tsx index f200a29fc5..f9d6c9a248 100644 --- a/plugins/github-release-manager/src/cards/createRc/CreateRc.test.tsx +++ b/plugins/github-release-manager/src/cards/createRc/CreateRc.test.tsx @@ -18,13 +18,13 @@ import React from 'react'; import { render } from '@testing-library/react'; import { + mockApiClient, mockCalverProject, mockNextGitHubInfo, - mockRcRelease, + mockReleaseCandidate, mockReleaseBranch, - mockReleaseVersion, + mockReleaseVersionCalver, mockSemverProject, - mockApiClient, } from '../../test-helpers/test-helpers'; import { TEST_IDS } from '../../test-helpers/test-ids'; @@ -46,7 +46,7 @@ describe('CreateRc', () => { const { getByTestId } = render( , ); @@ -60,7 +60,7 @@ describe('CreateRc', () => { const { getByTestId } = render( , ); diff --git a/plugins/github-release-manager/src/cards/createRc/CreateRc.tsx b/plugins/github-release-manager/src/cards/createRc/CreateRc.tsx index ba3733e88f..a71359af06 100644 --- a/plugins/github-release-manager/src/cards/createRc/CreateRc.tsx +++ b/plugins/github-release-manager/src/cards/createRc/CreateRc.tsx @@ -26,27 +26,27 @@ import { } from '@material-ui/core'; import { useAsyncFn } from 'react-use'; +import { ComponentConfigCreateRc } from '../../types/types'; import { createRc } from './sideEffects/createRc'; import { Differ } from '../../components/Differ'; import { getRcGitHubInfo } from './getRcGitHubInfo'; import { InfoCardPlus } from '../../components/InfoCardPlus'; -import { ComponentConfigCreateRc } from '../../types/types'; import { ResponseStepList } from '../../components/ResponseStepList/ResponseStepList'; import { SEMVER_PARTS } from '../../constants/constants'; import { TEST_IDS } from '../../test-helpers/test-ids'; import { usePluginApiClientContext } from '../../contexts/PluginApiClientContext'; import { useProjectContext } from '../../contexts/ProjectContext'; import { useStyles } from '../../styles/styles'; -import { ApiMethodRetval, IPluginApiClient } from '../../api/PluginApiClient'; +import { + GetBranchResult, + GetLatestReleaseResult, + GetRepositoryResult, +} from '../../api/PluginApiClient'; interface CreateRcProps { - defaultBranch: ApiMethodRetval< - IPluginApiClient['getRepository'] - >['repository']['defaultBranch']; - latestRelease: ApiMethodRetval< - IPluginApiClient['getLatestRelease'] - >['latestRelease']; - releaseBranch: ApiMethodRetval | null; + defaultBranch: GetRepositoryResult['defaultBranch']; + latestRelease: GetLatestReleaseResult; + releaseBranch: GetBranchResult | null; successCb?: ComponentConfigCreateRc['successCb']; } diff --git a/plugins/github-release-manager/src/cards/createRc/getRcGitHubInfo.test.ts b/plugins/github-release-manager/src/cards/createRc/getRcGitHubInfo.test.ts index 31f9b6a4f4..6b1feca055 100644 --- a/plugins/github-release-manager/src/cards/createRc/getRcGitHubInfo.test.ts +++ b/plugins/github-release-manager/src/cards/createRc/getRcGitHubInfo.test.ts @@ -16,10 +16,11 @@ import { DateTime } from 'luxon'; -import { ApiMethodRetval, IPluginApiClient } from '../../api/PluginApiClient'; import { mockSemverProject, mockCalverProject, + mockReleaseVersionCalver, + mockReleaseVersionSemver, } from '../../test-helpers/test-helpers'; import { getRcGitHubInfo } from './getRcGitHubInfo'; @@ -33,15 +34,11 @@ describe('getRcGitHubInfo', () => { }); describe('calver', () => { - const latestRelease = { - tagName: 'rc-2020.01.01_0', - } as ApiMethodRetval['latestRelease']; - it('should return correct GitHub info', () => { expect( getRcGitHubInfo({ project: mockCalverProject, - latestRelease, + latestRelease: mockReleaseVersionCalver, semverBumpLevel: 'minor', injectedDate: '2021.01.28', }), @@ -56,22 +53,18 @@ describe('getRcGitHubInfo', () => { }); describe('semver', () => { - const latestRelease = { - tagName: 'rc-1.1.1', - } as ApiMethodRetval['latestRelease']; - it("should return correct GitHub info when there's previous releases", () => { expect( getRcGitHubInfo({ project: mockSemverProject, - latestRelease, + latestRelease: mockReleaseVersionSemver, semverBumpLevel: 'minor', }), ).toMatchInlineSnapshot(` Object { - "rcBranch": "rc/1.2.0", - "rcReleaseTag": "rc-1.2.0", - "releaseName": "Version 1.2.0", + "rcBranch": "rc/1.3.0", + "rcReleaseTag": "rc-1.3.0", + "releaseName": "Version 1.3.0", } `); }); diff --git a/plugins/github-release-manager/src/cards/createRc/getRcGitHubInfo.ts b/plugins/github-release-manager/src/cards/createRc/getRcGitHubInfo.ts index de70da6f9c..d7e63740c2 100644 --- a/plugins/github-release-manager/src/cards/createRc/getRcGitHubInfo.ts +++ b/plugins/github-release-manager/src/cards/createRc/getRcGitHubInfo.ts @@ -17,10 +17,10 @@ import { DateTime } from 'luxon'; import { getBumpedSemverTagParts } from '../../helpers/getBumpedTag'; +import { GetLatestReleaseResult } from '../../api/PluginApiClient'; import { getSemverTagParts } from '../../helpers/tagParts/getSemverTagParts'; -import { SEMVER_PARTS } from '../../constants/constants'; import { Project } from '../../contexts/ProjectContext'; -import { ApiMethodRetval, IPluginApiClient } from '../../api/PluginApiClient'; +import { SEMVER_PARTS } from '../../constants/constants'; export const getRcGitHubInfo = ({ project, @@ -29,9 +29,7 @@ export const getRcGitHubInfo = ({ injectedDate = DateTime.now().toFormat('yyyy.MM.dd'), }: { project: Project; - latestRelease: ApiMethodRetval< - IPluginApiClient['getLatestRelease'] - >['latestRelease']; + latestRelease: GetLatestReleaseResult; semverBumpLevel: keyof typeof SEMVER_PARTS; injectedDate?: string; }) => { diff --git a/plugins/github-release-manager/src/cards/createRc/sideEffects/createRc.test.ts b/plugins/github-release-manager/src/cards/createRc/sideEffects/createRc.test.ts index 2f0b351973..824290bbb7 100644 --- a/plugins/github-release-manager/src/cards/createRc/sideEffects/createRc.test.ts +++ b/plugins/github-release-manager/src/cards/createRc/sideEffects/createRc.test.ts @@ -19,7 +19,7 @@ import { mockCalverProject, mockDefaultBranch, mockNextGitHubInfo, - mockReleaseVersion, + mockReleaseVersionCalver, } from '../../../test-helpers/test-helpers'; import { createRc } from './createRc'; @@ -29,7 +29,7 @@ describe('createRc', () => { it('should work', async () => { const result = await createRc({ defaultBranch: mockDefaultBranch, - latestRelease: mockReleaseVersion, + latestRelease: mockReleaseVersionCalver, nextGitHubInfo: mockNextGitHubInfo, pluginApiClient: mockApiClient, project: mockCalverProject, diff --git a/plugins/github-release-manager/src/cards/createRc/sideEffects/createRc.ts b/plugins/github-release-manager/src/cards/createRc/sideEffects/createRc.ts index b7b37bd143..06c408f022 100644 --- a/plugins/github-release-manager/src/cards/createRc/sideEffects/createRc.ts +++ b/plugins/github-release-manager/src/cards/createRc/sideEffects/createRc.ts @@ -17,19 +17,16 @@ import { getRcGitHubInfo } from '../getRcGitHubInfo'; import { ComponentConfigCreateRc, ResponseStep } from '../../../types/types'; import { - ApiMethodRetval, + GetLatestReleaseResult, + GetRepositoryResult, IPluginApiClient, } from '../../../api/PluginApiClient'; import { GitHubReleaseManagerError } from '../../../errors/GitHubReleaseManagerError'; import { Project } from '../../../contexts/ProjectContext'; interface CreateRC { - defaultBranch: ApiMethodRetval< - IPluginApiClient['getRepository'] - >['repository']['defaultBranch']; - latestRelease: ApiMethodRetval< - IPluginApiClient['getLatestRelease'] - >['latestRelease']; + defaultBranch: GetRepositoryResult['defaultBranch']; + latestRelease: GetLatestReleaseResult; nextGitHubInfo: ReturnType; pluginApiClient: IPluginApiClient; project: Project; @@ -50,7 +47,8 @@ export async function createRc({ * 1. Get the default branch's most recent commit */ const latestCommit = await pluginApiClient.getLatestCommit({ - ...project, + owner: project.owner, + repo: project.repo, defaultBranch, }); responseSteps.push({ @@ -65,7 +63,8 @@ export async function createRc({ const mostRecentSha = latestCommit.sha; const createdRef = await pluginApiClient.createRc .createRef({ - ...project, + owner: project.owner, + repo: project.repo, mostRecentSha, targetBranch: nextGitHubInfo.rcBranch, }) @@ -90,7 +89,8 @@ export async function createRc({ : defaultBranch; const nextReleaseBranch = nextGitHubInfo.rcBranch; const comparison = await pluginApiClient.createRc.getComparison({ - ...project, + owner: project.owner, + repo: project.repo, previousReleaseBranch, nextReleaseBranch, }); @@ -112,25 +112,24 @@ export async function createRc({ /** * 4. Creates the release itself in GitHub */ - const { - createReleaseResponse, - } = await pluginApiClient.createRc.createRelease({ - ...project, + const createReleaseResult = await pluginApiClient.createRc.createRelease({ + owner: project.owner, + repo: project.repo, nextGitHubInfo: nextGitHubInfo, releaseBody, }); responseSteps.push({ - message: `Created Release Candidate "${createReleaseResponse.name}"`, + message: `Created Release Candidate "${createReleaseResult.name}"`, secondaryMessage: `with tag "${nextGitHubInfo.rcReleaseTag}"`, - link: createReleaseResponse.htmlUrl, + link: createReleaseResult.htmlUrl, }); await successCb?.({ - gitHubReleaseUrl: createReleaseResponse.htmlUrl, - gitHubReleaseName: createReleaseResponse.name, + gitHubReleaseUrl: createReleaseResult.htmlUrl, + gitHubReleaseName: createReleaseResult.name, comparisonUrl: comparison.htmlUrl, previousTag: latestRelease?.tagName, - createdTag: createReleaseResponse.tagName, + createdTag: createReleaseResult.tagName, }); return responseSteps; diff --git a/plugins/github-release-manager/src/cards/info/Info.tsx b/plugins/github-release-manager/src/cards/info/Info.tsx index 05902162d4..a34a249917 100644 --- a/plugins/github-release-manager/src/cards/info/Info.tsx +++ b/plugins/github-release-manager/src/cards/info/Info.tsx @@ -23,13 +23,14 @@ import { TEST_IDS } from '../../test-helpers/test-ids'; import { useProjectContext } from '../../contexts/ProjectContext'; import { useStyles } from '../../styles/styles'; import flowImage from './flow.png'; -import { ApiMethodRetval, IPluginApiClient } from '../../api/PluginApiClient'; +import { + GetBranchResult, + GetLatestReleaseResult, +} from '../../api/PluginApiClient'; interface InfoCardProps { - releaseBranch: ApiMethodRetval | null; - latestRelease: ApiMethodRetval< - IPluginApiClient['getLatestRelease'] - >['latestRelease']; + releaseBranch: GetBranchResult | null; + latestRelease: GetLatestReleaseResult; } export const Info = ({ releaseBranch, latestRelease }: InfoCardProps) => { diff --git a/plugins/github-release-manager/src/cards/patchRc/Patch.tsx b/plugins/github-release-manager/src/cards/patchRc/Patch.tsx index 822c1b09ea..2f184277a1 100644 --- a/plugins/github-release-manager/src/cards/patchRc/Patch.tsx +++ b/plugins/github-release-manager/src/cards/patchRc/Patch.tsx @@ -17,7 +17,10 @@ import React from 'react'; import { Typography } from '@material-ui/core'; -import { ApiMethodRetval, IPluginApiClient } from '../../api/PluginApiClient'; +import { + GetBranchResult, + GetLatestReleaseResult, +} from '../../api/PluginApiClient'; import { ComponentConfigPatch } from '../../types/types'; import { getBumpedTag } from '../../helpers/getBumpedTag'; import { InfoCardPlus } from '../../components/InfoCardPlus'; @@ -27,10 +30,8 @@ import { useProjectContext } from '../../contexts/ProjectContext'; import { useStyles } from '../../styles/styles'; interface PatchProps { - latestRelease: ApiMethodRetval< - IPluginApiClient['getLatestRelease'] - >['latestRelease']; - releaseBranch: ApiMethodRetval | null; + latestRelease: GetLatestReleaseResult; + releaseBranch: GetBranchResult | null; successCb?: ComponentConfigPatch['successCb']; } diff --git a/plugins/github-release-manager/src/cards/patchRc/PatchBody.test.tsx b/plugins/github-release-manager/src/cards/patchRc/PatchBody.test.tsx index 2e0642402d..8562635f82 100644 --- a/plugins/github-release-manager/src/cards/patchRc/PatchBody.test.tsx +++ b/plugins/github-release-manager/src/cards/patchRc/PatchBody.test.tsx @@ -21,9 +21,9 @@ import { mockApiClient, mockBumpedTag, mockCalverProject, - mockRcRelease, + mockReleaseCandidate, mockReleaseBranch, - mockReleaseVersion, + mockReleaseVersionCalver, mockTagParts, } from '../../test-helpers/test-helpers'; @@ -48,7 +48,7 @@ describe('PatchBody', () => { const { getByTestId } = render( , @@ -64,7 +64,7 @@ describe('PatchBody', () => { it('should render not-prerelease description', async () => { const { getByTestId } = render( ['latestRelease'] - >; - releaseBranch: ApiMethodRetval; + latestRelease: NonNullable; + releaseBranch: GetBranchResult; successCb?: ComponentConfigPatch['successCb']; tagParts: NonNullable; } @@ -95,9 +93,7 @@ export const PatchBody = ({ }); const [patchReleaseResponse, patchReleaseFn] = useAsyncFn(async (...args) => { - const selectedPatchCommit: UnboxArray< - ApiMethodRetval - > = args[0]; + const selectedPatchCommit: GetRecentCommitsResultSingle = args[0]; const patchResponseSteps = await patch({ project, pluginApiClient, @@ -242,7 +238,8 @@ export const PatchBody = ({ disabled={commitExistsOnReleaseBranch || !releaseBranch} onClick={() => { const repoPath = pluginApiClient.getRepoPath({ - ...project, + owner: project.owner, + repo: project.repo, }); const host = pluginApiClient.getHost(); @@ -277,16 +274,16 @@ export const PatchBody = ({ ); } - const selectedPatchCommit = - githubDataResponse.value?.recentCommitsOnDefaultBranch[ - checkedCommitIndex - ]; return (