Skip to content

Commit 75b041e

Browse files
authored
fix(gatsby-plugin-contentful): wait for contentTypes to be created) (#22307)
* fix(gatsby-plugin-contentful): wait for contentTypes to be created) * add comments
1 parent bc1b2b5 commit 75b041e

File tree

2 files changed

+55
-50
lines changed

2 files changed

+55
-50
lines changed

packages/gatsby-source-contentful/src/gatsby-node.js

+38-28
Original file line numberDiff line numberDiff line change
@@ -216,35 +216,45 @@ exports.sourceNodes = async (
216216
}
217217
})
218218

219-
contentTypeItems.forEach((contentTypeItem, i) => {
220-
normalize.createNodesForContentType({
221-
contentTypeItem,
222-
contentTypeItems,
223-
restrictedNodeFields,
224-
conflictFieldPrefix,
225-
entries: entryList[i],
226-
createNode,
227-
createNodeId,
228-
resolvable,
229-
foreignReferenceMap,
230-
defaultLocale,
231-
locales,
232-
space,
233-
useNameForId: pluginConfig.get(`useNameForId`),
234-
richTextOptions: pluginConfig.get(`richText`),
235-
})
236-
})
219+
for (let i = 0; i < contentTypeItems.length; i++) {
220+
const contentTypeItem = contentTypeItems[i]
221+
222+
// A contentType can hold lots of entries which create nodes
223+
// We wait until all nodes are created and processed until we handle the next one
224+
// TODO add batching in gatsby-core
225+
await Promise.all(
226+
normalize.createNodesForContentType({
227+
contentTypeItem,
228+
contentTypeItems,
229+
restrictedNodeFields,
230+
conflictFieldPrefix,
231+
entries: entryList[i],
232+
createNode,
233+
createNodeId,
234+
resolvable,
235+
foreignReferenceMap,
236+
defaultLocale,
237+
locales,
238+
space,
239+
useNameForId: pluginConfig.get(`useNameForId`),
240+
richTextOptions: pluginConfig.get(`richText`),
241+
})
242+
)
243+
}
237244

238-
assets.forEach(assetItem => {
239-
normalize.createAssetNodes({
240-
assetItem,
241-
createNode,
242-
createNodeId,
243-
defaultLocale,
244-
locales,
245-
space,
246-
})
247-
})
245+
for (let i = 0; i < assets.length; i++) {
246+
// We wait for each asset to be process until handling the next one.
247+
await Promise.all(
248+
normalize.createAssetNodes({
249+
assetItem: assets[i],
250+
createNode,
251+
createNodeId,
252+
defaultLocale,
253+
locales,
254+
space,
255+
})
256+
)
257+
}
248258

249259
if (pluginConfig.get(`downloadLocal`)) {
250260
await downloadContentfulAssets({

packages/gatsby-source-contentful/src/normalize.js

+17-22
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ exports.createNodesForContentType = ({
307307
contentTypeItemId = contentTypeItem.sys.id
308308
}
309309

310+
const createNodePromises = []
310311
locales.forEach(locale => {
311312
const localesFallback = buildFallbackChain(locales)
312313
const mId = makeMakeId({
@@ -584,14 +585,16 @@ exports.createNodesForContentType = ({
584585

585586
contentTypeNode.internal.contentDigest = contentDigest
586587

587-
createNode(contentTypeNode)
588+
createNodePromises.push(createNode(contentTypeNode))
588589
entryNodes.forEach(entryNode => {
589-
createNode(entryNode)
590+
createNodePromises.push(createNode(entryNode))
590591
})
591592
childrenNodes.forEach(entryNode => {
592-
createNode(entryNode)
593+
createNodePromises.push(createNode(entryNode))
593594
})
594595
})
596+
597+
return createNodePromises
595598
}
596599

597600
exports.createAssetNodes = ({
@@ -602,6 +605,7 @@ exports.createAssetNodes = ({
602605
locales,
603606
space,
604607
}) => {
608+
const createNodePromises = []
605609
locales.forEach(locale => {
606610
const localesFallback = buildFallbackChain(locales)
607611
const mId = makeMakeId({
@@ -614,27 +618,16 @@ exports.createAssetNodes = ({
614618
localesFallback,
615619
})
616620

617-
const localizedAsset = { ...assetItem }
618-
// Create a node for each asset. They may be referenced by Entries
619-
//
620-
// Get localized fields.
621-
localizedAsset.fields = {
622-
file: localizedAsset.fields.file
623-
? getField(localizedAsset.fields.file)
624-
: null,
625-
title: localizedAsset.fields.title
626-
? getField(localizedAsset.fields.title)
627-
: ``,
628-
description: localizedAsset.fields.description
629-
? getField(localizedAsset.fields.description)
630-
: ``,
631-
}
632621
const assetNode = {
633-
contentful_id: localizedAsset.sys.contentful_id,
634-
id: mId(space.sys.id, localizedAsset.sys.id),
622+
contentful_id: assetItem.sys.contentful_id,
623+
id: mId(space.sys.id, assetItem.sys.id),
635624
parent: null,
636625
children: [],
637-
...localizedAsset.fields,
626+
file: assetItem.fields.file ? getField(assetItem.fields.file) : null,
627+
title: assetItem.fields.title ? getField(assetItem.fields.title) : ``,
628+
description: assetItem.fields.description
629+
? getField(assetItem.fields.description)
630+
: ``,
638631
node_locale: locale.code,
639632
internal: {
640633
type: `${makeTypeName(`Asset`)}`,
@@ -646,6 +639,8 @@ exports.createAssetNodes = ({
646639

647640
assetNode.internal.contentDigest = contentDigest
648641

649-
createNode(assetNode)
642+
createNodePromises.push(createNode(assetNode))
650643
})
644+
645+
return createNodePromises
651646
}

0 commit comments

Comments
 (0)