@italia-tools/faker
Version:
Italian-specific fake data generator based on Faker.js
109 lines (102 loc) • 4.03 kB
JavaScript
'use strict';
var rxjs = require('rxjs');
var operators = require('rxjs/operators');
function _interopNamespaceDefaultOnly (e) { return Object.freeze({ __proto__: null, default: e }); }
class LastNameSelector {
constructor(faker) {
this.faker = faker;
this.REGIONAL_WEIGHT = 0.5;
this.dataSubject = new rxjs.BehaviorSubject(null);
}
loadRegionalData() {
return rxjs.from(Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('../data/lastNamesByProvince.json.cjs')); })).pipe(operators.map(module => module.default), operators.catchError(error => {
console.error('Error loading regional data:', error);
return rxjs.of([]);
}));
}
loadFallbackData() {
return rxjs.from(Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('../data/lastNames.json.cjs')); })).pipe(operators.map(module => module.default), operators.catchError(error => {
console.error('Error loading fallback data:', error);
return rxjs.of([]);
}));
}
initializeMaps() {
if (this.dataSubject.getValue()) {
return rxjs.of(undefined);
}
return rxjs.forkJoin({
regionalData: this.loadRegionalData(),
fallbackData: this.loadFallbackData()
}).pipe(operators.map(({ regionalData, fallbackData }) => {
const regionMap = new Map();
const provinceMap = new Map();
regionalData.forEach(data => {
if (!regionMap.has(data.region)) {
regionMap.set(data.region, []);
}
regionMap.get(data.region)?.push(data);
provinceMap.set(data.province.toLowerCase(), data);
});
this.dataSubject.next({
regionMap,
provinceMap,
fallbackSurnames: fallbackData
});
}));
}
select(options) {
return this.initializeMaps().pipe(operators.switchMap(() => {
const data = this.dataSubject.getValue();
if (!data) {
throw new Error('Data not initialized');
}
if (!options) {
return rxjs.of(this.faker.helpers.arrayElement(data.fallbackSurnames));
}
let localSurnames = [];
if (options.province) {
const provinceData = data.provinceMap.get(options.province.toLowerCase());
if (provinceData) {
localSurnames = provinceData.surnames;
}
}
else if (options.region) {
const regionData = data.regionMap.get(options.region);
if (regionData) {
localSurnames = regionData.flatMap(data => data.surnames);
}
}
if (localSurnames.length === 0) {
return rxjs.of(this.faker.helpers.arrayElement(data.fallbackSurnames));
}
const useLocal = this.faker.number.float({ min: 0, max: 1 }) < this.REGIONAL_WEIGHT;
if (useLocal) {
return rxjs.of(this.faker.helpers.arrayElement(localSurnames));
}
else {
return rxjs.of(this.faker.helpers.arrayElement(data.fallbackSurnames));
}
}));
}
preloadData() {
return this.initializeMaps();
}
clearCache() {
this.dataSubject.next(null);
}
}
// Example usage:
/*
const lastNameSelector = new LastNameSelector(faker);
// Select a lastname
lastNameSelector.select({ region: 'Lombardia' }).subscribe(
lastname => console.log('Selected lastname:', lastname),
error => console.error('Error:', error)
);
// Preload data
lastNameSelector.preloadData().subscribe(
() => console.log('Data preloaded'),
error => console.error('Error preloading:', error)
);
*/
exports.LastNameSelector = LastNameSelector;