All files / generator BaseGenerator.ts

71.42% Statements 10/14
54.54% Branches 6/11
100% Functions 2/2
71.42% Lines 10/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51                              141x 108x 108x   33x     141x 141x                   141x         141x     141x       141x          
import { Faker, en, de, es, fr, it, type LocaleDefinition } from '@faker-js/faker'
 
export interface GeneratorOptions {
  locale?: 'en' | 'de' | 'es' | 'fr' | 'it'
  seed?: number
  refDate?: string
}
 
export abstract class BaseGenerator {
  protected generator: Faker
  protected seed: number
  protected refDate?: Date
 
  constructor(opts: GeneratorOptions) {
    // Parse refDate with fallback to current time for invalid dates
    if (opts.refDate) {
      const parsedDate = new Date(opts.refDate.trim())
      this.refDate = isNaN(parsedDate.getTime()) ? new Date() : parsedDate
    } else {
      this.refDate = new Date()
    }
 
    const localeData: LocaleDefinition = (() => {
      switch (opts?.locale) {
      case 'de':
        return de
      case 'es':
        return es
      case 'fr':
        return fr
      case 'it':
        return it
      default:
        return en
      }
    })()
 
    // Create isolated faker instance for deterministic seeding per generator
    this.generator = new Faker({ locale: [localeData] })
 
    // Use provided seed or a random 32-bit seed
    this.seed = typeof opts?.seed === 'number'
      ? opts.seed
      : Math.floor(Math.random() * 0x100000000)
 
    this.generator.seed(this.seed)
  }
 
  abstract generate(...args: unknown[]): unknown
}