Skip to content

Instantly share code, notes, and snippets.

@Khaledgarbaya
Last active October 27, 2021 15:46
Show Gist options
  • Save Khaledgarbaya/5106552d3142181a7110e44706ee4ced to your computer and use it in GitHub Desktop.
Save Khaledgarbaya/5106552d3142181a7110e44706ee4ced to your computer and use it in GitHub Desktop.
Gatsby Contentful Recipe

Setup Gatsby with Contentful

Contentful A content platform is everything a CMS isn’t. Control all of your content from a single hub. Publish to any digital channel. Integrate anything with our industry-leading app framework. See ya, CMS.


Install necessary NPM packages

---

Add the source plugin


Create a setup script


You are good to go. Please run npm run setup to get started

const spaceImport = require('contentful-import')
const exportFile = require('../contentful/export.json')
const inquirer = require('inquirer')
const chalk = require('chalk')
const path = require('path')
const { writeFileSync } = require('fs')
const argv = require('yargs-parser')(process.argv.slice(2))
console.log(`
To set up this project you need to provide your Space ID
and the belonging API access tokens.
You can find all the needed information in your Contentful space under:
${chalk.yellow(
`app.contentful.com ${chalk.red('->')} Space Settings ${chalk.red(
'->'
)} API keys`
)}
The ${chalk.green('Content Management API Token')}
will be used to import and write data to your space.
The ${chalk.green('Content Delivery API Token')}
will be used to ship published production-ready content in your Gatsby app.
The ${chalk.green('Content Preview API Token')}
will be used to show not published data in your development environment.
Ready? Let's do it! 🎉
`)
const questions = [
{
name: 'spaceId',
message: 'Your Space ID',
when: !argv.spaceId && !process.env.CONTENTFUL_SPACE_ID,
validate: input =>
/^[a-z0-9]{12}$/.test(input) ||
'Space ID must be 12 lowercase characters',
},
{
name: 'managementToken',
when: !argv.managementToken,
message: 'Your Content Management API access token',
},
{
name: 'accessToken',
when: !argv.accessToken && !process.env.CONTENTFUL_ACCESS_TOKEN_TOKEN,
message: 'Your Content Delivery API access token',
},
]
inquirer
.prompt(questions)
.then(({ spaceId, managementToken, accessToken }) => {
const { CONTENTFUL_SPACE_ID, CONTENTFUL_ACCESS_TOKEN } = process.env
// env vars are given precedence followed by args provided to the setup
// followed by input given to prompts displayed by the setup script
spaceId = CONTENTFUL_SPACE_ID || argv.spaceId || spaceId
managementToken = argv.managementToken || managementToken
accessToken = CONTENTFUL_ACCESS_TOKEN || argv.accessToken || accessToken
console.log('Writing config file...')
const configFiles = [`.env.development`, `.env.production`].map(file =>
path.join(__dirname, '..', file)
)
const fileContents =
[
`# All environment variables will be sourced`,
`# and made available to gatsby-config.js, gatsby-node.js, etc.`,
`# Do NOT commit this file to source control`,
`CONTENTFUL_SPACE_ID='${spaceId}'`,
`CONTENTFUL_ACCESS_TOKEN='${accessToken}'`,
].join('\n') + '\n'
configFiles.forEach(file => {
writeFileSync(file, fileContents, 'utf8')
console.log(`Config file ${chalk.yellow(file)} written`)
})
return { spaceId, managementToken }
})
.then(({ spaceId, managementToken }) =>
spaceImport({ spaceId, managementToken, content: exportFile })
)
.then((_, error) => {
console.log(
`All set! You can now run ${chalk.yellow(
'yarn run dev'
)} to see it in action.`
)
})
.catch(error => console.error(error))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment