gatsby-source-prismic
Version:
Gatsby source plugin for building websites using Prismic as a data source
259 lines (225 loc) • 7.08 kB
text/typescript
import * as gatsby from "gatsby";
import * as gatsbyFs from "gatsby-source-filesystem";
import * as imgixGatsby from "@imgix/gatsby";
import * as prismic from "@prismicio/client";
import * as prismicH from "@prismicio/helpers";
import * as prismicT from "@prismicio/types";
import * as prismicCustomTypes from "@prismicio/custom-types-client";
import * as gqlc from "graphql-compose";
import * as RTE from "fp-ts/ReaderTaskEither";
import { NodeHelpers } from "gatsby-node-helpers";
import { Runtime } from "./runtime";
export type Mutable<T> = {
-readonly [P in keyof T]: T[P];
};
export type UnknownRecord<K extends PropertyKey = PropertyKey> = Record<
K,
unknown
>;
export type IterableElement<TargetIterable> = TargetIterable extends Iterable<
infer ElementType
>
? ElementType
: never;
export type JoiValidationError = InstanceType<
gatsby.PluginOptionsSchemaArgs["Joi"]["ValidationError"]
>;
export type PrismicDocumentNodeInput<
TDocument extends prismicT.PrismicDocument = prismicT.PrismicDocument,
> = TDocument & gatsby.NodeInput & { prismicId: string };
export enum TypePathKind {
CustomType = "CustomType",
SharedSliceVariation = "SharedSliceVariation",
Field = "Field",
}
export interface TypePath {
kind: TypePathKind;
path: string[];
type: PrismicTypePathType;
}
export interface SerializedTypePath extends Omit<TypePath, "path"> {
path: string;
}
export type TypePathNode = TypePath & gatsby.Node;
export type TransformFieldNameFn = (fieldName: string) => string;
export interface Dependencies {
prismicClient: prismic.Client;
createTypes: gatsby.Actions["createTypes"];
createNode: gatsby.Actions["createNode"];
buildObjectType: gatsby.NodePluginSchema["buildObjectType"];
buildUnionType: gatsby.NodePluginSchema["buildUnionType"];
buildEnumType: gatsby.NodePluginSchema["buildEnumType"];
buildScalarType: gatsby.NodePluginSchema["buildScalarType"];
buildInterfaceType: gatsby.NodePluginSchema["buildInterfaceType"];
getNode: gatsby.SourceNodesArgs["getNode"];
getNodes: gatsby.SourceNodesArgs["getNodes"];
touchNode: gatsby.Actions["touchNode"];
deleteNode: gatsby.Actions["deleteNode"];
createNodeId: gatsby.NodePluginArgs["createNodeId"];
createContentDigest: gatsby.NodePluginArgs["createContentDigest"];
schema: gatsby.NodePluginSchema;
cache: gatsby.GatsbyCache;
store: gatsby.Store;
reporter: gatsby.Reporter;
reportInfo: gatsby.Reporter["info"];
reportWarning: gatsby.Reporter["warn"];
reportVerbose: gatsby.Reporter["verbose"];
globalNodeHelpers: NodeHelpers;
nodeHelpers: NodeHelpers;
pluginOptions: PluginOptions;
webhookBody?: unknown;
createRemoteFileNode: typeof gatsbyFs.createRemoteFileNode;
transformFieldName: TransformFieldNameFn;
runtime: Runtime;
}
type ShouldDownloadFilesPredicate = (
field: prismicT.ImageFieldImage | prismicT.LinkToMediaField,
) => boolean;
export type UnpreparedPluginOptions = gatsby.PluginOptions & {
repositoryName: string;
accessToken?: string;
apiEndpoint?: string;
customTypesApiEndpoint?: string;
releaseID?: string;
graphQuery?: string;
fetchLinks?: string[];
lang?: string;
pageSize?: number;
linkResolver?: prismicH.LinkResolverFunction;
routes?: prismic.Route[];
htmlSerializer?: prismicH.HTMLFunctionSerializer | prismicH.HTMLMapSerializer;
imageImgixParams?: imgixGatsby.ImgixUrlParams;
imagePlaceholderImgixParams?: imgixGatsby.ImgixUrlParams;
typePrefix?: string;
webhookSecret?: string;
shouldDownloadFiles?:
| boolean
| ShouldDownloadFilesPredicate
| Record<string, boolean | ShouldDownloadFilesPredicate>;
createRemoteFileNode?: typeof gatsbyFs.createRemoteFileNode;
transformFieldName?: TransformFieldNameFn;
fetch?: prismic.FetchLike & prismicCustomTypes.FetchLike;
customTypesApiToken?: string;
/**
* A record of all Custom Type API IDs mapped to their models.
*
* @deprecated Use the `customTypeModels` plugin option.
*/
schemas?: Record<string, prismicT.CustomTypeModelDefinition>;
/**
* A list of all Custom Types models using the Custom Types API object shape.
*/
customTypeModels?: prismicT.CustomTypeModel[];
/**
* A list of all Shared Slice models.
*/
sharedSliceModels?: prismicT.SharedSliceModel[];
};
export type PluginOptions = UnpreparedPluginOptions &
Required<
Pick<
UnpreparedPluginOptions,
| "apiEndpoint"
| "customTypeModels"
| "sharedSliceModels"
| "imageImgixParams"
| "imagePlaceholderImgixParams"
| "shouldDownloadFiles"
| "createRemoteFileNode"
| "transformFieldName"
| "fetch"
>
>;
export type FieldConfigCreator<
TSchema extends prismicT.CustomTypeModelField = prismicT.CustomTypeModelField,
> = (
path: string[],
schema: TSchema,
) => RTE.ReaderTaskEither<
Dependencies,
Error,
gqlc.ObjectTypeComposerFieldConfigDefinition<unknown, unknown>
>;
export type PrismicTypePathType =
| PrismicSpecialType
| typeof prismicT.CustomTypeModelFieldType[keyof typeof prismicT.CustomTypeModelFieldType]
| typeof prismicT.CustomTypeModelSliceType[keyof typeof prismicT.CustomTypeModelSliceType];
export enum PrismicSpecialType {
Document = "Document",
DocumentData = "DocumentData",
SharedSliceVariation = "SharedSliceVariation",
Unknown = "Unknown",
}
export interface PrismicAPIDocumentNode
extends prismicT.PrismicDocument,
gatsby.Node {
prismicId: string;
}
export type PrismicWebhookBody =
| PrismicWebhookBodyApiUpdate
| PrismicWebhookBodyTestTrigger;
export enum PrismicWebhookType {
APIUpdate = "api-update",
TestTrigger = "test-trigger",
}
interface PrismicWebhookBodyBase {
type: PrismicWebhookType;
domain: string;
apiUrl: string;
secret: string | null;
}
export interface PrismicWebhookBodyApiUpdate extends PrismicWebhookBodyBase {
type: PrismicWebhookType.APIUpdate;
masterRef?: string;
releases: PrismicWebhookOperations<PrismicWebhookRelease>;
masks: PrismicWebhookOperations<PrismicWebhookMask>;
tags: PrismicWebhookOperations<PrismicWebhookTag>;
documents: string[];
experiments?: PrismicWebhookOperations<PrismicWebhookExperiment>;
}
export interface PrismicWebhookBodyTestTrigger extends PrismicWebhookBodyBase {
type: PrismicWebhookType.TestTrigger;
}
interface PrismicWebhookOperations<T> {
update?: T[];
addition?: T[];
deletion?: T[];
}
interface PrismicWebhookMask {
id: string;
label: string;
}
interface PrismicWebhookTag {
id: string;
}
export interface PrismicWebhookRelease {
id: string;
ref: string;
label: string;
documents: string[];
}
/**
* @deprecated Experiments are no longer supported by Prismic.
*/
interface PrismicWebhookExperiment {
id: string;
name: string;
variations: PrismicWebhookExperimentVariation[];
}
/**
* @deprecated Experiments are no longer supported by Prismic.
*/
interface PrismicWebhookExperimentVariation {
id: string;
ref: string;
label: string;
}
export type PrismicCustomTypeApiResponse = PrismicCustomTypeApiCustomType[];
export interface PrismicCustomTypeApiCustomType<
Model extends prismicT.CustomTypeModel = prismicT.CustomTypeModel,
> {
id: string;
label: string;
repeatable: boolean;
json: Model;
}