diff --git a/packages/utils/src/lib/formatting.ts b/packages/utils/src/lib/formatting.ts index 682beeccd..c2909ab6f 100644 --- a/packages/utils/src/lib/formatting.ts +++ b/packages/utils/src/lib/formatting.ts @@ -52,6 +52,21 @@ export function formatDuration(duration: number): string { return `${(duration / 1000).toFixed(2)} s`; } +export function formatDate(date: Date): string { + const locale = 'en-US'; // fixed locale to ensure consistency across local defaults execution + return date + .toLocaleString(locale, { + weekday: 'short', + month: 'short', + day: 'numeric', + year: 'numeric', + hour: 'numeric', + minute: '2-digit', + timeZoneName: 'short', + }) + .replace(/\u202F/g, ' '); // see https://github.com/nodejs/node/issues/45171 +} + export function truncateText(text: string, maxChars: number): string { if (text.length <= maxChars) { return text; diff --git a/packages/utils/src/lib/formatting.unit.test.ts b/packages/utils/src/lib/formatting.unit.test.ts index f9bec2635..843221fd9 100644 --- a/packages/utils/src/lib/formatting.unit.test.ts +++ b/packages/utils/src/lib/formatting.unit.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from 'vitest'; import { formatBytes, + formatDate, formatDuration, pluralize, pluralizeToken, @@ -75,6 +76,19 @@ describe('formatDuration', () => { }); }); +describe('formatDate', () => { + it('should produce human-readable date and time in English', () => { + expect(formatDate(new Date('2024-01-23T09:50:09.606Z'))).toBe( + 'Tue, Jan 23, 2024, 9:50 AM UTC', + ); + }); + + // see https://github.com/nodejs/node/issues/45171 + it('should not include narrow non-breaking space', () => { + expect(formatDate(new Date())).not.toMatch(' '); + }); +}); + describe('truncateText', () => { it('should replace overflowing text with ellipsis', () => { expect(truncateText('All work and no play makes Jack a dull boy', 32)).toBe( diff --git a/packages/utils/src/lib/reports/__snapshots__/generate-md-report.integration.test.ts.snap b/packages/utils/src/lib/reports/__snapshots__/generate-md-report.integration.test.ts.snap index 78f0fe639..368c93d26 100644 --- a/packages/utils/src/lib/reports/__snapshots__/generate-md-report.integration.test.ts.snap +++ b/packages/utils/src/lib/reports/__snapshots__/generate-md-report.integration.test.ts.snap @@ -421,7 +421,7 @@ ESLint rule **prefer-arrow-callback**. [📖 Docs](https://eslint.org/docs/lates ## About -Report was created by [Code PushUp](https://github.com/flowup/quality-metrics-cli#readme) on Wed Sep 15 2021 00:00:00 GMT+0000 (Coordinated Universal Time). +Report was created by [Code PushUp](https://github.com/flowup/quality-metrics-cli#readme) on Wed, Sep 15, 2021, 12:00 AM UTC. |Commit|Version|Duration|Plugins|Categories|Audits| |:--|:--:|:--:|:--:|:--:|:--:| diff --git a/packages/utils/src/lib/reports/generate-md-report.ts b/packages/utils/src/lib/reports/generate-md-report.ts index a9a867f7e..702946b96 100644 --- a/packages/utils/src/lib/reports/generate-md-report.ts +++ b/packages/utils/src/lib/reports/generate-md-report.ts @@ -1,5 +1,5 @@ import { AuditReport, CategoryConfig, Issue } from '@code-pushup/models'; -import { formatDuration, slugify } from '../formatting'; +import { formatDate, formatDuration, slugify } from '../formatting'; import { CommitData } from '../git'; import { NEW_LINE } from './constants'; import { @@ -229,7 +229,8 @@ function reportToAboutSection( report: ScoredReport, commitData: CommitData | null, ): string { - const date = new Date().toString(); + const date = formatDate(new Date()); + const { duration, version, plugins, categories } = report; const commitInfo = commitData ? `${commitData.message} (${commitData.hash.slice(0, 7)})`