@italia-tools/faker
Version:
Italian-specific fake data generator based on Faker.js
90 lines (86 loc) • 3.49 kB
JavaScript
'use strict';
var weightedRandom = require('../utils/weightedRandom.cjs');
var types = require('../types/types.cjs');
var nameUtils = require('../utils/nameUtils.cjs');
var rxjs = require('rxjs');
var operators = require('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 rxjs.BehaviorSubject(null);
}
loadNameData() {
if (this.dataSubject.getValue()) {
return rxjs.of(undefined);
}
const femaleNamesPromise = Promise.resolve().then(function () { return require('../data/femaleFirstNames.json.cjs'); });
const maleNamesPromise = Promise.resolve().then(function () { return require('../data/maleFirstNames.json.cjs'); });
return rxjs.from(Promise.all([femaleNamesPromise, maleNamesPromise])).pipe(operators.map(([femaleModule, maleModule]) => {
const femaleFirstNames = femaleModule.default;
const maleFirstNames = maleModule.default;
const femaleNamesSelector = new weightedRandom.WeightedRandomSelector(femaleFirstNames.items);
const maleNamesSelector = new weightedRandom.WeightedRandomSelector(maleFirstNames.items);
this.dataSubject.next({
femaleNamesSelector,
maleNamesSelector
});
}), operators.catchError(error => {
console.error('Error loading name data:', error);
throw error;
}));
}
firstName$(options) {
return this.loadNameData().pipe(operators.switchMap(() => {
const data = this.dataSubject.getValue();
if (!data) {
throw new Error('Name data not initialized');
}
const gender = options?.gender ||
this.faker.helpers.arrayElement([types.Gender.Male, types.Gender.Female]);
let name = gender === types.Gender.Male
? data.maleNamesSelector.select()
: data.femaleNamesSelector.select();
name = nameUtils.NameUtils.formatItalianName(name);
if (options?.prefix) {
return rxjs.of(this.getNameWithPrefix(name, gender));
}
return rxjs.of(name);
}), operators.catchError(error => {
console.error('Error generating first name:', error);
return rxjs.of('');
}));
}
prefix$(gender) {
return rxjs.of(this.getPrefix(gender));
}
preloadData$() {
return this.loadNameData();
}
async firstName(options) {
return rxjs.lastValueFrom(this.firstName$(options));
}
async prefix(gender) {
return rxjs.lastValueFrom(this.prefix$(gender));
}
async preloadData() {
return rxjs.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);
}
}
exports.FirstNameModule = FirstNameModule;