@sanity-typed/faker
Version:
Generate Mock Data from Sanity Schemas
191 lines (187 loc) • 11.9 kB
text/typescript
import * as type_fest_source_is_literal from 'type-fest/source/is-literal';
import { Faker } from '@faker-js/faker';
import { InferSchemaValues } from '@sanity-typed/types';
import { DefinitionBase, ArrayMemberDefinition, FieldDefinition, TypeDefinition, ConfigBase } from '@sanity-typed/types/src/internal';
type Negate<T> = T extends true ? false : true;
type IsPlainObject<T> = T extends any[] ? false : T extends object ? true : false;
type MaybeArray<T> = T | T[];
type SchemaTypeDefinition<TType extends string, TNumberValue extends number, TStringValue extends string, TReferenced extends string, TReferenceWeak extends boolean, TBlockStyle extends string, TBlockListItem extends string, TBlockMarkDecorator extends string, TBlockMarkAnnotation extends DefinitionBase<any, any, any> & {
name?: string;
}, THotspot extends boolean> = ArrayMemberDefinition<TType, any, any, any, TNumberValue, TStringValue, TReferenced, TReferenceWeak, TBlockStyle, TBlockListItem, TBlockMarkDecorator, TBlockMarkAnnotation, THotspot, any, any, any> | FieldDefinition<TType, any, any, any, TNumberValue, TStringValue, TReferenced, TReferenceWeak, TBlockStyle, TBlockListItem, TBlockMarkDecorator, TBlockMarkAnnotation, THotspot, any, any, any> | TypeDefinition<TType, any, any, any, TNumberValue, TStringValue, TReferenced, TReferenceWeak, TBlockStyle, TBlockListItem, TBlockMarkDecorator, TBlockMarkAnnotation, THotspot, any, any>;
type FakerOptions = ConstructorParameters<typeof Faker>[0];
declare const instantiateFaker: (options: FakerOptions, seed: number) => (path: string) => <Fn extends (faker: Faker, index: number) => any>(fn: Fn) => (index: number) => ReturnType<Fn>;
declare const instantiateFakerT: <Fn extends (faker: Faker, index: number) => any>(options: FakerOptions, seed: number, path: string, fn: Fn) => (index: number) => ReturnType<Fn>;
declare const addTypeT: <const Type extends string | undefined, Fn extends (...args: any[]) => any>(type: Type, fn: Fn) => (...args: Parameters<Fn>) => Negate<type_fest_source_is_literal.LiteralCheck<Type, string>> extends infer T ? T extends Negate<type_fest_source_is_literal.LiteralCheck<Type, string>> ? T extends true ? ReturnType<Fn> : IsPlainObject<ReturnType<Fn>> extends infer T_1 ? T_1 extends IsPlainObject<ReturnType<Fn>> ? T_1 extends true ? Omit<ReturnType<Fn>, "_type"> & {
_type: Type;
} : ReturnType<Fn> : never : never : never : never;
type SchemaTypeToFaker<TSchemaType extends SchemaTypeDefinition<any, any, any, any, any, any, any, any, any, any>, TAliasedFakers extends {
[name: string]: (index: number) => any;
}> = ReturnType<typeof instantiateFakerT<TSchemaType["type"] extends keyof typeof constantFakers ? (typeof constantFakers)[TSchemaType["type"]] : TSchemaType["type"] extends "date" ? ReturnType<typeof dateFaker<Extract<TSchemaType, SchemaTypeDefinition<"date", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "datetime" ? ReturnType<typeof datetimeFaker<Extract<TSchemaType, SchemaTypeDefinition<"datetime", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "number" ? ReturnType<typeof numberFaker<Extract<TSchemaType, SchemaTypeDefinition<"number", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "reference" ? ReturnType<typeof referenceFaker<Extract<TSchemaType, SchemaTypeDefinition<"reference", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "string" ? ReturnType<typeof stringFaker<Extract<TSchemaType, SchemaTypeDefinition<"string", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "text" ? ReturnType<typeof textFaker<Extract<TSchemaType, SchemaTypeDefinition<"text", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "url" ? ReturnType<typeof urlFaker<Extract<TSchemaType, SchemaTypeDefinition<"url", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "array" ? ReturnType<typeof arrayFaker<Extract<TSchemaType, SchemaTypeDefinition<"array", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : TSchemaType["type"] extends "block" ? ReturnType<typeof blockFaker<Extract<TSchemaType, SchemaTypeDefinition<"block", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : TSchemaType["type"] extends "object" ? ReturnType<typeof objectFaker<Extract<TSchemaType, SchemaTypeDefinition<"object", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : TSchemaType["type"] extends "document" ? ReturnType<typeof documentFaker<Extract<TSchemaType, SchemaTypeDefinition<"document", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : TSchemaType["type"] extends "file" ? ReturnType<typeof fileFaker<Extract<TSchemaType, SchemaTypeDefinition<"file", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : TSchemaType["type"] extends "image" ? ReturnType<typeof imageFaker<Extract<TSchemaType, SchemaTypeDefinition<"image", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : ReturnType<typeof aliasFaker<TSchemaType, TAliasedFakers>>>>;
declare const customFaker: <TSchemaType extends SchemaTypeDefinition<any, any, any, any, any, any, any, any, any, any>>(schemaType: TSchemaType, fakerFn: (faker: Faker, previous: ReturnType<SchemaTypeToFaker<TSchemaType, {
[name: string]: (index: number) => any;
}>>, index: number) => ReturnType<SchemaTypeToFaker<TSchemaType, {
[name: string]: (index: number) => any;
}>>) => TSchemaType;
declare const implicitDocumentFakers: (instantiateFakerByPath: ReturnType<typeof instantiateFaker>, documentIdFaker: (type: string | undefined) => (index: number) => string) => {
"sanity.fileAsset": (index: number) => {
_type: "sanity.fileAsset";
metadata: {
[key: string]: unknown;
};
_createdAt: string;
_id: string;
_rev: string;
_updatedAt: string;
source?: {
url?: string | undefined;
id: string;
name: string;
} | undefined;
title?: string | undefined;
originalFilename?: string | undefined;
label?: string | undefined;
description?: string | undefined;
creditLine?: string | undefined;
extension: string;
mimeType: string;
path: string;
assetId: string;
sha1hash: string;
size: number;
url: string;
};
"sanity.imageAsset": (index: number) => {
_type: "sanity.imageAsset";
url: string;
metadata: {
palette?: {
vibrant?: {
title?: string | undefined;
_type: "sanity.imagePaletteSwatch";
background: string;
foreground: string;
population: number;
} | undefined;
muted?: {
title?: string | undefined;
_type: "sanity.imagePaletteSwatch";
background: string;
foreground: string;
population: number;
} | undefined;
lightVibrant?: {
title?: string | undefined;
_type: "sanity.imagePaletteSwatch";
background: string;
foreground: string;
population: number;
} | undefined;
lightMuted?: {
title?: string | undefined;
_type: "sanity.imagePaletteSwatch";
background: string;
foreground: string;
population: number;
} | undefined;
dominant?: {
title?: string | undefined;
_type: "sanity.imagePaletteSwatch";
background: string;
foreground: string;
population: number;
} | undefined;
darkVibrant?: {
title?: string | undefined;
_type: "sanity.imagePaletteSwatch";
background: string;
foreground: string;
population: number;
} | undefined;
darkMuted?: {
title?: string | undefined;
_type: "sanity.imagePaletteSwatch";
background: string;
foreground: string;
population: number;
} | undefined;
_type: "sanity.imagePalette";
} | undefined;
lqip?: string | undefined;
location?: {
alt?: number | undefined;
_type: "geopoint";
lat: number;
lng: number;
} | undefined;
exif?: ({
_type: "sanity.imageExifMetadata";
} & {
[key: string]: unknown;
}) | undefined;
blurHash?: string | undefined;
_type: "sanity.imageMetadata";
hasAlpha: boolean;
isOpaque: boolean;
dimensions: {
height: number;
width: number;
_type: "sanity.imageDimensions";
aspectRatio: number;
};
} & {
[key: string]: unknown;
};
_createdAt: string;
_id: string;
_rev: string;
_updatedAt: string;
source?: {
url?: string | undefined;
id: string;
name: string;
} | undefined;
title?: string | undefined;
originalFilename?: string | undefined;
label?: string | undefined;
description?: string | undefined;
creditLine?: string | undefined;
extension: string;
mimeType: string;
path: string;
assetId: string;
sha1hash: string;
size: number;
};
};
type SanityConfigFakers<TConfig extends MaybeArray<ConfigBase<any, any>>> = TConfig extends MaybeArray<ConfigBase<infer TTypeDefinition, infer TPluginOptions>> ? ReturnType<typeof implicitDocumentFakers> & {
[TType in TTypeDefinition as TType["name"]]: ReturnType<typeof addTypeT<TType["name"], SchemaTypeToFaker<TType, SanityConfigFakers<TConfig> & SanityConfigFakers<TPluginOptions>>>>;
} : never;
declare const counter: <Fn extends (index: number) => any>(fn: Fn) => () => ReturnType<Fn>;
declare const sanityConfigToFakerTyped: <const TConfig extends ConfigBase<any, any>>(config: TConfig, { faker, referencedChunkSize, seed, }: {
faker: FakerOptions;
referencedChunkSize?: number;
seed?: number;
}) => { [type in keyof SanityConfigFakers<TConfig>]: ReturnType<typeof counter<SanityConfigFakers<TConfig>[type]>>; };
declare const sanityConfigToFaker: <const TConfig extends ConfigBase<any, any>>(config: TConfig, args_1: {
faker: FakerOptions;
referencedChunkSize?: number;
seed?: number;
}) => { [TType in keyof InferSchemaValues<TConfig>]: () => InferSchemaValues<TConfig>[TType]; };
declare const sanityDocumentsFaker: <const TConfig extends ConfigBase<any, any>, Fakers extends {
[type: string]: () => any;
}>(config: TConfig, fakers: Fakers, { referencedChunkSize }?: {
referencedChunkSize?: number;
}) => () => ReturnType<Pick<Fakers, Extract<InferSchemaValues<TConfig>[keyof InferSchemaValues<TConfig>], {
_createdAt: string;
_id: string;
_rev: string;
_updatedAt: string;
_type: string;
}>["_type"] & keyof Fakers>[Extract<InferSchemaValues<TConfig>[keyof InferSchemaValues<TConfig>], {
_createdAt: string;
_id: string;
_rev: string;
_updatedAt: string;
_type: string;
}>["_type"] & keyof Fakers]>[];
export { customFaker, sanityConfigToFaker, sanityConfigToFakerTyped, sanityDocumentsFaker };