diff options
| author | ST-DDT <[email protected]> | 2024-03-24 13:51:49 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-03-24 12:51:49 +0000 |
| commit | 3485e7eece540b63059e97bd8166d1ffd88334de (patch) | |
| tree | 08474cb5729326a5966f0cda33221c3179f6ddc4 /src/modules | |
| parent | 45150d1ed6d5ce03d0468b938bb5ce4962476966 (diff) | |
| download | faker-3485e7eece540b63059e97bd8166d1ffd88334de.tar.xz faker-3485e7eece540b63059e97bd8166d1ffd88334de.zip | |
refactor(date)!: fail on invalid dates (#2757)
Diffstat (limited to 'src/modules')
| -rw-r--r-- | src/modules/date/index.ts | 117 |
1 files changed, 45 insertions, 72 deletions
diff --git a/src/modules/date/index.ts b/src/modules/date/index.ts index 2729c849..cc8b2d0a 100644 --- a/src/modules/date/index.ts +++ b/src/modules/date/index.ts @@ -5,26 +5,21 @@ import { SimpleModuleBase } from '../../internal/module-base'; import { assertLocaleData } from '../../locale-proxy'; /** - * Converts date passed as a string, number or Date to a Date object. - * If nothing or a non-parsable value is passed, then it will take the value from the given fallback. + * Converts a date passed as a `string`, `number` or `Date` to a valid `Date` object. * * @param date The date to convert. - * @param fallback The fallback date to use if the passed date is not valid. + * @param name The reference name used for error messages. Defaults to `'refDate'`. + * + * @throws If the given date is invalid. */ -function toDate( - date: string | Date | number | undefined, - fallback: () => Date -): Date { - if (date == null) { - return fallback(); - } +function toDate(date: string | Date | number, name: string = 'refDate'): Date { + const converted = new Date(date); - date = new Date(date); - if (Number.isNaN(date.valueOf())) { - date = fallback(); + if (Number.isNaN(converted.valueOf())) { + throw new FakerError(`Invalid ${name} date: ${date.toString()}`); } - return date; + return converted; } /** @@ -56,13 +51,12 @@ export class SimpleDateModule extends SimpleModuleBase { refDate?: string | Date | number; } = {} ): Date { - const { refDate } = options; - - const date = toDate(refDate, this.faker.defaultRefDate); + const { refDate = this.faker.defaultRefDate() } = options; + const time = toDate(refDate).getTime(); return this.between({ - from: new Date(date.getTime() - 1000 * 60 * 60 * 24 * 365), - to: new Date(date.getTime() + 1000 * 60 * 60 * 24 * 365), + from: time - 1000 * 60 * 60 * 24 * 365, + to: time + 1000 * 60 * 60 * 24 * 365, }); } @@ -98,23 +92,18 @@ export class SimpleDateModule extends SimpleModuleBase { refDate?: string | Date | number; } = {} ): Date { - const { years = 1, refDate } = options; + const { years = 1, refDate = this.faker.defaultRefDate() } = options; if (years <= 0) { throw new FakerError('Years must be greater than 0.'); } - const date = toDate(refDate, this.faker.defaultRefDate); - const range = { - min: 1000, - max: years * 365 * 24 * 3600 * 1000, - }; - - let past = date.getTime(); - past -= this.faker.number.int(range); // some time from now to N years ago, in milliseconds - date.setTime(past); + const time = toDate(refDate).getTime(); - return date; + return this.between({ + from: time - years * 365 * 24 * 3600 * 1000, + to: time - 1000, + }); } /** @@ -149,23 +138,18 @@ export class SimpleDateModule extends SimpleModuleBase { refDate?: string | Date | number; } = {} ): Date { - const { years = 1, refDate } = options; + const { years = 1, refDate = this.faker.defaultRefDate() } = options; if (years <= 0) { throw new FakerError('Years must be greater than 0.'); } - const date = toDate(refDate, this.faker.defaultRefDate); - const range = { - min: 1000, - max: years * 365 * 24 * 3600 * 1000, - }; + const time = toDate(refDate).getTime(); - let future = date.getTime(); - future += this.faker.number.int(range); // some time from now to N years later, in milliseconds - date.setTime(future); - - return date; + return this.between({ + from: time + 1000, + to: time + years * 365 * 24 * 3600 * 1000, + }); } /** @@ -192,11 +176,10 @@ export class SimpleDateModule extends SimpleModuleBase { }): Date { const { from, to } = options; - const fromMs = toDate(from, this.faker.defaultRefDate).getTime(); - const toMs = toDate(to, this.faker.defaultRefDate).getTime(); - const dateOffset = this.faker.number.int(toMs - fromMs); + const fromMs = toDate(from, 'from').getTime(); + const toMs = toDate(to, 'to').getTime(); - return new Date(fromMs + dateOffset); + return new Date(this.faker.number.int({ min: fromMs, max: toMs })); } /** @@ -291,23 +274,18 @@ export class SimpleDateModule extends SimpleModuleBase { refDate?: string | Date | number; } = {} ): Date { - const { days = 1, refDate } = options; + const { days = 1, refDate = this.faker.defaultRefDate() } = options; if (days <= 0) { throw new FakerError('Days must be greater than 0.'); } - const date = toDate(refDate, this.faker.defaultRefDate); - const range = { - min: 1000, - max: days * 24 * 3600 * 1000, - }; - - let future = date.getTime(); - future -= this.faker.number.int(range); // some time from now to N days ago, in milliseconds - date.setTime(future); + const time = toDate(refDate).getTime(); - return date; + return this.between({ + from: time - days * 24 * 3600 * 1000, + to: time - 1000, + }); } /** @@ -342,23 +320,18 @@ export class SimpleDateModule extends SimpleModuleBase { refDate?: string | Date | number; } = {} ): Date { - const { days = 1, refDate } = options; + const { days = 1, refDate = this.faker.defaultRefDate() } = options; if (days <= 0) { throw new FakerError('Days must be greater than 0.'); } - const date = toDate(refDate, this.faker.defaultRefDate); - const range = { - min: 1000, - max: days * 24 * 3600 * 1000, - }; + const time = toDate(refDate).getTime(); - let future = date.getTime(); - future += this.faker.number.int(range); // some time from now to N days later, in milliseconds - date.setTime(future); - - return date; + return this.between({ + from: time + 1000, + to: time + days * 24 * 3600 * 1000, + }); } /** @@ -415,9 +388,9 @@ export class SimpleDateModule extends SimpleModuleBase { refDate?: string | Date | number; } = {} ): Date { - const mode = options.mode === 'age' ? 'age' : 'year'; - const refDate = toDate(options.refDate, this.faker.defaultRefDate); - const refYear = refDate.getUTCFullYear(); + const { mode = 'year', refDate = this.faker.defaultRefDate() } = options; + const date = toDate(refDate); + const refYear = date.getUTCFullYear(); // If no min or max is specified, generate a random date between (now - 80) years and (now - 18) years respectively // So that people can still be considered as adults in most cases @@ -426,8 +399,8 @@ export class SimpleDateModule extends SimpleModuleBase { let min: number; let max: number; if (mode === 'age') { - min = new Date(refDate).setUTCFullYear(refYear - (options.max ?? 80) - 1); - max = new Date(refDate).setUTCFullYear(refYear - (options.min ?? 18)); + min = new Date(date).setUTCFullYear(refYear - (options.max ?? 80) - 1); + max = new Date(date).setUTCFullYear(refYear - (options.min ?? 18)); } else { // Avoid generating dates the first and last date of the year // to avoid running into other years depending on the timezone. |
