UNPKG

gatsby-source-prismic

Version:

Gatsby source plugin for building websites using Prismic as a data source

134 lines (118 loc) 3.12 kB
import type { SharedSlice, SharedSliceModel } from "@prismicio/client"; import type { GatsbyGraphQLUnionType, NodePluginArgs } from "gatsby"; import type { PluginOptions } from "../types"; import { fieldModelsRecordToGraphQLType } from "./fieldModelsRecordToGraphQLType"; import { pascalCase } from "./pascalCase"; type SharedSliceModelToGraphQLTypeArgs = { model: SharedSliceModel; sharedSliceModels: SharedSliceModel[]; gatsbyNodeArgs: NodePluginArgs; pluginOptions: PluginOptions; }; export const sharedSliceModelToGraphQLType = ( args: SharedSliceModelToGraphQLTypeArgs, ): GatsbyGraphQLUnionType => { let variationTypeNames: string[] = []; for (const variation of args.model.variations) { const type = args.gatsbyNodeArgs.schema.buildObjectType({ name: pascalCase( "Prismic", args.pluginOptions.typePrefix, args.model.id, "Slice", variation.id, ), description: args.model.description, fields: { id: { type: "ID!", resolve: (source: SharedSlice): string => { return ( source.id || args.gatsbyNodeArgs.createNodeId( args.gatsbyNodeArgs.createContentDigest(source), ) ); }, }, slice_type: { type: "String!", }, slice_label: { type: "String", }, version: { type: "String!", }, variation: { type: "String!", }, }, interfaces: ["PrismicSlice", "PrismicSharedSlice"], }); if (variation.primary && Object.keys(variation.primary).length > 0) { const primaryType = fieldModelsRecordToGraphQLType({ ...args, path: [args.model.id, variation.id, "primary"], models: variation.primary, }); primaryType.config.name = pascalCase( "Prismic", args.pluginOptions.typePrefix, args.model.id, "Slice", variation.id, "Primary", ); args.gatsbyNodeArgs.actions.createTypes(primaryType); if (type.config.fields) { type.config.fields.primary = { type: `${primaryType.config.name}!`, }; } } if (variation.items && Object.keys(variation.items).length > 0) { const itemType = fieldModelsRecordToGraphQLType({ ...args, path: [args.model.id, variation.id, "items"], models: variation.items, }); itemType.config.name = pascalCase( "Prismic", args.pluginOptions.typePrefix, args.model.id, "Slice", variation.id, "Item", ); args.gatsbyNodeArgs.actions.createTypes(itemType); if (type.config.fields) { type.config.fields.items = { type: `[${itemType.config.name}!]!`, }; } } args.gatsbyNodeArgs.actions.createTypes(type); variationTypeNames = [...variationTypeNames, type.config.name]; } const type = args.gatsbyNodeArgs.schema.buildUnionType({ name: pascalCase( "Prismic", args.pluginOptions.typePrefix, args.model.id, "Slice", ), types: variationTypeNames, description: args.model.description, resolveType: (source: SharedSlice) => { return pascalCase( "Prismic", args.pluginOptions.typePrefix, source.slice_type, "Slice", source.variation, ); }, }); return type; };