Skip to content

Commit de9f9d6

Browse files
MohdImran001Shinigami92
authored andcommitted
feat: migrate name (#103)
Co-authored-by: Shinigami92 <[email protected]>
1 parent 8fa14c6 commit de9f9d6

File tree

2 files changed

+300
-1
lines changed

2 files changed

+300
-1
lines changed

src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Git } from './git';
55
import { Hacker } from './hacker';
66
import { Helpers } from './helpers';
77
import { Mersenne } from './mersenne';
8+
import { Name } from './name';
89
import { Random } from './random';
910

1011
export interface FakerOptions {
@@ -181,7 +182,7 @@ export class Faker {
181182
readonly internet = new (require('./internet'))(this);
182183
readonly lorem = new (require('./lorem'))(this);
183184
readonly music = new (require('./music'))(this);
184-
readonly name = new (require('./name'))(this);
185+
readonly name: Name = new Name(this);
185186
readonly phone = new (require('./phone_number'))(this);
186187
readonly system = new (require('./system'))(this);
187188
readonly time = new (require('./time'))(this);

src/name.ts

Lines changed: 298 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
1+
import type { Faker } from '.';
2+
3+
export class Name {
4+
constructor(private readonly faker: Faker) {
5+
// Bind `this` so namespaced is working correctly
6+
for (const name of Object.getOwnPropertyNames(Name.prototype)) {
7+
if (name === 'constructor' || typeof this[name] !== 'function') {
8+
continue;
9+
}
10+
this[name] = this[name].bind(this);
11+
}
12+
}
13+
14+
/**
15+
* firstName
16+
*
17+
* @method faker.name.firstName
18+
* @param gender
19+
* @memberof faker.name
20+
*/
21+
firstName(gender?: string | number): string {
22+
if (
23+
typeof this.faker.definitions.name.male_first_name !== 'undefined' &&
24+
typeof this.faker.definitions.name.female_first_name !== 'undefined'
25+
) {
26+
// some locale datasets ( like ru ) have first_name split by gender. since the name.first_name field does not exist in these datasets,
27+
// we must randomly pick a name from either gender array so faker.name.firstName will return the correct locale data ( and not fallback )
28+
29+
if (typeof gender === 'string') {
30+
if (gender.toLowerCase() === 'male') {
31+
gender = 0;
32+
} else if (gender.toLowerCase() === 'female') {
33+
gender = 1;
34+
}
35+
}
36+
37+
if (typeof gender !== 'number') {
38+
if (typeof this.faker.definitions.name.first_name === 'undefined') {
39+
gender = this.faker.datatype.number(1);
40+
} else {
41+
// Fall back to non-gendered names if they exist and gender wasn't specified
42+
return this.faker.random.arrayElement(
43+
this.faker.definitions.name.first_name
44+
);
45+
}
46+
}
47+
if (gender === 0) {
48+
return this.faker.random.arrayElement(
49+
this.faker.definitions.name.male_first_name
50+
);
51+
} else {
52+
return this.faker.random.arrayElement(
53+
this.faker.definitions.name.female_first_name
54+
);
55+
}
56+
}
57+
58+
return this.faker.random.arrayElement(
59+
this.faker.definitions.name.first_name
60+
);
61+
}
62+
63+
/**
64+
* lastName
65+
*
66+
* @method lastName
67+
* @param gender
68+
* @memberof faker.name
69+
*/
70+
lastName(gender?: string | number): string {
71+
if (
72+
typeof this.faker.definitions.name.male_last_name !== 'undefined' &&
73+
typeof this.faker.definitions.name.female_last_name !== 'undefined'
74+
) {
75+
// some locale datasets ( like ru ) have last_name split by gender. i have no idea how last names can have genders, but also i do not speak russian
76+
// see above comment of firstName method
77+
if (typeof gender !== 'number') {
78+
gender = this.faker.datatype.number(1);
79+
}
80+
if (gender === 0) {
81+
return this.faker.random.arrayElement(
82+
this.faker.locales[this.faker.locale].name.male_last_name
83+
);
84+
} else {
85+
return this.faker.random.arrayElement(
86+
this.faker.locales[this.faker.locale].name.female_last_name
87+
);
88+
}
89+
}
90+
91+
return this.faker.random.arrayElement(
92+
this.faker.definitions.name.last_name
93+
);
94+
}
95+
96+
/**
97+
* middleName
98+
*
99+
* @method middleName
100+
* @param gender
101+
* @memberof faker.name
102+
*/
103+
middleName(gender?: string | number): string {
104+
if (
105+
typeof this.faker.definitions.name.male_middle_name !== 'undefined' &&
106+
typeof this.faker.definitions.name.female_middle_name !== 'undefined'
107+
) {
108+
if (typeof gender !== 'number') {
109+
gender = this.faker.datatype.number(1);
110+
}
111+
if (gender === 0) {
112+
return this.faker.random.arrayElement(
113+
this.faker.locales[this.faker.locale].name.male_middle_name
114+
);
115+
} else {
116+
return this.faker.random.arrayElement(
117+
this.faker.locales[this.faker.locale].name.female_middle_name
118+
);
119+
}
120+
}
121+
122+
return this.faker.random.arrayElement(
123+
this.faker.definitions.name.middle_name
124+
);
125+
}
126+
127+
/**
128+
* findName
129+
*
130+
* @method findName
131+
* @param firstName
132+
* @param lastName
133+
* @param gender
134+
* @memberof faker.name
135+
*/
136+
findName(
137+
firstName?: string,
138+
lastName?: string,
139+
gender?: string | number
140+
): string {
141+
const r = this.faker.datatype.number(8);
142+
let prefix: string = '',
143+
suffix: string = '';
144+
145+
// in particular locales first and last names split by gender,
146+
// thus we keep consistency by passing 0 as male and 1 as female
147+
148+
if (typeof gender !== 'number') {
149+
gender = this.faker.datatype.number(1);
150+
}
151+
152+
firstName ||= this.faker.name.firstName(gender);
153+
lastName ||= this.faker.name.lastName(gender);
154+
155+
switch (r) {
156+
case 0:
157+
prefix = this.faker.name.prefix(gender);
158+
if (prefix) {
159+
return prefix + ' ' + firstName + ' ' + lastName;
160+
}
161+
case 1:
162+
suffix = this.faker.name.suffix();
163+
if (suffix) {
164+
return firstName + ' ' + lastName + ' ' + suffix;
165+
}
166+
}
167+
168+
return firstName + ' ' + lastName;
169+
}
170+
171+
/**
172+
* jobTitle
173+
*
174+
* @method jobTitle
175+
* @memberof faker.name
176+
*/
177+
jobTitle(): string {
178+
return (
179+
this.faker.name.jobDescriptor() +
180+
' ' +
181+
this.faker.name.jobArea() +
182+
' ' +
183+
this.faker.name.jobType()
184+
);
185+
}
186+
187+
/**
188+
* gender
189+
*
190+
* @method gender
191+
* @param binary
192+
* @memberof faker.name
193+
*/
194+
gender(binary: boolean): string {
195+
if (binary) {
196+
return this.faker.random.arrayElement(
197+
this.faker.definitions.name.binary_gender
198+
);
199+
} else {
200+
return this.faker.random.arrayElement(this.faker.definitions.name.gender);
201+
}
202+
}
203+
204+
/**
205+
* prefix
206+
*
207+
* @method prefix
208+
* @param gender
209+
* @memberof faker.name
210+
*/
211+
prefix(gender?: string | number): string {
212+
if (
213+
typeof this.faker.definitions.name.male_prefix !== 'undefined' &&
214+
typeof this.faker.definitions.name.female_prefix !== 'undefined'
215+
) {
216+
if (typeof gender !== 'number') {
217+
gender = this.faker.datatype.number(1);
218+
}
219+
if (gender === 0) {
220+
return this.faker.random.arrayElement(
221+
this.faker.locales[this.faker.locale].name.male_prefix
222+
);
223+
} else {
224+
return this.faker.random.arrayElement(
225+
this.faker.locales[this.faker.locale].name.female_prefix
226+
);
227+
}
228+
}
229+
230+
return this.faker.random.arrayElement(this.faker.definitions.name.prefix);
231+
}
232+
233+
/**
234+
* suffix
235+
*
236+
* @method suffix
237+
* @memberof faker.name
238+
*/
239+
suffix(): string {
240+
return this.faker.random.arrayElement(this.faker.definitions.name.suffix);
241+
}
242+
243+
/**
244+
* title
245+
*
246+
* @method title
247+
* @memberof faker.name
248+
*/
249+
title(): string {
250+
var descriptor = this.faker.random.arrayElement(
251+
this.faker.definitions.name.title.descriptor
252+
),
253+
level = this.faker.random.arrayElement(
254+
this.faker.definitions.name.title.level
255+
),
256+
job = this.faker.random.arrayElement(
257+
this.faker.definitions.name.title.job
258+
);
259+
260+
return descriptor + ' ' + level + ' ' + job;
261+
}
262+
263+
/**
264+
* jobDescriptor
265+
*
266+
* @method jobDescriptor
267+
* @memberof faker.name
268+
*/
269+
jobDescriptor(): string {
270+
return this.faker.random.arrayElement(
271+
this.faker.definitions.name.title.descriptor
272+
);
273+
}
274+
275+
/**
276+
* jobArea
277+
*
278+
* @method jobArea
279+
* @memberof faker.name
280+
*/
281+
jobArea(): string {
282+
return this.faker.random.arrayElement(
283+
this.faker.definitions.name.title.level
284+
);
285+
}
286+
287+
/**
288+
* jobType
289+
*
290+
* @method jobType
291+
* @memberof faker.name
292+
*/
293+
jobType(): string {
294+
return this.faker.random.arrayElement(
295+
this.faker.definitions.name.title.job
296+
);
297+
}
298+
}

0 commit comments

Comments
 (0)