From 496bdbf041edb787bc140d8b1657c7f14fe935d0 Mon Sep 17 00:00:00 2001 From: Erik Engervall Date: Thu, 29 Apr 2021 22:32:14 +0200 Subject: [PATCH] Flatten Api, normalize signatures Signed-off-by: Erik Engervall --- .../src/api/GitReleaseApiClient.test.ts | 16 +- .../src/api/GitReleaseApiClient.ts | 384 +++++++++--------- .../hooks/useCreateReleaseCandidate.ts | 12 +- .../src/features/Patch/hooks/usePatch.ts | 19 +- .../src/features/Stats/helpers/getTagDates.ts | 6 +- .../src/features/Stats/hooks/useGetStats.ts | 4 +- .../src/test-helpers/test-helpers.ts | 76 ++-- 7 files changed, 255 insertions(+), 262 deletions(-) diff --git a/plugins/git-release-manager/src/api/GitReleaseApiClient.test.ts b/plugins/git-release-manager/src/api/GitReleaseApiClient.test.ts index 7d6ce5d0d3..00d1916a3a 100644 --- a/plugins/git-release-manager/src/api/GitReleaseApiClient.test.ts +++ b/plugins/git-release-manager/src/api/GitReleaseApiClient.test.ts @@ -32,14 +32,15 @@ describe('GitReleaseApiClient', () => { expect(gitReleaseApiClient).toMatchInlineSnapshot(` GitReleaseApiClient { "baseUrl": "https://api.github.com", - "createRc": Object { - "createRelease": [Function], - "getComparison": [Function], - }, + "createCommit": [Function], "createRef": [Function], + "createRelease": [Function], "createTagObject": [Function], + "getAllReleases": [Function], + "getAllTags": [Function], "getBranch": [Function], "getCommit": [Function], + "getComparison": [Function], "getHost": [Function], "getLatestRelease": [Function], "getOwners": [Function], @@ -47,6 +48,7 @@ describe('GitReleaseApiClient', () => { "getRepoPath": [Function], "getRepositories": [Function], "getRepository": [Function], + "getSingleTag": [Function], "getUser": [Function], "githubAuthApi": Object { "getAccessToken": [MockFunction], @@ -54,18 +56,12 @@ describe('GitReleaseApiClient', () => { "host": "github.com", "patch": Object { "createCherryPickCommit": [Function], - "createTempCommit": [Function], "forceBranchHeadToTempCommit": [Function], "merge": [Function], "replaceTempCommit": [Function], "updateRelease": [Function], }, "promoteRelease": [Function], - "stats": Object { - "getAllReleases": [Function], - "getAllTags": [Function], - "getSingleTag": [Function], - }, } `); }); diff --git a/plugins/git-release-manager/src/api/GitReleaseApiClient.ts b/plugins/git-release-manager/src/api/GitReleaseApiClient.ts index 81e06be15f..b27997e18b 100644 --- a/plugins/git-release-manager/src/api/GitReleaseApiClient.ts +++ b/plugins/git-release-manager/src/api/GitReleaseApiClient.ts @@ -259,47 +259,50 @@ export class GitReleaseApiClient implements GitReleaseApi { }; }; - createRc: GitReleaseApi['createRc'] = { - getComparison: async ({ owner, repo, base, head }) => { - const { octokit } = await this.getOctokit(); - const compareCommitsResponse = await octokit.repos.compareCommits({ - owner, - repo, - base, - head, - }); - - return { - htmlUrl: compareCommitsResponse.data.html_url, - aheadBy: compareCommitsResponse.data.ahead_by, - }; - }, - - createRelease: async ({ + getComparison: GitReleaseApi['getComparison'] = async ({ + owner, + repo, + base, + head, + }) => { + const { octokit } = await this.getOctokit(); + const compareCommitsResponse = await octokit.repos.compareCommits({ owner, repo, - rcReleaseTag, - releaseName, - rcBranch, - releaseBody, - }) => { - const { octokit } = await this.getOctokit(); - const createReleaseResponse = await octokit.repos.createRelease({ - owner, - repo, - tag_name: rcReleaseTag, - name: releaseName, - target_commitish: rcBranch, - body: releaseBody, - prerelease: true, - }); + base, + head, + }); - return { - name: createReleaseResponse.data.name, - htmlUrl: createReleaseResponse.data.html_url, - tagName: createReleaseResponse.data.tag_name, - }; - }, + return { + htmlUrl: compareCommitsResponse.data.html_url, + aheadBy: compareCommitsResponse.data.ahead_by, + }; + }; + + createRelease: GitReleaseApi['createRelease'] = async ({ + owner, + repo, + tagName, + name, + targetCommitish, + body, + }) => { + const { octokit } = await this.getOctokit(); + const createReleaseResponse = await octokit.repos.createRelease({ + owner, + repo, + tag_name: tagName, + name: name, + target_commitish: targetCommitish, + body, + prerelease: true, + }); + + return { + name: createReleaseResponse.data.name, + htmlUrl: createReleaseResponse.data.html_url, + tagName: createReleaseResponse.data.tag_name, + }; }; createTagObject: GitReleaseApi['createTagObject'] = async ({ @@ -332,41 +335,36 @@ export class GitReleaseApiClient implements GitReleaseApi { }; }; + createCommit: GitReleaseApi['createCommit'] = async ({ + owner, + repo, + message, + tree, + parents, + }) => { + const { octokit } = await this.getOctokit(); + const { data: commit } = await octokit.git.createCommit({ + owner, + repo, + message, + tree, + parents, + }); + + return { + message: commit.message, + sha: commit.sha, + }; + }; + patch: GitReleaseApi['patch'] = { - createTempCommit: async ({ - owner, - repo, - tagParts, - releaseBranchTree, - selectedPatchCommit, - }) => { - const { octokit } = await this.getOctokit(); - const { data: tempCommit } = await octokit.git.createCommit({ - owner, - repo, - message: `Temporary commit for patch ${tagParts.patch}`, - tree: releaseBranchTree, - parents: [selectedPatchCommit.firstParentSha ?? ''], // TODO: Avoid `??` - }); - - return { - message: tempCommit.message, - sha: tempCommit.sha, - }; - }, - - forceBranchHeadToTempCommit: async ({ - owner, - repo, - releaseBranchName, - tempCommit, - }) => { + forceBranchHeadToTempCommit: async ({ owner, repo, ref, sha }) => { const { octokit } = await this.getOctokit(); await octokit.git.updateRef({ owner, repo, - ref: `heads/${releaseBranchName}`, - sha: tempCommit.sha, + ref, + sha, force: true, }); }, @@ -491,61 +489,63 @@ ${selectedPatchCommit.commit.message}`, }; }; - stats: GitReleaseApi['stats'] = { - getAllTags: async ({ owner, repo }) => { - const { octokit } = await this.getOctokit(); + getAllTags: GitReleaseApi['getAllTags'] = async ({ owner, repo }) => { + const { octokit } = await this.getOctokit(); - const tags = await octokit.paginate(octokit.git.listMatchingRefs, { - owner, - repo, - ref: 'tags', - per_page: 100, - ...DISABLE_CACHE, - }); + const tags = await octokit.paginate(octokit.git.listMatchingRefs, { + owner, + repo, + ref: 'tags', + per_page: 100, + ...DISABLE_CACHE, + }); - return tags - .map(tag => ({ - tagName: tag.ref.replace('refs/tags/', ''), - tagSha: tag.object.sha, - tagType: tag.object.type as 'tag' | 'commit', - })) - .reverse(); - }, + return tags + .map(tag => ({ + tagName: tag.ref.replace('refs/tags/', ''), + tagSha: tag.object.sha, + tagType: tag.object.type as 'tag' | 'commit', + })) + .reverse(); + }; - getAllReleases: async ({ owner, repo }) => { - const { octokit } = await this.getOctokit(); + getAllReleases: GitReleaseApi['getAllReleases'] = async ({ owner, repo }) => { + const { octokit } = await this.getOctokit(); - const releases = await octokit.paginate(octokit.repos.listReleases, { - owner, - repo, - per_page: 100, - ...DISABLE_CACHE, - }); + const releases = await octokit.paginate(octokit.repos.listReleases, { + owner, + repo, + per_page: 100, + ...DISABLE_CACHE, + }); - return releases.map(release => ({ - id: release.id, - name: release.name, - tagName: release.tag_name, - createdAt: release.published_at, - htmlUrl: release.html_url, - })); - }, + return releases.map(release => ({ + id: release.id, + name: release.name, + tagName: release.tag_name, + createdAt: release.published_at, + htmlUrl: release.html_url, + })); + }; - getSingleTag: async ({ owner, repo, tagSha }) => { - const { octokit } = await this.getOctokit(); - const singleTag = await octokit.git.getTag({ - owner, - repo, - tag_sha: tagSha, - }); + getSingleTag: GitReleaseApi['getSingleTag'] = async ({ + owner, + repo, + tagSha, + }) => { + const { octokit } = await this.getOctokit(); + const singleTag = await octokit.git.getTag({ + owner, + repo, + tag_sha: tagSha, + }); - return { - date: singleTag.data.tagger.date, - username: singleTag.data.tagger.name, - userEmail: singleTag.data.tagger.email, - objectSha: singleTag.data.object.sha, - }; - }, + return { + date: singleTag.data.tagger.date, + username: singleTag.data.tagger.name, + userEmail: singleTag.data.tagger.email, + objectSha: singleTag.data.object.sha, + }; }; } @@ -654,30 +654,28 @@ export interface GitReleaseApi { objectSha: string; }>; - createRc: { - getComparison: ( - args: { - base: string; - head: string; - } & OwnerRepo, - ) => Promise<{ - htmlUrl: string; - aheadBy: number; - }>; + getComparison: ( + args: { + base: string; + head: string; + } & OwnerRepo, + ) => Promise<{ + htmlUrl: string; + aheadBy: number; + }>; - createRelease: ( - args: { - rcReleaseTag: string; - releaseName: string; - rcBranch: string; - releaseBody: string; - } & OwnerRepo, - ) => Promise<{ - name: string | null; - htmlUrl: string; + createRelease: ( + args: { tagName: string; - }>; - }; + name: string; + targetCommitish: string; + body: string; + } & OwnerRepo, + ) => Promise<{ + name: string | null; + htmlUrl: string; + tagName: string; + }>; createTagObject: ( args: { @@ -692,24 +690,22 @@ export interface GitReleaseApi { tagSha: string; }>; - patch: { - createTempCommit: ( - args: { - tagParts: SemverTagParts | CalverTagParts; - releaseBranchTree: string; - selectedPatchCommit: UnboxArray< - UnboxReturnedPromise - >; - } & OwnerRepo, - ) => Promise<{ + createCommit: ( + args: { message: string; - sha: string; - }>; + tree: string; + parents: string[]; + } & OwnerRepo, + ) => Promise<{ + message: string; + sha: string; + }>; + patch: { forceBranchHeadToTempCommit: ( args: { - releaseBranchName: string; - tempCommit: CreateTempCommitResult; + sha: string; + ref: string; } & OwnerRepo, ) => Promise; @@ -782,40 +778,47 @@ export interface GitReleaseApi { htmlUrl: string; }>; - stats: { - getAllTags: ( - args: OwnerRepo, - ) => Promise< - Array<{ - tagName: string; - tagSha: string; - tagType: 'tag' | 'commit'; - }> - >; + /** + * Used for the Stats feature + */ + getAllTags: ( + args: OwnerRepo, + ) => Promise< + Array<{ + tagName: string; + tagSha: string; + tagType: 'tag' | 'commit'; + }> + >; - getAllReleases: ( - args: OwnerRepo, - ) => Promise< - Array<{ - id: number; - name: string | null; - tagName: string; - createdAt: string | null; - htmlUrl: string; - }> - >; + /** + * Used for the Stats feature + */ + getAllReleases: ( + args: OwnerRepo, + ) => Promise< + Array<{ + id: number; + name: string | null; + tagName: string; + createdAt: string | null; + htmlUrl: string; + }> + >; - getSingleTag: ( - args: { - tagSha: string; - } & OwnerRepo, - ) => Promise<{ - date: string; - username: string; - userEmail: string; - objectSha: string; - }>; - }; + /** + * Used for the Stats feature + */ + getSingleTag: ( + args: { + tagSha: string; + } & OwnerRepo, + ) => Promise<{ + date: string; + username: string; + userEmail: string; + objectSha: string; + }>; } export type GetOwnersResult = UnboxReturnedPromise; @@ -839,13 +842,10 @@ export type GetLatestCommitResult = UnboxReturnedPromise< export type GetBranchResult = UnboxReturnedPromise; export type CreateRefResult = UnboxReturnedPromise; export type GetComparisonResult = UnboxReturnedPromise< - GitReleaseApi['createRc']['getComparison'] + GitReleaseApi['getComparison'] >; export type CreateReleaseResult = UnboxReturnedPromise< - GitReleaseApi['createRc']['createRelease'] ->; -export type CreateTempCommitResult = UnboxReturnedPromise< - GitReleaseApi['patch']['createTempCommit'] + GitReleaseApi['createRelease'] >; export type ForceBranchHeadToTempCommitResult = UnboxReturnedPromise< GitReleaseApi['patch']['forceBranchHeadToTempCommit'] @@ -867,11 +867,11 @@ export type PromoteReleaseResult = UnboxReturnedPromise< GitReleaseApi['promoteRelease'] >; export type GetAllTagsResult = UnboxReturnedPromise< - GitReleaseApi['stats']['getAllTags'] + GitReleaseApi['getAllTags'] >; export type GetAllReleasesResult = UnboxReturnedPromise< - GitReleaseApi['stats']['getAllReleases'] + GitReleaseApi['getAllReleases'] >; export type GetSingleTagResult = UnboxReturnedPromise< - GitReleaseApi['stats']['getSingleTag'] + GitReleaseApi['getSingleTag'] >; diff --git a/plugins/git-release-manager/src/features/CreateReleaseCandidate/hooks/useCreateReleaseCandidate.ts b/plugins/git-release-manager/src/features/CreateReleaseCandidate/hooks/useCreateReleaseCandidate.ts index d7cd38effc..18b606b009 100644 --- a/plugins/git-release-manager/src/features/CreateReleaseCandidate/hooks/useCreateReleaseCandidate.ts +++ b/plugins/git-release-manager/src/features/CreateReleaseCandidate/hooks/useCreateReleaseCandidate.ts @@ -197,7 +197,7 @@ export function useCreateReleaseCandidate({ ? latestRelease.targetCommitish : defaultBranch; const nextReleaseBranch = releaseCandidateGitInfo.rcBranch; - const comparison = await pluginApiClient.createRc + const comparison = await pluginApiClient .getComparison({ owner: project.owner, repo: project.repo, @@ -235,14 +235,14 @@ export function useCreateReleaseCandidate({ abortIfError(getComparisonRes.error); if (!getComparisonRes.value) return undefined; - const createReleaseResult = await pluginApiClient.createRc + const createReleaseResult = await pluginApiClient .createRelease({ owner: project.owner, repo: project.repo, - rcReleaseTag: releaseCandidateGitInfo.rcReleaseTag, - releaseName: releaseCandidateGitInfo.releaseName, - rcBranch: releaseCandidateGitInfo.rcBranch, - releaseBody: getComparisonRes.value.releaseBody, + tagName: releaseCandidateGitInfo.rcReleaseTag, + name: releaseCandidateGitInfo.releaseName, + targetCommitish: releaseCandidateGitInfo.rcBranch, + body: getComparisonRes.value.releaseBody, }) .catch(asyncCatcher); diff --git a/plugins/git-release-manager/src/features/Patch/hooks/usePatch.ts b/plugins/git-release-manager/src/features/Patch/hooks/usePatch.ts index 140648e91a..9ed4073d50 100644 --- a/plugins/git-release-manager/src/features/Patch/hooks/usePatch.ts +++ b/plugins/git-release-manager/src/features/Patch/hooks/usePatch.ts @@ -97,14 +97,15 @@ export function usePatch({ abortIfError(releaseBranchRes.error); if (!releaseBranchRes.value) return undefined; - const tempCommit = await pluginApiClient.patch - .createTempCommit({ + const tempCommit = await pluginApiClient + .createCommit({ owner: project.owner, repo: project.repo, - releaseBranchTree: - releaseBranchRes.value.releaseBranch.commit.commit.tree.sha, - selectedPatchCommit: releaseBranchRes.value.selectedPatchCommit, - tagParts, + message: `Temporary commit for patch ${tagParts.patch}`, + parents: [ + releaseBranchRes.value.selectedPatchCommit.firstParentSha ?? '', + ], + tree: releaseBranchRes.value.releaseBranch.commit.commit.tree.sha, }) .catch(asyncCatcher); @@ -130,8 +131,8 @@ export function usePatch({ .forceBranchHeadToTempCommit({ owner: project.owner, repo: project.repo, - tempCommit: tempCommitRes.value, - releaseBranchName, + sha: tempCommitRes.value.sha, + ref: `heads/${releaseBranchName}`, }) .catch(asyncCatcher); @@ -140,7 +141,7 @@ export function usePatch({ }); return { - great: 'success 🚀', + trigger: 'next step 🚀 ', }; }, [tempCommitRes.value, tempCommitRes.error]); diff --git a/plugins/git-release-manager/src/features/Stats/helpers/getTagDates.ts b/plugins/git-release-manager/src/features/Stats/helpers/getTagDates.ts index 08e10efafe..f69d853ae7 100644 --- a/plugins/git-release-manager/src/features/Stats/helpers/getTagDates.ts +++ b/plugins/git-release-manager/src/features/Stats/helpers/getTagDates.ts @@ -39,12 +39,12 @@ export const getTagDates = async ({ }: GetTagDates) => { if (startTag.tagType === 'tag' && endTag.tagType === 'tag') { const [{ date: startDate }, { date: endDate }] = await Promise.all([ - pluginApiClient.stats.getSingleTag({ + pluginApiClient.getSingleTag({ owner: project.owner, repo: project.repo, tagSha: startTag.tagSha, }), - pluginApiClient.stats.getSingleTag({ + pluginApiClient.getSingleTag({ owner: project.owner, repo: project.repo, tagSha: endTag.tagSha, @@ -126,7 +126,7 @@ async function getCommitFromTag({ project: GetTagDates['project']; tag: GetTagDates['startTag'] | GetTagDates['endTag']; }) { - const singleTag = await pluginApiClient.stats.getSingleTag({ + const singleTag = await pluginApiClient.getSingleTag({ owner: project.owner, repo: project.repo, tagSha: tag.tagSha, diff --git a/plugins/git-release-manager/src/features/Stats/hooks/useGetStats.ts b/plugins/git-release-manager/src/features/Stats/hooks/useGetStats.ts index ed29c09e75..7981a40267 100644 --- a/plugins/git-release-manager/src/features/Stats/hooks/useGetStats.ts +++ b/plugins/git-release-manager/src/features/Stats/hooks/useGetStats.ts @@ -26,11 +26,11 @@ export const useGetStats = () => { const stats = useAsync(async () => { const [allReleases, allTags] = await Promise.all([ - pluginApiClient.stats.getAllReleases({ + pluginApiClient.getAllReleases({ owner: project.owner, repo: project.repo, }), - pluginApiClient.stats.getAllTags({ + pluginApiClient.getAllTags({ owner: project.owner, repo: project.repo, }), diff --git a/plugins/git-release-manager/src/test-helpers/test-helpers.ts b/plugins/git-release-manager/src/test-helpers/test-helpers.ts index ed376c7e4a..883bdd8e0c 100644 --- a/plugins/git-release-manager/src/test-helpers/test-helpers.ts +++ b/plugins/git-release-manager/src/test-helpers/test-helpers.ts @@ -225,35 +225,33 @@ export const mockApiClient: GitReleaseApi = { objectSha: 'mock_createRef_objectSha', })), - createRc: { - createRelease: jest.fn(async () => ({ - name: 'mock_createRelease_name', - htmlUrl: 'mock_createRelease_html_url', - tagName: 'mock_createRelease_tag_name', - })), + createRelease: jest.fn(async () => ({ + name: 'mock_createRelease_name', + htmlUrl: 'mock_createRelease_html_url', + tagName: 'mock_createRelease_tag_name', + })), - getComparison: jest.fn(async () => ({ - htmlUrl: 'mock_compareCommits_html_url', - aheadBy: 1, - })), - }, + getComparison: jest.fn(async () => ({ + htmlUrl: 'mock_compareCommits_html_url', + aheadBy: 1, + })), createTagObject: jest.fn(async () => ({ tagName: 'mock_tag_object_tag', tagSha: 'mock_tag_object_sha', })), + createCommit: jest.fn(async () => ({ + message: 'mock_commit_message', + sha: 'mock_commit_sha', + })), + patch: { createCherryPickCommit: jest.fn(async () => ({ message: 'mock_cherrypick_message', sha: 'mock_cherrypick_sha', })), - createTempCommit: jest.fn(async () => ({ - message: 'mock_commit_message', - sha: 'mock_commit_sha', - })), - forceBranchHeadToTempCommit: jest.fn(async () => undefined), merge: jest.fn(async () => ({ @@ -286,30 +284,28 @@ export const mockApiClient: GitReleaseApi = { htmlUrl: 'mock_release_html_url', })), - stats: { - getAllTags: jest.fn(async () => [ - { - tagName: MOCK_RELEASE_CANDIDATE_TAG_NAME_CALVER, - tagSha: 'mock_sha', - tagType: 'tag' as const, - }, - ]), + getAllTags: jest.fn(async () => [ + { + tagName: MOCK_RELEASE_CANDIDATE_TAG_NAME_CALVER, + tagSha: 'mock_sha', + tagType: 'tag' as const, + }, + ]), - getAllReleases: jest.fn(async () => [ - { - id: 1, - name: 'mock_release_name', - tagName: 'mock_release_tag_name', - createdAt: 'mock_release_published_at', - htmlUrl: 'mock_release_html_url', - }, - ]), + getAllReleases: jest.fn(async () => [ + { + id: 1, + name: 'mock_release_name', + tagName: 'mock_release_tag_name', + createdAt: 'mock_release_published_at', + htmlUrl: 'mock_release_html_url', + }, + ]), - getSingleTag: jest.fn(async () => ({ - date: '2021-04-29T12:48:30.120Z', - username: 'mock_user_single_tag_name', - userEmail: 'mock_user_single_tag_email', - objectSha: 'mock_single_tag_object_sha', - })), - }, + getSingleTag: jest.fn(async () => ({ + date: '2021-04-29T12:48:30.120Z', + username: 'mock_user_single_tag_name', + userEmail: 'mock_user_single_tag_email', + objectSha: 'mock_single_tag_object_sha', + })), };