diff --git a/src/index.ts b/src/index.ts index 8a6b7ecc6b6..42015a69929 100644 --- a/src/index.ts +++ b/src/index.ts @@ -37,8 +37,7 @@ export type { NumberColorFormat, StringColorFormat, } from './modules/color'; -export { Gender } from './modules/name'; -export type { GenderType } from './modules/name'; +export type { Sex } from './modules/name'; export type { ChemicalElement, Unit } from './modules/science'; export { Faker }; diff --git a/src/modules/name/index.ts b/src/modules/name/index.ts index 009b35fc45f..02e35fb749e 100644 --- a/src/modules/name/index.ts +++ b/src/modules/name/index.ts @@ -1,26 +1,26 @@ import type { Faker } from '../..'; -export enum Gender { - female = 'female', - male = 'male', +export enum Sex { + Female = 'female', + Male = 'male', } -export type GenderType = 'female' | 'male'; +type SexValue = `${Sex}`; /** - * Select a definition based on given gender. + * Select a definition based on given sex. * * @param faker Faker instance. - * @param gender Gender. + * @param sex Sex. * @param param2 Definitions. - * @param param2.generic Non-gender definitions. + * @param param2.generic Non-sex definitions. * @param param2.female Female definitions. * @param param2.male Male definitions. - * @returns Definition based on given gender. + * @returns Definition based on given sex. */ function selectDefinition( faker: Faker, - gender: GenderType | undefined, + sex: Sex | SexValue | undefined, // TODO @Shinigami92 2022-03-21: Remove fallback empty object when `strict: true` { generic, @@ -29,13 +29,16 @@ function selectDefinition( }: { generic?: string[]; female?: string[]; male?: string[] } = {} ) { let values: string[] | undefined; - switch (gender) { - case 'female': + + switch (sex) { + case Sex.Female: values = female; break; - case 'male': + + case Sex.Male: values = male; break; + default: values = generic; break; @@ -69,7 +72,7 @@ export class Name { /** * Returns a random first name. * - * @param gender The optional gender to use. + * @param sex The optional sex to use. * Can be either `'female'` or `'male'`. * * @example @@ -77,11 +80,11 @@ export class Name { * faker.name.firstName("female") // 'Victoria' * faker.name.firstName("male") // 'Tom' */ - firstName(gender?: GenderType): string { + firstName(sex?: Sex | SexValue): string { const { first_name, female_first_name, male_first_name } = this.faker.definitions.name; - return selectDefinition(this.faker, gender, { + return selectDefinition(this.faker, sex, { generic: first_name, female: female_first_name, male: male_first_name, @@ -91,7 +94,7 @@ export class Name { /** * Returns a random last name. * - * @param gender The optional gender to use. + * @param sex The optional sex to use. * Can be either `'female'` or `'male'`. * * @example @@ -99,11 +102,11 @@ export class Name { * faker.name.lastName("female") // 'Grady' * faker.name.lastName("male") // 'Barton' */ - lastName(gender?: GenderType): string { + lastName(sex?: Sex | SexValue): string { const { last_name, female_last_name, male_last_name } = this.faker.definitions.name; - return selectDefinition(this.faker, gender, { + return selectDefinition(this.faker, sex, { generic: last_name, female: female_last_name, male: male_last_name, @@ -113,7 +116,7 @@ export class Name { /** * Returns a random middle name. * - * @param gender The optional gender to use. + * @param sex The optional sex to use. * Can be either `'female'` or `'male'`. * * @example @@ -121,11 +124,11 @@ export class Name { * faker.name.middleName("female") // 'Анастасівна' * faker.name.middleName("male") // 'Вікторович' */ - middleName(gender?: GenderType): string { + middleName(sex?: Sex | SexValue): string { const { middle_name, female_middle_name, male_middle_name } = this.faker.definitions.name; - return selectDefinition(this.faker, gender, { + return selectDefinition(this.faker, sex, { generic: middle_name, female: female_middle_name, male: male_middle_name, @@ -137,8 +140,7 @@ export class Name { * * @param firstName The optional first name to use. If not specified a random one will be chosen. * @param lastName The optional last name to use. If not specified a random one will be chosen. - * @param gender The optional gender to use. - * Can be either `'female'` or `'male'`. + * @param sex The optional sex to use. Can be either `'female'` or `'male'`. * * @example * faker.name.findName() // 'Allen Brown' @@ -147,17 +149,22 @@ export class Name { * faker.name.findName(undefined, 'Beer') // 'Mr. Alfonso Beer' * faker.name.findName(undefined, undefined, 'male') // 'Fernando Schaefer' */ - findName(firstName?: string, lastName?: string, gender?: GenderType): string { - const normalizedGender: GenderType = - gender ?? this.faker.helpers.arrayElement(['female', 'male']); + findName( + firstName?: string, + lastName?: string, + sex?: Sex | SexValue + ): string { + const normalizedSex: Sex | SexValue = + sex ?? this.faker.helpers.arrayElement([Sex.Female, Sex.Male]); - firstName = firstName || this.firstName(normalizedGender); - lastName = lastName || this.lastName(normalizedGender); + firstName = firstName || this.firstName(normalizedSex); + lastName = lastName || this.lastName(normalizedSex); const nameParts: string[] = []; - const prefix = this.faker.helpers.maybe(() => this.prefix(gender), { + const prefix = this.faker.helpers.maybe(() => this.prefix(sex), { probability: 0.125, }); + if (prefix) { nameParts.push(prefix); } @@ -168,13 +175,12 @@ export class Name { const suffix = this.faker.helpers.maybe(() => this.suffix(), { probability: 0.125, }); + if (suffix) { nameParts.push(suffix); } - const fullName = nameParts.join(' '); - - return fullName; + return nameParts.join(' '); } /** @@ -199,18 +205,17 @@ export class Name { /** * Returns a random name prefix. * - * @param gender The optional gender to use. - * Can be either `'female'` or `'male'`. + * @param sex The optional sex to use. Can be either `'female'` or `'male'`. * * @example * faker.name.prefix() // 'Miss' * faker.name.prefix('female') // 'Ms.' * faker.name.prefix('male') // 'Mr.' */ - prefix(gender?: GenderType): string { + prefix(sex?: Sex | SexValue): string { const { prefix, female_prefix, male_prefix } = this.faker.definitions.name; - return selectDefinition(this.faker, gender, { + return selectDefinition(this.faker, sex, { generic: prefix, female: female_prefix, male: male_prefix, diff --git a/test/name.spec.ts b/test/name.spec.ts index 1d9f44219b2..ed4a4c5129b 100644 --- a/test/name.spec.ts +++ b/test/name.spec.ts @@ -55,7 +55,7 @@ describe('name', () => { expect(first_name.length).toBeGreaterThan(0); }); - it('should return a gender-specific first name', () => { + it('should return a sex-specific first name', () => { let name = faker.name.firstName('female'); expect(faker.definitions.name.female_first_name).toContain(name); @@ -63,7 +63,7 @@ describe('name', () => { expect(faker.definitions.name.male_first_name).toContain(name); }); - it('should return a gender-specific first name when no gender-specific first name was defined', () => { + it('should return a sex-specific first name when no sex-specific first name was defined', () => { faker.locale = 'az'; faker.localeFallback = 'az'; @@ -88,7 +88,7 @@ describe('name', () => { expect(last_name.length).toBeGreaterThan(0); }); - it('should return a gender-specific last name', () => { + it('should return a sex-specific last name', () => { faker.locale = 'az'; let name = faker.name.lastName('female'); @@ -125,7 +125,7 @@ describe('name', () => { expect(faker.definitions.name.male_middle_name).toContain(name); }); - it('should return a gender-specific middle name', () => { + it('should return a sex-specific middle name', () => { faker.locale = 'uk'; let name = faker.name.middleName('female'); @@ -149,7 +149,7 @@ describe('name', () => { expect(fullName).toContain(' '); }); - it('should return a female gender-specific name with firstName and lastName', () => { + it('should return a female sex-specific name with firstName and lastName', () => { faker.locale = 'mk'; const female_specific = [ @@ -167,7 +167,7 @@ describe('name', () => { } }); - it('should return a male gender-specific name with firstName and lastName', () => { + it('should return a male sex-specific name with firstName and lastName', () => { faker.locale = 'mk'; const male_specific = [ @@ -185,7 +185,7 @@ describe('name', () => { } }); - it('should return a female gender-specific name with given firstName and lastName', () => { + it('should return a female sex-specific name with given firstName and lastName', () => { faker.locale = 'mk'; const male_specific = [ @@ -207,7 +207,7 @@ describe('name', () => { } }); - it('should return a male gender-specific name with given firstName and lastName', () => { + it('should return a male sex-specific name with given firstName and lastName', () => { faker.locale = 'mk'; const male_specific = [