diff --git a/src/gatsby-node.js b/src/gatsby-node.js index 63a6f83..9142ceb 100644 --- a/src/gatsby-node.js +++ b/src/gatsby-node.js @@ -1,6 +1,50 @@ require("es6-promise").polyfill() require("isomorphic-fetch") +const getHref = (link) => { + if (typeof link === `object`) { + return link.href + } + + return link +} + +const fetchEnabledLanguages = async ({ + baseUrl, + apiBase, + headers, + reporter, +}) => { + let next = `${baseUrl}/${apiBase}/configurable_language/configurable_language?sort=weight` + let availableLanguagesResponses = [] + + while (next) { + const result = await fetch(next, { + headers, + }) + if (!result.ok) { + reporter.error(`Bad res from ${next}`) + } + const responseBody = await result.json() + availableLanguagesResponses = availableLanguagesResponses.concat( + responseBody.data + ) + next = getHref(responseBody.links.next) + } + + const enabledLanguages = availableLanguagesResponses + .filter( + (language) => + [`und`, `zxx`].indexOf(language.attributes.drupal_internal__id) === -1 + ) + .map((language) => language.attributes.drupal_internal__id) + const defaultLanguage = enabledLanguages[0] + return { + defaultLanguage, + enabledLanguages, + } +} + exports.sourceNodes = async ( { actions, @@ -36,47 +80,73 @@ exports.sourceNodes = async ( ).toString("base64")}` } + reporter.info(`Checking the language configuration.`) + + const languageConfig = await fetchEnabledLanguages({ + baseUrl, + apiBase, + headers, + reporter, + }) + + let languages = languageConfig.enabledLanguages + if (!languages || languages.length == 0) { + languages = ["und"] + } + // Data can come from anywhere, but for now create it manually const menuResponses = await Promise.all( menus.map(async (menu) => { - return await fetch(`${baseUrl}/${apiBase}/menu_items/${menu}`, { - headers, - }).then(function (response) { - if (response.status >= 400) { - reporter.error( - `Bad response from ${baseUrl}/${apiBase}/menu_items/${menu}` - ) - } - return response.json() - }) + return Promise.all( + languageConfig.enabledLanguages.map(async (langcode) => { + let prefix = "" + if (langcode !== "und") { + prefix = `/${langcode}` + } + const url = `${baseUrl}${prefix}/${apiBase}/menu_items/${menu}` + const result = await fetch(url, { + headers, + }).then(function (res) { + if (res.status >= 400) { + reporter.error(`Bad res from ${url}`) + } + return res.json() + }) + result.langcode = langcode + return result + }) + ) }) ) - menuResponses.forEach(({ data: menuItems }) => { - const map = new Map() - menuItems.forEach((item) => { - const nodeContent = JSON.stringify(item) - const id = `menu-items-${item.id}` - let parentId = null - if (item.attributes.parent) { - parentId = `menu-items-${item.attributes.parent}` - } - const nodeMeta = { - id, - parent: parentId, - children: [], - internal: { - type: `MenuItems`, - mediaType: `text/html`, - content: nodeContent, - contentDigest: createContentDigest(item), - }, - } - const node = Object.assign({}, item.attributes, nodeMeta) - createNode(node) - if (parentId && map.has(parentId)) { - createParentChildLink({ parent: map.get(parentId), child: node }) - } - map.set(id, node) + menuResponses.forEach((menuResponse) => { + menuResponse.forEach(({ data: menuItems, langcode }) => { + const map = new Map() + menuItems.forEach((item) => { + const nodeContent = JSON.stringify(item) + const id = `menu-items-${item.id}-${langcode}` + let parentId = null + if (item.attributes.parent) { + parentId = `menu-items-${item.attributes.parent}` + } + const nodeMeta = { + id, + parent: parentId, + children: [], + langcode, + internal: { + type: `MenuItems`, + mediaType: `text/html`, + content: nodeContent, + contentDigest: createContentDigest(item), + }, + } + const node = Object.assign({}, item.attributes, nodeMeta) + createNode(node) + if (parentId && map.has(parentId)) { + createParentChildLink({ parent: map.get(parentId), child: node }) + } + map.set(id, node) + }) }) }) }