UNPKG

@italia-tools/faker

Version:

Italian-specific fake data generator based on Faker.js

90 lines (86 loc) 3.49 kB
'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;