UNPKG

gatsby-source-prismic-lang

Version:

Gatsby source plugin for building websites using prismic.io as a data source

447 lines (384 loc) 11.3 kB
# gatsby-source-prismic Source plugin for pulling data into [Gatsby][gatsby] from [prismic.io][prismic] repositories. ## Features - Supports Rich Text fields, slices, and content relation fields - Supports `gatsby-transformer-sharp` and `gatsby-image` for image fields - Utilizes `prismic-dom` to provide HTML and link values so you don't have to use `prismic-dom` directly ## Install ```sh npm install --save gatsby-source-prismic ``` ## How to use ```js // In your gatsby-config.js plugins: [ /* * Gatsby's data processing layer begins with “source” * plugins. Here the site sources its data from prismic.io. */ { resolve: "gatsby-source-prismic", options: { // The name of your prismic.io repository. This is required. // Example: 'gatsby-source-prismic-test-site' if your prismic.io address // is 'gatsby-source-prismic-test-site.prismic.io'. repositoryName: "gatsby-source-prismic-test-site", // An API access token to your prismic.io repository. This is required. // You can generate an access token in the "API & Security" section of // your repository settings. Setting a "Callback URL" is not necessary. // The token will be listed under "Permanent access tokens". accessToken: "example-wou7evoh0eexuf6chooz2jai2qui9pae4tieph1sei4deiboj", // Set a link resolver function used to process links in your content. // Fields with rich text formatting or links to internal content use this // function to generate the correct link URL. // The document node, field key (i.e. API ID), and field value are // provided to the function, as seen below. This allows you to use // different link resolver logic for each field if necessary. // See: https://prismic.io/docs/javascript/query-the-api/link-resolving linkResolver: ({ node, key, value }) => doc => { // Your link resolver }, // Set a list of links to fetch and be made available in your link // resolver function. // See: https://prismic.io/docs/javascript/query-the-api/fetch-linked-document-fields fetchLinks: [ // Your list of links ], // Set an HTML serializer function used to process formatted content. // Fields with rich text formatting use this function to generate the // correct HTML. // The document node, field key (i.e. API ID), and field value are // provided to the function, as seen below. This allows you to use // different HTML serializer logic for each field if necessary. // See: https://prismic.io/docs/nodejs/beyond-the-api/html-serializer htmlSerializer: ({ node, key, value }) => ( (type, element, content, children) => { // Your HTML serializer } ), } } ] ``` ## How to query You can query nodes created from Prismic using GraphQL like the following: **Note**: Learn to use the GraphQL tool and Ctrl+Spacebar at <http://localhost:3000/___graphql> to discover the types and properties of your GraphQL model. ```graphql { allPrismicPage { edges { node { id uid first_publication_date last_publication_date data { title { text } content { html } } } } } } ``` All documents are pulled from your repository and created as `prismic${contentTypeName}` and `allPrismic${contentTypeName}`, where `${contentTypeName}` is the API ID of your document's content type. For example, if you have `Product` as one of your content types, you will be able to query it like the following: ```graphql { allPrismicProduct { edges { node { id data { name price description { html } } } } } } ``` ### Query Rich Text fields Data from fields with rich text formatting (e.g. headings, bold, italic) is transformed to provide HTML and text versions. This uses the official [prismic-dom][prismic-dom] library and the `linkResolver` and `htmlSerializer` functions from your site's `gatsby-node.js` to create the HTML and text fields. **Note**: If you need to access the raw data, the original data is accessible using the `raw` field, though use of this field is discouraged. ```graphql { allPrismicPage { edges { node { id data { title { text } content { html } } } } } } ``` ### Query Link fields Link fields are processed using the official [prismic-dom][prismic-dom] library and the `linkResolver` function from your site's `gatsby-node.js`. The resolved URL is provided at the `url` field. If the link type is a web link (i.e. a URL external from your site), the URL is provided without additional processing. All other URL fields, such as `target`, `lang`, and `isBroken`, are provided on the field, as well. The `target` field defaults to an empty string. This allows you to always query the `target` field even if it is not set in Prismic. **Note**: If you need to access the raw data, the original data is accessible using the `raw` field, though use of this field is discouraged. ```graphql { allPrismicPage { edges { node { id data { featured_post { url target } } } } } } ``` ### Query Content Relation fields Content Relation fields relate a field to another document. Since fields from within the related document is often needed, the document data is provided at the `document` field. The resolved URL to the document using the official [prismic-dom][prismic-dom] library and the `linkResolver` function from your site's `gatsby-node.js` is also provided at the `url` field. **Note**: Data within the `document` field is wrapped in an array. Due to the method in which Gatsby processes one-to-one node relationships, this work-around is necessary to ensure the field can accommodate different content types. This may be fixed in a later Gatsby relase. Querying data on the `document` field is handled the same as querying slices. Please read the [Query slices](#query-slices) section for details. **Note**: If you need to access the raw data, the original data is accessible using the `raw` field, though use of this field is discouraged. ```graphql { allPrismicPage { edges { node { id data { featured_post { url document { __typename ... on PrismicPost { data { title { text } } } } } } } } } } ``` ### Query slices Prismic slices allow you to build a flexible series of content blocks. Since the content structure is dynamic, querying the content is handled differently than other fields. To access slice fields, you need to use GraphQL [inline fragments][graphql-inline-fragments]. This requires you to know types of nodes. The easiest way to get the type of nodes is to use the `/___graphql` debugger and run the below query (adjust the document type and field name). ```graphql { allPrismicPage { edges { node { id data { body { __typename } } } } } } ``` When you have node type names, you can use them to create inline fragments. Full example: ```graphql { allPrismicPage { edges { node { id data { body { __typename ... on PrismicPageBodyRichText { text { html } } ... on PrismicPageBodyQuote { quote { html } credit { text } } ... on PrismicPageBodyFootnote { content { html } } } } } } } } ``` ### Query direct API data as a fallback If you find you cannot query the data you need through the GraphQL interface, you can get the raw response from the [prismic-javascript][prismic-javascript] API using the `dataString` field. This field contains the whole node's original data before processing as a string generated using `JSON.stringify`. This is absolutely discouraged as it defeats the purpose of Gatsby's GraphQL data interface, but it is available if necessary ```graphql { allPrismicPage { edges { node { id dataString } } } } ``` ### Image processing To use image processing you need `gatsby-transformer-sharp`, `gatsby-plugin-sharp`, and their dependencies `gatsby-image` and `gatsby-source-filesystem` in your `gatsby-config.js`. You can apply image processing to any image field on a document. Image processing of inline images added to Rich Text fields is currently not supported. To access image processing in your queries, you need to use this pattern, where `...ImageFragment` is one of the [`gatsby-transformer-sharp` fragments][gatsby-image-fragments]: ```graphql { allPrismicPage { edges { node { id data { imageFieldName { localFile { childImageSharp { ...ImageFragment } } } } } } } } ``` Full example: ```graphql { allPrismicPage { edges { node { id data { imageFieldName { localFile { childImageSharp { resolutions(width: 500, height: 300) { ...GatsbyImageSharpResolutions_withWebp } } } } } } } } } ``` To learn more about image processing, check the documentation of [gatsby-plugin-sharp][gatsby-plugin-sharp]. ## Site's `gatsby-node.js` example ```js const path = require('path') exports.createPages = async ({ graphql, boundActionCreators }) => { const { createPage } = boundActionCreators const pages = await graphql(` { allPrismicPage { edges { node { id uid template } } } } `) const pageTemplates = { 'Light': path.resolve('./src/templates/light.js'), 'Dark': path.resolve('./src/templates/dark.js'), } pages.data.allPrismicPage.edges.forEach(edge => { createPage({ path: `/${edge.node.uid}`, component: pageTemplates[edge.node.template], context: { id: edge.node.id, }, }) }) } ``` [gatsby]: https://www.gatsbyjs.org/ [prismic]: https://prismic.io/ [prismic-dom]: https://github.com/prismicio/prismic-dom [prismic-javascript]: https://github.com/prismicio/prismic-javascript [graphql-inline-fragments]: http://graphql.org/learn/queries/#inline-fragments [gatsby-plugin-sharp]: https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-plugin-sharp [gatsby-image-fragments]: https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-image#gatsby-transformer-sharp