UNPKG

@prismicio/mock

Version:

Generate mock Prismic documents, fields, Slices, and models for development and testing environments

108 lines (78 loc) 2.24 kB
import { Seed } from "../types"; import { lorem, loremWords } from "./lorem"; import { PRNG } from "./PRNG"; export const createFaker = (seed: Seed): Faker => { return new Faker(seed); }; const DAY_MS = 1000 * 60 * 60 * 24; const YEAR_MS = DAY_MS * 365; const YEAR_2022_MS = 52 * (YEAR_MS + DAY_MS / 4); export class Faker { seed: Seed; private prng: PRNG; constructor(seed: Seed) { this.seed = seed; this.prng = new PRNG(seed.toString()); } random(): number { return this.prng.next(); } boolean(): boolean { return this.random() >= 0.5; } randomElement<T>(elements: readonly T[]): T { return elements[this.range(0, elements.length)]; } randomElements<T>(elements: readonly T[]): T[] { const alwaysInclude = this.randomElement(elements); return elements.filter( (element) => element === alwaysInclude || this.boolean(), ); } range(min: number, max: number): number { return Math.floor(this.rangeFloat(Math.ceil(min), Math.floor(max))); } rangeFloat(min: number, max: number): number { return this.random() * (max - min) + min; } words(length: number, wordOffset = this.range(0, loremWords.length)): string { return lorem(`${length}w`, wordOffset); } word(): string { return this.randomElement(loremWords); } lorem( length: Parameters<typeof lorem>[0], wordOffset = this.range(0, loremWords.length), ): string { return lorem(length, wordOffset); } url(): string { return `https://${this.word()}.example`; } hexColor(): string { return `#${this.hash(6)}`; } hash(length: number): string { let hash = ""; for (let i = 0; i < length; i++) { const chars = this.boolean() ? "abcdef" : "0123456789"; hash += chars[this.range(0, chars.length)]; } return hash; } date(): Date { return new Date(YEAR_2022_MS + this.range(-YEAR_MS * 3, YEAR_MS * 3)); } dateAfter(date: Date): Date { const timestamp = date.getTime(); return new Date(this.range(timestamp, timestamp + YEAR_MS * 3)); } dateBefore(date: Date): Date { const timestamp = date.getTime(); return new Date(this.range(timestamp - YEAR_MS * 3, timestamp)); } dateBetween(min: Date, max: Date): Date { return new Date(this.range(min.getTime(), max.getTime())); } }