diff --git a/src/hooks/sourceNodes/createNodeFromEntity/item/index.js b/src/hooks/sourceNodes/createNodeFromEntity/item/index.js index cfe6162..bf1c285 100644 --- a/src/hooks/sourceNodes/createNodeFromEntity/item/index.js +++ b/src/hooks/sourceNodes/createNodeFromEntity/item/index.js @@ -15,66 +15,79 @@ module.exports = function buildItemNode( ) { const siteEntity = entitiesRepo.site; const type = generateType(`${pascalize(entity.itemType.apiKey)}`); - const localesToGenerate = Array.isArray(rawLocalesToGenerate) + const allLocales = Array.isArray(rawLocalesToGenerate) ? rawLocalesToGenerate : siteEntity.locales; + const firstLocalizedField = entity.itemType.fields.find(f => f.localized); + const localesToGenerate = !firstLocalizedField + ? [siteEntity.locales[0]] + : entity.itemType.allLocalesRequired + ? allLocales + : Object.keys(entity[camelize(field.apiKey)]); return [].concat( ...localesToGenerate.map(locale => { const additionalNodesToCreate = []; - const i18n = { locale, fallbacks: localeFallbacks }; + const i18n = { + locale: locale, + fallbacks: localeFallbacks, + }; - const itemNode = buildNode(type, `${entity.id}-${locale}`, node => { - node.locale = locale; - node.entityPayload = entity.payload; - node.digest = entity.meta.updatedAt; + const itemNode = buildNode( + type, + [entity.id, locale].filter(x => !!x).join('-'), + node => { + node.locale = locale; + node.entityPayload = entity.payload; + node.digest = entity.meta.updatedAt; - entity.itemType.fields - .filter(field => field.fieldType === 'text') - .forEach(field => { - const camelizedApiKey = camelize(field.apiKey); + entity.itemType.fields + .filter(field => field.fieldType === 'text') + .forEach(field => { + const camelizedApiKey = camelize(field.apiKey); - let mediaType = 'text/plain'; + let mediaType = 'text/plain'; - if (field.appeareance.editor === 'markdown') { - mediaType = 'text/markdown'; - } else if (field.appeareance.editor === 'wysiwyg') { - mediaType = 'text/html'; - } + if (field.appeareance.editor === 'markdown') { + mediaType = 'text/markdown'; + } else if (field.appeareance.editor === 'wysiwyg') { + mediaType = 'text/html'; + } - const value = localizedRead( - entity, - camelizedApiKey, - field.localized, - i18n, - ); + const value = localizedRead( + entity, + camelizedApiKey, + field.localized, + i18n, + ); - const textNode = buildNode( - 'DatoCmsTextNode', - `${entity.id}-${locale}-${camelizedApiKey}`, - node => { - node.internal.mediaType = mediaType; - node.internal.content = value || ''; - node.digest = entity.meta.updatedAt; - }, - ); + const textNode = buildNode( + 'DatoCmsTextNode', + [entity.id, locale, camelizedApiKey].filter(x => !!x).join('-'), + node => { + node.internal.mediaType = mediaType; + node.internal.content = value || ''; + node.digest = entity.meta.updatedAt; + }, + ); - additionalNodesToCreate.push(textNode); - }); + additionalNodesToCreate.push(textNode); + }); - const seoNode = buildNode( - generateType('SeoMetaTags'), - node.id, - node => { - node.digest = entity.meta.updatedAt; - node.itemNodeId = `${type}-${entity.id}-${locale}`; - node.locale = locale; - }, - ); + const seoNode = buildNode( + generateType('SeoMetaTags'), + node.id, + node => { + node.digest = entity.meta.updatedAt; + node.itemNodeId = `${type}-${entity.id}-${locale}`; + node.locale = locale; + }, + ); - additionalNodesToCreate.push(seoNode); - node.seoMetaTags___NODE = seoNode.id; - }); + additionalNodesToCreate.push(seoNode); + node.seoMetaTags___NODE = seoNode.id; + }, + ); return [itemNode].concat(additionalNodesToCreate); }), diff --git a/src/hooks/sourceNodes/createTypes/fieldTypes/DatoCmsSeoMetaTags.js b/src/hooks/sourceNodes/createTypes/fieldTypes/DatoCmsSeoMetaTags.js index f8e3b16..2981f86 100644 --- a/src/hooks/sourceNodes/createTypes/fieldTypes/DatoCmsSeoMetaTags.js +++ b/src/hooks/sourceNodes/createTypes/fieldTypes/DatoCmsSeoMetaTags.js @@ -21,11 +21,17 @@ module.exports = ({ id: node.itemNodeId, }); - return seoTagsBuilder( - new JsonApiEntity(item.entityPayload, entitiesRepo), - entitiesRepo, - i18n, - ); + try { + return seoTagsBuilder( + new JsonApiEntity(item.entityPayload, entitiesRepo), + entitiesRepo, + i18n, + ); + } catch (e) { + console.log(e); + console.log(e.stack); + throw e; + } }, }, }, diff --git a/src/hooks/sourceNodes/createTypes/item/fields/text.js b/src/hooks/sourceNodes/createTypes/item/fields/text.js index 8c65a69..c5acf76 100644 --- a/src/hooks/sourceNodes/createTypes/item/fields/text.js +++ b/src/hooks/sourceNodes/createTypes/item/fields/text.js @@ -9,7 +9,12 @@ module.exports = ({ field }) => { resolveForSimpleField: fieldValue => fieldValue, resolveForNodeField: (fieldValue, context, node) => { return context.nodeModel.getNodeById({ - id: `DatoCmsTextNode-${node.entityPayload.id}-${node.locale}-${fieldKey}`, + id: [ + 'DatoCmsTextNode', + node.entityPayload.id, + node.locale, + fieldKey, + ].join('-'), }); }, }; diff --git a/src/hooks/sourceNodes/createTypes/utils/itemNodeId.js b/src/hooks/sourceNodes/createTypes/utils/itemNodeId.js index 37e6eb3..e98ac97 100644 --- a/src/hooks/sourceNodes/createTypes/utils/itemNodeId.js +++ b/src/hooks/sourceNodes/createTypes/utils/itemNodeId.js @@ -10,6 +10,16 @@ module.exports = function itemNodeId(id, locale, entitiesRepo, generateType) { return null; } + const firstLocalizedField = entity.itemType.fields.find(f => f.localized); + + if (!firstLocalizedField) { + return generateType( + `${pascalize(entity.itemType.apiKey)}-${entity.id}-${ + entitiesRepo.site.locales[0] + }`, + ); + } + return generateType( `${pascalize(entity.itemType.apiKey)}-${entity.id}-${locale}`, ); diff --git a/test/fixtures/graphql-responses/multipleInstances.json b/test/fixtures/graphql-responses/multipleInstances.json index a0a241f..bf2d57a 100644 --- a/test/fixtures/graphql-responses/multipleInstances.json +++ b/test/fixtures/graphql-responses/multipleInstances.json @@ -151,126 +151,6 @@ ], "id": "DatoCmsAlternativeSeoMetaTags-DatoCmsAlternativeArticle-24502153-en" } - }, - { - "__typename": "DatoCmsAlternativeArticle", - "locale": "it", - "originalId": "24502153", - "id": "DatoCmsAlternativeArticle-24502153-it", - "name": "Test", - "seo": { - "image": { - "path": "/34723/1615803363-structured-text.png" - } - }, - "seoMetaTags": { - "__typename": "DatoCmsAlternativeSeoMetaTags", - "tags": [ - { - "tagName": "title", - "content": "Alternate title" - }, - { - "tagName": "meta", - "attributes": { - "property": "og:title", - "content": "Alternate title" - } - }, - { - "tagName": "meta", - "attributes": { - "name": "twitter:title", - "content": "Alternate title" - } - }, - { - "tagName": "meta", - "attributes": { - "name": "description", - "content": "Alt description" - } - }, - { - "tagName": "meta", - "attributes": { - "property": "og:description", - "content": "Alt description" - } - }, - { - "tagName": "meta", - "attributes": { - "name": "twitter:description", - "content": "Alt description" - } - }, - { - "tagName": "meta", - "attributes": { - "name": "twitter:card", - "content": "summary" - } - }, - { - "tagName": "meta", - "attributes": { - "property": "article:modified_time", - "content": "2021-10-27T07:21:34Z" - } - }, - { - "tagName": "meta", - "attributes": { - "property": "article:published_time", - "content": "2021-03-15T10:16:31Z" - } - }, - { - "tagName": "meta", - "attributes": { - "property": "og:locale", - "content": "it_IT" - } - }, - { - "tagName": "meta", - "attributes": { - "property": "og:type", - "content": "article" - } - }, - { - "tagName": "meta", - "attributes": { - "property": "og:image", - "content": "https://www.datocms-assets.com/34723/1615803363-structured-text.png?w=1000&fit=max&fm=jpg" - } - }, - { - "tagName": "meta", - "attributes": { - "name": "twitter:image", - "content": "https://www.datocms-assets.com/34723/1615803363-structured-text.png?w=1000&fit=max&fm=jpg" - } - }, - { - "tagName": "meta", - "attributes": { - "property": "og:image:width", - "content": 1137 - } - }, - { - "tagName": "meta", - "attributes": { - "property": "og:image:height", - "content": 709 - } - } - ], - "id": "DatoCmsAlternativeSeoMetaTags-DatoCmsAlternativeArticle-24502153-it" - } } ] } diff --git a/test/graphql.test.js b/test/graphql.test.js index b654f94..8932e4a 100644 --- a/test/graphql.test.js +++ b/test/graphql.test.js @@ -387,9 +387,7 @@ Suite('tree collections', async () => { 'tree', await executeQuery(/* GraphQL */ ` { - allDatoCmsHierarchical( - filter: { root: { eq: true }, locale: { eq: "en" } } - ) { + allDatoCmsHierarchical(filter: { root: { eq: true } }) { nodes { id title