diff options
| author | Matt Mayer <[email protected]> | 2023-02-21 15:43:28 +0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-02-21 08:43:28 +0000 |
| commit | 0f98518f0906a9660dcdb8993b6cb983c5e4c92f (patch) | |
| tree | b5a3fe8c0c270e7b07050a9712d66df8a0774f3d /src/modules | |
| parent | a05c3e5fed805c5086a22841a81da0d86ab89386 (diff) | |
| download | faker-0f98518f0906a9660dcdb8993b6cb983c5e4c92f.tar.xz faker-0f98518f0906a9660dcdb8993b6cb983c5e4c92f.zip | |
fix(person): avoid repeated last name via new last_name_patterns (#1819)
Diffstat (limited to 'src/modules')
| -rw-r--r-- | src/modules/person/index.ts | 67 |
1 files changed, 47 insertions, 20 deletions
diff --git a/src/modules/person/index.ts b/src/modules/person/index.ts index ccbb8e14..5618110b 100644 --- a/src/modules/person/index.ts +++ b/src/modules/person/index.ts @@ -11,6 +11,7 @@ export type SexType = `${Sex}`; * Select a definition based on given sex. * * @param faker Faker instance. + * @param elementSelectorFn The method used to select the actual element. * @param sex Sex. * @param param2 Definitions. * @param param2.generic Non-sex definitions. @@ -18,17 +19,14 @@ export type SexType = `${Sex}`; * @param param2.male Male definitions. * @returns Definition based on given sex. */ -function selectDefinition( +function selectDefinition<T>( faker: Faker, + elementSelectorFn: (values: T[]) => string, sex: SexType | undefined, // TODO @Shinigami92 2022-03-21: Remove fallback empty object when `strict: true` - { - generic, - female, - male, - }: { generic?: string[]; female?: string[]; male?: string[] } = {} -) { - let values: string[] | undefined; + { generic, female, male }: { generic?: T[]; female?: T[]; male?: T[] } = {} +): string { + let values: T[] | undefined; switch (sex) { case Sex.Female: @@ -52,7 +50,7 @@ function selectDefinition( } } - return faker.helpers.arrayElement(values); + return elementSelectorFn(values); } /** @@ -89,7 +87,7 @@ export class PersonModule { const { first_name, female_first_name, male_first_name } = this.faker.definitions.person; - return selectDefinition(this.faker, sex, { + return selectDefinition(this.faker, this.faker.helpers.arrayElement, sex, { generic: first_name, female: female_first_name, male: male_first_name, @@ -110,14 +108,43 @@ export class PersonModule { * @since 8.0.0 */ lastName(sex?: SexType): string { - const { last_name, female_last_name, male_last_name } = - this.faker.definitions.person; - - return selectDefinition(this.faker, sex, { - generic: last_name, - female: female_last_name, - male: male_last_name, - }); + const { + last_name, + female_last_name, + male_last_name, + last_name_patterns, + male_last_name_patterns, + female_last_name_patterns, + } = this.faker.definitions.person; + + if ( + last_name_patterns != null || + male_last_name_patterns != null || + female_last_name_patterns != null + ) { + const pattern = selectDefinition( + this.faker, + this.faker.helpers.weightedArrayElement, + sex, + { + generic: last_name_patterns, + female: female_last_name_patterns, + male: male_last_name_patterns, + } + ); + return this.faker.helpers.fake(pattern); + } else { + return selectDefinition( + this.faker, + this.faker.helpers.arrayElement, + sex, + { + generic: last_name, + female: female_last_name, + male: male_last_name, + } + ); + } } /** @@ -137,7 +164,7 @@ export class PersonModule { const { middle_name, female_middle_name, male_middle_name } = this.faker.definitions.person; - return selectDefinition(this.faker, sex, { + return selectDefinition(this.faker, this.faker.helpers.arrayElement, sex, { generic: middle_name, female: female_middle_name, male: male_middle_name, @@ -278,7 +305,7 @@ export class PersonModule { const { prefix, female_prefix, male_prefix } = this.faker.definitions.person; - return selectDefinition(this.faker, sex, { + return selectDefinition(this.faker, this.faker.helpers.arrayElement, sex, { generic: prefix, female: female_prefix, male: male_prefix, |
