diff --git a/src/definitions/name.ts b/src/definitions/name.ts index 03bd404d22e..83b15964136 100644 --- a/src/definitions/name.ts +++ b/src/definitions/name.ts @@ -29,6 +29,8 @@ export type NameDefinitions = LocaleEntry<{ * A list of patterns used to generate names. */ name: string[]; + female_name: string[]; + male_name: string[]; title: NameTitleDefinitions; }>; diff --git a/src/locales/ja/name/name.ts b/src/locales/ja/name/name.ts index d58f90c6cb0..40a975f928c 100644 --- a/src/locales/ja/name/name.ts +++ b/src/locales/ja/name/name.ts @@ -1 +1,5 @@ -export default ['{{name.last_name}} {{name.first_name}}']; +export default [ + '{{name.last_name}} {{name.first_name}}', + '{{name.male_last_name}} {{name.male_first_name}}', + '{{name.female_last_name}} {{name.female_first_name}}', +]; diff --git a/src/locales/mk/name/female_name.ts b/src/locales/mk/name/female_name.ts new file mode 100644 index 00000000000..af471e578dd --- /dev/null +++ b/src/locales/mk/name/female_name.ts @@ -0,0 +1,6 @@ +export default [ + '{{name.female_prefix}} {{name.female_first_name}} {{name.female_last_name}}', + '{{name.female_first_name}} {{name.female_last_name}}', + '{{name.female_first_name}} {{name.female_last_name}}', + '{{name.female_first_name}} {{name.female_last_name}}', +]; diff --git a/src/locales/mk/name/index.ts b/src/locales/mk/name/index.ts index 8c6e627e06d..a712d9363b6 100644 --- a/src/locales/mk/name/index.ts +++ b/src/locales/mk/name/index.ts @@ -5,11 +5,13 @@ import type { NameDefinitions } from '../../..'; import female_first_name from './female_first_name'; import female_last_name from './female_last_name'; +import female_name from './female_name'; import female_prefix from './female_prefix'; import first_name from './first_name'; import last_name from './last_name'; import male_first_name from './male_first_name'; import male_last_name from './male_last_name'; +import male_name from './male_name'; import male_prefix from './male_prefix'; import name_ from './name'; import prefix from './prefix'; @@ -26,6 +28,8 @@ const name: NameDefinitions = { male_last_name, male_prefix, name: name_, + male_name, + female_name, prefix, suffix, title, diff --git a/src/locales/mk/name/male_name.ts b/src/locales/mk/name/male_name.ts new file mode 100644 index 00000000000..b0e2e12ca1e --- /dev/null +++ b/src/locales/mk/name/male_name.ts @@ -0,0 +1,6 @@ +export default [ + '{{name.male_prefix}} {{name.male_first_name}} {{name.male_last_name}}', + '{{name.male_first_name}} {{name.male_last_name}}', + '{{name.male_first_name}} {{name.male_last_name}}', + '{{name.male_first_name}} {{name.male_last_name}}', +]; diff --git a/src/modules/name/index.ts b/src/modules/name/index.ts index bdd3bd37795..c687fb04372 100644 --- a/src/modules/name/index.ts +++ b/src/modules/name/index.ts @@ -218,8 +218,8 @@ export class NameModule { const { gender, sex = gender || this.faker.helpers.arrayElement([Sex.Female, Sex.Male]), - firstName = this.firstName(sex), - lastName = this.lastName(sex), + firstName, + lastName, } = options; if (gender) { @@ -231,7 +231,7 @@ export class NameModule { }); } - const nameParts: string[] = []; + const nameParts = []; const prefix = this.faker.helpers.maybe(() => this.prefix(sex), { probability: 0.125, }); @@ -239,19 +239,51 @@ export class NameModule { if (prefix) { nameParts.push(prefix); } - nameParts.push(firstName); nameParts.push(lastName); const suffix = this.faker.helpers.maybe(() => this.suffix(), { probability: 0.125, }); - if (suffix) { nameParts.push(suffix); } + const defaultName = nameParts.join(' '); + + if ( + !this.faker.definitions.name.name || + this.faker.definitions.name.name.length === 0 + ) { + return defaultName; + } + + const fullNamePattern = selectDefinition(this.faker, sex, { + generic: this.faker.definitions.name.name, + female: this.faker.definitions.name.female_name, + male: this.faker.definitions.name.male_name, + }); + + const fullName = this.faker.helpers.mustache(fullNamePattern, { + 'name.gender': () => this.gender(), + 'name.binary_gender': () => this.gender(true), + 'name.prefix': () => this.prefix(sex), + 'name.female_prefix': () => this.prefix(sex), + 'name.male_prefix': () => this.prefix(sex), + 'name.first_name': () => (firstName ? firstName : this.firstName(sex)), + 'name.female_first_name': () => + firstName ? firstName : this.firstName(sex), + 'name.male_first_name': () => + firstName ? firstName : this.firstName(sex), + 'name.middle_name': () => this.middleName(sex), + 'name.female_middle_name': () => this.middleName(sex), + 'name.male_middle_name': () => this.middleName(sex), + 'name.last_name': () => (lastName ? lastName : this.lastName(sex)), + 'name.female_last_name': () => (lastName ? lastName : this.lastName(sex)), + 'name.male_last_name': () => (lastName ? lastName : this.lastName(sex)), + 'name.suffix': () => (suffix ? suffix : this.suffix()), + }); - return nameParts.join(' '); + return fullName; } /** diff --git a/test/__snapshots__/name.spec.ts.snap b/test/__snapshots__/name.spec.ts.snap index 91cb72ebd77..feb8f9df03b 100644 --- a/test/__snapshots__/name.spec.ts.snap +++ b/test/__snapshots__/name.spec.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1 -exports[`name > 42 > findName > noArgs 1`] = `"Sadie Wiegand"`; +exports[`name > 42 > findName > noArgs 1`] = `"Kelli Satterfield V"`; -exports[`name > 42 > findName > with gender 1`] = `"Melanie Schinner"`; +exports[`name > 42 > findName > with gender 1`] = `"Tina Reynolds"`; -exports[`name > 42 > findName > with name 1`] = `"John Doe"`; +exports[`name > 42 > findName > with name 1`] = `"John Doe DDS"`; exports[`name > 42 > findName > with name and gender 1`] = `"John Doe"`; @@ -12,19 +12,19 @@ exports[`name > 42 > firstName > noArgs 1`] = `"Garnet"`; exports[`name > 42 > firstName > with gender 1`] = `"Glen"`; -exports[`name > 42 > fullName > noArgs 1`] = `"Sadie Wiegand"`; +exports[`name > 42 > fullName > noArgs 1`] = `"Kelli Satterfield V"`; exports[`name > 42 > fullName > with all (gender) 1`] = `"John Doe"`; exports[`name > 42 > fullName > with all (sex) 1`] = `"John Doe"`; -exports[`name > 42 > fullName > with firstName 1`] = `"John Schinner"`; +exports[`name > 42 > fullName > with firstName 1`] = `"John Reynolds DDS"`; -exports[`name > 42 > fullName > with gender 1`] = `"Melanie Schinner"`; +exports[`name > 42 > fullName > with gender 1`] = `"Tina Reynolds"`; -exports[`name > 42 > fullName > with lastName 1`] = `"Sadie Doe"`; +exports[`name > 42 > fullName > with lastName 1`] = `"Kelli Doe DDS"`; -exports[`name > 42 > fullName > with sex 1`] = `"Melanie Schinner"`; +exports[`name > 42 > fullName > with sex 1`] = `"Tina Reynolds"`; exports[`name > 42 > gender > noArgs 1`] = `"Gender nonconforming"`; @@ -60,9 +60,9 @@ exports[`name > 42 > suffix > noArgs 1`] = `"III"`; exports[`name > 42 > suffix > with gender 1`] = `"III"`; -exports[`name > 1211 > findName > noArgs 1`] = `"Claude Trantow"`; +exports[`name > 1211 > findName > noArgs 1`] = `"Norman Christiansen"`; -exports[`name > 1211 > findName > with gender 1`] = `"Patti Koelpin"`; +exports[`name > 1211 > findName > with gender 1`] = `"Angelica Fahey"`; exports[`name > 1211 > findName > with name 1`] = `"John Doe"`; @@ -72,19 +72,19 @@ exports[`name > 1211 > firstName > noArgs 1`] = `"Tito"`; exports[`name > 1211 > firstName > with gender 1`] = `"Percy"`; -exports[`name > 1211 > fullName > noArgs 1`] = `"Claude Trantow"`; +exports[`name > 1211 > fullName > noArgs 1`] = `"Norman Christiansen"`; exports[`name > 1211 > fullName > with all (gender) 1`] = `"John Doe"`; exports[`name > 1211 > fullName > with all (sex) 1`] = `"John Doe"`; -exports[`name > 1211 > fullName > with firstName 1`] = `"John Koelpin"`; +exports[`name > 1211 > fullName > with firstName 1`] = `"John Fahey"`; -exports[`name > 1211 > fullName > with gender 1`] = `"Patti Koelpin"`; +exports[`name > 1211 > fullName > with gender 1`] = `"Angelica Fahey"`; -exports[`name > 1211 > fullName > with lastName 1`] = `"Claude Doe"`; +exports[`name > 1211 > fullName > with lastName 1`] = `"Norman Doe"`; -exports[`name > 1211 > fullName > with sex 1`] = `"Patti Koelpin"`; +exports[`name > 1211 > fullName > with sex 1`] = `"Angelica Fahey"`; exports[`name > 1211 > gender > noArgs 1`] = `"Trigender"`; @@ -120,31 +120,31 @@ exports[`name > 1211 > suffix > noArgs 1`] = `"DVM"`; exports[`name > 1211 > suffix > with gender 1`] = `"DVM"`; -exports[`name > 1337 > findName > noArgs 1`] = `"Leona Cronin"`; +exports[`name > 1337 > findName > noArgs 1`] = `"Eva Littel IV"`; -exports[`name > 1337 > findName > with gender 1`] = `"Esther MacGyver"`; +exports[`name > 1337 > findName > with gender 1`] = `"Mrs. Eva Littel"`; -exports[`name > 1337 > findName > with name 1`] = `"John Doe"`; +exports[`name > 1337 > findName > with name 1`] = `"John Doe II"`; -exports[`name > 1337 > findName > with name and gender 1`] = `"John Doe"`; +exports[`name > 1337 > findName > with name and gender 1`] = `"Mrs. John Doe"`; exports[`name > 1337 > firstName > noArgs 1`] = `"Devyn"`; exports[`name > 1337 > firstName > with gender 1`] = `"Ray"`; -exports[`name > 1337 > fullName > noArgs 1`] = `"Leona Cronin"`; +exports[`name > 1337 > fullName > noArgs 1`] = `"Eva Littel IV"`; -exports[`name > 1337 > fullName > with all (gender) 1`] = `"John Doe"`; +exports[`name > 1337 > fullName > with all (gender) 1`] = `"Mrs. John Doe"`; -exports[`name > 1337 > fullName > with all (sex) 1`] = `"John Doe"`; +exports[`name > 1337 > fullName > with all (sex) 1`] = `"Mrs. John Doe"`; -exports[`name > 1337 > fullName > with firstName 1`] = `"John MacGyver"`; +exports[`name > 1337 > fullName > with firstName 1`] = `"John Gottlieb IV"`; -exports[`name > 1337 > fullName > with gender 1`] = `"Esther MacGyver"`; +exports[`name > 1337 > fullName > with gender 1`] = `"Mrs. Eva Littel"`; -exports[`name > 1337 > fullName > with lastName 1`] = `"Leona Doe"`; +exports[`name > 1337 > fullName > with lastName 1`] = `"Eva Doe IV"`; -exports[`name > 1337 > fullName > with sex 1`] = `"Esther MacGyver"`; +exports[`name > 1337 > fullName > with sex 1`] = `"Mrs. Eva Littel"`; exports[`name > 1337 > gender > noArgs 1`] = `"Demigender"`; diff --git a/test/name.spec.ts b/test/name.spec.ts index 35cca232875..a925f1b1ae2 100644 --- a/test/name.spec.ts +++ b/test/name.spec.ts @@ -220,6 +220,16 @@ describe('name', () => { it('should return a male sex-specific name with given firstName and lastName', () => { faker.locale = 'mk'; + /* + '{{name.female_prefix}} {{name.female_first_name}} {{name.female_last_name}}', + '{{name.male_prefix}} {{name.male_first_name}} {{name.male_last_name}}', + '{{name.female_first_name}} {{name.female_last_name}}', + '{{name.female_first_name}} {{name.female_last_name}}', + '{{name.female_first_name}} {{name.female_last_name}}', + '{{name.male_first_name}} {{name.male_last_name}}', + '{{name.male_first_name}} {{name.male_last_name}}', + '{{name.male_first_name}} {{name.male_last_name}}', + */ const male_specific = [ ...faker.definitions.name.male_prefix, 'firstName', @@ -244,7 +254,6 @@ describe('name', () => { it('should return a name with firstName and lastName', () => { const fullName = faker.name.fullName(); - expect(fullName).toBeTypeOf('string'); expect(fullName).toContain(' '); }); @@ -328,6 +337,26 @@ describe('name', () => { expect(male_specific).toContain(part); } }); + + it('If fullNamePattern is defined, it should be configured accordingly.', () => { + faker.locale = 'ja'; + const male_specific = [ + ...faker.definitions.name.prefix, + 'firstName', + 'lastName', + ...faker.definitions.name.suffix, + ]; + const fullName = faker.name.fullName({ + firstName: 'firstName', + lastName: 'lastName', + gender: 'male', + }); + + const parts = fullName.split(' '); + for (const part of parts) { + expect(male_specific).toContain(part); + } + }); }); describe('gender()', () => {