aboutsummaryrefslogtreecommitdiff
path: root/src/modules/git
diff options
context:
space:
mode:
authorMatt Mayer <[email protected]>2023-07-14 21:11:28 +0100
committerGitHub <[email protected]>2023-07-14 20:11:28 +0000
commitc6323f81339b2371305dd8be38a1946be5140683 (patch)
tree31c26a5244c8560ad5b1764b802c4e126e6ff53f /src/modules/git
parent2afa23f32f4bb52aeecb6189282b37c6c48f7c84 (diff)
downloadfaker-c6323f81339b2371305dd8be38a1946be5140683.tar.xz
faker-c6323f81339b2371305dd8be38a1946be5140683.zip
refactor(git): don't use Intl (#2222)
Diffstat (limited to 'src/modules/git')
-rw-r--r--src/modules/git/index.ts82
1 files changed, 32 insertions, 50 deletions
diff --git a/src/modules/git/index.ts b/src/modules/git/index.ts
index 7528d9bb..26e6e767 100644
--- a/src/modules/git/index.ts
+++ b/src/modules/git/index.ts
@@ -1,30 +1,6 @@
import type { Faker } from '../..';
-import { FakerError } from '../../errors/faker-error';
import { deprecated } from '../../internal/deprecated';
-const GIT_DATE_FORMAT_BASE = Intl?.DateTimeFormat
- ? new Intl.DateTimeFormat('en', {
- weekday: 'short',
- month: 'short',
- day: 'numeric',
- hour: '2-digit',
- hourCycle: 'h24',
- minute: '2-digit',
- second: '2-digit',
- year: 'numeric',
- timeZone: 'UTC',
- })
- : null;
-
-const GIT_TIMEZONE_FORMAT = Intl?.NumberFormat
- ? new Intl.NumberFormat('en', {
- minimumIntegerDigits: 4,
- maximumFractionDigits: 0,
- useGrouping: false,
- signDisplay: 'always',
- })
- : null;
-
/**
* Module to generate git related entries.
*
@@ -70,8 +46,6 @@ export class GitModule {
* 'CRLF' = '\r\n'
* @param options.refDate The date to use as reference point for the commit. Defaults to `new Date()`.
*
- * @throws When the environment does not support `Intl.NumberFormat` and `Intl.DateTimeFormat`.
- *
* @example
* faker.git.commitEntry()
* // commit fe8c38a965d13d9794eb36918cb24cebe49a45c2
@@ -166,8 +140,6 @@ export class GitModule {
* @param options The optional options object.
* @param options.refDate The date to use as reference point for the commit. Defaults to `faker.defaultRefDate()`.
*
- * @throws When the environment does not support `Intl.NumberFormat` and `Intl.DateTimeFormat`.
- *
* @example
* faker.git.commitDate() // 'Mon Nov 7 14:40:58 2022 +0600'
* faker.git.commitDate({ refDate: '2020-01-01' }) // 'Tue Dec 31 05:40:59 2019 -0400'
@@ -185,28 +157,38 @@ export class GitModule {
} = {}
): string {
const { refDate = this.faker.defaultRefDate() } = options;
- // We check if Intl support is missing rather than if GIT_DATE_FORMAT_BASE/GIT_TIMEZONE_FORMAT is null. This allows us to test the error case in environments that do have Intl support by temporarily removing Intl at runtime.
- if (!Intl || !Intl.DateTimeFormat || !Intl.NumberFormat) {
- throw new FakerError(
- 'This method requires an environment which supports Intl.NumberFormat and Intl.DateTimeFormat'
- );
- }
-
- const dateParts = GIT_DATE_FORMAT_BASE.format(
- this.faker.date.recent({ days: 1, refDate })
- )
- .replace(/,/g, '')
- .split(' ');
- [dateParts[3], dateParts[4]] = [dateParts[4], dateParts[3]];
-
- // Timezone offset
- dateParts.push(
- GIT_TIMEZONE_FORMAT.format(
- this.faker.number.int({ min: -11, max: 12 }) * 100
- )
- );
-
- return dateParts.join(' ');
+ // Git uses a non-standard date format for commits by default per https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-log.html
+ // --date=default is the default format, and is based on ctime(3) output. It shows a single line with three-letter day of the week, three-letter month, day-of-month, hour-minute-seconds in "HH:MM:SS" format, followed by 4-digit year, plus timezone information, unless the local time zone is used, e.g. Thu Jan 1 00:00:00 1970 +0000.
+ // To avoid relying on the Intl global which may not be available in all environments, we implement a custom date format using built-in Javascript date functions.
+ const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
+ const months = [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ];
+
+ const date = this.faker.date.recent({ days: 1, refDate });
+ const day = days[date.getUTCDay()];
+ const month = months[date.getUTCMonth()];
+ const dayOfMonth = date.getUTCDate();
+ const hours = date.getUTCHours().toString().padStart(2, '0');
+ const minutes = date.getUTCMinutes().toString().padStart(2, '0');
+ const seconds = date.getUTCSeconds().toString().padStart(2, '0');
+ const year = date.getUTCFullYear();
+ const timezone = this.faker.number.int({ min: -11, max: 12 });
+ const timezoneHours = Math.abs(timezone).toString().padStart(2, '0');
+ const timezoneMinutes = '00';
+ const timezoneSign = timezone >= 0 ? '+' : '-';
+ return `${day} ${month} ${dayOfMonth} ${hours}:${minutes}:${seconds} ${year} ${timezoneSign}${timezoneHours}${timezoneMinutes}`;
}
/**