import type * as prismic from "@prismicio/client" import { createFaker, type Faker } from "../lib/createFaker" import type { Seed, WithoutFakerConfig } from "../types" import { query, type MockRestApiQueryConfig } from "./query" import { ref, type MockRestApiRefConfig } from "./ref" import { repository, type MockRestApiRepositoryConfig } from "./repository" import { tags, type MockRestApiTagsConfig } from "./tags" export const createAPIMockFactory = ( ...args: ConstructorParameters ): APIMockFactory => { return new APIMockFactory(...args) } type APIMockFactoryConfig = | { seed: Seed } | { faker: Faker } export class APIMockFactory { private faker: Faker constructor(config: APIMockFactoryConfig) { this.faker = "faker" in config ? config.faker : createFaker(config.seed) } get seed(): Seed { return this.faker.seed } query( config?: WithoutFakerConfig>, ): prismic.Query { return query({ ...config, faker: this.faker }) } ref( config?: WithoutFakerConfig>, ): ReturnType> { return ref({ ...config, faker: this.faker }) } repository(config?: WithoutFakerConfig): prismic.Repository { return repository({ ...config, faker: this.faker }) } tags(config?: WithoutFakerConfig): prismic.Tags { return tags({ ...config, faker: this.faker }) } }