Skip to content

Commit

Permalink
fix(git): limit need for Intl to specific method (#2172)
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewmayer authored May 27, 2023
1 parent 012ba2c commit a5e73f8
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 18 deletions.
50 changes: 33 additions & 17 deletions src/modules/git/index.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,29 @@
import type { Faker } from '../..';
import { FakerError } from '../../errors/faker-error';
import { deprecated } from '../../internal/deprecated';

const GIT_DATE_FORMAT_BASE = 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',
});
const GIT_TIMEZONE_FORMAT = new Intl.NumberFormat('en', {
minimumIntegerDigits: 4,
maximumFractionDigits: 0,
useGrouping: false,
signDisplay: 'always',
});
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.
Expand Down Expand Up @@ -64,6 +70,8 @@ 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
Expand Down Expand Up @@ -158,6 +166,8 @@ 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'
Expand All @@ -175,6 +185,12 @@ 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 })
Expand Down
34 changes: 33 additions & 1 deletion test/git.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import validator from 'validator';
import { describe, expect, it } from 'vitest';
import { faker } from '../src';
import { faker, FakerError } from '../src';
import { seededTests } from './support/seededRuns';
import { times } from './support/times';

Expand Down Expand Up @@ -114,6 +114,22 @@ describe('git', () => {

expect(commitEntry).not.contains('\r\n');
});

it('should throw if Intl is unavailable', () => {
const backup = globalThis.Intl.DateTimeFormat;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(globalThis as any).Intl.DateTimeFormat = undefined;

expect(() => {
faker.git.commitEntry();
}).toThrow(
new FakerError(
'This method requires an environment which supports Intl.NumberFormat and Intl.DateTimeFormat'
)
);

globalThis.Intl.DateTimeFormat = backup;
});
});

describe('commitMessage', () => {
Expand All @@ -138,6 +154,22 @@ describe('git', () => {
const parts = commitDate.split(' ');
expect(parts.length).toBe(6);
});

it('should throw if Intl is unavailable', () => {
const backup = globalThis.Intl.DateTimeFormat;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(globalThis as any).Intl.DateTimeFormat = undefined;

expect(() => {
faker.git.commitDate();
}).toThrow(
new FakerError(
'This method requires an environment which supports Intl.NumberFormat and Intl.DateTimeFormat'
)
);

globalThis.Intl.DateTimeFormat = backup;
});
});

describe('commitSha', () => {
Expand Down

0 comments on commit a5e73f8

Please sign in to comment.