UNPKG

@italia-tools/faker

Version:

Italian-specific fake data generator based on Faker.js

88 lines (85 loc) 3.28 kB
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 };