UNPKG

gatsby-source-wordpress

Version:

Source data from WordPress in an efficient and scalable way.

163 lines (158 loc) 6.29 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.createNodeWithSideEffects = exports.createGatsbyNodesFromWPGQLContentNodes = void 0; var _pQueue = _interopRequireDefault(require("p-queue")); var _fetchReferencedMediaItems = _interopRequireDefault(require("../fetch-nodes/fetch-referenced-media-items")); var _urlToPath = _interopRequireDefault(require("../../../utils/url-to-path")); var _store = require("../../../store"); var _fetchGraphql = _interopRequireDefault(require("../../../utils/fetch-graphql")); var _gatsbyVersion = require("../../../utils/gatsby-version"); var _helpers = require("../../create-schema-customization/helpers"); var _processNode = require("./process-node"); // @todo concurrency is currently set so low because side effects can overwhelm // the remote server. A queue for the entire source plugin should be created so that // everything can share a queue and we can speed some of these things up const createNodesQueue = new _pQueue.default({ concurrency: 2 }); const createNodeWithSideEffects = ({ node, state, wpgqlNodesGroup = null, referencedMediaItemNodeIds = new Set(), createdNodeIds = [], createNodesActivity = null, totalSideEffectNodes = null, type = null }) => async () => { const { wpUrl } = state.remoteSchema; const { helpers, pluginOptions } = state.gatsbyApi; const { actions, createContentDigest } = helpers; if (node.link) { // @todo is this still necessary? I don't think it is but double check // create a pathname for the node using the WP permalink node.path = (0, _urlToPath.default)(node.link); } if ((wpgqlNodesGroup === null || wpgqlNodesGroup === void 0 ? void 0 : wpgqlNodesGroup.plural) !== `mediaItems`) { const { processedNode } = await (0, _processNode.processNode)({ node, pluginOptions, referencedMediaItemNodeIds, wpUrl, helpers }); node = processedNode; } const builtTypename = (0, _helpers.buildTypeName)(node.__typename, pluginOptions.schema.typePrefix); let remoteNode = { ...node, __typename: builtTypename, id: node.id, parent: null, internal: { contentDigest: createContentDigest(node), type: type || builtTypename } }; const typeSettings = (0, _helpers.getTypeSettingsByType)({ name: node.type }); if (typeof (typeSettings === null || typeSettings === void 0 ? void 0 : typeSettings.beforeChangeNode) === `function`) { const { additionalNodeIds, remoteNode: changedRemoteNode } = (await typeSettings.beforeChangeNode({ actionType: `CREATE_ALL`, remoteNode, actions, helpers, type: node.type, fetchGraphql: _fetchGraphql.default, typeSettings, buildTypeName: _helpers.buildTypeName, wpStore: (0, _store.getStore)() })) || {}; if (changedRemoteNode) { remoteNode = changedRemoteNode; } if (additionalNodeIds !== null && additionalNodeIds !== void 0 && additionalNodeIds.length && totalSideEffectNodes) { additionalNodeIds.forEach(id => createdNodeIds.push(id) && totalSideEffectNodes.push(id)); } if (totalSideEffectNodes && typeof (totalSideEffectNodes === null || totalSideEffectNodes === void 0 ? void 0 : totalSideEffectNodes.length) === `number` && totalSideEffectNodes.length > 0 && createNodesActivity) { createNodesActivity.setStatus(`awaiting async side effects - ${totalSideEffectNodes.length} additional nodes fetched`); } } await actions.createNode(remoteNode); createdNodeIds.push(node.id); }; exports.createNodeWithSideEffects = createNodeWithSideEffects; const createGatsbyNodesFromWPGQLContentNodes = async ({ wpgqlNodesByContentType, createNodesActivity }) => { const state = (0, _store.getStore)().getState(); const { helpers, pluginOptions } = state.gatsbyApi; const { reporter } = helpers; // wp supports these file extensions // jpeg|jpg|png|gif|ico|pdf|doc|docx|ppt|pptx|pps|ppsx|odt|xls|psd|mp3|m4a|ogg|wav|mp4|m4v|mov|wmv|avi|mpg|ogv|3gp|3g2|svg|bmp|tif|tiff|asf|asx|wm|wmx|divx|flv|qt|mpe|webm|mkv|txt|asc|c|cc|h|csv|tsv|ics|rtx|css|htm|html|m4b|ra|ram|mid|midi|wax|mka|rtf|js|swf|class|tar|zip|gz|gzip|rar|7z|exe|pot|wri|xla|xlt|xlw|mdb|mpp|docm|dotx|dotm|xlsm|xlsb|xltx|xltm|xlam|pptm|ppsm|potx|potm|ppam|sldx|sldm|onetoc|onetoc2|onetmp|onepkg|odp|ods|odg|odc|odb|odf|wp|wpd|key|numbers|pages // gatsby-image supports these file types // const imgSrcRemoteFileRegex = /<img.*?src=\\"(.*?jpeg|jpg|png|webp|tif|tiff$)\\"[^>]+>/gim (0, _store.getStore)().dispatch.logger.createActivityTimer({ typeName: `MediaItem`, pluginOptions, reporter }); const createdNodeIds = []; const totalSideEffectNodes = []; const referencedMediaItemNodeIds = new Set(); for (const wpgqlNodesGroup of wpgqlNodesByContentType) { const wpgqlNodes = wpgqlNodesGroup.allNodesOfContentType; for (const node of wpgqlNodes.values()) { createNodesQueue.add(createNodeWithSideEffects({ state, node, wpgqlNodesGroup, referencedMediaItemNodeIds, createdNodeIds, createNodesActivity, totalSideEffectNodes })); } } await createNodesQueue.onIdle(); const referencedMediaItemNodeIdsArray = [...referencedMediaItemNodeIds]; /** * if we're not excluding media items or we're lazy fetching media items (before Gatsby v4), we need to fetch media item nodes upfront here */ if (!pluginOptions.type.MediaItem.exclude && (!pluginOptions.type.MediaItem.lazyNodes || _gatsbyVersion.usingGatsbyV4OrGreater) && referencedMediaItemNodeIdsArray.length) { await (0, _fetchReferencedMediaItems.default)({ referencedMediaItemNodeIds: referencedMediaItemNodeIdsArray }); (0, _store.getStore)().dispatch.logger.stopActivityTimer({ typeName: `MediaItem` }); return [...createdNodeIds, ...referencedMediaItemNodeIdsArray]; } (0, _store.getStore)().dispatch.logger.stopActivityTimer({ typeName: `MediaItem` }); return createdNodeIds; }; exports.createGatsbyNodesFromWPGQLContentNodes = createGatsbyNodesFromWPGQLContentNodes; //# sourceMappingURL=create-nodes.js.map