@italia-tools/faker
Version:
Italian-specific fake data generator based on Faker.js
88 lines (85 loc) • 3.28 kB
JavaScript
import { WeightedRandomSelector } from '../utils/weightedRandom.mjs';
import { Gender } from '../types/types.mjs';
import { NameUtils } from '../utils/nameUtils.mjs';
import { BehaviorSubject, of, from, lastValueFrom } from 'rxjs';
import { map, catchError, switchMap } from 'rxjs/operators';
class FirstNameModule {
constructor(faker) {
this.faker = faker;
this.commonTitles = {
male: ['Dott.', 'Ing.', 'Avv.', 'Prof.', 'Arch.', 'Rag.'],
female: ['Dott.ssa', 'Ing.', 'Avv.', 'Prof.ssa', 'Arch.', 'Rag.'],
neutral: ['Ing.', 'Avv.', 'Arch.', 'Rag.', 'Geom.']
};
this.dataSubject = new BehaviorSubject(null);
}
loadNameData() {
if (this.dataSubject.getValue()) {
return of(undefined);
}
const femaleNamesPromise = import('../data/femaleFirstNames.json.mjs');
const maleNamesPromise = import('../data/maleFirstNames.json.mjs');
return from(Promise.all([femaleNamesPromise, maleNamesPromise])).pipe(map(([femaleModule, maleModule]) => {
const femaleFirstNames = femaleModule.default;
const maleFirstNames = maleModule.default;
const femaleNamesSelector = new WeightedRandomSelector(femaleFirstNames.items);
const maleNamesSelector = new WeightedRandomSelector(maleFirstNames.items);
this.dataSubject.next({
femaleNamesSelector,
maleNamesSelector
});
}), catchError(error => {
console.error('Error loading name data:', error);
throw error;
}));
}
firstName$(options) {
return this.loadNameData().pipe(switchMap(() => {
const data = this.dataSubject.getValue();
if (!data) {
throw new Error('Name data not initialized');
}
const gender = options?.gender ||
this.faker.helpers.arrayElement([Gender.Male, Gender.Female]);
let name = gender === Gender.Male
? data.maleNamesSelector.select()
: data.femaleNamesSelector.select();
name = NameUtils.formatItalianName(name);
if (options?.prefix) {
return of(this.getNameWithPrefix(name, gender));
}
return of(name);
}), catchError(error => {
console.error('Error generating first name:', error);
return of('');
}));
}
prefix$(gender) {
return of(this.getPrefix(gender));
}
preloadData$() {
return this.loadNameData();
}
async firstName(options) {
return lastValueFrom(this.firstName$(options));
}
async prefix(gender) {
return lastValueFrom(this.prefix$(gender));
}
async preloadData() {
return lastValueFrom(this.preloadData$());
}
getNameWithPrefix(name, gender) {
return `${this.getPrefix(gender)} ${name}`;
}
getPrefix(gender) {
if (!gender) {
return this.faker.helpers.arrayElement(this.commonTitles.neutral);
}
return this.faker.helpers.arrayElement(this.commonTitles[gender]);
}
clearCache() {
this.dataSubject.next(null);
}
}
export { FirstNameModule };