This repository has been archived on 2026-10-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
dns2019/gatsby-node.js
T
2019-02-24 13:06:05 +01:00

387 lines
9.5 KiB
JavaScript

const _ = require('lodash')
const path = require('path')
const { createFilePath } = require('gatsby-source-filesystem')
const { paginate } = require('gatsby-awesome-pagination')
const getOnlyPublished = edges =>
_.filter(edges, ({ node }) => node.status === 'publish')
exports.createPages = ({ actions, graphql }) => {
const { createPage } = actions
return graphql(`
{
allWordpressPage {
edges {
node {
id
slug
status
}
}
}
}
`)
.then(result => {
if (result.errors) {
result.errors.forEach(e => console.error(e.toString()))
return Promise.reject(result.errors)
}
const pageTemplate = path.resolve(`./src/templates/page.js`)
// Only publish pages with a `status === 'publish'` in production. This
// excludes drafts, future posts, etc. They will appear in development,
// but not in a production build.
const allPages = result.data.allWordpressPage.edges
const pages =
process.env.NODE_ENV === 'production'
? getOnlyPublished(allPages)
: allPages
// Call `createPage()` once per WordPress page
_.each(pages, ({ node: page }) => {
createPage({
path: `/${page.slug}/`,
component: pageTemplate,
context: {
id: page.id,
},
})
})
})
.then(() => {
return graphql(`
{
allWordpressPost {
edges {
node {
id
slug
status
fields {
link
}
}
}
}
}
`)
})
.then(result => {
if (result.errors) {
result.errors.forEach(e => console.error(e.toString()))
return Promise.reject(result.errors)
}
const postTemplate = path.resolve(`./src/templates/post.js`)
const blogTemplate = path.resolve(`./src/templates/blog.js`)
// In production builds, filter for only published posts.
const allPosts = result.data.allWordpressPost.edges
const posts =
process.env.NODE_ENV === 'production'
? getOnlyPublished(allPosts)
: allPosts
// Iterate over the array of posts
_.each(posts, ({ node: post }) => {
// Create the Gatsby page for this WordPress post
createPage({
path: post.fields.link,
component: postTemplate,
context: {
id: post.id,
},
})
})
// Create a paginated blog, e.g., /, /page/2, /page/3
paginate({
createPage,
items: posts,
itemsPerPage: 10,
pathPrefix: ({ pageNumber }) => (pageNumber === 0 ? `/` : `/page`),
component: blogTemplate,
})
})
.then(() => {
return graphql(`
{
allWordpressWpEvents {
edges {
node {
id
slug
status
fields {
link
}
}
}
}
}
`)
})
.then(result => {
if (result.errors) {
result.errors.forEach(e => console.error(e.toString()))
return Promise.reject(result.errors)
}
const eventTemplate = path.resolve(`./src/templates/event.js`)
// In production builds, filter for only published events.
const allEvents = result.data.allWordpressWpEvents.edges
const events =
process.env.NODE_ENV === 'production'
? getOnlyPublished(allEvents)
: allEvents
// Iterate over the array of events
_.each(events, ({ node: event }) => {
// Create the Gatsby page for this WordPress event
createPage({
path: event.fields.link,
component: eventTemplate,
context: {
id: event.id,
},
})
})
// Create the event program
const programTemplate = path.resolve(`./src/templates/event-program.js`)
createPage({
path: `/program/`,
component: programTemplate,
})
})
.then(() => {
return graphql(`
{
allWordpressWpEventTypes(filter: { count: { gt: 0 } }) {
edges {
node {
id
name
slug
fields {
link
}
}
}
}
}
`)
})
.then(result => {
if (result.errors) {
result.errors.forEach(e => console.error(e.toString()))
return Promise.reject(result.errors)
}
const eventTypeTemplate = path.resolve(`./src/templates/event-type.js`)
_.each(
result.data.allWordpressWpEventTypes.edges,
({ node: event_type }) => {
createPage({
path: event_type.fields.link,
component: eventTypeTemplate,
context: {
name: event_type.name,
slug: event_type.slug,
},
})
}
)
})
.then(() => {
return graphql(`
{
allWordpressWpAssociations {
edges {
node {
id
slug
status
fields {
link
}
}
}
}
}
`)
})
.then(result => {
if (result.errors) {
result.errors.forEach(e => console.error(e.toString()))
return Promise.reject(result.errors)
}
const associationTemplate = path.resolve(`./src/templates/association.js`)
// In production builds, filter for only published associations.
const allAssociations = result.data.allWordpressWpAssociations.edges
const associations =
process.env.NODE_ENV === 'production'
? getOnlyPublished(allAssociations)
: allAssociations
// Iterate over the array of associations
_.each(associations, ({ node: association }) => {
// Create the Gatsby page for this WordPress event
createPage({
path: association.fields.link,
component: associationTemplate,
context: {
id: association.id,
},
})
})
// Create the list of associations
const associationListTemplate = path.resolve(
`./src/templates/association-list.js`
)
createPage({
path: `/foreningene/`,
component: associationListTemplate,
})
})
.then(() => {
return graphql(`
{
allWordpressCategory(filter: { count: { gt: 0 } }) {
edges {
node {
id
name
slug
}
}
}
}
`)
})
.then(result => {
if (result.errors) {
result.errors.forEach(e => console.error(e.toString()))
return Promise.reject(result.errors)
}
const categoriesTemplate = path.resolve(`./src/templates/category.js`)
// Create a Gatsby page for each WordPress Category
_.each(result.data.allWordpressCategory.edges, ({ node: cat }) => {
createPage({
path: `/categories/${cat.slug}/`,
component: categoriesTemplate,
context: {
name: cat.name,
slug: cat.slug,
},
})
})
})
.then(() => {
return graphql(`
{
allWordpressTag(filter: { count: { gt: 0 } }) {
edges {
node {
id
name
slug
}
}
}
}
`)
})
.then(result => {
if (result.errors) {
result.errors.forEach(e => console.error(e.toString()))
return Promise.reject(result.errors)
}
const tagsTemplate = path.resolve(`./src/templates/tag.js`)
// Create a Gatsby page for each WordPress tag
_.each(result.data.allWordpressTag.edges, ({ node: tag }) => {
createPage({
path: `/tags/${tag.slug}/`,
component: tagsTemplate,
context: {
name: tag.name,
slug: tag.slug,
},
})
})
})
.then(() => {
return graphql(`
{
allWordpressWpUsers {
edges {
node {
id
slug
}
}
}
}
`)
})
.then(result => {
if (result.errors) {
result.errors.forEach(e => console.error(e.toString()))
return Promise.reject(result.errors)
}
const authorTemplate = path.resolve(`./src/templates/author.js`)
_.each(result.data.allWordpressWpUsers.edges, ({ node: author }) => {
createPage({
path: `/author/${author.slug}`,
component: authorTemplate,
context: {
id: author.id,
},
})
})
})
}
exports.onCreateNode = ({ node, actions, getNode }) => {
const { createNodeField } = actions
if (node.internal.type === `MarkdownRemark`) {
const value = createFilePath({ node, getNode })
createNodeField({
name: `slug`,
node,
value,
})
}
relativeLinksFor = [
'wordpress__POST',
'wordpress__wp_associations',
'wordpress__wp_events',
'wordpress__wp_event_types',
]
if (relativeLinksFor.includes(node.internal.type)) {
const link = new URL(node.link).pathname
createNodeField({
node,
name: `link`,
value: link,
})
}
}