Source plugin for pulling data (including images) into Gatsby from Drupal sites.
Pulls data from Drupal 8 sites with the Drupal JSONAPI module installed.
An example site built with the headless Drupal distro ContentaCMS is at https://using-drupal.gatsbyjs.org/
apiBase
Option allows changing the API entry point depending on the version of
jsonapi used by your Drupal instance. The default value is jsonapi
, which has
been used since jsonapi version 8.x-1.0-alpha4
.
npm install --save gatsby-source-drupal
// In your gatsby-config.js
module.exports = {
plugins: [
{
resolve: `gatsby-source-drupal`,
options: {
baseUrl: `https://live-contentacms.pantheonsite.io/`,
apiBase: `api`, // optional, defaults to `jsonapi`
},
},
],
}
You can use the filters
option to limit the data that is retrieved from Drupal. Filters are applied per JSON API collection. You can use any valid JSON API filter query. For large data sets this can reduce the build time of your application by allowing Gatsby to skip content you'll never use.
As an example, if your JSON API endpoint (https://live-contentacms.pantheonsite.io/api) returns the following collections list, then articles
and recipes
are both collections that can have a filters applied:
{
...
links: {
articles: "https://live-contentacms.pantheonsite.io/api/articles",
recipes: "https://live-contentacms.pantheonsite.io/api/recipes",
...
}
}
To retrieve only recipes with a specific tag you could do something like the following where the key (recipe) is the collection from above, and the value is the filter you want to apply.
// In your gatsby-config.js
module.exports = {
plugins: [
{
resolve: `gatsby-source-drupal`,
options: {
baseUrl: `https://live-contentacms.pantheonsite.io/`,
apiBase: `api`,
filters: {
// collection : filter
recipe: "filter[tags.name][value]=British",
},
},
},
],
}
Which would result in Gatsby using the filtered collection https://live-contentacms.pantheonsite.io/api/recipes?filter[tags.name][value]=British to retrieve data.
You can use basicAuth
option if your site is protected by basicauth.
First, you need a way to pass environment variables to the build process, so secrets and other secured data aren't committed to source control. We recommend using dotenv
which will then expose environment variables. Read more about dotenv and using environment variables here. Then we can use these environment variables and configure our plugin.
// In your gatsby-config.js
module.exports = {
plugins: [
{
resolve: `gatsby-source-drupal`,
options: {
baseUrl: `https://live-contentacms.pantheonsite.io/`,
apiBase: `api`, // optional, defaults to `jsonapi`
basicAuth: {
username: process.env.BASIC_AUTH_USERNAME,
password: process.env.BASIC_AUTH_PASSWORD,
},
},
},
],
}
You can add optional request headers to the request using headers
param.
// In your gatsby-config.js
module.exports = {
plugins: [
{
resolve: `gatsby-source-drupal`,
options: {
baseUrl: `https://live-contentacms.pantheonsite.io/`,
apiBase: `api`, // optional, defaults to `jsonapi`
headers: {
Host: "https://example.com", // any valid request header here
},
},
},
],
}
You can append optional GET request params to the request url using params
option.
// In your gatsby-config.js
module.exports = {
plugins: [
{
resolve: `gatsby-source-drupal`,
options: {
baseUrl: `https://live-contentacms.pantheonsite.io/`,
apiBase: `api`, // optional, defaults to `jsonapi`
params: {
"api-key": "your-api-key-header-here", // any valid key value pair here
},
},
},
],
}
You can use the concurrentFileRequests
option to change how many simultaneous file requests are made to the server/service. This benefits build speed, however too many concurrent file request could cause memory exhaustion depending on the server's memory size so change with caution.
// In your gatsby-config.js
module.exports = {
plugins: [
{
resolve: `gatsby-source-drupal`,
options: {
baseUrl: `https://live-contentacms.pantheonsite.io/`,
apiBase: `api`, // optional, defaults to `jsonapi`
concurrentFileRequests: 60, // optional, defaults to `20`
},
},
],
}
You can use the disallowedLinkTypes
option to skip link types found in JSON:API documents. By default it skips the self
and describedby
links, which do not provide data that can be sourced. You may override the setting to add additional link types to be skipped.
// In your gatsby-config.js
module.exports = {
plugins: [
{
resolve: `gatsby-source-drupal`,
options: {
baseUrl: `https://live-contentacms.pantheonsite.io/`,
// skip the action--action resource type.
disallowedLinkTypes: [`self`, `describedby`, `action--action`],
},
},
],
}
You will need to have the Drupal module installed, more information on that here: https://www.drupal.org/project/gatsby
In your Drupal module configuration, set the update URL to your Gatsby Preview instance URL.
NOTES:
- This is experimental feature in active development. APIs used for this feature are not yet stable - it can break while we iterate on API design (particularly when versions of
gatsby-source-drupal
andGatsby Live Preview
Drupal module are incompatible).
While you don't need to pass any additional options for preview to work, you can pass a secret
for added security between your Drupal instance and Gatsby preview. Ensure this secret matches the one set in your Drupal Gatsby Preview settings.
// In your gatsby-config.js
module.exports = {
plugins: [
{
resolve: `gatsby-source-drupal`,
options: {
baseUrl: `https://live-contentacms.pantheonsite.io/`,
secret: process.env.PREVIEW_SECRET, // optional, must match Drupal instance preview secret
},
},
],
}
You can query nodes created from Drupal like the following:
{
allArticle {
edges {
node {
title
internalId
created(formatString: "DD-MMM-YYYY")
}
}
}
}