Skip to content

Commit

Permalink
Generate less nodes
Browse files Browse the repository at this point in the history
* Records of models that have no localized field only expose nodes for main locale
* Records of models with optional locales only expose nodes for locales they declare
  • Loading branch information
stefanoverna committed Apr 22, 2022
1 parent cbfeb89 commit 76520c4
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 174 deletions.
103 changes: 58 additions & 45 deletions src/hooks/sourceNodes/createNodeFromEntity/item/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}),
Expand Down
16 changes: 11 additions & 5 deletions src/hooks/sourceNodes/createTypes/fieldTypes/DatoCmsSeoMetaTags.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
},
},
},
Expand Down
7 changes: 6 additions & 1 deletion src/hooks/sourceNodes/createTypes/item/fields/text.js
Original file line number Diff line number Diff line change
Expand Up @@ -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('-'),
});
},
};
Expand Down
10 changes: 10 additions & 0 deletions src/hooks/sourceNodes/createTypes/utils/itemNodeId.js
Original file line number Diff line number Diff line change
Expand Up @@ -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}`,
);
Expand Down
120 changes: 0 additions & 120 deletions test/fixtures/graphql-responses/multipleInstances.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
}
]
}
Expand Down
4 changes: 1 addition & 3 deletions test/graphql.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 76520c4

Please sign in to comment.