UNPKG

@italia-tools/faker

Version:

Italian-specific fake data generator based on Faker.js

109 lines (102 loc) 4.03 kB
'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;