UNPKG

@prismicio/mock

Version:

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

323 lines (294 loc) 10 kB
import * as prismic from "@prismicio/client"; import { Faker } from "./lib/createFaker"; import * as value from "./value"; export type IterableElement<TargetIterable> = TargetIterable extends Iterable<infer ElementType> ? ElementType : TargetIterable extends AsyncIterable<infer ElementType> ? ElementType : never; export type ValueOf< ObjectType, ValueType extends keyof ObjectType = keyof ObjectType, > = ObjectType[ValueType]; type Simplify<T> = { [KeyType in keyof T]: T[KeyType] }; type Except<ObjectType, KeysType extends keyof ObjectType> = Pick< ObjectType, Exclude<keyof ObjectType, KeysType> >; export type SetRequired<BaseType, Keys extends keyof BaseType> = Simplify< // Pick just the keys that are optional from the base type. Except<BaseType, Keys> & // Pick the keys that should be required from the base type and make them required. Required<Pick<BaseType, Keys>> >; export type Seed = string | number; export type WithoutFakerConfig<T> = { [P in keyof T as P extends "seed" | "faker" ? never : P]: T[P]; }; export interface MockImageData { url: string; width: number; height: number; } export type MockEmbedData = prismic.AnyOEmbed & prismic.OEmbedExtra & { embed_url: string; html: string; }; export type MockRestApiConfig = | { seed: Seed; faker?: never; } | { faker: Faker; seed?: never; }; export type MockModelConfig = | { seed: Seed; faker?: never; } | { faker: Faker; seed?: never; }; // TODO: Add to @prismicio/types export type PrismicModel = | prismic.CustomTypeModel | prismic.CustomTypeModelField | prismic.CustomTypeModelSlice | prismic.SharedSliceModel | prismic.SharedSliceModelVariation; export type GroupFieldModelMap = Record< string, prismic.CustomTypeModelFieldForGroup >; export type NestedGroupFieldModelMap = Record< string, prismic.CustomTypeModelFieldForNestedGroup >; export type SlicePrimaryFieldModelMap = Record< string, prismic.CustomTypeModelFieldForSlicePrimary >; export type MockValueConfig<Model extends PrismicModel = PrismicModel> = { model?: Model; } & ( | { seed: Seed; faker?: never; } | { faker: Faker; seed?: never; } ); export type MockValueStateConfig< State extends prismic.FieldState = prismic.FieldState, > = { state?: State; }; export type MockValueConfigForModel< Model extends PrismicModel, State extends prismic.FieldState = prismic.FieldState, > = Model extends prismic.CustomTypeModelBooleanField ? value.MockBooleanValueConfig<Model> : Model extends prismic.CustomTypeModelColorField ? value.MockColorValueConfig<Model, State> : Model extends prismic.CustomTypeModelContentRelationshipField ? value.MockContentRelationshipValueConfig<Model, State> : Model extends prismic.CustomTypeModelDateField ? value.MockDateValueConfig<Model, State> : Model extends prismic.CustomTypeModelEmbedField ? value.MockEmbedValueConfig<Model, prismic.AnyOEmbed, State> : Model extends prismic.CustomTypeModelGeoPointField ? value.MockGeoPointValueConfig<Model, State> : Model extends prismic.CustomTypeModelImageField ? value.MockImageValueConfig<Model, State> : Model extends prismic.CustomTypeModelKeyTextField ? value.MockKeyTextValueConfig<Model, State> : Model extends prismic.CustomTypeModelLinkField ? value.MockLinkValueConfig< (typeof prismic.LinkType)[keyof typeof prismic.LinkType], Model, State > : Model extends prismic.CustomTypeModelLinkToMediaField ? value.MockLinkToMediaValueConfig<Model, State> : Model extends prismic.CustomTypeModelNumberField ? value.MockNumberValueConfig<Model, State> : Model extends prismic.CustomTypeModelRichTextField ? value.MockRichTextValueConfig : Model extends prismic.CustomTypeModelSelectField ? value.MockSelectValueConfig<Model, State> : Model extends prismic.CustomTypeModelTimestampField ? value.MockTimestampValueConfig<Model, State> : Model extends prismic.CustomTypeModelTitleField ? value.MockTitleValueConfig<Model, State> : Model extends prismic.CustomTypeModelUIDField ? value.MockUIDValueConfig<Model> : never; type CustomTypeModelStructuredTextField = | prismic.CustomTypeModelRichTextField | prismic.CustomTypeModelTitleField; export type MockRichTextValueConfig< Model extends CustomTypeModelStructuredTextField = CustomTypeModelStructuredTextField, > = { model?: Model; } & ( | { seed: Seed; faker?: never; } | { faker: Faker; seed?: never; } ); export type ModelValueMap< T extends Record<string, prismic.CustomTypeModelField>, > = { [P in keyof T]: ModelValue<T[P]>; }; export type ModelValue< T extends PrismicModel, State extends prismic.FieldState = prismic.FieldState, > = T extends prismic.CustomTypeModel ? CustomTypeModelValue<T> : T extends prismic.CustomTypeModelUIDField ? prismic.PrismicDocument["uid"] : T extends prismic.CustomTypeModelFieldForGroup ? CustomTypeModelFieldForGroupValue<T, State> : T extends prismic.CustomTypeModelGroupField ? CustomTypeModelGroupFieldValue<T, State> : T extends prismic.CustomTypeModelSliceZoneField ? prismic.SliceZone< ValueOf<{ [P in keyof NonNullable< NonNullable<T["config"]>["choices"] > as P extends string ? P : never]: NonNullable< NonNullable<T["config"]>["choices"] >[P] extends prismic.CustomTypeModelSlice ? CustomTypeModelSliceValue< NonNullable<NonNullable<T["config"]>["choices"]>[P], P extends string ? P : string > : NonNullable< NonNullable<T["config"]>["choices"] >[P] extends prismic.CustomTypeModelSharedSlice ? prismic.SharedSlice<P extends string ? P : string> : never; }>, State > : T extends prismic.CustomTypeModelSlice ? CustomTypeModelSliceValue<T> : T extends prismic.CustomTypeModelSharedSlice ? // TODO: Allow providing a union of of Shared Slices prismic.SharedSlice : T extends prismic.SharedSliceModel ? SharedSliceModelValue<T> : T extends prismic.SharedSliceModelVariation ? SharedSliceModelVariationValue<T> : never; type CustomTypeModelValue<T extends prismic.CustomTypeModel> = prismic.PrismicDocument< ModelValueMap<{ [P in keyof ValueOf<T["json"]> as ValueOf< T["json"] >[P]["type"] extends typeof prismic.CustomTypeModelFieldType.UID ? never : P]: ValueOf<T["json"]>[P]; }> >; type CustomTypeModelFieldForGroupValue< T extends prismic.CustomTypeModelFieldForGroup, State extends prismic.FieldState = prismic.FieldState, > = T extends prismic.CustomTypeModelNestedGroupField ? CustomTypeModelNestedGroupFieldValue<T, State> : T extends prismic.CustomTypeModelBooleanField ? prismic.BooleanField : T extends prismic.CustomTypeModelColorField ? prismic.ColorField<State> : T extends prismic.CustomTypeModelRichTextField ? prismic.RichTextField<State> : T extends prismic.CustomTypeModelTitleField ? prismic.TitleField<State> : T extends prismic.CustomTypeModelImageField<infer TThumbnailNames> ? prismic.ImageField<TThumbnailNames, State> : T extends prismic.CustomTypeModelLinkField ? prismic.LinkField<string, string, never, State> : T extends prismic.CustomTypeModelLinkToMediaField ? prismic.LinkToMediaField<State> : T extends prismic.CustomTypeModelContentRelationshipField ? prismic.ContentRelationshipField< string, string, never, State > : T extends prismic.CustomTypeModelDateField ? prismic.DateField<State> : T extends prismic.CustomTypeModelTimestampField ? prismic.TimestampField<State> : T extends prismic.CustomTypeModelNumberField ? prismic.NumberField<State> : T extends prismic.CustomTypeModelKeyTextField ? prismic.KeyTextField<State> : T extends prismic.CustomTypeModelSelectField ? prismic.SelectField<string, State> : T extends prismic.CustomTypeModelEmbedField ? prismic.EmbedField< prismic.AnyOEmbed & prismic.OEmbedExtra, State > : T extends prismic.CustomTypeModelGeoPointField ? prismic.GeoPointField<State> : T extends prismic.CustomTypeModelIntegrationField ? prismic.IntegrationField< Record<string, unknown>, State > : never; type CustomTypeModelGroupFieldValue< T extends prismic.CustomTypeModelGroupField, State extends prismic.FieldState = prismic.FieldState, > = prismic.GroupField< ModelValueMap<NonNullable<NonNullable<T["config"]>["fields"]>>, State >; type CustomTypeModelNestedGroupFieldValue< T extends prismic.CustomTypeModelNestedGroupField, State extends prismic.FieldState = prismic.FieldState, > = prismic.NestedGroupField< ModelValueMap<NonNullable<NonNullable<T["config"]>["fields"]>>, State >; type CustomTypeModelSliceValue< T extends prismic.CustomTypeModelSlice, SliceType = string, > = prismic.Slice< SliceType, ModelValueMap<NonNullable<T["non-repeat"]>>, ModelValueMap<NonNullable<T["repeat"]>> >; type SharedSliceModelValue<T extends prismic.SharedSliceModel> = prismic.SharedSlice< T["id"], SharedSliceModelVariationValue< IterableElement<NonNullable<T["variations"]>> > >; type SharedSliceModelVariationValue< T extends prismic.SharedSliceModelVariation, > = prismic.SharedSlice< string, prismic.SharedSliceVariation< T["id"], ModelValueMap<NonNullable<T["primary"]>>, ModelValueMap<NonNullable<T["items"]>> > >;