@prg/gatsby-source-something-whatever
Version:
something something whatever who gives a crap.
301 lines (276 loc) • 7.14 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.createContentNodes = void 0;
var _pluralize = _interopRequireDefault(require("pluralize"));
var _lodash = _interopRequireDefault(require("lodash.camelcase"));
var _gatsbyNodeHelpers = _interopRequireDefault(require("gatsby-node-helpers"));
var _util = require("./util");
var _constants = require("./constants");
var _queries = require("./queries");
const {
createNodeFactory
} = (0, _gatsbyNodeHelpers.default)({
typePrefix: _constants.TYPE_PREFIX,
conflictFieldPrefix: 'platform'
});
const byPosition = ({
position: positionA
}, {
position: positionB
}) => positionA - positionB;
const byId = TYPE => ({
id
}) => (0, _util.convertId)(id, TYPE);
const getSelectedOptions = variant => variant.selectedOptions.reduce((acc, {
title,
value
}) => Object.assign({}, acc, {
[title]: value
}), {});
const productMiddleware = node => {
const {
id,
available,
title,
handle,
description,
type,
parent,
children,
internal
} = node;
const foreignIds = node.shopifyProductIds.map(({
id
}) => id);
const metadata = node.metadata === null ? {} : node.metadata;
const images = node.images.map(byId(_constants.IMAGE));
const options = node.options.sort(byPosition).map(byId(_constants.PRODUCT_OPTION));
const optionValues = node.options.reduce((acc, {
title,
values
}) => Object.assign({}, acc, {
[title]: values.sort(byPosition).map(value => value.title)
}), {});
const variants = node.variants.sort((a, b) => {
try {
const A = getSelectedOptions(a);
const B = getSelectedOptions(b);
if (A.Color === B.Color && A.Size !== B.Size) {
return optionValues.Size.indexOf(A.Size) - optionValues.Size.indexOf(B.Size);
}
return optionValues.Color.indexOf(A.Color) - optionValues.Color.indexOf(B.Color);
} catch (error) {
return 0;
}
});
const featuredImage = variants[0].images.length ? (0, _util.convertId)(variants[0].images[0].id, _constants.IMAGE) : images[0];
return {
id,
available,
title,
handle,
description,
type,
foreignIds,
metadata,
featuredImage___NODE: featuredImage,
options___NODE: options,
images___NODE: images,
optionValues,
variants___NODE: variants.map(({
id
}) => (0, _util.convertId)(id, _constants.PRODUCT_VARIANT)),
parent,
children,
internal
};
};
const productVariantMiddleware = node => {
const {
id,
title,
available,
inventory,
foreignId,
productForeignId,
foreignProductHandle,
foreignProductPublishedAt,
price,
compareAtPrice,
metadata,
parent,
children,
internal
} = node;
const productId = (0, _util.convertId)(node.productId, _constants.PRODUCT);
const product = productId;
const selectedOptions = getSelectedOptions(node);
const firstImage = node.images.find(({
position
}) => position === 1);
const secondImage = node.images.find(({
position
}) => position === 2);
const image = firstImage ? (0, _util.convertId)(firstImage.id, _constants.IMAGE) : null;
const hoverImage = secondImage ? (0, _util.convertId)(secondImage.id, _constants.IMAGE) : null;
const images = node.images.map(byId(_constants.IMAGE));
return {
id,
title,
available,
inventory,
foreignId,
productForeignId,
foreignProductHandle,
foreignProductPublishedAt,
price,
compareAtPrice,
product___NODE: product,
productId,
images___NODE: images,
image___NODE: image,
hoverImage___NODE: hoverImage,
selectedOptions,
metadata,
parent,
children,
internal
};
};
const imageMiddleware = node => {
const {
id,
src,
altText,
parent,
children,
internal
} = node;
if (node.variants && node.variants.length) {
const {
variant: firstVariant
} = node.variants && node.variants[0];
const match = firstVariant.images.find(({
id
}) => id === node.platformId) || {};
const position = match.position || null;
const product = (0, _util.convertId)(firstVariant.productId, _constants.PRODUCT);
const variants = node.variants.map(({
id
}) => (0, _util.convertId)(id, _constants.PRODUCT_VARIANT));
return {
id,
src,
altText,
position,
product___NODE: product,
variants___NODE: variants,
parent,
children,
internal
};
}
if (node.product) {
return {
id,
src,
altText,
position: node.product.position || null,
product___NODE: (0, _util.convertId)(node.product.id, _constants.PRODUCT),
variants___NODE: [],
parent,
children,
internal
};
}
return {
id,
src,
altText,
position: null,
product___NODE: null,
variants___NODE: [],
parent,
children,
internal
};
};
const optionMiddleware = node => {
const productId = (0, _util.convertId)(node.productId, _constants.PRODUCT);
const product = productId;
const values = node.values.sort(byPosition).map(byId(_constants.PRODUCT_OPTION_VALUE));
return Object.assign({}, node, {
productId,
product___NODE: product,
values
});
};
const types = [{
name: _constants.IMAGE,
query: _queries.IMAGES_QUERY,
middleware: imageMiddleware
}, {
name: _constants.PRODUCT,
query: _queries.PRODUCTS_QUERY,
middleware: productMiddleware
}, {
name: _constants.PRODUCT_VARIANT,
query: _queries.PRODUCT_VARIANTS_QUERY,
middleware: productVariantMiddleware
}, {
name: _constants.PRODUCT_OPTION,
query: _queries.PRODUCT_OPTIONS_QUERY,
middleware: optionMiddleware
}, {
name: _constants.PRODUCT_OPTION_VALUE,
query: _queries.PRODUCT_OPTION_VALUES_QUERY
}];
const getTypeData = async (types, client, shopId) => {
const queries = types.map(({
name,
query,
middleware = node => node
}) => {
const factory = createNodeFactory(name, middleware);
const normalizedName = (0, _lodash.default)((0, _pluralize.default)(name));
return client.query({
query,
variables: {
shopId
}
}).then(({
data
}) => {
return {
name,
nodes: data[normalizedName].map(item => factory(item))
};
});
});
const typeData = await Promise.all(queries);
return typeData.reduce((acc, {
name,
nodes
}) => Object.assign({}, acc, {
[name]: nodes
}), {});
};
const createContentNodes = async (client, shopId, {
actions: {
createNode
}
}) => {
try {
const typeData = await getTypeData(types, client, shopId);
const createdNodes = Object.entries(typeData).map(([type, nodes]) => {
console.log((0, _util.formatMsg)(`Created ${nodes.length} ${_constants.TYPE_PREFIX}${type} nodes.`));
return nodes.map(node => createNode(node));
});
await Promise.all(createdNodes);
return typeData;
} catch (error) {
console.log('error', error);
}
};
exports.createContentNodes = createContentNodes;