diff --git a/.changeset/tame-buckets-move.md b/.changeset/tame-buckets-move.md new file mode 100644 index 0000000000..f7ee3deb90 --- /dev/null +++ b/.changeset/tame-buckets-move.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-azure-devops': patch +'@backstage/plugin-azure-devops-backend': patch +'@backstage/plugin-azure-devops-common': minor +--- + +Improved Date handling for the Azure DevOps set of plugins by using strings and letting the frontend handle the conversion to DateTime diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts index 429d608bd6..2cb7d93c0b 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts @@ -48,7 +48,7 @@ describe('AzureDevOpsApi', () => { const inputIdentityRef: IdentityRef = { displayName: 'Jane Doe', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', }; const inputBuild: Build = { @@ -56,9 +56,9 @@ describe('AzureDevOpsApi', () => { buildNumber: 'Build-1', status: BuildStatus.Completed, result: BuildResult.Succeeded, - queueTime: new Date('2020-09-12T06:10:23.9325232Z'), - startTime: new Date('2020-09-12T06:15:23.9325232Z'), - finishTime: new Date('2020-09-12T06:20:23.9325232Z'), + queueTime: new Date('2020-09-12T06:10:23.932Z'), + startTime: new Date('2020-09-12T06:15:23.932Z'), + finishTime: new Date('2020-09-12T06:20:23.932Z'), sourceBranch: 'refs/heads/develop', sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c', definition: inputBuildDefinition, @@ -72,11 +72,11 @@ describe('AzureDevOpsApi', () => { link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1', status: BuildStatus.Completed, result: BuildResult.Succeeded, - queueTime: new Date('2020-09-12T06:10:23.9325232Z'), - startTime: new Date('2020-09-12T06:15:23.9325232Z'), - finishTime: new Date('2020-09-12T06:20:23.9325232Z'), + queueTime: '2020-09-12T06:10:23.932Z', + startTime: '2020-09-12T06:15:23.932Z', + finishTime: '2020-09-12T06:20:23.932Z', source: 'refs/heads/develop (f4f78b31)', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', }; expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild); @@ -93,7 +93,7 @@ describe('AzureDevOpsApi', () => { const inputIdentityRef: IdentityRef = { displayName: 'Jane Doe', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', }; const inputBuild: Build = { @@ -101,9 +101,9 @@ describe('AzureDevOpsApi', () => { buildNumber: 'Build-1', status: BuildStatus.Completed, result: BuildResult.Succeeded, - queueTime: new Date('2020-09-12T06:10:23.9325232Z'), - startTime: new Date('2020-09-12T06:15:23.9325232Z'), - finishTime: new Date('2020-09-12T06:20:23.9325232Z'), + queueTime: new Date('2020-09-12T06:10:23.932Z'), + startTime: new Date('2020-09-12T06:15:23.932Z'), + finishTime: new Date('2020-09-12T06:20:23.932Z'), sourceBranch: 'refs/heads/develop', sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c', definition: undefined, @@ -117,11 +117,11 @@ describe('AzureDevOpsApi', () => { link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1', status: BuildStatus.Completed, result: BuildResult.Succeeded, - queueTime: new Date('2020-09-12T06:10:23.9325232Z'), - startTime: new Date('2020-09-12T06:15:23.9325232Z'), - finishTime: new Date('2020-09-12T06:20:23.9325232Z'), + queueTime: '2020-09-12T06:10:23.932Z', + startTime: '2020-09-12T06:15:23.932Z', + finishTime: '2020-09-12T06:20:23.932Z', source: 'refs/heads/develop (f4f78b31)', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', }; expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild); @@ -138,7 +138,7 @@ describe('AzureDevOpsApi', () => { const inputIdentityRef: IdentityRef = { displayName: 'Jane Doe', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', }; const inputBuild: Build = { @@ -146,9 +146,9 @@ describe('AzureDevOpsApi', () => { buildNumber: 'Build-1', status: undefined, result: BuildResult.Succeeded, - queueTime: new Date('2020-09-12T06:10:23.9325232Z'), - startTime: new Date('2020-09-12T06:15:23.9325232Z'), - finishTime: new Date('2020-09-12T06:20:23.9325232Z'), + queueTime: new Date('2020-09-12T06:10:23.932Z'), + startTime: new Date('2020-09-12T06:15:23.932Z'), + finishTime: new Date('2020-09-12T06:20:23.932Z'), sourceBranch: 'refs/heads/develop', sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c', definition: undefined, @@ -162,11 +162,11 @@ describe('AzureDevOpsApi', () => { link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1', status: BuildStatus.None, result: BuildResult.Succeeded, - queueTime: new Date('2020-09-12T06:10:23.9325232Z'), - startTime: new Date('2020-09-12T06:15:23.9325232Z'), - finishTime: new Date('2020-09-12T06:20:23.9325232Z'), + queueTime: '2020-09-12T06:10:23.932Z', + startTime: '2020-09-12T06:15:23.932Z', + finishTime: '2020-09-12T06:20:23.932Z', source: 'refs/heads/develop (f4f78b31)', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', }; expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild); @@ -183,7 +183,7 @@ describe('AzureDevOpsApi', () => { const inputIdentityRef: IdentityRef = { displayName: 'Jane Doe', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', }; const inputBuild: Build = { @@ -191,9 +191,9 @@ describe('AzureDevOpsApi', () => { buildNumber: 'Build-1', status: BuildStatus.InProgress, result: undefined, - queueTime: new Date('2020-09-12T06:10:23.9325232Z'), - startTime: new Date('2020-09-12T06:15:23.9325232Z'), - finishTime: new Date('2020-09-12T06:20:23.9325232Z'), + queueTime: new Date('2020-09-12T06:10:23.932Z'), + startTime: new Date('2020-09-12T06:15:23.932Z'), + finishTime: new Date('2020-09-12T06:20:23.932Z'), sourceBranch: 'refs/heads/develop', sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c', definition: undefined, @@ -207,11 +207,11 @@ describe('AzureDevOpsApi', () => { link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1', status: BuildStatus.InProgress, result: BuildResult.None, - queueTime: new Date('2020-09-12T06:10:23.9325232Z'), - startTime: new Date('2020-09-12T06:15:23.9325232Z'), - finishTime: new Date('2020-09-12T06:20:23.9325232Z'), + queueTime: '2020-09-12T06:10:23.932Z', + startTime: '2020-09-12T06:15:23.932Z', + finishTime: '2020-09-12T06:20:23.932Z', source: 'refs/heads/develop (f4f78b31)', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', }; expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild); @@ -222,7 +222,7 @@ describe('AzureDevOpsApi', () => { it('should return empty string for link', () => { const inputIdentityRef: IdentityRef = { displayName: 'Jane Doe', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', }; const inputBuild: Build = { @@ -230,9 +230,9 @@ describe('AzureDevOpsApi', () => { buildNumber: 'Build-1', status: BuildStatus.InProgress, result: undefined, - queueTime: new Date('2020-09-12T06:10:23.9325232Z'), - startTime: new Date('2020-09-12T06:15:23.9325232Z'), - finishTime: new Date('2020-09-12T06:20:23.9325232Z'), + queueTime: new Date('2020-09-12T06:10:23.932Z'), + startTime: new Date('2020-09-12T06:15:23.932Z'), + finishTime: new Date('2020-09-12T06:20:23.932Z'), sourceBranch: 'refs/heads/develop', sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c', definition: undefined, @@ -246,11 +246,11 @@ describe('AzureDevOpsApi', () => { link: '', status: BuildStatus.InProgress, result: BuildResult.None, - queueTime: new Date('2020-09-12T06:10:23.9325232Z'), - startTime: new Date('2020-09-12T06:15:23.9325232Z'), - finishTime: new Date('2020-09-12T06:20:23.9325232Z'), + queueTime: '2020-09-12T06:10:23.932Z', + startTime: '2020-09-12T06:15:23.932Z', + finishTime: '2020-09-12T06:20:23.932Z', source: 'refs/heads/develop (f4f78b31)', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', }; expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild); @@ -265,7 +265,7 @@ describe('AzureDevOpsApi', () => { const inputIdentityRef: IdentityRef = { displayName: 'Jane Doe', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', }; const inputPullRequest: GitPullRequest = { @@ -273,7 +273,7 @@ describe('AzureDevOpsApi', () => { repository: inputGitRepository, title: 'My Awesome New Feature', createdBy: inputIdentityRef, - creationDate: new Date('2020-09-12T06:10:23.9325232Z'), + creationDate: new Date('2020-09-12T06:10:23.932Z'), sourceRefName: 'refs/heads/topic/super-awesome-feature', targetRefName: 'refs/heads/main', status: PullRequestStatus.Active, @@ -287,9 +287,9 @@ describe('AzureDevOpsApi', () => { pullRequestId: 7181, repoName: 'super-feature-repo', title: 'My Awesome New Feature', - uniqueName: 'DOMAINjdoe', + uniqueName: 'DOMAIN\\jdoe', createdBy: 'Jane Doe', - creationDate: new Date('2020-09-12T06:10:23.9325232Z'), + creationDate: '2020-09-12T06:10:23.932Z', sourceRefName: 'refs/heads/topic/super-awesome-feature', targetRefName: 'refs/heads/main', status: PullRequestStatus.Active, diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index 1ed1f1d5f5..23ea3311f0 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -149,9 +149,9 @@ export function mappedRepoBuild(build: Build): RepoBuild { link: build._links?.web.href ?? '', status: build.status ?? BuildStatus.None, result: build.result ?? BuildResult.None, - queueTime: build.queueTime, - startTime: build.startTime, - finishTime: build.finishTime, + queueTime: build.queueTime?.toISOString(), + startTime: build.startTime?.toISOString(), + finishTime: build.finishTime?.toISOString(), source: `${build.sourceBranch} (${build.sourceVersion?.substr(0, 8)})`, uniqueName: build.requestedFor?.uniqueName ?? 'N/A', }; @@ -167,7 +167,7 @@ export function mappedPullRequest( title: pullRequest.title, uniqueName: pullRequest.createdBy?.uniqueName ?? 'N/A', createdBy: pullRequest.createdBy?.displayName ?? 'N/A', - creationDate: pullRequest.creationDate, + creationDate: pullRequest.creationDate?.toISOString(), sourceRefName: pullRequest.sourceRefName, targetRefName: pullRequest.targetRefName, status: pullRequest.status, diff --git a/plugins/azure-devops-backend/src/service/router.test.ts b/plugins/azure-devops-backend/src/service/router.test.ts index f5d533d2d8..ce5f712392 100644 --- a/plugins/azure-devops-backend/src/service/router.test.ts +++ b/plugins/azure-devops-backend/src/service/router.test.ts @@ -152,7 +152,7 @@ describe('createRouter', () => { link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1', status: BuildStatus.Completed, result: BuildResult.PartiallySucceeded, - queueTime: undefined, + queueTime: '2020-09-12T06:10:23.932Z', source: 'refs/heads/develop (f4f78b31)', }; @@ -162,7 +162,7 @@ describe('createRouter', () => { link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=2', status: BuildStatus.InProgress, result: BuildResult.None, - queueTime: undefined, + queueTime: '2020-09-12T06:10:23.932Z', source: 'refs/heads/develop (13c988d4)', }; @@ -172,7 +172,7 @@ describe('createRouter', () => { link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=3', status: BuildStatus.Completed, result: BuildResult.Succeeded, - queueTime: undefined, + queueTime: '2020-09-12T06:10:23.932Z', source: 'refs/heads/develop (9bedf678)', }; @@ -205,7 +205,7 @@ describe('createRouter', () => { repoName: 'super-feature-repo', title: 'My Awesome New Feature', createdBy: 'Jane Doe', - creationDate: undefined, + creationDate: '2020-09-12T06:10:23.932Z', sourceRefName: 'refs/heads/topic/super-awesome-feature', targetRefName: 'refs/heads/main', status: PullRequestStatus.Active, @@ -218,7 +218,7 @@ describe('createRouter', () => { repoName: 'super-feature-repo', title: 'Refactoring My Awesome New Feature', createdBy: 'Jane Doe', - creationDate: undefined, + creationDate: '2020-09-12T06:10:23.932Z', sourceRefName: 'refs/heads/topic/refactor-super-awesome-feature', targetRefName: 'refs/heads/main', status: PullRequestStatus.Active, @@ -231,7 +231,7 @@ describe('createRouter', () => { repoName: 'super-feature-repo', title: 'Bug Fix for My Awesome New Feature', createdBy: 'Jane Doe', - creationDate: undefined, + creationDate: '2020-09-12T06:10:23.932Z', sourceRefName: 'refs/heads/topic/fix-super-awesome-feature', targetRefName: 'refs/heads/main', status: PullRequestStatus.Active, diff --git a/plugins/azure-devops-common/api-report.md b/plugins/azure-devops-common/api-report.md index f03c0b4059..71f0b8b807 100644 --- a/plugins/azure-devops-common/api-report.md +++ b/plugins/azure-devops-common/api-report.md @@ -36,7 +36,7 @@ export type PullRequest = { title?: string; uniqueName?: string; createdBy?: string; - creationDate?: Date; + creationDate?: string; sourceRefName?: string; targetRefName?: string; status?: PullRequestStatus; @@ -72,9 +72,9 @@ export type RepoBuild = { link?: string; status?: BuildStatus; result?: BuildResult; - queueTime?: Date; - startTime?: Date; - finishTime?: Date; + queueTime?: string; + startTime?: string; + finishTime?: string; source: string; uniqueName?: string; }; diff --git a/plugins/azure-devops-common/src/types.ts b/plugins/azure-devops-common/src/types.ts index eacc2af30d..a647f87300 100644 --- a/plugins/azure-devops-common/src/types.ts +++ b/plugins/azure-devops-common/src/types.ts @@ -74,9 +74,9 @@ export type RepoBuild = { link?: string; status?: BuildStatus; result?: BuildResult; - queueTime?: Date; - startTime?: Date; - finishTime?: Date; + queueTime?: string; + startTime?: string; + finishTime?: string; source: string; uniqueName?: string; }; @@ -114,7 +114,7 @@ export type PullRequest = { title?: string; uniqueName?: string; createdBy?: string; - creationDate?: Date; + creationDate?: string; sourceRefName?: string; targetRefName?: string; status?: PullRequestStatus; diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.stories.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.stories.tsx index 76a19155ba..84980b0b51 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.stories.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.stories.tsx @@ -56,7 +56,7 @@ const generateTestData = (rows = 10): RepoBuild[] => { title: `backstage ci - 1.0.0-preview-${rows - i}`, status, result, - queueTime: new Date(Date.now() - i * 60000), + queueTime: new Date(Date.now() - i * 60000).toISOString(), source: 'refs/heads/main', link: '', }); diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx index 5667c65711..c16c836393 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -149,7 +149,10 @@ const columns: TableColumn[] = [ field: 'queueTime', width: 'auto', render: (row: Partial) => - DateTime.fromJSDate(row.queueTime ?? new Date()).toRelative(), + (row.queueTime + ? DateTime.fromISO(row.queueTime) + : DateTime.now() + ).toRelative(), }, ];