diff --git a/packages/gatsby/src/schema/index.js b/packages/gatsby/src/schema/index.js index 444f97352ff8e..922218dd9cc6f 100644 --- a/packages/gatsby/src/schema/index.js +++ b/packages/gatsby/src/schema/index.js @@ -2,13 +2,32 @@ const _ = require(`lodash`) const { GraphQLSchema, GraphQLObjectType } = require(`graphql`) +const apiRunner = require(`../utils/api-runner-node`) const buildNodeTypes = require(`./build-node-types`) const buildNodeConnections = require(`./build-node-connections`) -const { store } = require(`../redux`) +const { store, getNodes } = require(`../redux`) const invariant = require(`invariant`) +async function getEnhancedGqlFields(typesGQL) { + const enhancedFields = await apiRunner(`enhanceSchema`, { + types: typesGQL, + allNodes: getNodes(), + traceId: `initial-enhanceSchema`, + }) + return enhancedFields +} + module.exports = async () => { const typesGQL = await buildNodeTypes() + let enhancedFields = {} + const enhancedFieldResults = await getEnhancedGqlFields(typesGQL) + Object.keys(enhancedFieldResults).forEach(key => { + enhancedFields = { + ...enhancedFields, + ...enhancedFieldResults[key], + } + }) + const connections = buildNodeConnections(_.values(typesGQL)) // Pull off just the graphql node from each type object. @@ -20,7 +39,7 @@ module.exports = async () => { const schema = new GraphQLSchema({ query: new GraphQLObjectType({ name: `RootQueryType`, - fields: { ...connections, ...nodes }, + fields: { ...connections, ...nodes, ...enhancedFields }, }), }) diff --git a/packages/gatsby/src/utils/api-node-docs.js b/packages/gatsby/src/utils/api-node-docs.js index 534e55fd055d4..81836970f7de1 100644 --- a/packages/gatsby/src/utils/api-node-docs.js +++ b/packages/gatsby/src/utils/api-node-docs.js @@ -203,3 +203,9 @@ exports.onPostBuild = true * See gatsby-transformer-remark and gatsby-source-contentful for examples. */ exports.onPreExtractQueries = true + +/** + * Run after the schema has been created but before it's dispatched allowing you + * to do cool enhancements e.g. union / interface stuff + */ +exports.enhanceSchema = true