aboutsummaryrefslogtreecommitdiff
path: root/src/modules
diff options
context:
space:
mode:
authorMatt Mayer <[email protected]>2023-02-21 15:43:28 +0700
committerGitHub <[email protected]>2023-02-21 08:43:28 +0000
commit0f98518f0906a9660dcdb8993b6cb983c5e4c92f (patch)
treeb5a3fe8c0c270e7b07050a9712d66df8a0774f3d /src/modules
parenta05c3e5fed805c5086a22841a81da0d86ab89386 (diff)
downloadfaker-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.ts67
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,