gatsby-source-prismic
Version:
Gatsby source plugin for building websites using Prismic as a data source
62 lines (58 loc) • 1.69 kB
text/typescript
import * as gatsby from "gatsby";
import * as prismicH from "@prismicio/helpers";
import * as prismicT from "@prismicio/types";
import * as RTE from "fp-ts/ReaderTaskEither";
import { pipe, identity } from "fp-ts/function";
import { buildObjectType } from "../lib/buildObjectType";
import { Dependencies } from "../types";
/**
* Builds a GraphQL Type used by Link fields. The resulting type can be created
* using Gatsby's `createTypes` action.
*/
// TODO: Move typename to Dependencies (create in `buildDependencies.ts`).
export const buildLinkType: RTE.ReaderTaskEither<
Dependencies,
never,
gatsby.GatsbyGraphQLType
> = pipe(
RTE.ask<Dependencies>(),
RTE.chain((deps) =>
buildObjectType({
name: deps.nodeHelpers.createTypeName("LinkType"),
fields: {
link_type: deps.globalNodeHelpers.createTypeName("LinkTypeEnum"),
isBroken: "Boolean",
url: {
type: "String",
resolve: (source: prismicT.LinkField): string | null =>
prismicH.asLink(source, deps.pluginOptions.linkResolver),
},
target: "String",
size: "Int",
id: "ID",
type: "String",
tags: "[String]",
lang: "String",
slug: "String",
uid: "String",
document: {
type: deps.nodeHelpers.createTypeName("AllDocumentTypes"),
resolve: (source: prismicT.LinkField): string | null =>
source.link_type === prismicT.LinkType.Document &&
"isBroken" in source &&
!source.isBroken
? deps.nodeHelpers.createNodeId(source.id)
: null,
extensions: { link: {} },
},
localFile: {
type: "File",
extensions: {
link: {},
},
},
raw: { type: "JSON", resolve: identity },
},
}),
),
);